@@ -11,8 +11,8 @@ use rand::{prelude::ThreadRng, *};
11
11
use crate :: evaluation:: Evaluation ;
12
12
#[ derive( Copy , Clone ) ]
13
13
struct Indivisual {
14
- values : [ f64 ; Evaluation :: WEIGHT_COUNT as usize ] ,
15
- evaluation : f64 ,
14
+ pub values : [ f64 ; Evaluation :: WEIGHT_COUNT as usize ] ,
15
+ pub evaluation : f64 ,
16
16
}
17
17
18
18
impl Indivisual {
@@ -34,31 +34,42 @@ impl GeneticAlgorithm {
34
34
35
35
for _i in 0 ..50 {
36
36
let param = [
37
- Self :: get_random ( -5.12 , 5 .12, & mut random) ,
38
- 0.0 ,
39
- 0.0 ,
40
- 0.0 ,
37
+ Self :: get_random ( -5.12 , - 2 .12, & mut random) ,
38
+ Self :: get_random ( - 5.12 , - 2.12 , & mut random ) ,
39
+ Self :: get_random ( - 5.12 , - 2.12 , & mut random ) ,
40
+ Self :: get_random ( - 5.12 , - 2.12 , & mut random ) ,
41
41
0.0 ,
42
42
0.0 ,
43
43
0.0 ,
44
44
0.0 ,
45
45
0.0 ,
46
46
] ;
47
47
indivisuals. push ( Indivisual {
48
- evaluation : Self :: Function ( param[ 0 ] ) ,
48
+ evaluation : Self :: Function ( & param) ,
49
49
values : param,
50
50
} )
51
51
}
52
52
53
+ let mut gen_count = 0 ;
53
54
loop {
55
+ indivisuals. sort_by ( |a, b| a. evaluation . partial_cmp ( & b. evaluation ) . unwrap ( ) ) ;
56
+
57
+ println ! ( "gen:{}" , gen_count) ;
54
58
for i in 0 ..indivisuals. len ( ) {
55
- println ! ( "{},{}" , indivisuals[ i] . values[ 0 ] , indivisuals[ i] . evaluation) ;
59
+ println ! (
60
+ "値:{}:{},評価:{}" ,
61
+ indivisuals[ i] . values[ 0 ] , indivisuals[ i] . values[ 1 ] , indivisuals[ i] . evaluation
62
+ ) ;
56
63
}
57
64
println ! ( "---------------" ) ;
58
65
59
66
let index1 = random. gen_range ( 0 ..indivisuals. len ( ) ) ;
60
67
let index2 = random. gen_range ( 0 ..indivisuals. len ( ) ) ;
61
68
69
+ if index1 == index2 {
70
+ continue ;
71
+ }
72
+
62
73
//子作り
63
74
let mut childs = Vec :: new ( ) ;
64
75
for _i in 0 ..20 {
@@ -69,6 +80,10 @@ impl GeneticAlgorithm {
69
80
) ) ;
70
81
}
71
82
83
+ for i in 0 ..20 {
84
+ childs. index_mut ( i as usize ) . evaluation = Self :: Function ( & childs. index ( i) . values ) ;
85
+ }
86
+
72
87
childs. push ( indivisuals[ index1] . clone ( ) ) ;
73
88
childs. push ( indivisuals[ index2] . clone ( ) ) ;
74
89
@@ -79,11 +94,20 @@ impl GeneticAlgorithm {
79
94
80
95
* indivisuals. index_mut ( index1) = elite;
81
96
* indivisuals. index_mut ( index2) = roulette;
97
+
98
+ gen_count += 1 ;
82
99
}
83
100
}
84
101
85
- fn Function ( x : f64 ) -> f64 {
86
- x. powf ( 2.0 ) as f64 - 10 as f64 * ( 2 as f64 * PI * x as f64 ) . cos ( )
102
+ fn Function ( array : & [ f64 ] ) -> f64 {
103
+ let mut result = 0.0 ;
104
+ for i in 0 ..array. len ( ) {
105
+ result += ( array[ i] . powf ( 2.0 ) as f64
106
+ - 10 as f64 * ( 2 as f64 * PI * array[ i] as f64 ) . cos ( )
107
+ + 10 as f64 )
108
+ }
109
+
110
+ result
87
111
}
88
112
89
113
fn learn ( ) { }
@@ -124,7 +148,7 @@ impl GeneticAlgorithm {
124
148
125
149
let mut test = Vec :: new ( ) ;
126
150
for i in 0 ..indivisuals. len ( ) {
127
- test. push ( ( indivisuals[ i] . evaluation * 10000 as f64 ) as i32 )
151
+ test. push ( ( indivisuals[ i] . evaluation * 100 as f64 ) as i32 )
128
152
}
129
153
130
154
let result = Self :: roulette_choise ( & mut test, & mut random) ;
@@ -145,6 +169,10 @@ impl GeneticAlgorithm {
145
169
max += rate[ i] ;
146
170
}
147
171
172
+ if max == 0 {
173
+ panic ! ( "?" ) ;
174
+ }
175
+
148
176
let mut temp = random. gen_range ( 0 ..max) ;
149
177
150
178
for i in 0 ..rate. len ( ) {
@@ -180,10 +208,11 @@ impl GeneticAlgorithm {
180
208
best
181
209
}
182
210
211
+ ///小さいほうを選ぶ
183
212
fn elite_choise ( indivisuals : & [ Indivisual ] ) -> Indivisual {
184
213
let mut result = Indivisual :: new ( ) ;
185
214
for indivisual in indivisuals {
186
- if result. evaluation == f64:: MAX || indivisual. evaluation > result. evaluation {
215
+ if result. evaluation == f64:: MAX || indivisual. evaluation < result. evaluation {
187
216
result = * indivisual;
188
217
}
189
218
}
0 commit comments