本章介绍一些重要的、严格意义上真正的启发式算法。话不多说,进入正题。
1
构造型启发式算法
第一类启发式算法是构造型搜索(constructive search)算法。它通常从每一个自由决策变量的离散分量开始,在每次迭代中,在当前决策解固定情况下,一个先前自由的变量固定为一个可行值。在最简单的情况下,当没有自由变量存在时,搜索过程停止。
构造型搜索的主要难点在于如何选择下一个待固定的自由变量并且确定它的值,而贪婪(greedy)或短视(myopic)算法是解决这一问题最常见的方法。
贪婪构造型启发式算法每次迭代都会选择并固定下一个变量,这种方法在当前临时解的变量已经固定的情况下,可以保证下一个解的最大可行性,并且能够最大限度地改进目标函数值
换句话说,贪婪算法的规则是在目前已知内容的基础上,选择固定被选中概率最大的变量,从而得到更好的解。该算法在下一次选择时只能依靠局部信息,因此一般情况下存在风险,在贪婪算法中一个只有少数变量固定的并且看起来表现很好的解实际上会迫使搜索进入可行空间中非常差的区域,然后考虑到该算法的高效,有所损失在所难免。在极少数情况下,贪婪算法能得到精确的解(荒地能源案例展示过贪心算法)
案例传送门:网络流与图(四)
我们需要制定一个贪婪选择的准则——在选择任务时优先考虑具有高目标函数“价值”系数的任务,但同时需要考虑约束条件。通常情况下,以比率为衡量标准来权衡任务价值和客观约束条件,以NASA资本预算模型为例,可以构造比率:
分子考虑了两部分:选择任务的直接价值和它后续任务的潜在价值(依赖关系的可选择任务,随机分配一半价值);分母把选定任务要消耗的剩余约束“资源”的分数相加。这个比率通过“性价比”,即价值与所使用资源的比值,实现目标和约束两方面的综合考量。
利用上述定义的比率,通过贪心算法得到NASA案例的搜索过程:
对于t=3,x9取值为0,因为若取1,将违反约束2;在t=6时刻,x4取0是因为与x3的依赖关系,也是因为约束关系;然后在t=9时刻,按照原理应取x11,但因为顺序关系,必须先取x2=1;最后是t=12时刻,根据约束可以一次性判断x7=x8=x12=0
最后得到的最优解值是671,可以比较由分支定界搜索得到的最优解值765。贪心算法是一种近似最优解,且会存在较大的风险。
所以只有在求解大规模,并且通常是非线性的高度组合的离散模型或者需要我们快速求解的情况下,才真正需要应用构造型搜索方法。
2
改进搜索启发式算法
运筹学专题开篇不久,我们介绍了搜索理论的基础,并展示了Dclub选址案例。该案例是在连续变量情况下进行的搜索算法(improving search)
传送门:搜索理论基础
只要我们对该方法进行适当修改,就可以产生非常有效的启发式算法。对于离散形式的改进搜索,需要明确定义当前解的邻域。引入显式移动集合M来囊括所有可能的当前解的邻居解。
这里我们要注意如何选择移动集合M.一个穷尽的方法就是当前解所有分量都向前和向后移动一