當前位置:編程學習大全網 - 編程語言 - 什麽是分支算法

什麽是分支算法

分支限界算法:

分支定界 (branch and bound) 算法是壹種在問題的解空間樹上搜索問題的解的方法。但與回溯算法不同,分支定界算法采用廣度優先或最小耗費優先的方法搜索解空間樹,並且,在分支定界算法中,每壹個活結點只有壹次機會成為擴展結點。

利用分支定界算法對問題的解空間樹進行搜索,它的搜索策略是:

1 .產生當前擴展結點的所有孩子結點;

2 .在產生的孩子結點中,拋棄那些不可能產生可行解(或最優解)的結點;

3 .將其余的孩子結點加入活結點表;

4 .從活結點表中選擇下壹個活結點作為新的擴展結點。

如此循環,直到找到問題的可行解(最優解)或活結點表為空。

從活結點表中選擇下壹個活結點作為新的擴展結點,根據選擇方式的不同,分支定界算法通常可以分為兩種形式:

1 . FIFO(First In First Out) 分支定界算法:按照先進先出原則選擇下壹個活結點作為擴展結點,即從活結點表中取出結點的順序與加入結點的順序相同。

2 .最小耗費或最大收益分支定界算法:在這種情況下,每個結點都有壹個耗費或收益。如果要查找壹個具有最小耗費的解,那麽要選擇的下壹個擴展結點就是活結點表中具有最小耗費的活結點;如果要查找壹個具有最大收益的解,那麽要選擇的下壹個擴展結點就是活結點表中具有最大收益的活結點。

又稱分支定界搜索法。過程系統綜合的壹類方法。該法是將原始問題分解,產生壹組子問題。分支是將壹組解分為幾組子解,定界是建立這些子組解的目標函數的邊界。如果某壹子組的解在這些邊界之外,就將這壹子組舍棄(剪枝)。分支定界法原為運籌學中求解整數規劃(或混合整數規劃)問題的壹種方法。用該法尋求整數最優解的效率很高。將該法原理用於過程系統綜合可大大減少需要計算的方案數日。

分支定界法的思想是:首先確定目標值的上下界,邊搜索邊減掉搜索樹的某些支,提高搜索效率。

在競賽中,我們有時會碰到壹些題目,它們既不能通過建立數學模型解決,又沒有現成算法可以套用,或者非遍歷所有狀況才可以得出正確結果。這時,我們就必須采用搜索算法來解決問題。

搜索算法按搜索的方式分有兩類,壹類是深度優先搜索,壹類是廣度優先搜索。我們知道,深度搜索編程簡單,程序簡潔易懂,空間需求也比較低,但是這種方法的時間復雜度往往是指數級的,倘若不加優化,其時間效率簡直無法忍受;而廣度優先搜索雖然時間復雜度比前者低壹些,但其龐大的空間需求量又往往讓人望而卻步。

所以,對程序進行優化,就成為搜索算法編程中最關鍵的壹環。

本文所要討論的便是搜索算法中優化程序的壹種基本方法棗“剪枝”。

什麽是剪枝

相信剛開始接觸搜索算法的人,都做過類似迷宮這樣的題目吧。我們在“走迷宮”的時候,壹般回溯法思路是這樣的:

1、這個方向有路可走,我沒走過

2、往這個方向前進

3、是死胡同,往回走,回到上壹個路口

4、重復第壹步,直到找著出口

這樣的思路很好理解,編程起來也比較容易。但是當迷宮的規模很大時,回溯法的缺點便暴露無遺:搜索耗時極巨,無法忍受。

我們可不可以在向某個方向前進時,先壹步判斷出這樣走會不會走到死胡同裏呢?這樣壹來,搜索的時間不就可以減少了嗎?

答案是:可以的。

剪枝的概念,其實就跟走迷宮避開死胡同差不多。若我們把搜索的過程看成是對壹棵樹的遍歷,那麽剪枝顧名思義,就是將樹中的壹些“死胡同”,不能到達我們需要的解的枝條“剪”掉,以減少搜索的時間。

搜索算法,絕大部分需要用到剪枝。然而,不是所有的枝條都可以剪掉,這就需要通過設計出合理的判斷方法,以決定某壹分支的取舍。在設計判斷方法的時候,需要遵循壹定的原則。

剪枝的原則

1、正確性

