use genetic_algorithm_fn::function;
use genetic_algorithm_fn::solutions;
use genetic_algorithm_fn::test_functions;
use genetic_algorithm_traits::Individual;
use genetic_algorithm_traits::Population;
#[test]
fn test_end_to_end() {
let function_to_optimize = function::Function::new(|x| {
Ok(-test_functions::hartman_3_dimensional(
*x.get(0)
.ok_or(function::FunctionError::WrongNumberOfEntries {
expected_number_of_entries: 3,
actual_number_of_entries: x.len(),
})?,
*x.get(1)
.ok_or(function::FunctionError::WrongNumberOfEntries {
expected_number_of_entries: 3,
actual_number_of_entries: x.len(),
})?,
*x.get(2)
.ok_or(function::FunctionError::WrongNumberOfEntries {
expected_number_of_entries: 3,
actual_number_of_entries: x.len(),
})?,
))
});
let solutions = solutions::Solutions::random(50, -10.0..10.0, 3);
let max_fit_initial =
solutions.get_n_fittest(1, &function_to_optimize)[0].fitness(&function_to_optimize);
let optimized_solutions =
solutions::evolve_population(solutions, 100, 20, &function_to_optimize, 0);
let max_fit_optimized = optimized_solutions.get_n_fittest(1, &function_to_optimize)[0]
.fitness(&function_to_optimize);
assert!(max_fit_initial < max_fit_optimized);
}