ZDT

The ZDT [53] problem suite is based on the construction process

\begin{align} \begin{split} \min && \; f_1(x)\\[2mm] \min && \; f_2(x) = g(x) \, h(f_1(x),g(x)) \end{split} \end{align}

where two objective have to be minimized. The function \(g(x)\) can be considered as the function for convergenece and usually \(g(x) = 1\) holds for pareto-optimal solutions (except for ZDT5).

ZDT1

This is a 30-variable problem (\(n=30\)) with a convex Pareto-optimal set:

Definition

\begin{align} \begin{split} f_1(x) &= \, & x_1 \\ g(x) &=& 1 + \frac{9}{n-1} \; \sum_{i=2}^{n} x_i \\ h(f_1,g) &=& 1 - \sqrt{f_1/g} \\ \end{split} \end{align}

\[0 \leq x_i \leq 1 \quad i=1,\ldots,n\]

Optimum

\[0 \leq x_1^* \leq 1 \quad \text{and} \quad x_i^*=0 \; \text{for} \; i=2,\ldots,n\]

Plot

[1]:
from pymoo.problems import get_problem
from pymoo.util.plotting import plot

problem = get_problem("zdt1")
plot(problem.pareto_front(), no_fill=True)
../../_images/problems_multi_zdt_9_0.png

ZDT2

This is also a 30-variable problem (\(n=30\)) with a non-convex Pareto-optimal set:

Definition

\begin{align} \begin{split} f_1(x) &= \, & x_1 \\ g(x) &=& 1 + \frac{9}{n-1} \; \sum_{i=2}^{n} x_i \\ h(f_1,g) &=& 1 - (f_1/g)^2 \\ \end{split} \end{align}

\[0 \leq x_i \leq 1 \quad i=1,\ldots,n\]

Optimum

\[0 \leq x_1^* \leq 1 \quad \text{and} \quad x_i^*=0 \; \text{for} \; i=2,\ldots,n\]

Plot

[2]:
from pymoo.problems import get_problem
from pymoo.util.plotting import plot

problem = get_problem("zdt2")
plot(problem.pareto_front(), no_fill=True)
../../_images/problems_multi_zdt_17_0.png

ZDT3

This is also a 30-variable problem (\(n=30\)) with a number of disconnected Pareto-optimal fronts:

Definition

\begin{align} \begin{split} f_1(x) &= \, & x_1 \\ g(x) &=& 1 + \frac{9}{n-1} \; \sum_{i=2}^{n} x_i \\ h(f_1,g) &=& 1 - \sqrt{f_1/g} - (f_1/g) \; \sin(10\pi f_1)\\ \end{split} \end{align}

\[0 \leq x_i \leq 1 \quad i=1,\ldots,n\]

Optimum

\[\begin{split}0 \leq x_1^* \leq 0.0830 \\ 0.1822 \leq x_1^* \leq 0.2577\\ 0.4093 \leq x_1^* \leq 0.4538 \\ 0.6183 \leq x_1^* \leq 0.6525 \\ 0.8233 \leq x_1^* \leq 0.8518 \\ x_i^*=0 \; \text{for} \; i=2,\ldots,n\end{split}\]

Plot

[3]:
from pymoo.problems import get_problem
from pymoo.util.plotting import plot

problem = get_problem("zdt3")
plot(problem.pareto_front(), no_fill=True)
../../_images/problems_multi_zdt_25_0.png

ZDT4

This is a 10-variable (\(n=10\)) problem having a convex Pareto-optimal set. There exist many local Pareto-optimal solutions in this problem. Therefore, algorithms can easily get stuck in a local optimum.

Definition

\begin{align} \begin{split} f_1(x) &= \, & x_1 \\ g(x) &=& 1 + 10(n-1) + \sum_{i=2}^{n} (x_i^2 - 10 \cos(4\pi x_i))\\ h(f_1,g) &=& 1 - \sqrt{f_1/g}\\ \end{split} \end{align}

\[\begin{split}0 \leq x_1 \leq 1 \\ -10 \leq x_i \leq 10 \quad i=2,\ldots,n\end{split}\]

Optimum

\[0 \leq x_1^* \leq 1 \quad \text{and} \quad x_i^*=0 \; \text{for} \; i=2,\ldots,n\]

Plot

[4]:
from pymoo.problems import get_problem
from pymoo.util.plotting import plot

problem = get_problem("zdt4")
plot(problem.pareto_front(), no_fill=True)
../../_images/problems_multi_zdt_33_0.png

ZDT5

In ZDT5 in variables are decodec by bitsrings. At all 11 discrete variables are used, where \(x_1\) is represented by 30 bits and the rest \(x_2\) to \(x_{11}\) by 5 bits each. The function \(u(x)\) does nothing else than count the number of \(1\) of the corresponding variable. Also, note that the objective function is deceptive, because the values of \(v(u(x_i))\) are decreasing with the number of 1’s, but has its minimum when all variables are indeed 1.

Definition

\begin{align} \begin{split} f_1(x) &= \, & 1+u(x_1)\\ g(x) &=& \sum_{i=2}^{n} v(u(x_i))\\[2mm] v(u(x_i)) &=& \begin{cases} 2 + u(x_i) \quad \text{if} \; u(x_i) < 5\\ 1 \quad \quad \quad \; \; \; \text{if} \; u(x_i) = 5 \end{cases}\\[4mm] h(f_1,g) &=& 1 /f_1(x)\\[2mm] \end{split} \end{align}

Optimum

\[0 \leq u(x_1^*) \leq 30 \quad \text{and} \quad u(x_i^*)=5 \; \text{for} \; i=2,\ldots,n\]

Plot

[5]:
from pymoo.problems import get_problem
from pymoo.util.plotting import plot

problem = get_problem("zdt5", normalize=False)
plot(problem.pareto_front(), no_fill=True)
../../_images/problems_multi_zdt_41_0.png

Please note that by default here the Pareto-front is not normalized. However, this can be easily achived normalizing \(f_1\) in the range of \((1,31)\) and \(f_2\) in \((10/31, 10)\) which are the known bounds of the Pareto-set. By default the normalized problem is used.

[6]:
from pymoo.problems import get_problem
from pymoo.util.plotting import plot

problem = get_problem("zdt5", normalize=False)
plot(problem.pareto_front(), no_fill=True)
../../_images/problems_multi_zdt_43_0.png

ZDT6

This is a 10-variable (\(n=10\)) problem having a nonconvex Pareto-optimal set. The density of solutions across the Pareto-optimal region is non-uniform.

Definition

\begin{align} \begin{split} f_1(x) &= \, & 1 - \exp(-4 x_1) \sin^6 (6 \pi x_1) \\[2mm] g(x) &=& 1 + 9 \bigg[\bigg( \sum_{i=2}^{n} x_i \bigg) / 9\bigg]^{0.25}\\[2mm] h(f_1,g) &=& 1 - (f_1/g)^2\\ \end{split} \end{align}

\[0 \leq x_i \leq 1 \quad i=1,\ldots,n\]

Optimum

\[0 \leq x_1^* \leq 1 \quad \text{and} \quad x_i^*=0 \; \text{for} \; i=2,\ldots,n\]

Plot

[7]:
from pymoo.problems import get_problem
from pymoo.util.plotting import plot

problem = get_problem("zdt6")
plot(problem.pareto_front(), no_fill=True)
../../_images/problems_multi_zdt_51_0.png