模拟退火算法(Simulated Annealing,SA)的全面讲解及python实现

时间:2025-02-19 07:51:40
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')