Skip to content

Commit

Permalink
Feature/mixed solution (#73)
Browse files Browse the repository at this point in the history
* Working on implementing a IntegerFloatSolution class

* Add unit test cases for class IntegerFloatProblem

* Add class NMMin

* Add class IntegerFloatSBXCrossover

* Add test cases for SBXCrossover

* Still working on implementing an approach for the IntegerFloatSolution class

* Add user defined exceptiones in file checking.py

* Working on the implementation of class CompositeSolution

* Workon on class CompositeSolution

* Class CompositeMutation implemented and tested

* Fix a bug in class Neighborhood

* Class CompositeCrossover implemented and tested

* Add class

* Add class

* Rename file

* Add problem ZDT1Modified

* Add examples with NSGA-II

* Add NSGA-II examples

* Optimize imports

* Minor changes

* Changes on attribute name

Co-authored-by: Yebisu <[email protected]>
  • Loading branch information
benhid and Yebisu authored Feb 17, 2020
1 parent e2c448e commit 8c0a6cf
Show file tree
Hide file tree
Showing 81 changed files with 1,131 additions and 184 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ algorithm = NSGAII(
offspring_population_size=100,
mutation=PolynomialMutation(probability=1.0 / problem.number_of_variables, distribution_index=20),
crossover=SBXCrossover(probability=1.0, distribution_index=20),
termination_criterion=StoppingByEvaluations(max=25000)
termination_criterion=StoppingByEvaluations(max_evaluations=25000)
)

algorithm.run()
Expand Down Expand Up @@ -99,7 +99,7 @@ plot_front.plot(front, label='NSGAII-ZDT1', filename='NSGAII-ZDT1', format='png'
<img src=docs/source/_static/NSGAII-ZDT1.png width=450 alt="Pareto front approximation">

## Features
The current release of jMetalPy (v1.5.3) contains the following components:
The current release of jMetalPy (v1.5.4) contains the following components:

* Algorithms: local search, genetic algorithm, evolution strategy, simulated annealing, random search, NSGA-II, NSGA-III, SMPSO, OMOPSO, MOEA/D, MOEA/D-DRA, MOEA/D-IEpsilon, GDE3, SPEA2, HYPE, IBEA. Preference articulation-based algorithms (G-NSGA-II, G-GDE3, G-SPEA2, SMPSO/RP); Dynamic versions of NSGA-II, SMPSO, and GDE3.
* Parallel computing based on Apache Spark and Dask.
Expand Down
6 changes: 3 additions & 3 deletions examples/experiment/comparison.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ def configure_experiment(problems: dict, n_run: int):
mutation=PolynomialMutation(probability=1.0 / problem.number_of_variables,
distribution_index=20),
crossover=SBXCrossover(probability=1.0, distribution_index=20),
termination_criterion=StoppingByEvaluations(max=max_evaluations)
termination_criterion=StoppingByEvaluations(max_evaluations=max_evaluations)
),
algorithm_tag='NSGAII',
problem_tag=problem_tag,
Expand All @@ -38,7 +38,7 @@ def configure_experiment(problems: dict, n_run: int):
population_size=100,
cr=0.5,
f=0.5,
termination_criterion=StoppingByEvaluations(max=max_evaluations)
termination_criterion=StoppingByEvaluations(max_evaluations=max_evaluations)
),
algorithm_tag='GDE3',
problem_tag=problem_tag,
Expand All @@ -53,7 +53,7 @@ def configure_experiment(problems: dict, n_run: int):
mutation=PolynomialMutation(probability=1.0 / problem.number_of_variables,
distribution_index=20),
leaders=CrowdingDistanceArchive(100),
termination_criterion=StoppingByEvaluations(max=max_evaluations)
termination_criterion=StoppingByEvaluations(max_evaluations=max_evaluations)
),
algorithm_tag='SMPSO',
problem_tag=problem_tag,
Expand Down
2 changes: 1 addition & 1 deletion examples/multiobjective/gde3/dynamic_gde3.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
population_size=100,
cr=0.5,
f=0.5,
termination_criterion=StoppingByEvaluations(max=500)
termination_criterion=StoppingByEvaluations(max_evaluations=500)
)

algorithm.observable.register(observer=PlotFrontToFileObserver('dynamic_front_vis'))
Expand Down
4 changes: 2 additions & 2 deletions examples/multiobjective/gde3/gde3_spark_evaluator.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from examples.multiobjective.zdt1_modified import ZDT1Modified
from jmetal.algorithm.multiobjective.gde3 import GDE3
from jmetal.problem.multiobjective.zdt import ZDT1Modified
from jmetal.util.evaluator import SparkEvaluator
from jmetal.util.solution import print_function_values_to_file, print_variables_to_file
from jmetal.util.termination_criterion import StoppingByEvaluations
Expand All @@ -12,7 +12,7 @@
population_size=10,
cr=0.5,
f=0.5,
termination_criterion=StoppingByEvaluations(max=100),
termination_criterion=StoppingByEvaluations(max_evaluations=100),
population_evaluator=SparkEvaluator()
)

Expand Down
2 changes: 1 addition & 1 deletion examples/multiobjective/gde3/ggde3_zdt2.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
population_size=100,
cr=0.5,
f=0.5,
termination_criterion=StoppingByEvaluations(max=max_evaluations),
termination_criterion=StoppingByEvaluations(max_evaluations=max_evaluations),
dominance_comparator=GDominanceComparator(reference_point)
)

Expand Down
2 changes: 1 addition & 1 deletion examples/multiobjective/ibea/ibea_zdt1.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
offspring_population_size=100,
mutation=PolynomialMutation(probability=1.0 / problem.number_of_variables, distribution_index=20),
crossover=SBXCrossover(probability=1.0, distribution_index=20),
termination_criterion=StoppingByEvaluations(25000)
termination_criterion=StoppingByEvaluations(max_evaluations=25000)
)

algorithm.run()
Expand Down
4 changes: 1 addition & 3 deletions examples/multiobjective/mocell/mocell_zdt1.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
from jmetal.util.solution_list import print_function_values_to_file, print_variables_to_file

from jmetal.algorithm.multiobjective.mocell import MOCell
from jmetal.lab.visualization import Plot
from jmetal.operator import SBXCrossover, PolynomialMutation
from jmetal.problem import ZDT1
from jmetal.util.archive import CrowdingDistanceArchive
from jmetal.util.neighborhood import C9
from jmetal.util.observer import ProgressBarObserver
from jmetal.util.solution import read_solutions
from jmetal.util.termination_criterion import StoppingByEvaluations

Expand All @@ -22,7 +20,7 @@
archive=CrowdingDistanceArchive(100),
mutation=PolynomialMutation(probability=1.0 / problem.number_of_variables, distribution_index=20),
crossover=SBXCrossover(probability=1.0, distribution_index=20),
termination_criterion=StoppingByEvaluations(max=max_evaluations)
termination_criterion=StoppingByEvaluations(max_evaluations=max_evaluations)
)

algorithm.run()
Expand Down
2 changes: 1 addition & 1 deletion examples/multiobjective/moead/moead_dtlz2.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
neighbourhood_selection_probability=0.9,
max_number_of_replaced_solutions=2,
weight_files_path='resources/MOEAD_weights',
termination_criterion=StoppingByEvaluations(max=max_evaluations)
termination_criterion=StoppingByEvaluations(max_evaluations=max_evaluations)
)

algorithm.run()
Expand Down
2 changes: 1 addition & 1 deletion examples/multiobjective/moead/moead_iepsilon_lircmop1.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
neighbourhood_selection_probability=0.9,
max_number_of_replaced_solutions=2,
weight_files_path='resources/MOEAD_weights',
termination_criterion=StoppingByEvaluations(max=max_evaluations)
termination_criterion=StoppingByEvaluations(max_evaluations=max_evaluations)
)

algorithm.run()
Expand Down
2 changes: 1 addition & 1 deletion examples/multiobjective/moead/moead_lz09.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
neighbourhood_selection_probability=0.9,
max_number_of_replaced_solutions=2,
weight_files_path='resources/MOEAD_weights',
termination_criterion=StoppingByEvaluations(max=max_evaluations)
termination_criterion=StoppingByEvaluations(max_evaluations=max_evaluations)
)

