分支限界演算法。

2021-10-10 09:53:18 字數 2350 閱讀 2707

分支限界法類似於回溯演算法,是在問題的解空間樹上搜尋問題解的演算法,主要體現在兩點不同:

1.求解目標不同。回溯演算法的求解目標是找出解空間樹中滿足約束條件的所有解,而分支限界法的求解目標是找出滿足約束條件的乙個解,或者是在滿足約束條件的解中找出某種意義下的最優解。

⒉.搜尋解空間樹的方式不同。回溯演算法以深度優先的方式搜尋解空間樹,而分支限界法則以廣度優先或者以最小耗費優先的方式搜尋解空間樹。

分支限界演算法基本思想:

分支限界法常以廣度優先或以最小耗費(最大效益)優先的方式搜尋問題的解空間樹。在分支限界法中,每乙個活結點只有一次機會稱為擴充套件節點,活結點一旦成為擴充套件節點,就一次性產生其所有兒子節點(分支),在這些兒子節點中,導致不可行解或是導致非最優解的兒子節點會被捨棄掉,其餘兒子節點會被加入活結點表中。為了有效的選擇下乙個擴充套件節點加迭搜尋k宿每ht個活結點骨a薪兵個函式值(限界),並根據計算的函式值結果從當前活結點表中取下乙個最有利的節點成為當前的擴充套件節點,使搜尋朝著解空間樹上最優解的分支推進。重複上述節點擴充套件過程,直到找到所需的最優解或者活結點表為空。

從活結點表中選擇下乙個擴充套件節點時,不同的方式會導致不同的分支限界法,常見有:

1.佇列式(fifo)分支限界法

a.—開始,根結點是唯一的活結點,根結點加入活結點佇列。b.從活結點佇列中取出隊頭結點後,作為當前擴充套件結點。

c.對當前擴充套件結點,先從左到右產生它的所有孩子節點,用約束條件檢查,把所有滿足約束函式的孩子節點加入活結點佇列中。

d.再從活結點表中取出隊首結點為當前擴充套件結點,重複上述過程,直到找到乙個解或活結點隊列為空為止。

⒉.優先順序佇列式分支限界法

a.對每一活結點計算乙個優先順序(某些資訊的函式值)。

b.根據這些優先順序從當前活結點表中優先選擇乙個優先順序最高(最有利)的結點作為擴充套件結點,使搜尋朝著解空間樹上有最優解的分支推進,以便盡快地找出乙個最優解。

c.對當前擴充套件結點,先從左到右產生它的所有孩子節點,用約束條件檢查,對所有滿足約束函式的孩子節點計算優先順序並加入到活結點優先順序佇列中。

d.再從活結點表中取出下乙個優先順序最高的結點為當前擴充套件結點,重複上述過程,直到找到乙個解或活結點隊列為空為止。

int w = ; // 貨櫃的重量

const int n = sizeof(w) / sizeof(w[0]); // 貨櫃的數量

int c = 20; // 輪船的容量

int cw = 0; // 已選擇物品的重量

int bestw = 0; // 記錄最優的裝載量

// 描述節點型別

struct node

int weight; // 從根節點到當前節點所選擇物品的總重量

int level; // 當前節點的層數

node *parent; // 記錄當前節點的父節點

bool isleft; // 記錄當前節點是否被選擇

};// 廣度優先遍歷子集樹的fifo佇列

queueque;

int i = 0; // 表示起始的層數,從根節點開始

node *bestnode = nullptr;

int r = 0; // 記錄未被處理的物品的總重量

// 新增活結點到佇列當中

void addlivenode(int w, int level, node *parent, bool isleft)

}// 節點的上界函式, 返回未被處理的物品的總重量

int maxbound(int level)

return s;

}int main1()

// 活結點孩子入佇列

// que.push(node(cw + w[i], i + 1));

addlivenode(cw+w[i], i+1, node, true);

} // 處理右孩子,表示不選擇i節點

// que.push(node(cw, i + 1));

r = maxbound(i); // 求第i個節點的重量值上界

if (cw + r >= bestw)

// 處理完i節點後,它成為死節點,然後出隊

node = que.front();

que.pop();

// 恢復cw和i的值,表示從i節點跳到廣度遍歷的下乙個節點了

cw = node->weight;

i = node->level;

} cout << bestw << endl;

int bestx[n] = ;

for (int j = n - 1; j >= 0; --j)

for (int v : bestx)

cout << endl;

return 0;

}

演算法 分支限界法

在當前節點 擴充套件節點 處,先生成其所有的兒子節點 分支 然後再從當前的活節點 當前節點的子節點 表中選擇下乙個擴充套件節點。為了有效地選擇下乙個擴充套件節點,加速搜尋的程序,在每乙個活節點處,計算乙個函式值 限界 並根據函式值,從當前活節點表中選擇乙個最有利的節點作為擴充套件節點,使搜尋朝著解空...

分支限界演算法(2)

例題四單源最短路徑問題分支限界演算法的資料結構 include include include using namespace std class graphic class pathnode bool operator pathnode b const graphic graphic int n,...

演算法入門 分支限界法

用淺顯的話說就是一開始就大致性地找好方向 拿本人來說,專業選擇的軟體工程 然後從軟體工程細分到移動開發 然後又分到遊戲開發 然後又分到前端遊戲開發。或者也可以這樣,當你需要在乙個學生管理系統的資料夾手動查詢id為1208的學生資訊,這時候,你就要提前為每個資料夾寫好相關的策略 比如我要查詢學生的相關...