做优化时遇到「解空间太大,穷举不可能,又写不出精确的公式」,就轮到启发式算法上场。它们不保证找到全局最优,但能在可接受的时间内给出一个足够好的解。常见的有这么几类。
一、基于种群的进化类
- 遗传算法:编码、选择、交叉、变异,适合适应度可以计算的组合优化,比如排课、装箱。
- 粒子群优化 PSO:一群粒子在解空间里跟着自己历史和全局最优飞,参数少、代码短,适合连续函数寻优。
- 差分进化 DE:用个体间的差分做变异,连续优化里表现很稳,调参比遗传算法少。
- 蚁群算法:模拟信息素积累,天然适合路径问题,比如物流配送路线。
二、邻域搜索类
这类算法从一个解出发,不断尝试改一点,看能不能变更好。
- 模拟退火:以一定概率接受变差的结果,温度逐渐降低,避免卡在局部最优。
- 禁忌搜索:记录最近走过的解,禁止回头,逼着往新区域探索。
- 爬山法:只接受更好的解,简单但容易卡死,一般作为基线。
三、构造类与贪心变体
边建解边做决策,比如贪心算法、最近邻、插入法。它们速度快、思路直观,经常拿来给其他算法提供初始解。做车辆路径问题时,先用插入法得到一个可行解,再用邻域搜索优化,效果通常比纯随机初始化好很多。
四、超启发式
不针对具体问题,而是动态选择低层启发式的组合,比如选择算子、优先级规则。适合问题类型多、需要一套通用框架的场景,实现复杂度高,一般项目用不上。
怎么选
- 连续变量、目标可算:PSO 或 DE,上手最快。
- 组合问题、解可以编码:遗传算法、模拟退火。
- 路径与调度:蚁群、禁忌搜索,或者直接用成熟的求解器。
- 有现成的商业求解器:能建模为线性规划或整数规划的,别急着上启发式。
几点实话:启发式算法调参很花时间,结果有随机性,要跑多次对比均值;不要拿单次结果下结论;评估函数(适应度)写错了,算法再好也没用。先想清楚目标函数和约束,比选算法重要得多。