【算法导论】分支限界法

参考中科大徐云老师《算法分析与设计》课件。

基本思想:

在解空间树中,以广度优先BFS或最佳优先方式搜索最优解,利用部分解的最优信息,裁剪那些不能得到最优解的子树以提高搜索效率。

搜索策略:在扩展结点处,先生成其所有的儿子结点(分支),然后再从当前的活结点表中选择下一个扩展结点。为了有效地选择下一个扩展结点,以加速搜索的进程,在每一个活结点处,计算一个函数值(优先值),并根据这些已计算出的函数值,从当前活结点表中选出一个最有利的结点作为扩展结点,使搜索朝着解空间树上有最优解的分支推进,以便尽快地找出一个最优解。

与回溯法的区别:

1. 求解目标不同:回溯法的求解目标是找出解空间树中满足约束条件的所有解,分支限界法的求解目标是尽快地找出满足约束条件的一个解。

2. 搜索方式不同:回溯算法使用深度优先方法搜索,而分支限界一般用宽度优先或最佳优先方法来搜索。

3. 对扩展结点的扩展方式不同:分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点 一旦成为扩展结点,就一次性产生其所有儿子结点。

4. 存储空间的要求不同: 分支限界法的存储空间比回溯法大得多,因此当内存容量有限时,回溯法成功的可能性更大。

求解步骤:

1. 定义解空间(对解编码);

2. 确定解空间的树结构;

3. 按BFS等方式搜索:

a. 每个活结点仅有一次机会变成扩展结点;

b. 由扩展结点生成一步可达的新结点;

c. 在新结点中, 删除不可能导出最优解的结点; //限界策略

d. 将余下的新结点加入活动表(队列)中;

e. 从活动表中选择结点再扩展; //分支策略

f. 直至活动表为空;

两种常见的活结点扩充方式:

1. 先进先出队列(F I F O) : 从活结点表中取出 结点的顺序与加入结点的顺序相同,因此活结点表的性质与队列相同;

2. 优先队列(耗费用小根堆,受益用大根堆): 每 个结点都有一个对应的耗费或收益。如果查找一个具有最小耗费的解,则活结点表可用小根堆来建立,下一个扩展结点就是具有最小耗费的活结点; 如果希望搜索一个具有最大收益的解,则可用大根堆来构造活结点表,下一个扩展结点是具有最大收益的活结点。

猜你喜欢

转载自blog.csdn.net/Chen_Swan/article/details/86101008