Skip to content

Commit 2a177d0

Browse files
committed
GA
1 parent 02a0d11 commit 2a177d0

File tree

3 files changed

+42
-12
lines changed

3 files changed

+42
-12
lines changed

crossbuild.bat

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
cross build --target x86_64-unknown-linux-gnu

run release.bat run release.bat

File renamed without changes.

src/geneticalgorithm.rs

+41-12
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ use rand::{prelude::ThreadRng, *};
1111
use crate::evaluation::Evaluation;
1212
#[derive(Copy, Clone)]
1313
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,
1616
}
1717

1818
impl Indivisual {
@@ -34,31 +34,42 @@ impl GeneticAlgorithm {
3434

3535
for _i in 0..50 {
3636
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),
4141
0.0,
4242
0.0,
4343
0.0,
4444
0.0,
4545
0.0,
4646
];
4747
indivisuals.push(Indivisual {
48-
evaluation: Self::Function(param[0]),
48+
evaluation: Self::Function(&param),
4949
values: param,
5050
})
5151
}
5252

53+
let mut gen_count = 0;
5354
loop {
55+
indivisuals.sort_by(|a, b| a.evaluation.partial_cmp(&b.evaluation).unwrap());
56+
57+
println!("gen:{}", gen_count);
5458
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+
);
5663
}
5764
println!("---------------");
5865

5966
let index1 = random.gen_range(0..indivisuals.len());
6067
let index2 = random.gen_range(0..indivisuals.len());
6168

69+
if index1 == index2 {
70+
continue;
71+
}
72+
6273
//子作り
6374
let mut childs = Vec::new();
6475
for _i in 0..20 {
@@ -69,6 +80,10 @@ impl GeneticAlgorithm {
6980
));
7081
}
7182

83+
for i in 0..20 {
84+
childs.index_mut(i as usize).evaluation = Self::Function(&childs.index(i).values);
85+
}
86+
7287
childs.push(indivisuals[index1].clone());
7388
childs.push(indivisuals[index2].clone());
7489

@@ -79,11 +94,20 @@ impl GeneticAlgorithm {
7994

8095
*indivisuals.index_mut(index1) = elite;
8196
*indivisuals.index_mut(index2) = roulette;
97+
98+
gen_count += 1;
8299
}
83100
}
84101

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
87111
}
88112

89113
fn learn() {}
@@ -124,7 +148,7 @@ impl GeneticAlgorithm {
124148

125149
let mut test = Vec::new();
126150
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)
128152
}
129153

130154
let result = Self::roulette_choise(&mut test, &mut random);
@@ -145,6 +169,10 @@ impl GeneticAlgorithm {
145169
max += rate[i];
146170
}
147171

172+
if max == 0 {
173+
panic!("?");
174+
}
175+
148176
let mut temp = random.gen_range(0..max);
149177

150178
for i in 0..rate.len() {
@@ -180,10 +208,11 @@ impl GeneticAlgorithm {
180208
best
181209
}
182210

211+
///小さいほうを選ぶ
183212
fn elite_choise(indivisuals: &[Indivisual]) -> Indivisual {
184213
let mut result = Indivisual::new();
185214
for indivisual in indivisuals {
186-
if result.evaluation == f64::MAX || indivisual.evaluation > result.evaluation {
215+
if result.evaluation == f64::MAX || indivisual.evaluation < result.evaluation {
187216
result = *indivisual;
188217
}
189218
}

0 commit comments

Comments
 (0)