上一章:分治法和动态规划http://www.cnblogs.com/suxi-blog/articles/6238831.html
下一章:分支限界法http://www.cnblogs.com/suxi-blog/articles/6240060.html
一.贪心算法
1.贪心算法是把一个复杂的问题分解为一个较为简单的局部最优选择,每一步选择都是对当前解的一个扩展,直到获取问题的完整。贪心算法的典型运用是求解最优化问题,而且对许多问题都能得到整体最优解。(这里得到的结不一定是最优解,但一定是最优解的十分接近的解)
2.可以使用贪心算法的要具有两个重要的性质:最优子结构和贪心选择性质
(1)最优子结构:在这里就不再说了,要看的请到上一章的动态规划里看。
(2)贪心选择性质:指问题的整体最优解可以通过一系列的局部最优的选择得到。
3.贪心算法和动态规划的主要区别:
(1)动态规划:只要求出相关的子问题的解后才能做出选择
(2)贪心算法:仅当前的状态下做出最好的选择,即局部最优选,产生再去作出这样选择后产生的相关子问题的解。
4.贪心算法通常被使用来求解最优的问题,从某初始化的状态出发,根据但前的局部最优策略以满足约束方程为条件,以是目标函数增长最快(最慢)为准则,在候选集合进行一系列的选择,以便尽快的构成问题的可行解。
5.贪心算法的一般步骤:
Greedy(C) //C是问题的输入集合,即候选集合
{
S={}; //初始化解集合为空集
while(not solution(S)) //集合S没有构成问题的一个解
{
x=select(C); //在候选集合C中做贪心选择
if feasible(S,x) //判断集合S中加入x后的解是否可行
{
S=S+{X};
}
C=C-{x}; //不管可不可行,都要从候选集中C删除x
}
return S;
}
二.回溯算法
1.回溯算法就是一种有组织的系统最优化搜索技术,可以看作蛮力法穷举搜索的改进。回溯法常常可以避免搜索所有可能的解,所以它是用求解组织数量较大的问题。(为什么?后面会解释)
2.首先我们先了解一下一个基本概念“解空间树”:问题的解空间一般使用解空间树的方式来组织,树的根节点位于第1层,表示搜索的初始状态,依次向下排列。
3.解空间树的动态搜索:在搜索至树中任一节点时,先判断该节点对应的部分是否是满足约束条件,或者是否超出目标函数的界,也就是判断该节点是否包含问题的最优解。如果肯定不包含,则跳过对该节点为根的子树的搜索,即所谓的剪枝;否则,进入该节点为根的子树,继续按照深度优先策略搜索。(这也是为什么回溯可以避免搜索所有的解)
4.在搜索过程中,通常采用两种策略避免无效搜索:(1)用约束条件剪除得不到的可行解的子树
(2)用目标函数剪取得不到的最优解的子树
(这两种方式统称为:剪枝函数)
5.在用回溯法求解问题时,常常遇到两种典型的解空间树:
(1)子集树:但所有的问题是从n个元素的集合中找出满足某种性质的子集时,相应的解空间树成为子集树
(2)排列树:当所给出问题是确定n个元素满足某种性质的排列时,相应的解空间称为排列树。
6.回溯法的一般步骤:
(1)设置初始化的方案(给变量赋初始值,读入已知数据等)
(2)变换方式去试探,若全部试完侧转(7)
(3)判断此法是否成功(通过约束函数),不成功则转(2)
(4)试探成功则前进一步再试探
(5)正确方案还是未找到则转(2)
(6)以找到一种方案则记录并打印
(7)退回一步(回溯),若未退到头则转(2)
(8)已退到头则结束或打印无解
7.回溯法的优点在于其结构明确,可读性强,易于理解,而且通过对问题的分析可以大大提高运行效率。
--------------------------------------------------------------------------------------------------------------------
今天就到这里,下一次:分支限界法
http://www.cnblogs.com/suxi-blog/articles/6240060.html