回溯法與分支限界法 裝載問題

2021-10-09 02:59:10 字數 1355 閱讀 8041

分支限界法和回溯法都屬於搜尋演算法,但是他們的搜尋策略是不同的。分支限界法=廣度優先搜尋(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 ...