use rand::{thread_rng, Rng};
use crate::decay::Decay;
use super::Choice;
pub struct EpsilonGreedy<D: Decay> {
epsilon: D,
}
impl<D: Decay> EpsilonGreedy<D> {
pub fn new(decay: D) -> Self {
Self { epsilon: decay }
}
pub fn choose(&self, episode: u32) -> Choice {
let epsilon = self.epsilon.evaluate(episode as f32);
if thread_rng().gen::<f32>() > epsilon {
Choice::Exploit
} else {
Choice::Explore
}
}
}