优化算法 | 退火算法流程

我发现模拟退火算法的过程和随机化算法里面的蒙特卡洛算法很像,都是选择初始值s,能量函数e(s),初始能量是很高的,比如在解方程的时候,随机生成初始解s,解出来的值和目标值的差为其能量e(s),一开始能量是很高的,也就是差值是很高的,一开始有一个随机倍数k,一开始k很高,然后随机生成一个数a,a为-k~k之间,然后将s`=s+a,评估e(s`)也就是s`的能量,如果能量降低了,说明接近最终解了,取s`为s,将k变大,继续下一次随机,也就是再取一个a;如果能量升高了说明远离了最终解,这个时候有一定的概率取s`,这个概率和当前的能量有关,将k变小,从新取a,继续从s开始模拟,

持续以上模拟一直到e(s`)足够小或者是模拟的次数足够多。

模拟退火算法伪代码

1

2

3

4

5

6

7

8

9

s:=s0;e:=E(s)//设定目前状态为s0,其能量E(s0)

k:=0//评估次数k

whilek<kmaxande>emax//若还有时间(评估次数k还不到kmax)且结果还不够好(能量e不够低)则:

sn:=neighbour(s)//随机选取一临近状态sn

en:=Esn)//sn的能量为E(sn)

ifrandom()<P(e,en,temp(k/kmax))then//决定是否移至临近状态sn

s:=sn;e:=en//移至临近状态sn

k:=k+1//评估完成,次数k加一

returns//回转状态s

退火算法可以用来求解NP难问题,对于NP难问题而言,可以设计一个多项式时间的算法,不断的列举可能的解,由于解可以在多项式时间内验证,因此算法的总的时间实际上上是多项式时间,多于P难问题,就没有这个必要了,因为他们的解可以在多项式时间内解出来。

对于P类问题而言,它描述的是算法在最坏情况下的时间复杂度。

模拟退火算法的算法流程图,如下所示,模拟退火算法首先是设置初始温度,并产生一个初始解,其中,初始解可以随机产生或者是通过某种构造方法来获得,其次,在指定的迭代次数中,进行多次迭代。在每次迭代中,首先运用某种局部搜索或者扰动等手段获得一个新解;然后判断新解和当前解的目标函数值之间的关系,如果新解有所改进,则接受该新解为新的当前解,否则,按照概率公式决定是否选择新解为当前解。随着迭代的进行,温度逐渐降低,直到算法收敛或者达到某种预定的终止条件为止 

输入:实例I

输出:解X*

Begin

(1)  初始化:设置初始温度为T,初始解为X=X0,每个T值的迭代次数L

(2)  For i=1,2,…L do

(2.1) 产生新解X`

(2.2)计算增量E=f(x`)-f(x),其中f为评价函数(目标函数)

(2.3)若E<0,则X=X`,否则以概率e^(-E/(kT))接受X`为新的当前解X

Endfor

(3)  如果满足终止条件则输出当前解为最优解X*,结束程序

(4)  T逐渐减少,且T>0,然后转第(2)步

(5)  输出目标函数值最好的解X*

End

模拟退火算法会进行多次模拟,每次模拟的温度T都不一样,每一次模拟都会生成一个X*,最后会输出最好的那个X* 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值