通俗的解释启发式算法

启发式搜索算法蕴含着许多人生哲学,它虽不是数学方法,其思想更类似于人类解决问题的思想和一些人生中总结的道理,值得好好体会。最后用网上一段描述各种搜索算法的例子来作为总结:

 

为了找出地球上最高的山,一群有志 的兔子们开始想办法。

 

(1)兔子朝着比现在高的地方跳去。他们找到了不远处的最高山峰。但是这座山不一定是珠穆朗玛峰。这就是爬山法,它不能保证局部最优值就是全局最优值。

 

(2)兔子喝醉了。他随机地跳了很长时间。这期间,它可能走向高处,也可能踏入平地。但是,他渐渐清醒了并朝他踏过的最方向跳去。这就是模拟退火。

 

(3)兔子们知道一个兔的力量是渺小的。他们互相转告着,哪里的山已经找过,并组找过的每一座山他们都留 下一只兔子做记号。他们制定了下一步去哪里寻找的策略。这就是禁忌搜索。

 

(4)兔子们吃了失忆药片,并被发射到太空,然后随机落到了地球上的某些地方。他们不知道自己的使命是什么。但是,如果你过几年就杀死一部分海拔低的兔子, 多产的兔子们自己就会找到珠穆朗玛峰。这就是遗传算法。



作者:Dr.h
链接:https://www.zhihu.com/question/27666809/answer/826889734
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

什么是启发式算法

启发式算法一般用于解决NP-hard问题,其中NP是指非确定性多项式。

例如,著名的推销员旅行问题(Travel Saleman Problem or TSP):假设一个推销员需要从南京出发,经过广州,北京,上海,…,等 n 个城市, 最后返回香港。 任意两个城市之间都有飞机直达,但票价不等。假设公司只给报销 C 元钱,问是否存在一个行程安排,使得他能遍历所有城市,而且总的路费小于 C?

推销员旅行问题显然是 NP 的。因为如果你任意给出一个行程安排,可以很容易算出旅行总开销。但是,要想知道一条总路费小于 C 的行程是否存在,在最坏情况下,必须检查所有可能的旅行安排。

启发式算法是相对于最优化算法提出的,是基于直观或者经验构造的算法,在可接受的开销(时间和空间)内给出待解决组合优化问题的一个可行解。

目前通用的启发式算法

目前比较通用的启发式算法一般有模拟退火算法(SA)、遗传算法(GA)、蚁群算法(ACO)、人工神经网络(ANN)等。

模拟退火算法(SA)

模拟退火算法(Simulated Annealing, SA)的思想借鉴于固体的退火原理,当固体的温度很高的时候,内能比较大,固体的内部粒子处于快速无序运动,当温度慢慢降低的过程中,固体的内能减小,粒子的慢慢趋于有序,最终,当固体处于常温时,内能达到最小,此时,粒子最为稳定。模拟退火算法便是基于这样的原理设计而成。

模拟退火算法步骤

  1. 初始化温度T(充分大),温度下限Tmin(充分小),初始解X,每个T值迭代次数L

  2. 随机生成临域解x_new;

  3. 设f(x)函数来计算用来计算解得好坏,计算出f(x_new)-f(x);

  4. 如果f(x_new)-f(x)>0,说明新解比原来的解好,则无条件接受,如果f(x_new)-f(x)<0,则说明旧解比新解好,则以概率exp((f(xnew)-f(x))/k*T)接受x_new作为解。

  5. 如果当前温度<Tmin时,则退出循环,输出当前结果,否则减少当前温度,回到第2步继续循环,常用的降温方法为T= a*T (0<a<1),一般a取接近1的值

模拟退火算法实例

遗传算法(GA)

遗传算法(Genetic Algorithm, GA)起源于对生物系统所进行的计算机模拟研究。它是模仿自然界生物进化机制发展起来的随机全局搜索和优化方法,借鉴了达尔文的进化论和孟德尔的遗传学说。

