對于所謂的分支限界法和回溯法,我們完全可以更加靈活,請看表格。
深度優先 | 廣度優先 | 約束條件 | 限界函數 | 算法 | 策略 |
---|---|---|---|---|---|
√ | √ | 回溯法 | 局部判定 | ||
√ | √ | √ | 分支限界法 | 局部判定 | |
√ | √ | √ | 加限界的回溯法 | 局部判定 | |
√ | 枚舉法 | 全局判定 | |||
√ | 枚舉法 | 全局判定 |
前兩種是我們常見的,但是,事實上,這幾種方式, 怎么玩都行,看實際需求了。
一般來說,剪枝策略使用 約束條件 + 限界函數,然后再配合深度優先或者廣度優先,是最好不過的了,也就是后兩種。
這樣一來,能夠盡可能地剪枝,以提高搜索效率。
而最后兩種枚舉法,則沒有剪枝策略,是一種全局判定方式,是最低效的。
總之,這三種常見的搜索算法,無非就是
- 枚舉策略
- 深度優先
- 廣度優先
- 剪枝策略
- 約束條件
- 限界函數
枚舉策略 | 剪枝策略 |
---|---|
深度優先 | 約束條件 |
廣度優先 | 限界函數 |
其中,枚舉策略有且僅有一種,剪枝策略則隨意,然后就有了經典的枚舉法(蠻力法)、回溯法和分支限界法。
搜索算法的學習策略
已經顯而易見了,這4種方式,單獨學明白,懂邏輯,會實現,然后再組合起來使用就OK了。
預測思想:限界函數
限界函數是通過對子樹未來的上界/下界的預測,來評定是否需要繼續生成,方法就是按照平均值排序后,乘以剩余容量。
具體實例可以參考
-
0/1 knapsack problem using branch and bound
-
分支限界法-01背包問題
限界函數和約束條件的目標
- 約束條件,是為了去掉不可行解,從而進行剪枝
- 限界函數,是為了去掉非最優解,從而剪枝,但是它依然是可行解
明確了這兩個目標,就能夠更加針對性選擇了,如果題目求多個可行解,那么就不可能使用限界函數。