前几天浏览CSDN的时候看到了腾讯soso团队博客人工智能算法-优化算法 .看到文章后不知道咋回事,一直潜水的我有点忍不住要说几句!
在贴子中说到优化算法:
常用有4种优化算法:
1 随机搜索
2 爬山法
3 退火法
4 遗传算法
第一种就不说了,比较简单, 而后面三种都是属于local seach. local seach 是一种meta-heuristic , 就是一种启发示找查!
大致思想是:
(1). 给定一个数量的初始值状态,也就当前状态
(2). 根据当前状态以一定的规则生成一定数量的相邻状态
(3). 根据一定规则用相邻状态来代替当前状态 (比如相邻状态值优于当前状态)
(4). 重复(2),(3)直到找到一个满意的解或者查找时间用完!
常用的local search 算法有 爬山算法, 模拟退火算法, 遗传算法和禁忌查找等, 主要是用来解决一些NP问题
http://en.wikipedia.org/wiki/Local_search_(optimization), 具体说明这个里面介绍了点!
这几个算法都是比较经典的算法, 这里先简单说下吧
对于local search 最重要的就是以下几个方面:
1). 状态的表示, 用什么的结构表示状态, 就在一定程度上决定后面生成相邻状态难易和查找空间大小
2). 相邻状态的生成的方法
3). 参数设置(如找查的初始解,模拟退火的初始温度, 温度的变化率,禁忌表的长度等), 不同问题参数设置可能不一样!
(1)爬山算法,
这几个算法中爬山算法计算时间最少,当然它快的是有代价的, 它的原理就是在步骤(3)中,找查当前状态中所有的相邻状态,然后用最好的相邻状态代替当前状态, 它的缺点就是容易出现局部最小解! 但是它仍然在一些实时性要求比较高的问题用的比较多吧!
http://en.wikipedia.org/wiki/Hill_climbing
这个网址中讲的比较好了(我把自己能补充的都补在里面了),我就不多说了.
(2)退火算法
与爬山算法相比较,退火算法可以以一定的概率接受一些状态值比当前状态值差的状态, 这个就有可能escape局部最小的状态! 这个概率和当前的"温度"有关,当查找越往后, "温度"就越低, 这样接受比当前状态值差的可能性就越小!
(3)禁忌查找
这个算法在查找的过程中增加了一个禁忌表来避免迂回的查找!
(4)遗传算法
和前面两个不一样的是,这个算法在初始时就有多个状态即叫一个种群,其实我们也可看为一个大"状态"(当然前面几种方法也可以用多线程来实现多个初始状态的情况), 在算法中叫"个体". 在生成相邻状态上也和前面几种方法不同. 主要是通过"交叉"和"变异"来改变"染色体"中的编码来生成相邻状态. 使用该算法的关键是把握好收敛速度和"种群多样性"之间的矛盾.
相关书和论文:
Handbook of Metaheuristics
A Tutorial survey