algorithm.run()
Expand Down
2 changes: 1 addition & 1 deletion examples/multiobjective/moead/moeaddra_lz09.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
neighbourhood_selection_probability=0.9,
max_number_of_replaced_solutions=2,
weight_files_path='resources/MOEAD_weights',
termination_criterion=StoppingByEvaluations(max=max_evaluations)
termination_criterion=StoppingByEvaluations(max_evaluations=max_evaluations)
)

algorithm.run()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
from dask.distributed import Client
from distributed import LocalCluster

from examples.multiobjective.zdt1_modified import ZDT1Modified
from jmetal.algorithm.multiobjective.nsgaii import DistributedNSGAII
from jmetal.operator import PolynomialMutation, SBXCrossover
from jmetal.problem.multiobjective.zdt import ZDT1Modified
from jmetal.util.termination_criterion import StoppingByEvaluations

"""
Distributed (asynchronous) version of NSGA-II using Dask.
"""

if __name__ == '__main__':
problem = ZDT1Modified()

Expand All @@ -23,7 +27,7 @@
population_size=100,
mutation=PolynomialMutation(probability=1.0 / problem.number_of_variables, distribution_index=20),
crossover=SBXCrossover(probability=1.0, distribution_index=20),
termination_criterion=StoppingByEvaluations(max=max_evaluations),
termination_criterion=StoppingByEvaluations(max_evaluations=max_evaluations),
number_of_cores=ncores,
client=client
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
from examples.multiobjective.zdt1_modified import ZDT1Modified
from jmetal.algorithm.multiobjective.nsgaii import NSGAII
from jmetal.operator import SBXCrossover, PolynomialMutation
from jmetal.problem.multiobjective.zdt import ZDT1Modified
from jmetal.util.evaluator import DaskEvaluator
from jmetal.util.solution import print_function_values_to_file, print_variables_to_file
from jmetal.util.termination_criterion import StoppingByEvaluations

"""
Distributed (synchronous) version of NSGA-II using Dask.
"""
if __name__ == '__main__':
problem = ZDT1Modified()

Expand All @@ -17,7 +20,7 @@
mutation=PolynomialMutation(probability=1.0 / problem.number_of_variables, distribution_index=20),
crossover=SBXCrossover(probability=1.0, distribution_index=20),
population_evaluator=DaskEvaluator(),
termination_criterion=StoppingByEvaluations(max=max_evaluations)
termination_criterion=StoppingByEvaluations(max_evaluations=max_evaluations)
)

algorithm.run()
Expand All @@ -31,4 +34,3 @@
print(f'Problem: ${problem.get_name()}')
print(f'Computing time: ${algorithm.total_computing_time}')


Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
from examples.multiobjective.zdt1_modified import ZDT1Modified
from jmetal.algorithm.multiobjective.nsgaii import NSGAII
from jmetal.operator import SBXCrossover, PolynomialMutation
from jmetal.problem.multiobjective.zdt import ZDT1Modified
from jmetal.util.evaluator import SparkEvaluator
from jmetal.util.solution import print_function_values_to_file, print_variables_to_file
from jmetal.util.termination_criterion import StoppingByEvaluations

"""
Distributed (synchronous) version of NSGA-II using Apache Spark.
"""

if __name__ == '__main__':
problem = ZDT1Modified()

Expand All @@ -17,7 +21,7 @@
mutation=PolynomialMutation(probability=1.0 / problem.number_of_variables, distribution_index=20),
crossover=SBXCrossover(probability=1.0, distribution_index=20),
population_evaluator=SparkEvaluator(),
termination_criterion=StoppingByEvaluations(max=max_evaluations)
termination_criterion=StoppingByEvaluations(max_evaluations=max_evaluations)
)

algorithm.run()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
offspring_population_size=100,
mutation=PolynomialMutation(probability=1.0 / problem.number_of_variables, distribution_index=20),
crossover=SBXCrossover(probability=1.0, distribution_index=20),
termination_criterion=StoppingByEvaluations(max=max_evaluations)
termination_criterion=StoppingByEvaluations(max_evaluations=max_evaluations)
)

algorithm.observable.register(observer=PlotFrontToFileObserver('dynamic_front_vis'))
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
from jmetal.algorithm.multiobjective.nsgaii import NSGAII
from jmetal.lab.visualization import Plot, InteractivePlot
from jmetal.operator import SBXCrossover, PolynomialMutation
from jmetal.problem import ZDT2
from jmetal.util.comparator import GDominanceComparator
from jmetal.util.observer import ProgressBarObserver, VisualizerObserver
from jmetal.util.solution import print_function_values_to_file, print_variables_to_file, read_solutions
from jmetal.util.termination_criterion import StoppingByEvaluations

"""
Program to configure and run G-NSGA-II (NSGA-II with G-Dominance) to solve problem ZDT2 with
reference point = [0.2, 0.5].
"""

if __name__ == '__main__':
problem = ZDT2()
problem.reference_front = read_solutions(filename='resources/reference_front/ZDT2.pf')

reference_point = [0.2, 0.5]

max_evaluations = 25000
algorithm = NSGAII(
problem=problem,
population_size=100,
offspring_population_size=100,
mutation=PolynomialMutation(probability=1.0 / problem.number_of_variables, distribution_index=20),
crossover=SBXCrossover(probability=1.0, distribution_index=20),
dominance_comparator=GDominanceComparator(reference_point),
termination_criterion=StoppingByEvaluations(max_evaluations=max_evaluations)
)

algorithm.observable.register(observer=ProgressBarObserver(max=max_evaluations))
algorithm.observable.register(
observer=VisualizerObserver(reference_front=problem.reference_front, reference_point=reference_point))

algorithm.run()
front = algorithm.get_result()

# Plot front
plot_front = Plot(title='Pareto front approximation. Problem: ' + problem.get_name(),
reference_front=problem.reference_front, axis_labels=problem.obj_labels)
plot_front.plot(front, label=algorithm.label, filename=algorithm.get_name())

# Plot interactive front
plot_front = InteractivePlot(title='Pareto front approximation. Problem: ' + problem.get_name(),
reference_front=problem.reference_front, axis_labels=problem.obj_labels)
plot_front.plot(front, label=algorithm.label, filename=algorithm.get_name())

# Save results to file
print_function_values_to_file(front, 'FUN.' + algorithm.label)
print_variables_to_file(front, 'VAR.' + algorithm.label)

print('Algorithm (continuous problem): ' + algorithm.get_name())
print('Problem: ' + problem.get_name())
print('Computing time: ' + str(algorithm.total_computing_time))
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
from jmetal.algorithm.multiobjective.nsgaii import NSGAII
from jmetal.core.problem import OnTheFlyFloatProblem
from jmetal.operator import SBXCrossover, PolynomialMutation
from jmetal.util.solution import get_non_dominated_solutions, read_solutions, print_function_values_to_file, \
print_variables_to_file
from jmetal.util.termination_criterion import StoppingByEvaluations

"""
Program to configure and run the NSGA-II algorithm configured with standard settings.
"""

if __name__ == '__main__':
# Defining problem Schaffer on the fly
def f1(x: [float]):
return x[0] * x[0]

def f2(x: [float]):
return (x[0] - 2) * (x[0] - 2)

problem = OnTheFlyFloatProblem()
problem \
.set_name('Schaffer') \
.add_variable(-10000.0, 10000.0) \
.add_function(f1) \
.add_function(f2)

problem.reference_front = read_solutions(filename='resources/reference_front/ZDT1.pf')

max_evaluations = 25000
algorithm = NSGAII(
problem=problem,
population_size=100,
offspring_population_size=100,
mutation=PolynomialMutation(probability=1.0 / problem.number_of_variables, distribution_index=20),
crossover=SBXCrossover(probability=1.0, distribution_index=20),
termination_criterion=StoppingByEvaluations(max_evaluations=max_evaluations)
)

algorithm.run()
front = get_non_dominated_solutions(algorithm.get_result())

# Save results to file
print_function_values_to_file(front, 'FUN.' + algorithm.label)
print_variables_to_file(front, 'VAR.'+ algorithm.label)

print('Algorithm (continuous problem): ' + algorithm.get_name())
print('Problem: ' + problem.get_name())
print('Computing time: ' + str(algorithm.total_computing_time))

Loading

0 comments on commit 8c0a6cf

Please sign in to comment.