1、定義
分支定界法(branch and bound)是一種求解整數規划問題的最常用算法。這種方法不但可以求解純
整數規划,還可以求解混合整數規划問題。
2、算法步驟
第2步:將放寬了某些約束條件的替代問題分成若干子問題,要求各子問題的解集合的並集要包含原問題的所有
可行解,然后對每個子問題求
最優解。這些子問題的
最優解中的最優者若是原問題的
可行解,則它就是原問題的
最優解,計算結束。否則它的目標函數值就是原問題的一個新的上界。另外,各子問題的最優解中,若有原問題的
可行解的,選這些可行解的最大目標函數值,它就是原問題的最優解的一個下界。
第4步:在保留下的所有子問題中,選出
最優解的
目標函數值最大的一個,重復第1步和第2步。如果已經找到該子問題的最優
可行解,那么其目標函數值與前面保留的其他問題在內的所有子問題的可行解中目標函數值最大者,將它作為新的下界,重復第3步,直到求出最優解。
3、我的理解
- 放寬條件;各分支問題最優解最優者定上界,各分支問題最優可行解最優者定下界;選一個最優解中不符合限制條件的x值,根據x值對該子問題分支,繼續求。最優解最優者=最優可行解最優者(最優解最優者符合限制條件),即終結。
- 始終從最優解最大的一個子問題開始分支、定界……
- 始終維護更新一個子問題集合。
- 終結條件:
- 最優解最優者=最優可行解最優者(最優解最優者符合限制條件),即終結。
- 各個子問題的最優解<下界,子問題終結,被放棄。
- 松弛問題沒有可行解,原問題也沒有可行解
- 所有子問題已處理完,沒有找到,原問題沒有可行解。
- 算法思想如下:
-
/**** 設min<=目標函數值G<=max,flag表示某子問題是否已解(初始值為0),數組P[ ]存放當前所有子問題,數組B[ ]暫存每輪求解的問題的最優解。 ****/ 1、將問題放入P[ ]。 2、對P[ ]中的每個未解問題: 計算最優解,存入B[ ]; 若該最優解<min,則從P[ ]中刪掉該問題,continue; //減枝 //判斷最優解是否是可行解, 若是,則是該問題的最優可行解, 若該問題是原問題,則得解,return; 置flag=1; 若該解>min, 則min=當前解。 若max==min,則得解,return; 3、尋找B[ ]中的最優值。 若該最優值>max,則max=當前最優值。 4、分解該最優值問題為n個子問題,將這n個子問題加入P[ ],並置相應flag=0,執行2~4. 5、若P中不存在未解問題,則問題無解。
- 算法描述如下:
1 /*********** 2 設min<=目標函數值G<=max, 3 flag表示某子問題是否已解, 4 數組P[ ]存放當前所有子問題. 5 數組B[]暫存每一輪求解中的最優解。 6 ************/ 7 8 BranchAndBound() 9 { 10 將問題放入P[ ]。 11 while( P[]中有未解問題 ) 12 { 13 定義數組B[]; 14 15 for( ;P[ ]中的每個未解問題; ) //一輪一輪求解 16 { 17 18 計算最優解; 19 if( 該放松問題無可行解 ) //剪枝 20 { 21 if( 該問題是原問題 ) 22 return; //出口1:無解 23 從P中刪除此問題; 24 continue; 25 } 26 保存最優解到B[]中; 27 28 if(最優解<min) //剪枝 29 { 30 從P[ ]中刪掉該問題; 31 continue; 32 } 33 34 if( 最優解是可行解 ) 35 { 36 if( 該問題是原問題 ) //出口2:有解 37 { 38 得解; 39 return; 40 } 41 置flag=1; 42 if( 該解>min ) //更新下界 43 { 44 min=當前解。 45 if( max==min ) //出口3:有解 46 { 47 得解; 48 return; 49 } 50 } 51 } 52 } 53 54 尋找B[ ]中的最最優值。 55 if( 該最優值>max ) //更新上界 56 max = 該最優值。 57 分解該最優值問題為n個子問題,將這n個問題加入到P[]中。 //分支 58 } 59 return; //P中不存在未解問題,問題無解。出口4:無解 60 }
- 例子: