首先我们举一个兔子们寻找珠穆朗玛峰的例子来说明各种优化算法的内部原理。
局部搜索、模拟退火、遗传算法、禁忌搜索:
1. 兔子朝着比现在高的地方跳过去,他们到了不远处的最高山峰。但这座山不一定是珠穆朗玛峰,这就是局部搜索,他不一定能保证局部最优值就是全局最优值。
2. 兔子们喝醉了,随机的跳了很长时间。这段时间它可能跳入高处,也可能跳往平底。但他们逐渐清醒了,并朝高的地方跳过去。这就是模拟退火。
3. 兔子们吃了失忆药片,并被随机的发送到太空然后随机的落到某些地方。他们不知道自己的使命是什么,你每过一段时间就杀死,那些海拔较低的兔子。多产的兔子会自己找到珠穆朗玛峰。
4. 兔子们知道自己的力量是渺小的。他们互相转告哪里的山已经找到过,并且他们走过每一座山,都会给剩下的兔子留下记号。他们还制定了下一步去哪里寻找的策略,这就是禁忌搜索。
模拟退火法:
模拟退火本质上也是一种暴力搜索,只不过是利用随机的性质和局部极值区域连续的特性避免了大量的计算。进而在较短的时间内从某种概率上逼近局部最优值和全局最优值。玻尔兹曼概率分布:Prob(E) ~ Exp(-E/kT) 。
exp(C(S)-C(Si))/kt > random[0,1) then 保留该方法。
下降过程中,“高”和“低”的定义。
P(Tk)=(Ck)exp(-Ei/Tk)
Ei下降,Pi上升 Tk下降,Pi下降。
爬山法:
爬山法只是对深度优先搜索的改进方法了,它指经过评价当前的问题状态后,限于条件,不是去缩小,而是去增加这一状态与目标状态的差异,经过迂回前进,最终达到解决问题的总目标。就如同爬山一样,为了到达山顶,有时不得不先上矮山顶,然后再下来-------,这样翻越一个个的小山头,直到最终达到山顶。
未完待续,作者后面有时间了会将这部分的内容一一补上。最近先想写一下并行编程,复习一下shell编程。
参考文献: