use std::fmt;
#[non_exhaustive]
#[derive(Clone, Debug)]
pub enum TemperatureSchedule {
Triki {
initial_temperature: f64,
delta: f64,
},
Cauchy {
initial_temperature: f64,
},
Geometric {
initial_temperature: f64,
},
None,
}
#[non_exhaustive]
#[derive(Clone, Debug)]
pub enum OperationalLearning {
Multinomial {
learning_rate: f64,
initial_learning_matrix: Vec<f64>,
},
Markov {
learning_rate: f64,
initial_learning_matrix: Vec<Vec<f64>>,
},
HiddenMarkov {
learning_rate: f64,
initial_transition_matrix: Vec<Vec<f64>>,
initial_emission_matrix: Vec<Vec<f64>>,
},
None,
}
#[non_exhaustive]
#[derive(Clone, Debug)]
pub enum CommunicationStyle {
ConstantFrequency {
frequency: f64,
},
RegularInterval {
interval: usize,
},
ScheduledMeetings {
times: Vec<usize>,
},
None,
}
#[derive(Clone, Debug)]
pub struct Parameters {
pub number_of_teams: usize,
pub number_of_agents: usize,
pub number_of_iterations: usize,
pub temperature_schedule: TemperatureSchedule,
pub operational_learning: OperationalLearning,
pub communication: CommunicationStyle,
pub self_bias: f64,
pub quality_bias: f64,
pub satisficing_fraction: f64,
}
impl Parameters {
pub fn load_from_file(&mut self, file_name: String) {
unimplemented!()
}
pub fn verify(&self) {
if self.satisficing_fraction < 0.0 || self.satisficing_fraction > 1.0 {
panic!("The satisficing fraction must be between 0 and 1 inclusive.");
}
}
pub fn hsat() -> Self {
Parameters {
temperature_schedule: TemperatureSchedule::Triki {
initial_temperature: 100.0,
delta: 0.05,
},
communication: CommunicationStyle::RegularInterval { interval: 1 },
self_bias: 0.0,
quality_bias: 0.0,
satisficing_fraction: 0.0,
..Default::default()
}
}
}
impl Default for Parameters {
fn default() -> Self {
Parameters {
number_of_teams: 1,
number_of_agents: 3,
number_of_iterations: 100,
temperature_schedule: TemperatureSchedule::Geometric {
initial_temperature: 1.0,
},
operational_learning: OperationalLearning::None,
communication: CommunicationStyle::None,
self_bias: 1.0,
quality_bias: 1.0,
satisficing_fraction: 0.5,
}
}
}
#[allow(unused_must_use)]
impl fmt::Display for Parameters {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
writeln!(f, " - {} teams", self.number_of_teams);
writeln!(f, " - {} agents", self.number_of_agents);
writeln!(f, " - {} iterations", self.number_of_iterations);
match self.temperature_schedule {
TemperatureSchedule::Triki {
initial_temperature,
delta,
} => {
writeln!(f, " - Triki annealing schedule");
writeln!(f, " - initial_temperature = {}", initial_temperature);
writeln!(f, " - delta = {}", delta);
}
TemperatureSchedule::Cauchy {
initial_temperature,
} => {
writeln!(f, " - Cauchy annealing schedule");
writeln!(f, " - initial_temperature = {}", initial_temperature);
}
TemperatureSchedule::Geometric {
initial_temperature,
} => {
writeln!(f, " - Geometric annealing schedule");
writeln!(f, " - initial_temperature = {}", initial_temperature);
}
TemperatureSchedule::None => {
writeln!(f, " - No annealing schedule");
}
}
match &self.operational_learning {
OperationalLearning::Multinomial {
learning_rate,
initial_learning_matrix,
} => {
writeln!(f, " - Multinomial learning style");
writeln!(f, " - learning rate = {}", learning_rate);
}
OperationalLearning::Markov {
learning_rate,
initial_learning_matrix,
} => {
writeln!(f, " - Markov Chain learning style");
writeln!(f, " - learning rate = {}", learning_rate);
}
OperationalLearning::HiddenMarkov { learning_rate, .. } => {
writeln!(f, " - Hidden Markov learning style");
writeln!(f, " - learning rate = {}", learning_rate);
}
OperationalLearning::None => {
writeln!(f, " - No operational learning");
}
}
writeln!(f, " - self bias = {}", self.self_bias);
writeln!(f, " - quality bias = {}", self.quality_bias);
writeln!(f, " - satisficing fraction = {}", self.satisficing_fraction);
Ok(())
}
}