Hill-climbing optimisation

Global maximum

Let’s try it with the function

$$ f(x,y) = e^{-\left(x^2+y^2\right)} $$

import numpy as np
import matplotlib.pyplot as plt
from plotutils import *

x = np.linspace(-2.0, 2.0, 1000)
y = np.linspace(-2.0, 2.0, 1000)
X, Y = np.meshgrid(x, y)

Z = np.exp(-(X ** 2 + Y ** 2))

fig, ax = plt.subplots(1, 1)
cp = ax.contourf(X, Y, Z, cmap=cmaps[1])

ax.set_title("f(x,y)")
ax.set_xlabel("x")
ax.set_ylabel("y")
plt.show()

from gradient_free_optimizers import HillClimbingOptimizer

search_space = {
    "x": x,
    "y": y,
}
opt = HillClimbingOptimizer(search_space)
def f(pos):
    x = pos["x"]
    y = pos["y"]
    z = np.exp(-(x**2 + y**2))
    return z
result = opt.search(f,
                    n_iter=30000,
                    verbosity=['print_times'])
   Evaluation time   : 0.9117169380187988 sec    [28.97 %]
   Optimization time : 2.235219955444336 sec    [71.03 %]
   Iteration time    : 3.1469368934631348 sec    [9533.08 iter/sec]
opt.best_para
{'x': -0.002002002002001957, 'y': 0.002002002002002179}

Local maximum

Let’s try it with the function

$$ f(x,y) = e^{-\left(x^2+y^2\right)}+2e^{-\left((x-1.7)^2+(y-1.7)^2\right)} $$

x = np.linspace(-1.0, 3.0, 1000)
y = np.linspace(-1.0, 3.0, 1000)
X, Y = np.meshgrid(x, y)

Z = np.exp(-(X**2 + Y**2))+2*np.exp(-((X-1.7)**2+(Y-1.7)**2))

fig,ax=plt.subplots(1,1)
cp = ax.contourf(X, Y, Z, cmap=cmaps[1])

ax.set_title('f(x,y)')
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.show()

opt = HillClimbingOptimizer(search_space)
def f(pos):
    x = pos["x"]
    y = pos["y"]
    z = np.exp(-(x**2 + y**2))+2*np.exp(-((x-1.7)**2+(y-1.7)**2))
    return z
result = opt.search(f,
                    n_iter=30000, 
                    verbosity=['print_times'])
   Evaluation time   : 0.9092590808868408 sec    [29.73 %]
   Optimization time : 2.148698091506958 sec    [70.27 %]
   Iteration time    : 3.057957172393799 sec    [9810.47 iter/sec]
opt.best_para
{'x': 1.6956956956956954, 'y': 1.6956956956956954}