编程之美--烙饼的排序

解法1. http://blog.csdn.net/tianshuai1111/article/details/7659673

解法2. http://www.cnblogs.com/bvbook/archive/2008/07/25/1251090.html

解法3. http://blog.csdn.net/bruce_zeng/article/details/8194451


分支界限法介绍

分枝界限法是由三栖学者查理德·卡普(Richard M.Karp)在20世纪60年代发明,成功求解含有65个城市的旅行商问题,创当时的记录。“分枝界限法”把问题的可行解展开如树的分枝,再经由各个分枝中寻找最佳解。

1. 基本概念

描述:采用广度优先产生状态空间树的结点,并使用剪枝函数的方法称为分枝限界法。
所谓“分支”是采用广度优先的策略,依次生成扩展结点的所有分支(即:儿子结点)。
所谓“限界”是在结点扩展过程中,计算结点的上界(或下界),边搜索边减掉搜索树的某些分支,从而提高搜索效率。


 

2. 算法的步骤

 

 

步骤一:如果问题的目标为最小化,则设定目前最优解的值Z=∞
步骤二:根据分枝法则(Branching rule),从尚未被洞悉(Fathomed)节点(局部解)中选择一个节点,并在此节点的下一阶层中分为几个新的节点。
步骤三:计算每一个新分枝出来的节点的下限值(Lower bound,LB)
步骤四:对每一节点进行洞悉条件测试,若节点满足以下任意一个条件,则此节点可洞悉而不再被考虑:
此节点的下限值大于等于Z值。
已找到在此节点中,具最小下限值的可行解;若此条件成立,则需比较此可行解与Z值,若前者较小,则需更新Z值,以此为可行解的值。
此节点不可能包含可行解。
步骤五:判断是否仍有尚未被洞悉的节点,如果有,则进行步骤二,如果已无尚未被洞悉的节点,则演算停止,并得到最优解。


 

3. 分支限界法与回溯法

 

 

回溯法深度优先搜索堆栈活结点的所有可行子结点被遍历后才被从栈中弹出找出满足约束条件的所有解。
分支限界法广度优先或最小消耗优先搜索队列、优先队列每个结点只有一次成为活结点的机会找出满足约束条件的一个解或特定意义下的最优解。

(1)求解目标:回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。 
(2)搜索方式的不同:回溯法以深度优先的方式搜索解空间树,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树。


 

4. 典型问题

 

(1)货郎担问题

(2)旅行推销员问题

 

参考:http://wiki.mbalib.com/wiki/%E5%88%86%E6%9E%9D%E7%95%8C%E9%99%90%E6%B3%95

 

你可能感兴趣的:(编程之美)