外包网,温州百度网站快速优化,成品ppt网站国外,东莞推广系统电话来源#xff1a;固体退火。一种处理工艺#xff1a;将金属缓慢加热到一定程度#xff0c;保持足够的时间#xff0c;然后以适宜的速度冷却。退火后的金属具有了新的属性降低硬度等。
一、爬山算法
1.爬山算法是一种局部择优的方法#xff0c;是一种局部贪心的最优算法。…来源固体退火。一种处理工艺将金属缓慢加热到一定程度保持足够的时间然后以适宜的速度冷却。退火后的金属具有了新的属性降低硬度等。
一、爬山算法
1.爬山算法是一种局部择优的方法是一种局部贪心的最优算法。采用启发式方法是对深度优先搜索的一种改进它利用反馈信息帮助生成解的决策。
2.主要思想 1随机选择一个登山的起点 2每次拿相邻点与当前点进行比对,取两者中较优者,作为爬坡的下一步 3重复第2步直至该点的邻近点中不再有比其大的点选择该点作为本次爬山的顶点,即为该算法获得的最优解。
实现简单但存在缺陷它可以搜索到局部最优解不一定是全局最优解如图 当前解是C点那么做一个局部搜索寻找最大值从G点搜索可能会找到D点但当我们去观看上图发现它最终寻找的点并不是全局最优解。这就是它的缺陷但是呢模拟退火就改善了这个缺陷。
二、模拟退火
模拟退火机制在一定程度上避免陷入局部最优解与爬山算法不同那么它是如何改变的呢在局部搜索即使找到一个比当前解较差的解也会以一定的概率跳到这个解上。
那就是Metropolis准则公式如下: 代表t1时刻的内能Et1可以理解为函数值 在进行优化搜索的时候我们一般找最小值为标准那么这个准则当下一个时刻的函数值比这个时刻的小它跳出当前值的概率为1亮点在当下一个时候内能比此时刻大的时候它并没有立即拒绝而是以一定的概率进行选择我们也会发现相差越多概率越小。此外接受新解的概率还受到降温系数和初始温度T的影响。温度的作用就是来计算转移概率P的。当温度每次下降后转移概率也发生变化因此在所有温度下迭代L次的结果也都是不相同的。在每个温度下迭代L次来寻找当前温度下的最优解然后降低温度继续寻找直到到达终止温度即转移概率P接近于0.
接受状态的三条原则
1在固定温度下接受使目标函数下降的候选解的概率要大于使目标函数上升的候选解概率
2随着温度的下降接受使目标函数上升的解的概率要逐渐减小
3当温度趋于零时只能接受目标函数下降的解。
三、模拟退火的流程
大概的来讲分为升温过程、降温过程内循环分子在每个温度内达到的平衡、外循环温度降到最终温度。
步骤为
1.开始给定相对较高的初始温度T产生初始解X0可以采用随机产生计算对应的目标函数值EX0。
2.令TkT其中k的范围是0—1的值为温度下降系数。
3.对当前解Xt做随机扰动在其领域内产生一个新解Xt1)计算对应函数值根据蒙特卡洛准则进行判断是否接受新解。
4.在温度T下迭代L次扰动和接受过程。
5.判断是否达到终止温度。若达到则终止否则步骤二。如图画的有些丑但意思没错 6.实例
f(x)4*x1^2-2*x1^4x1^6/3x1*x2-4*x2^24*x2^2,|xi|5.最优解。 1.导包设置参数
import math
from random import random
import matplotlib.pyplot as pltdef func(x, y): #函数优化问题res 4*x**2-2*x**4x**6/3x*y-4*y**24*y**4return res
T0100#初始温度
Tf1#终止温度
alpha0.98#降温系数
l100#内循环迭代次数
TT0#当前温度
#自变量取值
x [random() * 11 -5 for i in range(l)] #随机生成100个x的值范围[-5,5]
y [random() * 11 -5 for i in range(l)] #随机生成100个y的值范围[-5,5],y表示x2
2.设置扰动 def generate_new(func, x, y): #扰动产生新解的过程while True:x_new x T * (random() - random())y_new y T * (random() - random())if (-5 x_new 5) (-5 y_new 5): break #重复得到新解直到产生的新解满足约束条件return x_new, y_new
3.Metropolis准则
def Metrospolis(func, f, f_new): #Metropolis准则if f_new f:return 1else:p math.exp((f - f_new) / self.T)if random() p:return 1else:return 0
4.外循环和内循环 count 0#外循环迭代当前温度小于终止温度的阈值while T Tf: #内循环迭代100次for i in range(l): f func(x[i],y[i]) #f为迭代一次后的值x_new, y_new generate_new(x[i],y[i]) #产生新解f_new func(x_new, y_new) if Metrospolis(f, f_new): x[i] x_new y[i] y_new
#温度按照一定的比例下降冷却T T * alpha count 1
5.结果