回溯算法與分支限界法


回溯法

一、回溯法

回溯法可以系統的搜索一個問題的所有解或者任意解。它在問題的解空間樹中,按深度優先策略從根節點出發搜索解空間樹,算法搜索至解空間樹的任意一個結點時,先判斷該節點如(子樹)是否包含問題的解,如果肯定不包含,則跳過對其子樹的搜索,逐層向其根節點回溯。否則,則按照深度優先的策略搜索子樹。當回溯到根,且根節點的所有子樹都已被搜索遍才結束。這種以深
度優先方式系統搜索問題解的算法稱為回溯法,適用於解決組合數較大的問題。

例:n皇后問題
n皇后問題要求在一個n行n列的棋盤上放置n個皇后,使得皇后彼此之間不受攻擊,按照國際象棋的規則,一個皇后可以攻擊與之處於同一行或同一列或同一條斜線上的其他任何棋子。因此,n皇后問題等價於要求在一個n*n格的棋盤上放置n個皇后,使得任意兩個皇后不在同一行、同一列和相同的對角線上。
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

int Place(int *Column, int index){
int i;
for(i=1; i<index; i++) {
int Column_differ=abs(Column[index]-Column[i]);
int Row_differ=abs(index-i);
if(Column[i] == Column[index] || Column_differ == Row_differ)
/*有皇后與其在同列或同一斜線上*/
return 0;
}
return 1; /*沒有皇后與其同行、同列或同對角線*/
} 
void N_Queue(int n){
int Column_num[n+1]; /*數組下標表示皇后所在的行,數組元素的值
int index=1; /*皇后的個數*/ 表示皇后所在的列*/
int i; /*循環變量*/
int answer_num=0; /*解個數*/
for(i=1; i <= n; i++) /*初始化數組Column*/
Column_num[i]=0;
while(index > 0){
Column_num[index]++;
while(Column_num[index] <= n && !Place(Column_num ,index)) 
/*尋找皇后的位置*/
Column[index]++; 
if(Column_num[index] <= n){
if(index== n){ /*如果是最后一行時,即有一個解時*/
answer_num++; 
for(i=1; i<=n; i++)
Column_num [index]++;
}
else{ /*繼續尋找下一個皇后*/
index++; 
Column_num[index]=0;
}
}else
index--; /*當前皇后無法放置回溯至上個皇后*/
}

分支限界法

一、分支限界法

分支限界法類似於回溯法,也是一種在問題的解空間樹T上搜索問題解的算法。但:1.分支限界法與回溯法的求解目標不同。回溯法的求解目標是找出滿足約束條件的所有解,而分支限界法的求解目標是找出滿足約束條件的一個解,或是滿足約束條件的最優解。2.分支限界法與回溯法在解空間樹T上的搜索方式也不相同。回溯法以深度優先的方式搜索解空間樹T,而分支限界法則以廣度優先或以最小耗費優先的方式搜索解空間樹T。

分支限界法的思想
分支限界法首先將根結點加入活結點表(用於存放活結點的數據結構),接着從活結點表中取出根節點,使其稱為當前擴展結點,一次性生成其所有孩子結點,判斷孩子結點是舍棄還是保留,舍棄那些導致不可行解或者導致非最優解的孩子結點,其余的被保 留在活結點表中。再從活結點表中取出一個活結點作為當前擴展結點,重復上述過程,一直持續到找到所需的解或活結點表為空時為止。活結點表的實現通常有2種方法:一是先進先出隊列;二是優先級隊列。

例:0-1背包問題。假設有4個物品,其重量分別為(4, 7, 5, 3), 價值分別為(40, 42, 25, 12),背包容量W=10。首先,將給定物品按單位重量價值從大到小排序,結果如下:

在這里插入圖片描述

應用貪心法求得近似解為(1, 0, 0, 0),獲得的價值為40,這作為0-1背包問題的下界。
如何求得0-1背包問題的一個合理的上界?考慮最好情況,背包中裝入的全部是第一個物品且可以將背包裝滿,則可以得到上界的計算方法:ub=40+(10-4)×(v1/w1)=40×60=100。於是,得到了目標函數的界[40, 100]。
在這里插入圖片描述

在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM