分治法:
基本思想:
将问题分解成多个子问题,并允许不断分解,使规模越来越小,最终可用已知的方法求解足够小的问题。
使用要求:
(1) 问题能够按照某种方式分解成若干个规模较小、相互独立且与原问题类型相同的子问题。
(2) 子问题足够小时可以直接求解。
(3) 能够将子问题的解组合成原问题的解。
贪心法:
基本思想:
总是选择当前最优解,并不考虑整体最优。
特点:
拥有最优子结构特性。当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征。
动态规划法:
基本思想:将较大问题分解为较小的同类子问题,这一点上它与分治法和贪心法类似。动态规划法解决子问题重叠现象,利用最优子结构,自底向上从子问题的最优解逐步构造出整个问题的最优解。
适用动态规划法的要求:具有最优子结构特性和重叠子问题。
与贪心算法比较:
贪心算法:局部的最优性依赖于其前面各部分是否最优;且不能保证最终解的最优性。
动态规划:当前决策的最优性取决于其后续决策系列的是否最优。动态规划方法可以保证问题求解是全局最优的。
回溯法:
基本思想:
搜索,或是一种组织得井井有条的,能避免不必要搜索的穷举式搜索法。在搜索过程中使用约束函数(constraint function),可以避免无谓地搜索那些已知不含答案状态的子树。使用剪枝函数减少问题求解所需实际生成的状态结点数。
剪枝函数:
约束函数在扩展结点处剪去不满足约束的子树。
限界函数:剪去得不到最优解的子树。
分支限界法:
基本思想:
每一个结点只有一次机会成为扩展结点。结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。
三种不同扩展方法:
FIFO分枝限界法的活结点表是先进先出队列。
LIFO分枝限界法的活结点表是堆栈。
LC分枝限界法的活结点表是优先权队列,即选取具有最高优先级的活节点出队列。
与回溯法比较:
回溯法:使用深度优先生成状态空间树中结点,并使用剪枝函数。
分枝限界法:使用广度优先生成状态空间树中结点,并使用剪枝函数