Codebase for Distance-based Multi-Objective Point Problem instances.
This repository holds Matlab code for the Distance-Based Multi-Objective Point Problem (DBMOPP) instance generator.
The DBMOPP generator in the DBMOPP.m
file is the most recent version of the generator, and follows an object-oriented design.
This is a substantial new version of the generator including the integration of hard and soft constraints and additional features, accepted in IEEE Transactions on Evolutionary Computation.
Jonathan E. Fieldsend, Tinkle Chugh, Richard Allmendinger, and Kaisa Miettinen. 2021. A Visualizable Test Problem Generator for Many-Objective Optimization, IEEE Transactions on Evolutionary Computation, to appear. doi: https://10.1109/TEVC.2021.3084119.
All instance generation functionality is in this single file. Note there some additional plotting functions still being added. Illustrations of usage directly. Details regarding the earlier version of the generator can be found towards the bottom of this page.
The public methods of this class are as follows:
DBMOPP(numberOfObjectives, numberOfDesignVariables, numberOfLocalParetoSets, numberOfDominanceResistanceRegions, numberOfGlobalParetoSets, proportionOfConstrainedSpaceIfChecker, globalParetoSetType, constraintType, numberOfdiscontinousObjectiveFunctionRegions, variableSolutionDensity, varyingObjectiveScales, proportionOfNeutralSpace, monte_carlo_samples)
Which constructs an instance of the problem
plotLandscapeForSingleObjective(index, resolution)
which plots the 2D landscape of the objective numbered by index
. Plot generated by a grid with resolution
samples at each dimension.
plotParetoSetMembers(resolution)
Samples points on a grid with resolution
samples at each dimension, plots those which are Pareto optimal for this instance.
plotDominanceLandscape(resolution)
Plots the dominance landscape of this problem, by generating by a grid with resolution
samples at each dimension.
plotProblemInstance()
Plots the different regions set up for this problem instance.
plotCorrelation(resolution, corr_type, summary_type)
Plots the 2D correlation plot for this problem. Samples points on a grid with resolution
samples at each dimension. Uses the corr_type
correlation type (Pearson [default], Kendall or Spearman) and summary_type
(mean [default], median, max and min). Correlation value/matrix at each grid point is calculated put placing a circle radius 10^-6 around each point and calculating with respect to 100 equally placed samples on the edge of this circle.
isAParetoSetMember(x, suppressWarning)
Returns true if x
is a Pareto set member, false otherwise. Obviously you should not be using this method during an optimisation! Pass suppressWarning
as true if you don't want to be reminded of this...
getAParetoSetMember()
Returns a Pareto decision vector uniformly at random for this instance. It also returns the corresonding 2D projection for the design location.
evaluate(x)
evaluates a design vector x
Help information can be accessed at the command line for each of the public methods, e.g. the command
help DBMOPP/evaluate
will display
[objective_vector, soft_constraint_violation, hard_constraint_violation] = evaluate(obj,x)
Evalutes the design vector x under this instance of the problem
INPUTS
x = design vector to evaluate, should adhere to the box
constraints of the problem, i.e. between -1 and +1 on all
dimensions
OUTPUTS
objective_vector = vector of objective values associated with
x for this DBMOPP problem. If x violates any soft or hard
constraints will be a vector of NaNs
soft_constraint_violation = Soft constraint violation. 0 if
no violation, otherwise value increases with distance to the
boundary from the constrain/legal space
hard_constraint_violation = Hard constraint violation. Value
of true if there is a violation, false otherwise
First let's create an instance from the generator, this is done with the constructor, which creates a DBMOPP instance based on the arguments. Default values are used when arguments are missing (see documentation in code). An example would be
my_instance = DBMOPP(4,2,0,0,5,0,1,0,0,false,false,0);
This creates my_instance
which has 4 objectives, 2 decision variables, 5 disconnected Pareto set regions which have global Pareto set type '1', meaning they are partially intersecting -- the entire Pareto front can be described by fewer than five of the regions, but not one alone.
Calling
my_instance.plotProblemInstance();
plots a helpful visualisation of the problem as constructed, in this case,
As we don't have e.g. any constrained space, or neutral space in this instance example, it is showing the attractor locations (labelled with the objective they minimise) and the convex hull of the region they bound.
Calling my_instance.plotParetoSetMembers()
plots which samples on the default resolution (a 500 by 500 grid) are Pareto optimal. As we have set up a partially intersecting Pareto set type, some areas in the convex hull are additionally penalised (the objective values increased), meaning they are not Pareto optimal, this plot shows us the Pareto optimal locations from the grid of samples
If we look at the fitness landscape for objectve 1, by calling
my_instance.plotLandscapeForSingleObjective(1);
we can see how this is affected both by the attractors in each region, and the offset applied inside the convex hull of the attractor groupings defining the regions, to induce the partially overlapping Pareto sets.
The evaluate
method allows you to utilise the generated instance to assess the quality of a design, it returns the objective vector, and the soft and hard constrain violation values. E.g.
x = [0.6 0.4];
[y, sc, hc] = my_instance.evaluate(x);
Evaluates the design x
. This instance has no constraints (bar box constraints), so the sc
and hc
values are both zero.
y
y =
0.3218 0.1977 0.5040 0.4860
sc
sc =
0
hc
hc =
0
The number of solutions found which are Pareto optimal under the instance configuration can be assessed using the isAParetoSetMember
method:
my_instance.isAParetoSetMember(x,true)
ans =
logical
0
In this case, x
is not Pareto optimal (as can also be seen in the earlier plots), a close neighbour is though:
my_instance.isAParetoSetMember([-0.487,0.4],true)
ans =
logical
1
Let us generate a more complicated instance
my_complex_instance = DBMOPP(3,10,3,3,2,0.3,2,8,2,false,true,0.2);
This is a 10-dimensional problem, with three competing objectives. 30% of the design space is soft constraint violating, 20% is neutral, there are 2 global Pareto set regions, which do not duplicate performance. There are also local fronts and domainace resistance regions.
plotDominanceLandscape
-- will plot the dominance landscape of an instance
Previous version of the generator with a subset of the functionality is described here:
Jonathan E. Fieldsend, Tinkle Chugh, Richard Allmendinger, and Kaisa Miettinen. 2019. A Feature Rich Distance-Based Many-Objective Visualisable Test Problem Generator. In Genetic and Evolutionary Computation Conference (GECCO ’19), July 13–17, 2019, Prague, Czech Republic. ACM, New York
Paper availabale from
Insititutional repository: https://ore.exeter.ac.uk/repository/handle/10871/36824
Publisher Doi: https://doi.org/10.1145/3321707.3321727
The codebase for this earlier paper is in the GECCO2019 folder.
USAGE:
Two main functions are
distance_problem_generator -- this generates a problem instance (please see its help documentation)
distance_points_problem -- this takes a design vector and a problem instance and returns its quality vector (please see its help documentation)
Other .m files are helper/plotter functions.