import numpy as np
import as plt
import random
class SA(object):
def __init__(self, interval, tab='min', T_max=1000, T_min=1, iterMax=1000, rate=0.95):
self.interval = interval # 状态空间,即解的搜索范围
self.T_max = T_max # 温度上限
self.T_min = T_min # 温度下限
self.iterMax = iterMax # 定温内部迭代次数
self.rate = rate # 退火降温速度
self.x_seed = (interval[0], interval[1])
self.tab = () # 求解最大值还是最小值的标签:‘min','max'
self.solve()
self.display()
def solve(self):
temp = 'deal_' + self.tab
if hasattr(self, temp):
deal = getattr(self, temp) # 采用反射方法提取对应的函数
else:
exit(">>>tab标签传参有误:'min'|'max'<<<")
x1 = self.x_seed
T = self.T_max
while T >= self.T_min:
for i in range(self.iterMax):
f1 = self.func(x1)
delta_x = ()*2-1
if self.interval[0] <= x1+delta_x <= self.interval[1]:
x2 = x1 + delta_x
else:
x2 = x1 - delta_x
f2 = self.func(x2)
delta_f = f2 - f1
x1 = deal(x1, x2, delta_f, T)
T *= self.rate
self.x_solu = x1
self.f_solu = self.func(x1)
def func(self, x):
value = (x**2)*(x**2-5*x)
return value
def p_min(self, delta, T):
probability = (-delta/T)
return probability
def p_max(self, delta, T):
probability = (delta/T)
return probability
def deal_min(self, x1, x2, delta, T):
if delta < 0:
return x2
else:
p = self.p_min(delta,T)
if p > ():
return x2
else:
return x1
def deal_max(self, x1, x2, delta, T):
if delta > 0:
return x2
else:
p = self.p_max(delta, T)
if p > ():
return x2
else:
return x1
def display(self):
print(f'seed: {self.x_seed}\nseed_funtion value: {self.func(self.x_seed)}\nsolution: {self.x_solu}\nfunction value: {self.f_solu}')
(figsize=(6, 4))
x = (self.interval[0], self.interval[1])
y = self.func(x)
(x,y,'g-',label='function')
(self.x_seed,self.func(self.x_seed),'bo',label='seed')
(self.x_solu,self.func(self.x_solu),'r*',label='solution')
(f'solution={self.x_solu}')
('x')
('y')
()
()
()
if __name__ == '__main__':
SA([-5,5],'max')