Preamble
import numpy as np # for multidimensional containers
Introduction
In an earlier section, we briefly covered selection in singleobjective problems. There is a fundamental difference between selection in singleobjective problems when compared to multiobjective problems. In singleobjective problems, we often look for a single solution which has the best objective value, whereas this is not possible in multiobjective problems because they often involve conflicts between multiple objectives. Because multiobjective problems consider more than one objective value, it is often the case that a solution with the best value for one objective will often have degradation in one or more other objective values. This is where a tradeoff emerges in the objective space, and it is unlikely that there exists a single solution that can be considered optimal.
Therefore, the solution to a multiobjective optimisation problem is not a single solution vector, but instead an approximation set. This is a set of many candidate solutions that present tradeoffs between the multiple objectives, where any improvement in one objective value will result in the degradation in one or more of the other objective values. This notion of "optimum" solutions is called Paretooptimality.
Paretooptimality and other approaches to determining dominance relationships between multiple solutions in a population are important during the selection stage of an optimisation algorithm, highlighted below.
Notation
Let's define a multiobjective function
We have a population
where
We will also define the corresponding objective values
where
Dominance
When using or designing algorithms to solve multiobjective optimisation problems, we will often encounter the concept of domination. This concept is useful for comparing two solutions to determine whether one is better than the other.
We can now use our notation to define dominance relationships. Let's take two solutions to a twoobjective problem:
Definition 1: A solution

The objective values of
are no worse than those of${\mathrm{X}}_{1}$ in all objectives, i.e. for this twoobjective problem${\mathrm{X}}_{2}$ for all${f}_{m}({\mathrm{X}}_{1})\le {f}_{m}({\mathrm{X}}_{2})$ .$m=(1,2)$ 
The objective values of solution
are strictly better than at least one of those of solution${\mathrm{X}}_{1}$ , i.e. for this twoobjective problem${\mathrm{X}}_{2}$ for at least one${f}_{m}({\mathrm{X}}_{1})<{f}_{m}({\mathrm{X}}_{2})$ .$m=(1,2)$
If any of the two conditions are violated, the solution
Definition 2: Two solutions

The objective values of solution
are strictly better than at least one of those of solution${\mathrm{X}}_{1}$ , i.e. for this twoobjective problem${\mathrm{X}}_{2}$ for at least one${f}_{m}({\mathrm{X}}_{1})<{f}_{m}({\mathrm{X}}_{2})$ .$m=(1,2)$ 
The objective values of solution
are strictly worse than at least one of those of solution${\mathrm{X}}_{1}$ , i.e. for this twoobjective problem${\mathrm{X}}_{2}$ for at least one${f}_{m}({\mathrm{X}}_{1})>{f}_{m}({\mathrm{X}}_{2})$ .$m=(1,2)$
Selecting Solutions
Generally, one of our goals throughout the optimisation process is to select the best solutions. This means that solutions that can be categorised as either "dominating" or "nondominating" are solutions that we are interested in. To be clear, we are not interested in solutions that are dominated, because they do not offer any desirable performance with respect to any of the considered objectives.
Let's use Python to demonstrate these dominance relations that are often used for selection. Here, we will assume a minimisation problem, where smaller values are better. We will initialise four sets of solutions by synthetically assigning objective values that will demonstrate our dominance relations.
Our first set
Y1 = np.array([0, 0.5])
Y2 = np.array([0.5, 0.5])
Our second set
Y3 = np.array([0.5, 0.5])
Y4 = np.array([0.5, 0.5])
Our third set
Y5 = np.array([0, 0.5])
Y6 = np.array([0.5, 0])
Our fourth set
Y7 = np.array([0.5, 0.5])
Y8 = np.array([0, 0.25])
First, we will define a function to determine whether a solution dominates another or not.
def dominates(X1, X2):
if np.any(X1 < X2) and np.all(X1 <= X2):
return True
else:
return False
Now, let's test it with our four sets of objective values.
dominates(Y1, Y2)
True
dominates(Y3, Y4)
False
dominates(Y5, Y6)
False
dominates(Y7, Y8)
False
As expected, the only solution pairing that satisfies the criteria for dominance is our first set
Next, let's define a function to determine whether two solutions are nondominated.
def nondominated(X1, X2):
if np.any(X1 < X2) and np.any(X1 > X2):
return True
else:
return False
Again, we will test it with our four sets of objective values.
nondominated(Y1, Y2)
False
nondominated(Y3, Y4)
False
nondominated(Y5, Y6)
True
nondominated(Y7, Y8)
False
As expected, the only solution pairing that satisfies the criteria for dominance is our first set
We can string these two functions together within a decision structure to determine the dominance relation between any two solutions.
def dominance_relation(X1, X2):
if np.all(X1 == X2):
print("The solutions are identical.")
elif dominates(X1, X2):
print("The first solution dominates the second.")
elif nondominated(X1, X2):
print("The two solations are nondominating")
else:
print("The first solution is dominated by the second.")
Finally, we will test it with our four sets of objective values.
dominance_relation(Y1, Y2)
The first solution dominates the second.
dominance_relation(Y3, Y4)
The solutions are identical.
dominance_relation(Y5, Y6)
The two solations are nondominating
dominance_relation(Y7, Y8)
The first solution is dominated by the second.
Visualisation
Dominance relations can be clearly visualised when working in a twoobjective space. Let's do this with some arbitrary solutions. We'll use the ParetoFront
visualisation type from PlotAPI.
The figure presents arbitrary solutions to a hypothetical minimisation problem. That is, the lower the values for Objective 1 and Objective 2, the better. PlotAPI ParetoFront
has colourcoded the solutions according to their rank, where solutions of the same colour can be considered nondominated with respect to each other.
Conclusion
In this section we introduced the concept of Paretooptimality and looked at dominance relations in more detail, complete with examples in Python. The next challenge we will encounter is when we need to select a subset of solutions from a population that consists of entirely nondominated solutions. For example, which 100 solutions do we select from a population of 200 nondominated solutions? We will offer some solutions to this challenge in the later sections.