分支限界法和回溯法都屬於搜尋演算法,但是他們的搜尋策略是不同的。分支限界法=廣度優先搜尋(bfs)+剪枝函式,回溯法=深度優先搜尋(dfs)+剪枝函式
回溯法(找出滿足約束條件的所有解),分枝限界法(找出滿足約束條件的乙個解或特定意義下的最優解)
裝載問題(有兩艘船,載重量分別是c1、 c2,n個貨櫃,重量是wi (i=1…n),且所有貨櫃的總重量不超過c1+c2。確定是否有可能將所有貨櫃全部裝入兩艘船。)
解題思路:
1.首先將第一艘船盡可能裝滿
2.將剩餘的貨櫃裝上第二艘船
(將第一艘船盡可能裝滿等價於選取全體貨櫃的乙個子集,使子集貨櫃之和最接近c1,也就是求出不超過c1的最大值max,若總重量-max < c2則能裝入到兩艘船)
c1=11,c2=13,wi(i=1…n)=2,3,4,5,3,6
回溯法:
#include
#include
#define n 100
int visited[n]=;
int a[n]=;
int c1=
11,c2=13;
int n=6;
int w=
;int bestw=0;
int cw=0;
void
solve
(int dep)}}
else
visited[dep]=0
;solve
(dep+1)
;}}int
main()
if((sum-bestw)
<=c2)
else
printf
("strategy:");
for(
int i=
0;i)printf
("\n");
}
分支限界法:
#include
#include
#include
using namespace std;
queue<
int> q;
int n=6;
int w=
;int c1=
11,c2=13;
int bestw=0;
void
enqueue
(int wt,
int i)
else
}int
maxloading
(int w,
int c)}}
intmain()
if((sum-result)
<=c2)
else
}
回溯法與分支限界演算法
1 概念 回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就 回溯 返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術...
回溯演算法與分支限界法
確定了解空間的組織結構以後,回溯法從開始結點 根結點 出發,以深度優先方式搜尋整個解空間。這個開始結點為活結點,同時也成為當前結點的擴充套件結點。在當前的擴充套件結點處,搜尋向縱深方向移至乙個新結點。這個結點就成為新的活結點,並成為當前擴充套件結點。如果在當前的擴充套件結點處不能向縱深方向移動,則當...
佇列式分支限界法 裝載問題
今晚終於把老師發布的演算法題的思路理清楚了,很是開心。這次的演算法是用佇列式分支限界法解決裝載問題。下面對於演算法的幾乎每一步都給了詳細解釋。需要的同學可以借鑑一下。嘻嘻。希望大家一起共同進步呀 佇列式分支限界法 貨櫃問題 public class fifobbloding 佇列類 private ...