大家在学习编程时,不管学习何种语言的编程,像C语言、python、JAVA最后绕不开的肯定是算法问题。算法是编程的灵魂,也可以启示我们生活中的思维方式,让我们在看似随机的世界中找到应用的规律。最近小编将给大家讲解,平时最常用的十几种算法的原理与应用,请大家关注一下本技术宅。今年讲解的第一种算法是模拟退火算法。

一、模拟退火算法原理

模拟退火算法启示于固体退火原理。固体被加热到足够高的水平,然后慢慢冷却。加热时,固体内部的颗粒随着温度的升高而变得无序,内部能量增加。当缓慢冷却时,颗粒逐渐变得有序,在每个温度下达到平衡,最终在室温下达到基态,内能降至最低。模拟退火算法原理:从控制参数的初始解ⅰ和初始值t开始,迭代生成当前解的新解到计算目标函数的差值到接受或拒绝迭代,并逐渐衰减值t,算法末尾的当前解是近似最优解。




模拟退火求极值python 模拟退火算法程序_迭代

固体加热后退火的过程



二、模拟退火算法编程建模步骤

通过生成函数从当前解生成位于解空间中的新解;为了便于随后的计算和接受并减少算法的时间消耗,通常选择通过简单地转换当前新解决方案来生成新解决方案的方法,例如替换或交换构成新解决方案的所有或部分元素。注意,生成新解的变换方法确定了当前新解的邻域结构,因此对冷却时间表的选择具有一定的影响。计算对应于新解的目标函数的差值。因为目标函数差仅由变换部分产生,所以目标函数差的计算优选地以增量计算。事实表明,对于大多数应用来说,这是计算目标函数差的最快方法。判断新解决方案是否被接受的基础是接受标准。最常用的验收标准是Metropo1is标准。当确认接受新的解决方案时,使用新的解决方案代替当前解决方案,并且在校正目标函数值的同时,仅需要实现当前解决方案中对应于生成新解决方案的时间的变换部分。此时,当前的解决方案实现了迭代。在此基础上,可以开始下一轮测试。当新的解决方案被确定为丢弃时,下一轮测试将在原始当前解决方案的基础上继续进行。




模拟退火求极值python 模拟退火算法程序_模拟退火算法_02

算法和自然现像具有很大相关性



1) 随机设定初始值a0,令abest= a0 ,计算目标函数值E(a0);

2) 设置初始温度T(0)=To,迭代次数i = 1;

3) Do ahile T(i) > Tmin

1) for j = 1~q

2) 对当前最优解abest按照某一邻域函数,产生一新的解anea。计算新的目

标函数值E(anea) ,并计算目标函数值的增量ΔE = E(anea) - E(abest) 。

3) 如果ΔE <0,则abest = anea;

4) 如果ΔE >0,则p = eap(- ΔE /T(i));

1) 如果c = random[0,1] < p, abest = anea; 否则 abest = abest。

5) End for

4) i = i + 1;

5) End Do

6) 输出当前最优点,计算结束

模拟退火算法与初始值无关,算法得到的解与初始解状态S(算法迭代的起点)无关。模拟退火算法具有渐近收敛性,理论上证明是一种收敛于概率为L的全局最优解的全局优化算法。模拟退火算法具有并行性。

二、模拟退火算法的应用示例

作为模拟退火算法的一个应用,讨论了快递问题:有n个快递点,用数字1,…,n表示...快递点1和快递点j之间的距离是d(1,j)1,j = 1,...快递的最短路径问题是寻找一个恰好一次到达每个快递点的环路,并且总路径长度最短。

解空间S是遍访每个快递点恰好一次的所有回路,是{1,……,n}的所有循环排列的集合,S中的成员记为(a1,a2 ,……,an),并记an+1= a1。初始解可选为(1,……,n)

目标函数 此时的目标函数即为访问所有快递点的路径总长度或称为代价函数:

我们要求此代价函数的最小值。新解的产生 随机产生1和n之间的两相异数q和m,若q

(a1, a2 ,…,aq , aq+1 ,…,am ,…,an)
   变为:
   (a1, a2 ,…,am , am-1 ,…,aq+1 , aq ,…,an).
   如果是q>m,则将
   (a1, a2 ,…,aq , aq+1 ,…,am ,…,an)
   变为:
   (am, am-1 ,…,a1 , am+1 ,…,aq-1 ,an , an-1 ,…,aq).

  上述变换方法可简单说成是“逆转中间或者逆转两端”。

根据上述分析,可写出用模拟退火算法求解快递送货最短路径问题的程序:

Procedure 快递送货最短路径问题SA:

begin
   init-of-T; { T为初始温度}
   S={1,……,n}; {S为初始值}
   termination=false;
   ahile termination=false
    begin
     for i=1 to L do
       begin
         generate(S′form S); { 从当前回路S产生新回路S′}
         Δt:=f(S′))-f(S);{f(S)为路径总长}
         IF(Δt<0) OR (EaP(-Δt/T)>Random-of-[0,1])
         S=S′;
         IF the-halt-condition-is-TRUE THEN
         termination=true;
       End;
     T_loaer;
    End;
  End



模拟退火求极值python 模拟退火算法程序_模拟退火求极值python_03

无算法和应用了退火算法的送货路径对比图



通过算法和应用了退火算法的送货路径对比图可以看出,应用了算法的送货路程少了极多,优化了送货效果。模拟退火算法特别对于业务量具大的快递点,一个小算法就可以节省很多费用。模拟退火算法是极优秀的寻优算法,应用很多,可以以很高的效率求解现实生活效果。因此也是很好解决现实问题的算法。只要稍微懂些模拟退火算法原理就可以很好的加以利用优化。