# Rotated and Shifted problemsΒΆ

In this tutorial we will learn how to use meta-problems. These are optimization problems that transform somehow another optimization problem. In particular we will have a look to the rotated and shifted meta-problems. Let us start creating a shifted problem.

In [1]: from PyGMO import *
In [2]: prob = problem.ackley(5)
In [3]: shifted_prob1 = problem.shifted(problem=prob)
In [4]: shifted_prob2 = problem.shifted(problem=prob,shift=15)
In [5]: shifted_prob3 = problem.shifted(problem=prob,shift=[23,-12.2,22,33,5.3])


We have used three different constructors to instantiate the new problem with a random shift vector (shifted_prob1), with a uniform shift vector (shifted_prob2) and with a fully defined shift vector (shifted_prob3). In all cases we may extract the shift vector using the corresponding attribute

In [4]: shift1 = shifted_prob1.shift_vector
Out[11]: (22.05074397709721, 42.30378775731836, 41.28781073553851, -37.032452729545746, -43.15424830101163)


We may now check that such a shift does not change the performance of a given algorithm. We choose, for this tutorial Improved Harmony Search, but you can try changing it to test others.

In [5]:  l = list()
In [6]:  algo = algorithm.ihs(1000);
In [7]:  for i in range(100):
pop = population(prob,20)
for i in range(15):
pop = algo.evolve(pop)
l.append(pop.champion.f[0])
In [8]:  l_shift = list()
In [9]:  for i in range(100):
pop = population(shifted_prob1,20)
for i in range(15):
pop = algo.evolve(pop)
l_shift.append(pop.champion.f[0])
In [10]: boxplot([l,l_shift])


which will produce a plot similar to:

where one can clearly see how the algorithm ihs does not change its performances when the search space is shifted.

We now repeat the same procedure for a rotated problem.

In [1]: from PyGMO import *
In [2]: prob = problem.ackley(5)
In [3]: shifted_prob = problem.rotated(problem=prob)


Also in the case of the rotated problem the kwarg rotation allows to pass a rotation matrix directly, otherwise a random orthonormal matrix will be generated and can be extracted by the problem.rotation attribute.

Running the same procedure as for the shifted problem returns a picture like the one below.

Which clearly indicates how the rotation affects negatively the algorithm performance.

Note that meta-problems can be nested together, so it is perfectly valid to have

In [1]: from PyGMO import *
In [2]: prob = problem.ackley(5)
In [3]: new_prob = problem.rotated(problem.shifted(problem.rotated(prob)))


To make sure one can reconstruct the original problem, the transformations applied are logged in the problem __repr__ method

In [4]: print new_prob
Out[4]:
Problem name: Ackley [Rotated] [Shifted] [Rotated]
Global dimension:                       5
Integer dimension:                      0
Fitness dimension:                      1
Constraints dimension:                  0
Inequality constraints dimension:       0
Lower bounds: [-1.4142135623730951, -1.4142135623730951, -1.4142135623730951, -1.4142135623730951, -1.4142135623730951]
Upper bounds: [1.4142135623730951, 1.4142135623730951, 1.4142135623730951, 1.4142135623730951, 1.4142135623730951]
Constraints tolerance:                  0

Rotation matrix:
-0.599649   0.20824 0.0152832 -0.740073 -0.221622
-0.263871 -0.341942  0.873749  0.072256  0.211634
-0.114375 -0.709787 -0.157299 0.0906273 -0.670943
0.663241  0.209505  0.425168 -0.326385 -0.478461
0.343255 -0.540391  -0.17555 -0.576482  0.476451

Shift vector: [-2.5281990225671565, 2.2507667730831695, 2.260031719866459, -2.6037537655145679, -0.45739118339223306]

Rotation matrix:
-0.469888  -0.334498  -0.813054  0.0761044 -0.0216481
-0.416312  -0.467594   0.372853  -0.513315   0.453352
0.413702  0.0719025  -0.277365   0.149243   0.851161
0.182474   0.391322  -0.341818  -0.830096 -0.0875853
-0.633596   0.714957  0.0784432   0.139221    0.24871