Source code for jmetal.algorithm.multiobjective.gde3

from typing import TypeVar, List

from jmetal.config import store
from jmetal.core.algorithm import EvolutionaryAlgorithm, DynamicAlgorithm
from jmetal.core.problem import Problem, DynamicProblem
from jmetal.core.solution import FloatSolution
from jmetal.operator import DifferentialEvolutionCrossover, RankingAndCrowdingDistanceSelection
from jmetal.operator.selection import DifferentialEvolutionSelection
from jmetal.util.comparator import Comparator, DominanceComparator
from jmetal.util.evaluator import Evaluator
from jmetal.util.generator import Generator
from jmetal.util.termination_criterion import TerminationCriterion

S = TypeVar('S')
R = List[S]


[docs]class GDE3(EvolutionaryAlgorithm[FloatSolution, FloatSolution]): def __init__(self, problem: Problem, population_size: int, cr: float, f: float, termination_criterion: TerminationCriterion = store.default_termination_criteria, k: float = 0.5, population_generator: Generator = store.default_generator, population_evaluator: Evaluator = store.default_evaluator, dominance_comparator: Comparator = store.default_comparator): super(GDE3, self).__init__( problem=problem, population_size=population_size, offspring_population_size=population_size) self.dominance_comparator = dominance_comparator self.selection_operator = DifferentialEvolutionSelection() self.crossover_operator = DifferentialEvolutionCrossover(cr, f, k) self.population_generator = population_generator self.population_evaluator = population_evaluator self.termination_criterion = termination_criterion self.observable.register(termination_criterion)
[docs] def selection(self, population: List[FloatSolution]) -> List[FloatSolution]: mating_pool = [] for i in range(self.population_size): self.selection_operator.set_index_to_exclude(i) selected_solutions = self.selection_operator.execute(self.solutions) mating_pool = mating_pool + selected_solutions return mating_pool
[docs] def reproduction(self, mating_pool: List[S]) -> List[S]: offspring_population = [] first_parent_index = 0 for solution in self.solutions: self.crossover_operator.current_individual = solution parents = mating_pool[first_parent_index:first_parent_index + 3] first_parent_index += 3 offspring_population.append(self.crossover_operator.execute(parents)[0]) return offspring_population
[docs] def replacement(self, population: List[S], offspring_population: List[FloatSolution]) -> List[List[FloatSolution]]: tmp_list = [] for solution1, solution2 in zip(self.solutions, offspring_population): result = self.dominance_comparator.compare(solution1, solution2) if result == -1: tmp_list.append(solution1) elif result == 1: tmp_list.append(solution2) else: tmp_list.append(solution1) tmp_list.append(solution2) join_population = population + offspring_population return RankingAndCrowdingDistanceSelection( self.population_size, dominance_comparator=self.dominance_comparator ).execute(join_population)
[docs] def create_initial_solutions(self) -> List[FloatSolution]: return [self.population_generator.new(self.problem) for _ in range(self.population_size)]
[docs] def evaluate(self, solution_list: List[FloatSolution]) -> List[FloatSolution]: return self.population_evaluator.evaluate(solution_list, self.problem)
[docs] def stopping_condition_is_met(self) -> bool: return self.termination_criterion.is_met
[docs] def get_result(self) -> List[FloatSolution]: return self.solutions
[docs] def get_name(self) -> str: return 'GDE3'
[docs]class DynamicGDE3(GDE3, DynamicAlgorithm): def __init__(self, problem: DynamicProblem, population_size: int, cr: float, f: float, termination_criterion: TerminationCriterion, k: float = 0.5, population_generator: Generator = store.default_generator, population_evaluator: Evaluator = store.default_evaluator, dominance_comparator: Comparator = DominanceComparator()): super(DynamicGDE3, self).__init__( problem, population_size, cr, f, termination_criterion, k, population_generator, population_evaluator, dominance_comparator) self.completed_iterations = 0
[docs] def restart(self) -> None: pass
[docs] def update_progress(self): if self.problem.the_problem_has_changed(): self.restart() self.problem.clear_changed() observable_data = self.get_observable_data() self.observable.notify_all(**observable_data) self.evaluations += self.offspring_population_size
[docs] def stopping_condition_is_met(self): if self.termination_criterion.is_met: observable_data = self.get_observable_data() self.observable.notify_all(**observable_data) self.restart() self.init_progress() self.completed_iterations += 1