1.模拟退火概念:
最优化算法,随机从某一状态开始,然后随机生成一个较小的随机数(扰动量),然后得到新的状态。若新状态比原状态好,则直接更新。若新状态比原状态差,则根据随机产生0~1之间的随机数和,状态转移概率(Metropolis准则)抉择是否更新状态。模拟退火算法是一种启发式搜索算法,即按照预定的控制策略进行搜索,在搜索过程中获取的中间信息将用来改进控制策略
简单说就是:
更新x:根据已有的x,再给出随机数值r,然后更新xNew = x + r
求值yNew:根据xNew和函数求出yNew
比较状态:yNew比原来的解更好时候,直接更新(x=xNew)。比原来差时,根据随着逐渐减小的概率p(状态转移概率)与随机数r比较,r<p时,更新,反之则不更新,随着执行次数的增加,也越难更新。
计算温度:t=t+1,T=T(t),循环,直到满足终止条件。
2.状态空间与领域函数:
状态空间:由编码的可行解的集合组成,说白了就是自变量定义域。
邻域函数:尽可能满足产生的候选解遍布全部的状态空间,通常由产生候选解的方式和候选解产生的概率分布组成,就是由产生的随机数再加上原来的自变量。
3.状态转移概率(Metropolis准则)
特点:P与T增而增,减而减,所以后期的状态转移概率非常小,即很难改变状态
4.冷却进度表
经典模拟退火算法降温方式:
快速模拟退火算法降温方式:
其余貌似不是很常见,暂时写这两个
5.初始温度设置:
模拟退火算法收初始温度的影响较大,对于求高质量解和计算效率都有拮抗影响(大概这个意思)。
确定初始温度的常用方法:
(1)均匀抽样一组状态,以各状态目标值的方差为初温。
(2)随机产生一组状态,确定亮亮状态间的最大目标值差,然后根据差值,利用一定的函数确定初温,如:
其中Pr为初始接受概率。
(3)根据经验公式给出
6.python代码实现:求出最小值
# 模拟退火模型构建
T = 1000 # 温度
T0 = T # 初始温度
Tmin = 1 # 最小温度
t = 0 # 时间
k = 50 # 每个温度的迭代次数
x = np.random.uniform(low=0,high=100) # 随机化初始值
y = 0 # y初始值
def aimFunction(x):
y = x ** 3 - 60 * x ** 2 - 4 * x + 6
return y
while T > Tmin:
for i in range(k):
y = aimFunction(x) # 目标函数
xNew = x + np.random.uniform(low=-0.05,high=0.05) # 更新xNew
yNew = aimFunction(xNew) # 求出新状态值
if xNew < 100 and xNew > 0: # 状态比较
if y > yNew:
x = xNew
else:
r = np.random.uniform(low=0,high=1) # 随机数
p = math.exp(-(yNew-y)/T) # 概率值
if r < p: # 小于则更新
x = xNew
t = t + 1
T = T0/(1+t) # 快速模拟退火算法降温方式
print("t:",t," T:",T)
print(aimFunction(x))
小白,望大佬指点
推荐模拟退火算法