分支限界法实现最优装载c++_分支限界法
曉強Deep Learning的讀書分享會,先從這里開始,從大學開始。大家好,我是曉強,計算機科學與技術專業研究生在讀。我會不定時的更新我的文章,內容可能包括深度學習入門知識,具體包括CV,NLP方向的基礎知識和學習的論文;網絡表征學習的相關論文解讀。當然我每天的讀書心得也會分享給大家,可能涉及我們生活各個方面的書籍。我也會不定時回答大家的問題與大家一同進步,共同交流,互相監督,結交更多的朋友。希望大家多留言,多交流,多多關照。我在這里等你一同學習,如果需要相關資料也可以私信我,進入我們的群大家庭。
【曉白】今天正值高考,給大家加油。還是要堅持下去的,努力終會有收獲,只為了追求那個曾經的優秀的自己。所以今天中午抽時間寫了一篇分支限界法的文章。希望大家點贊,關注,支持一下。謝謝精神合伙人的支持和鼓勵。如果有準備秋招的同學,也可以來看一下,對大家很有幫助。有任何疑問可以私信,獲得我們大家庭的聯系方式,多多溝通,共同進步。如果高考結束以后大家對計算機學習有一定興趣,或者家長朋友和考生希望以后報考計算機,學習計算機的,也可以關注我,看更多文章;詳情私信,了解更多。可以咨詢,輔導入門。今天更新第六章的前面先補充一下回溯法的效率。
第五章回溯法的效率分析:
一個回溯算法的效率在很大程度上依賴于以下幾個因素:
(1)產生X[k]的時間
(2)滿足顯約束的x[k]值的個數
(3)計算約束函數Constraint的時間
(4)計算上界函數Bound的時間
(5)滿足約束函數和上界函數約束的所有x[k]的個數,在選擇約束函數時通常存在著生成結點數與約束函數計算量之間的折衷
重排原理:
解空間的結構一經選定,影響回溯法效率的前四個因素就可以確定,只剩下生成結點的數目是可變的,它將隨問題的具體內容以及結點的不同生成方式而變動。
對于一個問題的具體實例,我們很難預測回溯法的算法行為。特別是我們很難估計出回溯法在解這一具體實例時所產生的結點數。這是我們在分析回溯法效率時遇到的主要困難。
蒙特卡羅方法:
估計回溯法將要產生的結點數目。主要思想是在解空間樹上產生一條隨機的路徑,然后沿此路徑來估算解空間樹中滿足約束條件的結點總數。
算法Estimate從解空間樹的根結點開始選取一條隨機路徑,計算回溯法生成的結點總數m。
Estimate (int n, Type *x)
{ int m=1,r=1,k=1;
while (k<=n)
{
SetType T=x[k]的滿足約束的可取值集合;
if (Size(T)==0)return m;
r*= Size(T); // Size(T)得到集合T大小
m+=r;
x[k]=Choose(T); //Choose(T) 從集合T隨機地選一個元素
k++;
}
return m;
}
當用回溯法求解某一具體問題時,可用算法Estimate估算回溯法生成的結點數。
若要估算得更精確些,可選取若干條不同的隨機路徑(通常不超過20條),分別對各隨機路徑估計結點總數,然后再取這些結點總數的平均值,得到m的估算值。
例:8后問題
利用顯約束排除那些有2個皇后在同一行或同一列的方法,也有8!種不同的方法。8后問題的解空間樹的結點總數是:
回溯法產生的結點數m是解空間樹的結點總數的1.55%左右。說明回溯法的效率大大高于窮舉法。
第六章 分支限界法
分支限界法類似于回溯法,也是一種在問題的解空間樹T上搜索解的算法。但是,分支限界法與回溯法有不同的求解目標:回溯法的求解目標是找出T中滿足約束條件的所有解,或任意一個解;分支限界法的求解目標則是找出T中使得某一目標函數值達到極小或極大的解,即問題在某種意義下的最優解。
由于求解目標不同, 導致分支限界法與回溯法在解空間樹T上搜索的算法有兩點不同:
(1)回溯法以深度優先的方式搜索解空間樹T;分支限界法以廣度優先或最小耗費優先的方式搜索解空間樹T。
(2)回溯法一般只通過約束條件,而分支限界法不僅通過約束條件,而且通過目標函數的限界來減少無效搜索,提高求解效率。
分支限界法的搜索策略是:
在擴展結點處,先生成其所有兒子結點(使其變為活結點),然后再從當前的活結點表中選擇下一個擴展結點。為了有效地選擇下一個擴展結點,以加速搜索的進程,在每一活結點處,計算一個函數值(限界),并根據這些已計算出的函數值,從當前活結點表中選擇一個最有利的結點作為擴展結點,使搜索朝著解空間樹上有最優解的分支推進,以便盡快地找出一個最優解。這種方法就稱為分支限界法。
一、分支限界法的基本思想
從活動結點表選擇下一個擴展結點的原則體現在對活結點表的組織方式(即,數據結構)之中。常見的活結點表的組織方式有以下二種:
隊列式(FIFO)
優先隊列式(PQ, Prioroty Queue)---優先隊列可用堆實現
所以,常見的分支限界法分為:
(1)隊列式(FIFO)分支限界法
(2)優先隊列式(PQ)分支限界法
用隊列式分支限界法求解單源最短路徑問題
按隊列式分支限界法求解單源最短路徑的算法:
SSShortestPaths(v)
{ E.i=v;
E.length=0;
dist[v]=0; //源點V到源點V的最近距離
INSERT (Q, E); //Q是一個隊列
while(!Empty(Q))
{ E=DELETE(Q);
if(dist[E.i]<E.length) continue; //源點V到頂點i的當前最近距離
for(j=1; j<=n; j++)
if ((c[E.i][j]<inf)&&(E.length+c[E.i][j]<dist[j]))
{ dist[j]=E.length+c[E.i][j];
prev[j]=E.i;
N.i=j;
N.length=dist[j];
INSERT(Q,N);
}
}
}
用優先隊列式分支限界法求解單源最短路徑問題
(1) 按隊列式分支限界法求解多段圖最短路徑的算法:
ShortestPath(v)
{E.i=v; E.length=0;
Bound=inf; //也可用貪心法先確定一個初始界限
INSERT (Q, E); //Q是隊列
while(!Empty(Q))
{ E=DELETE(Q);
if(Bound<E.length) continue;
for (j=1; j<=n; j++)
{ if ((c[E.i][j]<inf)&&(E.length+c[E.i][j]<Bound))
{ prev[j]=E.i;
if(j是終點)
{Bound=E.length+c[E.i][j];continue; }
N.i=j;
N.length= E.length+c[E.i][j];
INSERT(Q,N);
}
}
}
}
按優先隊列式分支限界法求解多段圖問題的算法:
template <class Type>
void graph <Type> :: ShortestPath(int v)
{MinHeap <MinHeapNode <Type> > H(1000); //定義小根堆的容量為1000
MinHeapNode <Type> E;
E.i=v; E.length=0; //定義源為初始擴展結點
Bound=inf; //開始搜索問題的解空間
while(true)
{ if(E.length<Bound)
for(j=1; j<=n; j++)
if ((c[E.i][j]<inf)&&(E.length+c[E.i][j]<Bound))
{ prev[j]=E.i;
if(j是終點)
{Bound=E.length+c[E.i][j];continue; }
MinHeapNode <Type> N;
N.i=j; N.length= E.length+c[E.i][j];
H.Insert(N);
}
try { H.DeleteMin(E);} //從優先隊列取下一個擴展結點
catch (OutOfBound) {break;} // 優先隊列空
}
}
今天算法設計分析的第六章更新完畢,明天我會繼續更新對于第五章,和第六章的補充知識,敬請期待。當然,后續我也打算給小伙伴們更新一下計算理論的介紹以便大家全面的學習。7.7-7.10是高考的日子,我也會繼續更新,希望與大家一起堅持下去。祝順利,金榜題名都圓大學夢。莘莘學子們,如果對計算機學習感興趣也可以私信留言咨詢,學習,推薦資料,一對一輔導交流都可以。加入大家庭,一起學習。感興趣,關注我,文章。連接如下,
曉強DL:第五章 回溯法(Backtrack)?zhuanlan.zhihu.com曉強DL:圖像處理必讀論文之AlexNet?zhuanlan.zhihu.com曉強DL:圖像處理必讀論文之二:VGG網絡?zhuanlan.zhihu.com曉強DL:第四章 貪心算法(Greedy Algorithms)?zhuanlan.zhihu.com曉強DL:第三章 動態規劃(Dynamic Programming )?zhuanlan.zhihu.com曉強DL:第二章 遞歸與分治?zhuanlan.zhihu.com曉強DL:計算機算法設計與分析第一章 算法概述?zhuanlan.zhihu.com曉強DL:Opencv圖像處理(一)?zhuanlan.zhihu.com曉強DL:OpenCV圖像處理(二)?zhuanlan.zhihu.com曉強DL:Opencv圖像處理(三)?zhuanlan.zhihu.com曉強DL:Opencv圖像處理 (四)?zhuanlan.zhihu.com總結
以上是生活随笔為你收集整理的分支限界法实现最优装载c++_分支限界法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python输入文件名读取文件_[Pyt
- 下一篇: s3c2440移植MQTT