The package from DPEA. Collection of optimization test functions and some useful methods for working with them
pip install OptimizationTestFunctions
- Optimization Test Functions
Each test function is the callable object of some class with next fields at least:
bounds
-- tuple with structure(xmin, xmax, ymin, ymax)
. It is recommended borders for 3D plotting and 2D optimization for this functionx_best
-- global minimum argument of function inbounds
area as numpy array. If unknown, it'sNone
f_best
-- function value atx_best
ifx_best
exists andNone
otherwise
A lot of function objects need determined dim
argument in constructor.
U can call these "functions" like usual functions with structure numpy 1D-array -> float value
.
Checklist:
Sphere(dim, degree = 2)
Ackley(dim)
AckleyTest(dim)
Rosenbrock(dim)
Fletcher(dim, seed = None)
Griewank(dim)
Penalty2(dim, a=5, k=100, m=4)
Quartic(dim)
Rastrigin(dim)
SchwefelDouble(dim)
SchwefelMax(dim)
SchwefelAbs(dim)
SchwefelSin(dim)
Stairs(dim)
Abs(dim)
Michalewicz(m = 10)
Scheffer(dim)
Eggholder(dim)
Weierstrass(dim, a = 0.5, b = 3, kmax = 20)
U imports them using code:
from OptimizationTestFunctions import Sphere, Ackley, AckleyTest, Rosenbrock, Fletcher, Griewank, Penalty2, Quartic, Rastrigin, SchwefelDouble, SchwefelMax, SchwefelAbs, SchwefelSin, Stairs, Abs, Michalewicz, Scheffer, Eggholder, Weierstrass
And plot them using code
There are plot_3d
function for 3D-plotting:
plot_3d(func, points_by_dim = 50, title = '', bounds = None, show_best_if_exists = True, save_as = None, cmap = 'twilight', plot_surface = True, plot_heatmap = True)
with arguments:
func
: class callable object; Object which can be called as function.points_by_dim
: int, optional; points for each dimension of plotting (50x50, 100x100...). The default is 50.title
: str, optional; title of plot with LaTeX notation. The default is ''.bounds
: tuple, optional; space bounds with structure(xmin, xmax, ymin, ymax)
. The default is None.show_best_if_exists
: boolean, optional; point best solution by arrow if x_best exists. The default is True.save_as
: str/None, optional; file path to save image (None if not needed). The default is None.cmap
: str, optional; color map of plot. The default is'twilight'
. See another cmaps examples hereplot_surface
: boolean, optional; plot 3D surface. The default is True.plot_heatmap
: boolean, optional; plot 2D heatmap. The default is True.
from OptimizationTestFunctions import Fletcher, plot_3d
# dim should be 2 for plotting 3D
dim = 2
# Fletcher is good function depends on random seed!
seed = 1
f1 = Fletcher(dim, seed)
# full available functional of plotting
plot_3d(f1,
points_by_dim = 70,
title = fr"{type(f1).__name__}\ with\ seed = {seed}", # LaTeX formula notation
bounds = None,
show_best_if_exists = True,
save_as = "Fletcher1.png",
cmap = 'twilight',
plot_surface = True,
plot_heatmap = True)
# disable arrow
plot_3d(f1,
points_by_dim = 70,
title = fr"{type(f1).__name__}\ with\ seed = {seed}",
bounds = None,
show_best_if_exists = False,
save_as = "Fletcher2.png",
cmap = 'twilight',
plot_surface = True,
plot_heatmap = True)
# select another bounds
plot_3d(f1,
points_by_dim = 70,
title = fr"{type(f1).__name__}\ with\ seed = {seed}",
bounds = (-2, 6, -8, 10),
show_best_if_exists = False,
save_as = "Fletcher3.png",
cmap = 'twilight',
plot_surface = True,
plot_heatmap = True)
# Create another Fletcher function
seed = 33
f2 = Fletcher(dim, seed)
# use another cmap
plot_3d(f2,
points_by_dim = 70,
title = fr"{type(f1).__name__}\ with\ seed = {seed}",
bounds = None,
show_best_if_exists = False,
save_as = "Fletcher4.png",
cmap = 'inferno',
plot_surface = True,
plot_heatmap = True)
# plot only 3D
plot_3d(f2,
points_by_dim = 70,
title = fr"{type(f1).__name__}\ with\ seed = {seed}",
bounds = None,
show_best_if_exists = False,
save_as = "Fletcher5.png",
cmap = 'inferno',
plot_surface = True,
plot_heatmap = False)
# plot only heatmap
plot_3d(f2,
points_by_dim = 70,
title = fr"{type(f1).__name__}\ with\ seed = {seed}",
bounds = None,
show_best_if_exists = True,
save_as = "Fletcher6.png",
cmap = 'inferno',
plot_surface = False,
plot_heatmap = True)
Transformation
object is the callable object like "functions" of this package. It performs next useful transformations:
- parallel transfer (shift)
- rotation
- add noises
U can create Transformation
object using code:
transform = Transformation(transformed_function, shift_step = None, rotation_matrix = None, noise_generator = None, seed = None)
where:
transformed_function
: function or class callable object; transformed function.shift_step
: numpy 1D array/None, optional; array of shifts by each dimension orNone
. The default isNone
.rotation_matrix
: 2D-array/int/None, optional; 2D ortogonal rotation matrix or dimension for creating random rotation matrix orNone
if no rotate. The default isNone
.noise_generator
: function, optional; function gets current value and returns value with some noise. The default isNone
.seed
: int, optional; random seed for rotation matrix if needed reproduce. The default isNone
.
U also can create noises by using Noises
static class.
import numpy as np
from OptimizationTestFunctions import Weierstrass, plot_3d, Transformation, Noises
# dim should be 2 for plotting 3D
dim = 2
# Let's create Weierstrass function
f = Weierstrass(dim, a = 0.5, b = 5, kmax = 20)
# show it
plot_3d(f,
points_by_dim = 70,
title = f"{type(f).__name__}",
bounds = None,
show_best_if_exists = True,
save_as = "Trans1.png",
cmap = 'hot',
plot_surface = True,
plot_heatmap = True)
# transformation with shift
shifted_func = Transformation(f, shift_step=np.array([3, 4]))
# show it
plot_3d(shifted_func,
points_by_dim = 70,
title = "shifted",
bounds = None,
show_best_if_exists = True,
save_as = "Trans2.png",
cmap = 'hot',
plot_surface = True,
plot_heatmap = True)
# transformation with rotation
rotated_func = Transformation(f, rotation_matrix = dim, seed = 2) # random rotation matrix with dim 2
# show it
plot_3d(rotated_func,
points_by_dim = 70,
title = "rotated",
bounds = None,
show_best_if_exists = True,
save_as = "Trans3.png",
cmap = 'hot',
plot_surface = True,
plot_heatmap = True)
# transformation with noise
noised_func = Transformation(f, noise_generator = Noises.normal(center = 0, sd = 0.5))
# show it
plot_3d(noised_func,
points_by_dim = 70,
title = "noised",
bounds = None,
show_best_if_exists = True,
save_as = "Trans4.png",
cmap = 'hot',
plot_surface = True,
plot_heatmap = True)
# U can specify your noise behavior
def add_noise(current_val):
if current_val > 5:
return 0
return current_val np.random.random()/10
noised_func = Transformation(f, noise_generator = add_noise)
plot_3d(noised_func,
points_by_dim = 70,
title = "noised",
bounds = None,
show_best_if_exists = True,
save_as = "Trans5.png",
cmap = 'hot',
plot_surface = True,
plot_heatmap = True)
# Also u can combine all these transformations
new_func = Transformation(f,
shift_step= np.array([10, -10]),
rotation_matrix = 2, seed = 3,
noise_generator = Noises.uniform(-0.1, 0.5)
)
plot_3d(new_func,
points_by_dim = 70,
title = "mixed",
bounds = None,
show_best_if_exists = True,
save_as = "Trans6.png",
cmap = 'hot',
plot_surface = True,
plot_heatmap = True)