add rnd macro
This commit is contained in:
parent
79357432d7
commit
ed4d53979b
13
src/lib.rs
13
src/lib.rs
|
@ -342,6 +342,12 @@ struct Agent {
|
||||||
goal: Solution,
|
goal: Solution,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
macro_rules! rnd {
|
||||||
|
($max: expr) => {
|
||||||
|
rand::random::<usize>() % $max
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
impl Agent {
|
impl Agent {
|
||||||
const WIN_REWARD: f32 = 100000.0;
|
const WIN_REWARD: f32 = 100000.0;
|
||||||
const BOX_REWARD: f32 = 0.00021;
|
const BOX_REWARD: f32 = 0.00021;
|
||||||
|
@ -354,7 +360,7 @@ impl Agent {
|
||||||
&[Direction::U, Direction::D, Direction::L, Direction::R];
|
&[Direction::U, Direction::D, Direction::L, Direction::R];
|
||||||
|
|
||||||
fn chromo() -> Direction {
|
fn chromo() -> Direction {
|
||||||
Self::DIR_TABLE[rand::random::<usize>() % Self::DIR_TABLE.len()]
|
Self::DIR_TABLE[rnd!(Self::DIR_TABLE.len())]
|
||||||
}
|
}
|
||||||
|
|
||||||
fn with_dna(state: State, dna: Vec<Direction>) -> Self {
|
fn with_dna(state: State, dna: Vec<Direction>) -> Self {
|
||||||
|
@ -374,7 +380,7 @@ impl Agent {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn cross(&mut self, seed: &Self, cr: usize) {
|
fn cross(&mut self, seed: &Self, cr: usize) {
|
||||||
let ratio = (rand::random::<usize>() % cr) + 1;
|
let ratio = rnd!(cr) + 1;
|
||||||
let len = self.dna.len();
|
let len = self.dna.len();
|
||||||
|
|
||||||
self.dna[..len / ratio].copy_from_slice(&seed.dna[..len / ratio]);
|
self.dna[..len / ratio].copy_from_slice(&seed.dna[..len / ratio]);
|
||||||
|
@ -382,8 +388,7 @@ impl Agent {
|
||||||
|
|
||||||
fn mutate(&mut self, max: usize) {
|
fn mutate(&mut self, max: usize) {
|
||||||
let len = self.dna.len();
|
let len = self.dna.len();
|
||||||
let ni = rand::random::<usize>() % max;
|
let (ni, nd) = (rnd!(max), rnd!(len));
|
||||||
let nd = rand::random::<usize>() % len;
|
|
||||||
|
|
||||||
for x in 0..ni {
|
for x in 0..ni {
|
||||||
self.dna[(nd + x) % len] = Agent::chromo();
|
self.dna[(nd + x) % len] = Agent::chromo();
|
||||||
|
|
Loading…
Reference in New Issue