对于所谓的分支限界法和回溯法,我们完全可以更加灵活,请看表格。
深度优先 | 广度优先 | 约束条件 | 限界函数 | 算法 | 策略 |
---|---|---|---|---|---|
√ | √ | 回溯法 | 局部判定 | ||
√ | √ | √ | 分支限界法 | 局部判定 | |
√ | √ | √ | 加限界的回溯法 | 局部判定 | |
√ | 枚举法 | 全局判定 | |||
√ | 枚举法 | 全局判定 |
前两种是我们常见的,但是,事实上,这几种方式, 怎么玩都行,看实际需求了。
一般来说,剪枝策略使用 约束条件 + 限界函数,然后再配合深度优先或者广度优先,是最好不过的了,也就是后两种。
这样一来,能够尽可能地剪枝,以提高搜索效率。
而最后两种枚举法,则没有剪枝策略,是一种全局判定方式,是最低效的。
总之,这三种常见的搜索算法,无非就是
枚举策略 | 剪枝策略 |
---|---|
深度优先 | 约束条件 |
广度优先 | 限界函数 |
其中,枚举策略有且仅有一种,剪枝策略则随意,然后就有了经典的枚举法(蛮力法)、回溯法和分支限界法。
已经显而易见了,这4种方式,单独学明白,懂逻辑,会实现,然后再组合起来使用就OK了。
限界函数是通过对子树未来的上界/下界的预测,来评定是否需要继续生成,方法就是按照平均值排序后,乘以剩余容量。
具体实例可以参考
0/1 knapsack problem using branch and bound
分支限界法-01背包问题
明确了这两个目标,就能够更加针对性选择了,如果题目求多个可行解,那么就不可能使用限界函数。