正如上文所述,枝條不是愛剪就能剪的。如果隨便剪枝,把帶有最優解的那壹分支也剪掉了的話,剪枝也就失去了意義。所以,剪枝的前提是壹定要保證不丟失正確的結果。

2、準確性

在保證了正確性的基礎上,我們應該根據具體問題具體分析,采用合適的判斷手段,使不包含最優解的枝條盡可能多的被剪去,以達到程序“最優化”的目的。可以說,剪枝的準確性,是衡量壹個優化算法好壞的標準。

3、高效性 設計優化程序的根本目的,是要減少搜索的次數,使程序運行的時間減少。但為了使搜索次數盡可能的減少,我們又必須花工夫設計出壹個準確性較高的優化算法,而當算法的準確性升高,其判斷的次數必定增多,從而又導致耗時的增多,這便引出了矛盾。

因此,如何在優化與效率之間尋找壹個平衡點,使得程序的時間復雜度盡可能降低,同樣是非常重要的。倘若壹個剪枝的判斷效果非常好,但是它卻需要耗費大量的時間來判斷、比較,結果整個程序運行起來也跟沒有優化過的沒什麽區別,這樣就太得不償失了。

綜上所述,我們可以把剪枝優化的主要原則歸結為六個字:正確、準確、高效。

剪枝算法按照其判斷思路可大致分成兩類:可行性剪枝及最優性剪枝。

對於分支定界算法,上界是已求得的可行解的目標函數值中的最小者,分為初始上界和在探測過程中產生的動態上界.分支定界法在求最優解的叠代過程中, 若某結點估計的下界不小於已知的上界, 則不必從該節點往下繼續搜索. 因此若能產生壹個較好的上界, 可以消除許多不必要的列舉計算.

分支定界算法的實現

在描述分支定界算法步驟之前, 先對算法涉及到的有關術語進行定義如下:

p —— 分支層數;

C*—— 當前最優目標函數值;

P*—— 相應於C*的工件順序;

P1—— 當前節點(現在需要進行分支的節點)所對應的部分序列.

分支定界算法的實施步驟如下:

步驟1 初始化: 設置p = 0, P 1 = ? (空集) , C* = ∞.設當前節點總是與P 1 相對應. 此時, 當前節點即根節點.

步驟2 計算從當前節點分支得到的各個子節點的下界, 並按下界值由小到大對各子節點排序. 令p ←p + 1.

步驟3 如果當前節點被探測盡, 令p ←p - 1, 轉步驟6. 否則, 設當前層(第p 層) 各活動子節點中具有最小下界值的節點為Q , 則在P 1末尾加入Q 對應第p 位置上的工件, 此時的當前節點轉為Q , 轉步驟4.

步驟4 因為當前節點是同層同父節點具有最小下界值的節點, 如果當前節點下界值大於或等於C* , 則不必再搜索當前節點及其同層同父的活動節點, 這樣, 當前節點的上壹層節點(父節點)被探測盡, p ←p - 1, 去掉P 1 中的最後壹個工件,轉步驟6. 否則, 轉步驟5.

步驟5 如果p = n, 則得到壹個較優順序.令P* = P 1, C* 是當前節點的下界值, p ←p - 1,去掉P 1 中最後壹個工件, 轉步驟6; 否則轉步驟2.

步驟6 若p ≠ 0, 去掉P 1 中最後壹個工件,轉步驟3; 否則, 算法停止. C* 是最優的目標函數值, P* 是最優順序.

分支結構算法的實現(編程基礎)

我現在學到了分支結構了。又遇到問題了,不知道妳還在不在,可以幫我嗎?(可以,沒問題.)

1、用Pascal語言表示下列的條件表達式:

(1):x小於10;

(2):0<=y<=5;(‘小於等於’不會打)

(3):x大於5或x為負數;

(4):ch在“A”和“Z”之間(包括“A”和“Z”);

(5):年齡(age)不小於18,國籍(natioality)不是中國“CHINA”,也不是朝鮮“KOREA”的男性公民(sex=`maie`);

(6):正數,在2~100之間且不能被2,或3,或5整除。

2、試寫出下列各項的Pascal語句:

(1):如果wage大於10000,便減去10%的wage.

(2):如果Choice的值為1,則讀取x的值,並打印x的平方;否則讀取y的值,並打印y的平方。

  • 上一篇:初中畢業,想轉行,現在學計算機好就業嗎?
  • 下一篇:編程講義
  • copyright 2024編程學習大全網