72 lines
1.9 KiB
Rust
72 lines
1.9 KiB
Rust
// https://codemyroad.wordpress.com/2013/04/14/tetris-ai-the-near-perfect-player/
|
|
|
|
use super::Actor;
|
|
use rand::rngs::SmallRng;
|
|
use rand::Rng;
|
|
|
|
pub struct Parameters {
|
|
total_height: f64,
|
|
bumpiness: f64,
|
|
holes: f64,
|
|
complete_lines: f64,
|
|
}
|
|
|
|
impl Parameters {
|
|
fn mutate(mut self, rng: &mut SmallRng) {
|
|
let mutation_amt = rng.gen_range(-0.2, 0.2);
|
|
match rng.gen_range(0, 4) {
|
|
0 => self.total_height += mutation_amt,
|
|
1 => self.bumpiness += mutation_amt,
|
|
2 => self.holes += mutation_amt,
|
|
3 => self.complete_lines += mutation_amt,
|
|
_ => unreachable!(),
|
|
}
|
|
|
|
let normalization_factor = (self.total_height.powi(2)
|
|
+ self.bumpiness.powi(2)
|
|
+ self.holes.powi(2)
|
|
+ self.complete_lines.powi(2))
|
|
.sqrt();
|
|
|
|
self.total_height /= normalization_factor;
|
|
self.bumpiness /= normalization_factor;
|
|
self.holes /= normalization_factor;
|
|
self.complete_lines /= normalization_factor;
|
|
}
|
|
}
|
|
|
|
pub struct GeneticHeuristicAgent {}
|
|
|
|
impl Actor for GeneticHeuristicAgent {
|
|
fn get_action(
|
|
&self,
|
|
rng: &mut SmallRng,
|
|
state: &super::State,
|
|
legal_actions: &[crate::game::Action],
|
|
) -> crate::game::Action {
|
|
unimplemented!()
|
|
}
|
|
fn update(
|
|
&mut self,
|
|
state: super::State,
|
|
action: crate::game::Action,
|
|
next_state: super::State,
|
|
next_legal_actions: &[crate::game::Action],
|
|
reward: f64,
|
|
) {
|
|
unimplemented!()
|
|
}
|
|
fn set_learning_rate(&mut self, learning_rate: f64) {
|
|
unimplemented!()
|
|
}
|
|
fn set_exploration_prob(&mut self, exploration_prob: f64) {
|
|
unimplemented!()
|
|
}
|
|
fn set_discount_rate(&mut self, discount_rate: f64) {
|
|
unimplemented!()
|
|
}
|
|
fn dbg(&self) {
|
|
unimplemented!()
|
|
}
|
|
}
|