Untitled
unknown
plain_text
2 years ago
1.5 kB
25
Indexable
import math
import random
def get_random_number(x_min, x_max):
return random.uniform(x_min, x_max)
def is_acceptable(y, yt, temp):
p = math.exp((yt - y) / temp)
return p > random.uniform(0, 1)
def get_trial_interval(x, temp, x_min, x_max):
xt_min = max(x - 2 * temp, x_min)
xt_max = min(x + 2 * temp, x_max)
return xt_min, xt_max
def function(x):
pi = math.pi
return 3 * math.sin((pi * x) / 5) + math.sin(pi * x)
def simulated_annealing(epochs, trials, temp, alpha, x_min, x_max):
def print_epoch_info(epoch, x, y):
print(f"\n\nEpoch {epoch}/{epochs}, x={x}, f(x)={y}, T={temp}")
def print_trial_info(trial, xt, yt):
print(f"\n Interval per trial {trial} = [{xt_min}; {xt_max}]")
print(f" xt={xt}, f(xt)={yt}")
x = get_random_number(x_min, x_max)
for epoch in range(1, epochs + 1):
y = function(x)
print_epoch_info(epoch, x, y)
for trial in range(1, trials + 1):
xt_min, xt_max = get_trial_interval(x, temp, x_min, x_max)
print_trial_info(trial, *get_trial_result(x, xt_min, xt_max))
temp *= alpha
return x
def get_trial_result(x, xt_min, xt_max):
xt = get_random_number(xt_min, xt_max)
yt = function(xt)
return xt, yt
# Parameters
temp = 1.0
x_min, x_max = 0, 10
alpha = 0.9
epochs, trials = 5, 3
local_maximum = simulated_annealing(epochs, trials, temp, alpha, x_min, x_max)
print(f"\n\nLocal maximum of the function is {local_maximum}")
Editor is loading...