From 0ab44c8ff2b26da0dd136d2e47efde0873789c9f Mon Sep 17 00:00:00 2001 From: Gromwud Date: Mon, 22 Sep 2025 11:24:44 +0300 Subject: [PATCH 1/6] compare obj functions instead of equations --- epde/optimizers/moeadd/moeadd.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/epde/optimizers/moeadd/moeadd.py b/epde/optimizers/moeadd/moeadd.py index c277c53c..6706549f 100644 --- a/epde/optimizers/moeadd/moeadd.py +++ b/epde/optimizers/moeadd/moeadd.py @@ -157,7 +157,7 @@ def delete_point(self, point): for level in self.levels: temp = [] for element in level: - if element != point or element in history: + if element.obj_fun != point.obj_fun or element in history: temp.append(element) history.append(element) if not len(temp) == 0: @@ -166,7 +166,7 @@ def delete_point(self, point): population_cleared = [] history = [] for elem in self.population: - if elem != point or elem in history: + if elem.obj_fun != point.obj_fun or elem in history: population_cleared.append(elem) history.append(elem) From f1b114e711b99fc59c57b5695326bf154844e723 Mon Sep 17 00:00:00 2001 From: Gromwud Date: Mon, 22 Sep 2025 11:27:31 +0300 Subject: [PATCH 2/6] always mutate params of the equation --- epde/operators/multiobjective/mutations.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/epde/operators/multiobjective/mutations.py b/epde/operators/multiobjective/mutations.py index 0722ac03..69d865f6 100644 --- a/epde/operators/multiobjective/mutations.py +++ b/epde/operators/multiobjective/mutations.py @@ -39,11 +39,11 @@ def apply(self, objective : SoEq, arguments : dict): # TODO: add setter for best altered_objective.vals.replace_gene(gene_key = eq_key, value = altered_eq) - for param_key in params_keys: - altered_param = self.suboperators['param_mutation'].apply(altered_objective.vals[param_key], - subop_args['param_mutation']) - altered_objective.vals.replace_gene(gene_key = param_key, value = altered_param) - altered_objective.vals.pass_parametric_gene(key = param_key, value = altered_param) + for param_key in params_keys: + altered_param = self.suboperators['param_mutation'].apply(altered_objective.vals[param_key], + subop_args['param_mutation']) + altered_objective.vals.replace_gene(gene_key = param_key, value = altered_param) + altered_objective.vals.pass_parametric_gene(key = param_key, value = altered_param) altered_objective.reset_state() # Использовать ли reset_right_part return altered_objective From eadf9e79dd24021731dc1c966109c0d9a6a7b08a Mon Sep 17 00:00:00 2001 From: Gromwud Date: Mon, 22 Sep 2025 11:52:10 +0300 Subject: [PATCH 3/6] Do not mutate right after crossover --- epde/operators/multiobjective/moeadd_specific.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/epde/operators/multiobjective/moeadd_specific.py b/epde/operators/multiobjective/moeadd_specific.py index e363242a..b1dd1cd8 100644 --- a/epde/operators/multiobjective/moeadd_specific.py +++ b/epde/operators/multiobjective/moeadd_specific.py @@ -349,10 +349,11 @@ def apply(self, objective: ParetoLevels, arguments: dict): while objective.unplaced_candidates: offspring = objective.unplaced_candidates.pop() - attempt = 1; + attempt = 1 attempt_limit = self.params['attempt_limit'] - temp_offspring = self.suboperators['chromosome_mutation'].apply(objective=offspring, - arguments=subop_args['chromosome_mutation']) + # temp_offspring = self.suboperators['chromosome_mutation'].apply(objective=offspring, + # arguments=subop_args['chromosome_mutation']) + temp_offspring = offspring while True: self.suboperators['right_part_selector'].apply(objective=temp_offspring, arguments=subop_args['right_part_selector']) From 232bf27158b676f0e303b9241544ec349127ae1c Mon Sep 17 00:00:00 2001 From: Gromwud Date: Mon, 22 Sep 2025 13:20:42 +0300 Subject: [PATCH 4/6] Resolve ambiguity --- epde/operators/common/coeff_calculation.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/epde/operators/common/coeff_calculation.py b/epde/operators/common/coeff_calculation.py index 7feacd67..f183dbe5 100644 --- a/epde/operators/common/coeff_calculation.py +++ b/epde/operators/common/coeff_calculation.py @@ -81,7 +81,10 @@ def apply(self, objective : Equation, arguments : dict = None): for weight_idx in range(len(weights)-1): if weight_idx in nonzero_features_indexes: weights[weight_idx] = valueable_weights[nonzero_features_indexes.index(weight_idx)] - weights[-1] = valueable_weights[-1] + weights[-1] = valueable_weights[-1] + nonzero_terms_mask = np.array([False if np.isclose(weight, 0) else True for weight in weights]) + weights = np.array([item if keep else 0 for item, keep in zip(weights, nonzero_terms_mask)]) + objective.weights_internal = np.array([item if keep else 0 for item, keep in zip(objective.weights_internal, nonzero_terms_mask[:-1])]) objective.weights_final_evald = True objective.weights_final = weights From 787c6c314975af8def94519095169186f34fa829 Mon Sep 17 00:00:00 2001 From: Gromwud Date: Mon, 22 Sep 2025 13:21:08 +0300 Subject: [PATCH 5/6] Point removal bugfix --- epde/optimizers/moeadd/moeadd.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/epde/optimizers/moeadd/moeadd.py b/epde/optimizers/moeadd/moeadd.py index 6706549f..a812a849 100644 --- a/epde/optimizers/moeadd/moeadd.py +++ b/epde/optimizers/moeadd/moeadd.py @@ -157,18 +157,18 @@ def delete_point(self, point): for level in self.levels: temp = [] for element in level: - if element.obj_fun != point.obj_fun or element in history: + if not np.array_equal(element.obj_fun, point.obj_fun) or any(np.array_equal(element.obj_fun, h) for h in history): temp.append(element) - history.append(element) + history.append(element.obj_fun) if not len(temp) == 0: new_levels.append(temp) population_cleared = [] history = [] for elem in self.population: - if elem.obj_fun != point.obj_fun or elem in history: + if not np.array_equal(elem.obj_fun, point.obj_fun) or any(np.array_equal(elem.obj_fun, h) for h in history): population_cleared.append(elem) - history.append(elem) + history.append(elem.obj_fun) if len(population_cleared) != sum([len(level) for level in new_levels]): print(len(population_cleared), len(self.population), sum([len(level) for level in new_levels])) From 0bb0177af6a43b9576e23bee9b8a340071be2622 Mon Sep 17 00:00:00 2001 From: Gromwud Date: Mon, 22 Sep 2025 13:21:47 +0300 Subject: [PATCH 6/6] moeadd_specific.py update --- epde/operators/multiobjective/moeadd_specific.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/epde/operators/multiobjective/moeadd_specific.py b/epde/operators/multiobjective/moeadd_specific.py index b1dd1cd8..388bfa4f 100644 --- a/epde/operators/multiobjective/moeadd_specific.py +++ b/epde/operators/multiobjective/moeadd_specific.py @@ -351,23 +351,20 @@ def apply(self, objective: ParetoLevels, arguments: dict): offspring = objective.unplaced_candidates.pop() attempt = 1 attempt_limit = self.params['attempt_limit'] - # temp_offspring = self.suboperators['chromosome_mutation'].apply(objective=offspring, - # arguments=subop_args['chromosome_mutation']) - temp_offspring = offspring + temp_offspring = self.suboperators['chromosome_mutation'].apply(objective=offspring, + arguments=subop_args['chromosome_mutation']) while True: self.suboperators['right_part_selector'].apply(objective=temp_offspring, arguments=subop_args['right_part_selector']) self.suboperators['chromosome_fitness'].apply(objective=temp_offspring, arguments=subop_args['chromosome_fitness']) - if all([not np.allclose(temp_offspring.obj_fun, solution.obj_fun) for solution in objective.population]): + if all([not np.array_equal(temp_offspring.obj_fun, solution.obj_fun) for solution in objective.population]): self.suboperators['pareto_level_updater'].apply(objective=(temp_offspring, objective), arguments=subop_args['pareto_level_updater']) break elif attempt >= attempt_limit: - # print('The algorithm had issues with generating unique offsprings.') temp_offspring.create() - # temp_offspring.reset_state() attempt = 1 self.suboperators['chromosome_mutation'].apply(objective=temp_offspring, arguments=subop_args['chromosome_mutation'])