algorithm principle
good explanation
flow
curve func
import numpy as np
def h(x):
if x < -1 or x > 1:
y = 0
else:
y = (np.cos(50 * x) + np.sin(20 * x) + np.random.normal())
return y
hv = np.vectorize(h)
simulated anealing
import numpy as np
def SA(search_space):
t = 4
t_min = 1
r = 0.9
start = np.random.choice(search_space)
x = start
cur = h(x)
history = [x]
while t > t_min:
x_next = x + np.random.rand() * t
cur = h(x)
if x_next > -1 and x_next < 1:
de = h(x_next) - h(x)
else:
continue
if de > 0:
x = x_next
history.append(x)
else:
if (np.random.rand() < np.exp(de / t)):
x = x_next
history.append(x)
t = t * r
return x,history
X = np.linspace(-1, 1, num = 1000)
x1, history = SA(X)
print(x1)
draw
import matplotlib.pyplot as plt
plt.plot(X, hv(X))
plt.scatter(x1, hv(x1), marker = 'x')
plt.plot(history, hv(history))