add more features to genetic algorithm
This commit is contained in:
parent
43387e966a
commit
5bc21c459d
1 changed files with 44 additions and 2 deletions
|
@ -17,6 +17,8 @@ pub struct Parameters {
|
||||||
bumpiness: f64,
|
bumpiness: f64,
|
||||||
holes: f64,
|
holes: f64,
|
||||||
complete_lines: f64,
|
complete_lines: f64,
|
||||||
|
max_height: f64,
|
||||||
|
max_well_depth: f64,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Parameters {
|
impl Default for Parameters {
|
||||||
|
@ -26,6 +28,8 @@ impl Default for Parameters {
|
||||||
bumpiness: 1.0,
|
bumpiness: 1.0,
|
||||||
holes: 1.0,
|
holes: 1.0,
|
||||||
complete_lines: 1.0,
|
complete_lines: 1.0,
|
||||||
|
max_height: 1.0,
|
||||||
|
max_well_depth: 1.0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -33,11 +37,13 @@ impl Default for Parameters {
|
||||||
impl Parameters {
|
impl Parameters {
|
||||||
fn mutate(mut self, rng: &mut SmallRng) {
|
fn mutate(mut self, rng: &mut SmallRng) {
|
||||||
let mutation_amt = rng.gen_range(-0.2, 0.2);
|
let mutation_amt = rng.gen_range(-0.2, 0.2);
|
||||||
match rng.gen_range(0, 4) {
|
match rng.gen_range(0, 6) {
|
||||||
0 => self.total_height += mutation_amt,
|
0 => self.total_height += mutation_amt,
|
||||||
1 => self.bumpiness += mutation_amt,
|
1 => self.bumpiness += mutation_amt,
|
||||||
2 => self.holes += mutation_amt,
|
2 => self.holes += mutation_amt,
|
||||||
3 => self.complete_lines += mutation_amt,
|
3 => self.complete_lines += mutation_amt,
|
||||||
|
4 => self.max_height += mutation_amt,
|
||||||
|
5 => self.max_well_depth += mutation_amt,
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,7 +51,8 @@ impl Parameters {
|
||||||
+ self.bumpiness.powi(2)
|
+ self.bumpiness.powi(2)
|
||||||
+ self.holes.powi(2)
|
+ self.holes.powi(2)
|
||||||
+ self.complete_lines.powi(2))
|
+ self.complete_lines.powi(2))
|
||||||
.sqrt();
|
+ self.max_height.powi(2)
|
||||||
|
+ self.max_well_depth.powi(2).sqrt();
|
||||||
|
|
||||||
self.total_height /= normalization_factor;
|
self.total_height /= normalization_factor;
|
||||||
self.bumpiness /= normalization_factor;
|
self.bumpiness /= normalization_factor;
|
||||||
|
@ -75,6 +82,8 @@ impl Default for GeneticHeuristicAgent {
|
||||||
bumpiness: rng.gen::<f64>(),
|
bumpiness: rng.gen::<f64>(),
|
||||||
holes: rng.gen::<f64>(),
|
holes: rng.gen::<f64>(),
|
||||||
complete_lines: rng.gen::<f64>(),
|
complete_lines: rng.gen::<f64>(),
|
||||||
|
max_height: rng.gen::<f64>(),
|
||||||
|
max_well_depth: rng.gen::<f64>(),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -118,11 +127,40 @@ impl GeneticHeuristicAgent {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let max_height = heights.iter().max().unwrap().unwrap_or_else(|| 0) as f64;
|
||||||
|
|
||||||
|
let mut max_well_height = 0;
|
||||||
|
|
||||||
|
for i in 0..heights.len() {
|
||||||
|
let left = if i == 0 {
|
||||||
|
20
|
||||||
|
} else {
|
||||||
|
heights[i - 1].unwrap_or_else(|| 0)
|
||||||
|
};
|
||||||
|
|
||||||
|
let right = if i == heights.len() - 1 {
|
||||||
|
20
|
||||||
|
} else {
|
||||||
|
heights[i + 1].unwrap_or_else(|| 0)
|
||||||
|
};
|
||||||
|
|
||||||
|
let well_height = if left > right { right } else { left };
|
||||||
|
max_well_height = *[
|
||||||
|
max_well_height,
|
||||||
|
well_height - heights[i].unwrap_or_else(|| 0),
|
||||||
|
]
|
||||||
|
.iter()
|
||||||
|
.max()
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
Parameters {
|
Parameters {
|
||||||
total_height,
|
total_height,
|
||||||
bumpiness,
|
bumpiness,
|
||||||
complete_lines,
|
complete_lines,
|
||||||
holes: holes as f64,
|
holes: holes as f64,
|
||||||
|
max_height,
|
||||||
|
max_well_depth: max_well_height as f64,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,6 +186,10 @@ impl GeneticHeuristicAgent {
|
||||||
+ other.params.total_height * other_weight,
|
+ other.params.total_height * other_weight,
|
||||||
complete_lines: self.params.total_height * self_weight
|
complete_lines: self.params.total_height * self_weight
|
||||||
+ other.params.total_height * other_weight,
|
+ other.params.total_height * other_weight,
|
||||||
|
max_height: self.params.max_height * self_weight
|
||||||
|
+ other.params.max_height * other_weight,
|
||||||
|
max_well_depth: self.params.max_well_depth * self_weight
|
||||||
|
+ other.params.max_well_depth * other_weight,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in a new issue