一、概念:與貪婪法一樣,這種方法也是用來為組合優化問題設計求解演算法的,所不同的是它在問題的整個可能解空間搜尋,所設計出來的演算法雖然時間複雜度比貪婪演算法高,但它的優點是與窮舉法類似,都能保證求出問題的最佳解,而且這種方法不是盲目的窮舉搜尋,而是在搜尋中通過界限,可以中途停止對某些不可能得到的最優解的子空間。進一步搜尋(類似人工智慧中的剪枝),故它比窮舉法效率更高。
二、基本思路:
分支限界法常以廣度優先或以最小耗費(最大效益)優先的方式搜尋問題的解空間樹。在分支限界法中,每乙個活結點只有一次機會成為擴充套件結點。活結點一旦成為擴充套件結點,就一次性產生其所有兒子結點。在這些兒子結點中,導致不可行解或導致非最優解的兒子結點被捨棄,其餘兒子結點被加入活結點表中。 此後,從活結點表中取下一結點成為當前擴充套件結點,並重複上述結點擴充套件過程。這個過程一直持續到找到所需的解或活結點表為空時為止。
常見的兩種分支限界法
(1)佇列式(fifo)分支限界法
按照佇列先進先出(fifo)原則選取下乙個結點為擴充套件結點。
(2)優先佇列式分支限界法
按照優先佇列中規定的優先順序選取優先順序最高的結點成為當前擴充套件結點。
demo:
乙個小偷在歷屆noip競賽中,有4道初賽題和5道複賽題均涉及到揹包問題,所謂的揹包問題,可以描述如下:
打劫乙個保險箱,發現櫃子裡有n類不同大小與價值的物品,但小偷只有乙個容積為m的揹包來裝東西,揹包問題就是要找出乙個小偷選擇所偷物品的組合,以使偷走的物品總價值最大。
如有4件物品,容積分別為: 3 4 5 8
對應的價值分別為: 4 5 7 10
小偷揹包的載重量為:12
則取編號為1 2 3的物品,得到最大價值為16。
* 0/1揹包問題的分支定界法演算法*/ #include#include#define maxnum 100 struct node ; typedef struct node datatype ; struct seqqueue ; typedef struct seqqueue*pseqqueue ; pseqqueue createemptyqueue_seq(void) int isemptyqueue_seq(pseqqueue paqu) /* 在佇列中插入一元素x */ void enqueue_seq(pseqqueue paqu,datatype x) } /* 刪除佇列頭元素 */ void dequeue_seq(pseqqueue paqu) /* 對非空佇列,求佇列頭部元素 */ datatype frontqueue_seq(pseqqueue paqu) /* 物品按價效比從新排序*/ void sort(int n,double p,double w) return s ; } /* 求最小可能值*/ double down(int k,double m,int n,double p,double w) return s ; } /* 用佇列實現分支定界演算法*/ double solve(double m,int n,double p,double w,unsigned long*po) ; sort(n,p,w); x.max=up(0,m,n,p,w); x.min=min=down(0,m,n,p,w); if(min==0)return-1 ; enqueue_seq(q,x); while(!isemptyqueue_seq(q)) enqueue_seq(q,y); } if(x.weight+w[step-1]<=m) enqueue_seq(q,y); } } } return min ; } #define n 4 double m=15 ; double p[n]= ; double w[n]= ; int main() getchar(); return 0 ; }
分支界限法演算法
支限界法思路的簡單描述是 把問題的解空間轉化成了圖或者樹的結構表示,然後使用廣度優先搜尋策略進行遍歷,遍歷的過程中記錄和尋找所有可行解或者最優解。類似於回溯法,也是一種在問題的解空間樹t上搜尋問題解的演算法。但在一般情況下,分支限界法與回溯法的求解目標不同。回溯法的求解目標是找出t中滿足約束條件的所...
演算法分析 分支界限法
二 分支限界法的一般過程 由於求解目標不同,導致分支限界法與回溯法在解空間樹t上的搜尋方式也不相同。回溯法以深度優先的方式搜尋解空間樹t,而分支限界法則以廣度優先或以最小耗費優先的方式搜尋解空間樹t。分支限界法的搜尋策略是 在擴充套件結點處,先生成其所有的兒子結點 分支 然後再從當前的活結點表中選擇...
分支界限法
在當前節點 擴充套件節點 處,先生成其所有的兒子節點 分支 然後再從當前的活節點 當前節點的子節點 表中選擇下乙個擴充套件節點。為了有效地選擇下乙個擴充套件節點,加速搜尋的程序,在每乙個活節點處,計算乙個函式值 限界 並根據函式值,從當前活節點表中選擇乙個最有利的節點作為擴充套件節點,使搜尋朝著解空...