Hill-climbing optimisation

Global maximum

Let’s try it with the function

 0 

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

 1 

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}