scirs2_optimize/multi_objective/algorithms/
moead.rs1use super::{MultiObjectiveOptimizer, MultiObjectiveResult};
6use crate::error::OptimizeError;
7use crate::multi_objective::solutions::{Population, Solution};
8use ndarray::{Array1, ArrayView1};
9
10#[derive(Debug, Clone)]
12pub struct MOEAD {
13 population_size: usize,
14 n_objectives: usize,
15 n_variables: usize,
16 weight_vectors: Vec<Vec<f64>>,
17 neighborhood_size: usize,
18 population: Population,
19 generation: usize,
20 evaluations: usize,
21}
22
23impl MOEAD {
24 pub fn new(population_size: usize, n_objectives: usize, n_variables: usize) -> Self {
26 Self {
27 population_size,
28 n_objectives,
29 n_variables,
30 weight_vectors: Vec::new(),
31 neighborhood_size: 20,
32 population: Population::with_capacity(population_size, n_objectives, n_variables),
33 generation: 0,
34 evaluations: 0,
35 }
36 }
37
38 fn generate_weight_vectors(&mut self) {
40 }
42
43 fn tchebycheff(&self, objectives: &[f64], weight: &[f64], ideal_point: &[f64]) -> f64 {
45 objectives
46 .iter()
47 .zip(weight.iter())
48 .zip(ideal_point.iter())
49 .map(|((obj, w), ideal)| w * (obj - ideal).abs())
50 .fold(0.0_f64, |a, b| a.max(b))
51 }
52}
53
54impl MultiObjectiveOptimizer for MOEAD {
55 fn optimize<F>(&mut self, objective_function: F) -> Result<MultiObjectiveResult, OptimizeError>
56 where
57 F: Fn(&ArrayView1<f64>) -> Array1<f64> + Send + Sync,
58 {
59 Ok(MultiObjectiveResult {
61 pareto_front: Vec::new(),
62 population: Vec::new(),
63 n_evaluations: 0,
64 n_generations: 0,
65 success: true,
66 message: "MOEA/D not yet implemented".to_string(),
67 hypervolume: Some(0.0),
68 metrics: Default::default(),
69 })
70 }
71
72 fn evolve_generation<F>(&mut self, _objective_function: &F) -> Result<(), OptimizeError>
73 where
74 F: Fn(&ArrayView1<f64>) -> Array1<f64> + Send + Sync,
75 {
76 self.generation += 1;
77 Ok(())
78 }
79
80 fn initialize_population(&mut self) -> Result<(), OptimizeError> {
81 Ok(())
83 }
84
85 fn check_convergence(&self) -> bool {
86 false
88 }
89
90 fn get_population(&self) -> &Population {
91 &self.population
92 }
93
94 fn get_generation(&self) -> usize {
95 self.generation
96 }
97
98 fn get_evaluations(&self) -> usize {
99 self.evaluations
100 }
101
102 fn name(&self) -> &str {
103 "MOEA/D"
104 }
105}