-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathoptimizer_incremental.go
75 lines (57 loc) · 1.73 KB
/
optimizer_incremental.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package genetic_algorithm
import (
log "github.com/cihub/seelog"
)
type IncrementalOptimizer struct {
*OptimizerBase
weeder WeederInterface
}
func NewIncrementalOptimizer() *IncrementalOptimizer {
optimizer := &IncrementalOptimizer{}
optimizer.OptimizerBase = NewOptimizerBase(optimizer)
return optimizer
}
func (optimizer *IncrementalOptimizer) Weeder(weeder WeederInterface) *IncrementalOptimizer {
optimizer.weeder = weeder
return optimizer
}
func (optimizer *IncrementalOptimizer) optimizeInner() {
optimizer.weed()
optimizer.breed()
optimizer.mutate()
}
func (optimizer *IncrementalOptimizer) weed() {
optimizer.statistics.Start("weed")
defer optimizer.statistics.End()
optimizer.population = optimizer.weeder.Weed(optimizer.population)
log.Tracef("Weeded population:\n%v\n", optimizer.population)
}
func (optimizer *IncrementalOptimizer) breed() {
optimizer.statistics.Start("breed")
defer optimizer.statistics.End()
newPopulation := optimizer.population
optimizer.selector.Prepare(optimizer.population)
for {
chromsToCross := optimizer.selector.SelectMany(optimizer.crossover.ParentsCount())
log.Debugf("Parents:\n%v", chromsToCross)
children := optimizer.crossover.Crossover(chromsToCross)
log.Debugf("Children\n%v\n", children)
for i := 0; i < len(children); i++ {
newPopulation = append(newPopulation, children[i])
if len(newPopulation) == optimizer.popSize {
optimizer.population = newPopulation
return
}
}
}
}
func (optimizer *IncrementalOptimizer) mutate() {
optimizer.statistics.Start("mutate")
defer optimizer.statistics.End()
optimizer.mutator.Mutate(optimizer.population)
}
func (optimizer *IncrementalOptimizer) check() {
if optimizer.weeder == nil {
panic("Weeder must be set")
}
}