-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdemo.go
99 lines (90 loc) · 2.47 KB
/
demo.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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package main
import (
"bufio"
"fmt"
"os"
"github.com/aaarne/ea/ackley"
"github.com/aaarne/ea/evolutionstrategy"
"github.com/aaarne/ea/geneticalgorithm"
"github.com/aaarne/ea/hillclimber"
"github.com/aaarne/ea/optimizer"
)
func main() {
demonstrateHillClimber()
waitKey()
fmt.Println("-------------------------------------------------")
demonstrateGeneticAlgorithm()
waitKey()
fmt.Println("-------------------------------------------------")
demonstratePipelinedGeneticAlgorithm()
waitKey()
fmt.Println("-------------------------------------------------")
demonstrateEvolutionStategy()
}
func waitKey() {
fmt.Println("Press Enter to continue...")
bufio.NewReader(os.Stdin).ReadBytes('\n')
}
func demonstrateHillClimber() {
climber := hillclimber.Hillclimber{
Nmax: 1000,
Delta: 1e-1,
Dim: 6,
}
result := climber.Climb([]float64{5, 1, 9, 10, 1.5, 2.33})
fmt.Println("Hillclimber:")
fmt.Println("\tResult: ", result)
fmt.Println("\tValue: ", ackley.Ackley(result))
fmt.Println()
}
func demonstrateGeneticAlgorithm() {
fmt.Println("Genetic Algorithm")
g := geneticalgorithm.GeneticAlgorithm{
Popsize: 50,
MaxIterations: 25000,
Mutator: geneticalgorithm.NonUniformMutator,
Recombiner: geneticalgorithm.OnePointCrossOver,
Selector: geneticalgorithm.RemainderStochasticSampling,
}
result := g.Optimize(func(individuum optimizer.Fitnessable) bool {
return individuum.GetPhenotype() < 0.05
}, true)
fmt.Println()
fmt.Println("Result: ")
fmt.Println(result)
fmt.Println()
}
func demonstrateEvolutionStategy() {
fmt.Println("Evolution Strategy")
e := evolutionstrategy.EvolutionStrategy{
Popsize: 100,
Lambda: 7,
MaxIterations: 1000,
UpperBound: 40.0,
LowerBound: -40.0,
}
result := e.Optimize(func(individuum optimizer.Fitnessable) bool {
return individuum.GetPhenotype() < 1e-9
}, true)
fmt.Println()
fmt.Println("Result: ")
fmt.Println(result)
fmt.Println()
}
func demonstratePipelinedGeneticAlgorithm() {
fmt.Println("Genetic Algorithm (Pipelined)")
g := geneticalgorithm.GeneticAlgorithm{
Popsize: 100,
MaxIterations: 1e8,
Mutator: geneticalgorithm.NonUniformMutator,
Recombiner: geneticalgorithm.OnePointCrossOver,
Selector: geneticalgorithm.RemainderStochasticSampling,
}
result := g.OptimizePipelined(func(individuum optimizer.Fitnessable) bool {
return individuum.GetPhenotype() < 0.05
}, true)
fmt.Println()
fmt.Println("Result: ")
fmt.Println(result)
fmt.Println()
}