其本质是一种高效、并行、全局搜索的方法,能在搜索过程中自动获取和积累有关搜索空间的知识,并自适应地控制搜索过程以求得最佳解。

相关术语

编码(coding):将物体的表现型用编码的方式转为程序可控的基因型。

解码(decoding):基因型到表现型的映射。

基因型(genotype):参数的因子;

表现型(phenotype):根据不同因子最终展现的形态;

适应度(fitness):度量某个结果的好坏。

进化(evolution):不断剔除差的结果,最终逐步留下好的结果。

选择(selection):以一定的概率从种群中选择若干个个体留下,并繁殖。选择过程是一种基于适应度的优胜劣汰的过程。

复制(reproduction):将父本、母本的基因复制,以便产生下一代。

交叉(crossover):两个染色体的某一相同位置处DNA被切断,前后两串分别交叉组合形成两个新的染色体。也称基因重组或杂交;

变异(mutation):交叉后可能(很小的概率)对染色体进行更改,来防止算法过早收敛而陷入局部最优解中。

变异概率Pm不能太小,这样降低全局搜索能力;也不能太大,Pm > 0.5,这时GA退化为随机搜索。

(1)基本位变异算子(用于二进制编码)

基本位变异算子是指对个体编码串随机指定的某一位或某几位基因作变异运算。对于基本遗传算法中用二进制编码符号串所表示的个体,若需要进行变异操作的某一基因座上的原有基因值为0,则变异操作将其变为1;反之,若原有基因值为1,则变异操作将其变为0。

变异前:

000001110000000010000

变异后:

000001110001000010000

(2)逆转变异算子(用于互换编码)(源代码中使用类似此方法)

在个体中随机挑选两个逆转点,再将两个逆转点间的基因交换。

变异前:

1346798205

变异后:

1246798305

个体(individual):指染色体带有特征的实体;

种群(population):个体的集合,该集合内个体数称为种群的大小

遗传算法步骤

  1. 对潜在问题进行编码,初始化基因组,并根据基因组随机初始化种群,并指定繁衍代数。

  2. 计算种群中每个个体的适应度,选择一定数目的留下,其余淘汰。

  3. 在留下的个体中,随机繁衍,对分母基因进行交叉(极小概率变异),产生下一代。

  4. 回到第2步进行循环。直到达到指定的繁衍代数

蚁群算法(ACO)

简单介绍一下蚁群算法的思路。我们尝试复原一下蚂蚁寻找食物的场景。想象有一只蚂蚁找到了食物,这时它需要将食物带回蚁穴。对于这一只蚂蚁而言,它显然并不知道应该怎么走。那么,这只蚂蚁有可能会随机选择一条路线。

这条路线很可能是一条远路。但是,蚂蚁一路上留下了记号,也就是信息素。如果这只蚂蚁继续不停地搬运食物,或者有许多其他蚂蚁一块搬运的话。他们总会在运气好的时候走到更快往返的路线上。蚂蚁选择的路越好,相同时间内往返的次数也就更多,也就在路上留下了更多的信息素。

于是,蚂蚁们总会发现,有一些路径的信息素更浓,这些路径就是更好的路线。于是蚂蚁也就更多地向信息素更浓的路径上偏移。蚂蚁们不停重复这个过程,最终总能找到一条确定的路线,而这条路线就是蚂蚁们找到的最优路径。

蚁群算法步骤

  1. 初始化蚂蚁数量、可行路段、每条路段距离、每条路段的初始信息素大小等信息

  2. 设定蚂蚁的起点、终点。

  3. 蚂蚁从起点出发根据信息素浓度,有一定的概率性选择路段,浓度越高,概率越大,逐步回到终点。

  4. 在蚂蚁走过的路径上,根据每条路段的长度按比例释放信息素,短的路段释放的信息素多,长的路段释放的信息素少。

  5. 对所有路段的信息素进行挥发。

  6. 回到第二步进行循环,直到蚂蚁数量迭代完。

作者:夏虫亦可语冰
链接:https://www.jianshu.com/p/e2aec624106a
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值