1.贪婪法
- 通常用来解决具有最大值或最小值的优化问题。
- 从某个状态出发,根据当前局部的而非全局的最优决策,以满足约束方程为条件,以使得目标函数的值增加最快或最慢为准则,选择一个能最快达到要求的输入元素,以尽快构成问题的可行解。
- 适合贪婪法求解的问题一般具有两个重要性质:
(1)贪婪选择性质:所求问题的全局最优解可以通过一系列局部最优的选择来达到。
(2)最优子结构:一个问题的最优解包括其子问题的最优解。
贪婪法实例:
TSP
背包问题
单源最短路径问题
狄克斯特拉算法
最小生成树问题
克鲁斯卡尔算法
普里姆算法
霍夫曼编码问题
霍夫曼算法
2.动态规划
推荐阅读 https://www.cnblogs.com/caiyishuai/p/9047991.html
- 假定一种状态可以做出多种决策,而每一种决策可以产生一种新的状态
- 最优决策是在最后阶段形成的,然后往前倒退,直到初始阶段;而决策的具体结果及所产生的状态转移,是由初始阶段开始进行计算,然后往后递归或迭代,直到最终结果。
动态规划实例:
TSP
多段图的最短路径问题
资源分配问题
设备更新问题
最长公共子序列问题
0/1背包问题
RNA最大碱基对匹配问题
3.回溯法
- 走不通就退回再走:按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择。
- 显著特点:从根节点出发,按照状态空间树的结构,向下搜索它的所有儿子节点,对不满足约束条件的儿子节点,把它当做d_节点(死节点)而丢弃;对满足约束条件的节点,把它当做e_节点(扩展节点),继续向下搜索它的所有儿子节点。当搜索到一个满足约束条件的叶节点时,就得到一个可行解;或者所有儿子节点都不满足约束条件时,该节点就当做d_节点而丢弃,向上回溯到它的父亲节点。
- 在某种意义上,上述搜索是盲目进行的。
- 解题步骤:
(1)根据给定问题,定义问题的解空间
(2)确定状态空间树的结构
(3)用DFS搜索解空间,用约束方程和目标函数的界对状态空间树进行修剪,生成搜索树,得到问题的解。
回溯法实例
n后问题
图的着色问题
哈密顿回路问题
0/1背包问题
4.分支与限界
- 在分支节点(e_节点)上,预先分别估算沿着它的各个儿子节点向下搜索的路径中,目标函数可能取得的界,然后把它的这些儿子节点和它们可能取得的界保存在一张节点表中,再从表中选取界最大或最小的e_节点向下搜索。
- 用优先队列/堆结构动态维护节点表
- 根据节点表中不断更新的信息,不断调整搜索方向,有选择、有目标地往前搜索;回溯的时候也不是单纯沿着父亲节点一层层向上回溯,而是依据节点表中的信息回溯。