启发式算法的使用方法以及迭代过程的本质

启发式算法只是一种框架,仅仅用启发式算法无法解决问题,要把启发式算法融入具体问题的计算过程,才能发挥启发式算法的作用。
 

这里把使用启发式算法解决问题的过程大致总结为以下两个大的步骤:

步骤一. 完成问题建模,确定问题的解是什么

只有先完成问题建模,才能再调用启发式算法框架。问题建模需要明确问题的解、目标函数、目标函数值。

问题的解:问题的一个解也就是解决问题的一种途径(引申为问题的输入)

目标函数:也就是计算过程,能够将给定的问题的解转化为目标函数值(引申为具体问题内部算法,能够将给定的问题的输入转化为问题的输出)

目标函数值:问题的解经过目标函数的计算得到的结果(引申为问题的输出)

例如,求解y=x^2的最小值,那么某个xi就是问题的一个解,计算公式y=x^2就是目标函数,计算出的xi所对应的yi就是目标函数值。

例如,求解10个城市的TSP问题,那么这10个城市的某种排列顺序S就是问题的一个解,计算一种特定的排列顺序所对应的TSP路径总长度的功能就是目标函数,计算出的S所对应的TSP路径总长度就是目标函数值。

注意:

1. 目标函数可简单也可复杂,简单如一个二次函数y=x^2,复杂如累计城市坐标之间的TSP路径长度,甚至更复杂。目标函数的复杂程度和具体问题相关,可以简化理解为一个函数f,目标函数值=f(问题的解)。

2. 问题的解并不一定直接用于启发式算法流程(步骤二),有时候可能需要转换解的表示方式(例如遗传算法里的解的编码),而解的有效的表示方式也影响着启发式算法的最终效果。

 

步骤二. 套用启发式算法流程

所有启发式算法流程都大同小异,这里引用《中国机器学习白皮书》中对于演化算法的总结,引用如下:

演化算法通常具有公共的算法结构:

1. 产生初始解集合,并计算解的目标函数值;

2. 使用启发式算子从解集合产生一批新解,并计算目标函数值,并加入解集合;

3. 根据启发式评价准则,将解集合中较差的一部分解删除;

4. 重复第二步,直到设定的停止准则满足;

5. 输出解集合中最优的解。

不同的演化算法,主要在于其启发式算子、评价准则、停止准则等部件的设计不同。演化算法通常维护一个解的集合,并通过启发式算子来从现有的解产生新解,并通过挑选更好的解进入下一次循环,不断提高解的质量。

仍然以求解y=x^2的最小值为例,说明具体过程:

1. 指定一批初始解,即初始解集合{x1, x2, x3, ... xn},根据公式y=x^2,算出对应的目标函数值{y1, y2, y3, ... yn};

2. 根据原来的解{x1, x2x3, ... xn}产生一批新解{x1', x2', x3', ... xn'},根据公式y=x^2,算出新解对应的目标函数值{y1', y2', y3', ... yn'},此时,解集合变为{x1, x2, x3, ... xn, x1', x2', x3', ... xn'},解集合长度为2n

3. 删除目标函数值较大的yiyi'所对应的解xixi',保持解集合长度为n

4. 重复第二步

5. 输出最小的yi(或yi')所对应的xi(或xi'

注意:

1. 启发式算法流程中的2和3为更新解集的关键步骤,和采用的具体启发式算法有关。

2. 启发式算法流程依赖于目标函数,因为需要将问题的解计算为目标函数值,而目标函数自身和启发式算法流程无关,由问题建模决定,所以,可以这么理解,启发式算法流程是以目标函数的计算过程为基础的循环过程。

 

可以看出,算法流程的本质就是迭代搜索。迭代搜索过程虽然包含大量的随机性,但是,并不是完全盲目的、胡乱的搜索,而是带有一定技巧性的搜索,直到找到满意解。

另外,从这个角度来看,启发式算法之所以称之为一种框架,而不是一种通常意义上的“算法”,是因为启发式算法自身并不能将给定的问题的解转化为目标函数值,而是在现有的问题的解中不断的尝试,看哪一个问题的解对应的目标函数值最好。

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值