use std::fmt::Display;
use crate::algorithms::objective::ImprovementDirection;
use crate::solution::Solution;
use crate::utils::random::Random;
pub trait Problem<T, Q = f64>
where
T: Clone,
Q: Clone + Default,
{
fn new() -> Self;
fn evaluate(&self, solution: &mut Solution<T, Q>);
fn create_solution(&self, _rng: &mut Random) -> Solution<T, Q>;
fn set_problem_description(&mut self, description: String);
fn get_problem_description(&self) -> String;
fn get_improvement_direction(&self) -> ImprovementDirection;
fn get_problem_parameters_payload(&self) -> String {
String::new()
}
fn format_solution(&self, solution: &Solution<T, Q>) -> String
where
T: Display,
Q: Display,
{
let quality_state = if solution.has_quality() {
"evaluated"
} else {
"not evaluated"
};
format!(
"variables={}, quality={}",
solution.num_variables(),
quality_state
)
}
}