1.模拟退火算法简介:
2.模拟退火算法的关键点:
(1)随机的更新可行解x,判断可行解x对应的函数值和原来函数值之间的大小:如果优于原来的函数值,则让新的可行解x为问题的解;否则以一定的概率(大于某个随机的概率值时)去接受此可行解。
(2)温度T在不断的下降,对应的概率也在不断的变化。T较大时,对应的概率值也大,表明,接受差解的概率大,有利于跳出局部最优解;T较小时,对应的概率也小,表明,接受差解的概率小,此时,迭代进入后期,靠近最优解,有利于保存最优解。
3.代码:
'''
1.本文的算法是模拟退火算法
2.模拟退火算法的核心在于,对问题的差解以一定的概率去接受,此过程有利于跳出局部最优解
3.f=x*0.2*np.sin(x**2)
'''
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import math
def f(x): #求目标函数的最小值
# return (x**2-5*x)*np.sin(x**2)
# return x*0.002
return 10 * math.sin(5 * x) + 7 * math.cos(4 * x)
# return x*math.sin(x)*math.cos(2*x)-2*x*math.sin(3*x)+3*x*math.sin(4*x)
T=100 #初始温度
T_end=0.01 #终止温度
coldrate=0.9 #温度下降速率
x=np.random.uniform(0,5) #为x随机赋一个初值
best=[] #记录问题每一次迭代时问题的最优解
history=[] #记录x的取值
# history.append(x)
while T > T_end :
y=f(x)
x_new=x+np.random.uniform(-1,1) #随机的更新x的取值
# print(x)
y_new=f(x_new) #计算新解对应的函数值
# history.append(x_new) #记录x的取值
# best.append(y_new) #记录函数值
if y_new < y:
x=x_new #更新问题的解为新的取值
# best.append(y_new)
history.append(x_new) # 记录x的取值
best.append(y_new) # 记录函数值
else:
p=np.exp(-(y_new-y)/T)
r=np.random.uniform(0,1) #随机生成比较的概率值
if p > r:
x=x_new #以一定的概率接受差解
history.append(x_new) # 记录x的取值
best.append(y_new) # 记录函数值
# best.append(y_new)
# else: #拒绝差解:
# best.append(y)
T=T*coldrate #温度下降,模拟退火
# x1=[i for i in np.linspace(0,5)]
# y1=map(f,x1)
plt.plot(history,best)
plt.plot(x,f(x),'om')
plt.show()
print('最优解和函数最小值分别为:',x,f(x))
4.运行结果:
5.模拟退火算法总结:
模拟退火算法是在可行解x小于最优解的情况时,以一定的概率T接受当前的可行解x,并继续运行。概率T在多态的变化,T较大时,对应的概率值也大,表明,接受差解的概率大,有利于跳出局部最优解;T较小时,对应的概率也小,表明,接受差解的概率小,此时,迭代进入后期,靠近最优解,有利于保存最优解。