算法设计与分析(未完待续)

1.贪婪法

  • 通常用来解决具有最大值或最小值的优化问题。
  • 从某个状态出发,根据当前局部的而非全局的最优决策,以满足约束方程为条件,以使得目标函数的值增加最快或最慢为准则,选择一个能最快达到要求的输入元素,以尽快构成问题的可行解。
  • 适合贪婪法求解的问题一般具有两个重要性质:
    (1)贪婪选择性质:所求问题的全局最优解可以通过一系列局部最优的选择来达到。
    (2)最优子结构:一个问题的最优解包括其子问题的最优解。

贪婪法实例:

TSP

背包问题

单源最短路径问题

狄克斯特拉算法

最小生成树问题

克鲁斯卡尔算法
普里姆算法

霍夫曼编码问题

霍夫曼算法

2.动态规划

  • 假定一种状态可以做出多种决策,而每一种决策可以产生一种新的状态
  • 最优决策是在最后阶段形成的,然后往前倒退,直到初始阶段;而决策的具体结果及所产生的状态转移,是由初始阶段开始进行计算,然后往后递归或迭代,直到最终结果。

动态规划实例:

TSP

多段图的最短路径问题

资源分配问题

设备更新问题

最长公共子序列问题

0/1背包问题

RNA最大碱基对匹配问题

3.回溯法

  • 走不通就退回再走:按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择。
  • 显著特点:从根节点出发,按照状态空间树的结构,向下搜索它的所有儿子节点,对不满足约束条件的儿子节点,把它当做d_节点(死节点)而丢弃;对满足约束条件的节点,把它当做e_节点(扩展节点),继续向下搜索它的所有儿子节点。当搜索到一个满足约束条件的叶节点时,就得到一个可行解;或者所有儿子节点都不满足约束条件时,该节点就当做d_节点而丢弃,向上回溯到它的父亲节点。
  • 在某种意义上,上述搜索是盲目进行的。
  • 解题步骤:
    (1)根据给定问题,定义问题的解空间
    (2)确定状态空间树的结构
    (3)用DFS搜索解空间,用约束方程和目标函数的界对状态空间树进行修剪,生成搜索树,得到问题的解。

回溯法实例

n后问题

图的着色问题

哈密顿回路问题

0/1背包问题

4.分支与限界

  • 在分支节点(e_节点)上,预先分别估算沿着它的各个儿子节点向下搜索的路径中,目标函数可能取得的界,然后把它的这些儿子节点和它们可能取得的界保存在一张节点表中,再从表中选取界最大或最小的e_节点向下搜索。
  • 用优先队列/堆结构动态维护节点表
  • 根据节点表中不断更新的信息,不断调整搜索方向,有选择、有目标地往前搜索;回溯的时候也不是单纯沿着父亲节点一层层向上回溯,而是依据节点表中的信息回溯

分支与限界实例

作业分配问题

单源最短路径问题

0/1背包问题

TSP

猜你喜欢

转载自blog.csdn.net/weixin_38493025/article/details/84560141