分支定界法上下界_分支定界(Branch-and-Cut)方法的逻辑
對于一個含有m個變量的模型,如果每個變量是連續變量,每個變量的范圍無論是[-5,100]、[5,500]、[0,1]......,都可以作為LP問題在多項式時間內求解。
現在增加一個條件,模型中有n個變量是{0,1}變量。如果將變量松弛為[0,1]之間的連續變量,作為LP問題求解,這n個變量的取值可能是介于[0,1]區間的任何數,而無法保證是{0,1}。
分支定界是在這個背景下運用的。
我們以0-1整數規劃舉例:
首先,我們將0-1整數規劃模型松弛為LP模型求最優解,對于最小化問題,該LRP的最優解是原問題最優解的下界,i.e. 原問題的最優解一定不小于LRP的最優解。
其次,我們令這n個變量在滿足{0,1}約束的前提下求出一個可行解,該解可能不是最優解,一定是最優解的上界,i.e. 原問題的最優解一定不大于該可行解。
建樹:
如果模型中有n個{0,1}變量,我們就畫一個有
個葉子節點的二叉樹,如下。n=4:
我們把LRP解得的x1的值(假如x1=0.7)作為根節點:
分支:
因為x1的取值是0或1,因此分支:
定界:
計算x1=0,其他變量松弛情況下,模型的最優解y1。
計算x1=1,其他變量松弛情況下,模型的最優解y2。
情形1:如果y1或y2大于當前的上界,則該支及其以下的分支沒必要search下去,稱為cut。
情形2:如果y1或y2小于當前的上界,則該支的下界被更新為y1或y2,稱為定界。
情形3:如果求得y1或y2時,這n個變量正好滿足{0,1}約束,則終止運算,因為滿足約束的松弛模型最優解一定是原模型的最優解。
對于情形1和2,我們還需要把運算進行下去。
分支:
因為x2的值也是在[0,1]區間上,我們將x2分支:
Note:x1=0或x1=1那個分支可能在上述情形1中被cut了。
定界:
分別計算x2=0、x2=1情況下,除x1、x2之外的其他變量松弛的最優解。
情形1:當前松弛最優解大于當前的上界(當前最優可行解),則該支及其以下的分支沒必要search下去,稱為cut。
情形2:當前松弛最優解小于當前的上界(當前最優可行解),則下界被更新為當前松弛最優解,稱為定界。
情形3:對于當前松弛最優解,這n個變量正好滿足{0,1}約束,則終止運算,因為滿足約束的松弛模型最優解一定是原模型的最優解。
對于情形1和2,我們還需要把運算進行下去。
分支:
因為x3的值也是在[0,1]區間上,我們將x3分支:
Note:x2=0或x2=1的分支可能在上述情形1中被cut了。
定界:
與上同理。
分支:
因為x4的值也是在[0,1]區間上,我們將x4分支:
Note:x3=0或x3=1的某些分支可能在上述情形1中被cut了。
定界:
與上同理。
算法復雜度:
完整二叉樹的節點是指數增長的,to be exact,每增加1個{0,1}變量,最小分支(葉子節點)的個數需要乘以2。例如n=10,最小分支的個數為1024;n=15,最小分支的個數為32768;n=20,最小分支的個數為1048576。這就是指數爆炸!
如此復雜度的運算,那什么時候中止呢:
(1)獲得最優解,如上情形3。
(2)上下界之間的gap小于預設的MIPGap參數值。
(3)完成了預設的運算時間。
(4)強制中止(Ctrl+C,輸入m.optimize()會從中止處繼續運行)
Note:“建樹”是根據定界逐步完成的,不是事先將完整的二叉樹建好,只會建滿足定界要求的“支”,顯然,最終建好的樹不是一個完整的二叉樹。
總結
以上是生活随笔為你收集整理的分支定界法上下界_分支定界(Branch-and-Cut)方法的逻辑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux两个网段默认网关_Linux下
- 下一篇: 什么时候能用Δs判断反应进行方向_化学反