1. 程式人生 > 其它 >單純形法簡陋入門

單純形法簡陋入門

單純形法

解決的問題

單純形法可以在較短的時間(似乎是非多項式時間,但我不會證,也找不到論文,不過就是非常快)內解決線性規劃問題

形式的處理

對於一個線性規劃問題,我們可以寫作(以下的\(\,x\,\)是變數,其他都是常數,大寫字母表示矩陣):

\[max\ z=\sum_{i=1}^nc_ix_i=CX\\ s.t.\begin{cases} \sum_{i=1}^na_{1,i}x_i\leq b_1\\ \sum_{i=2}^na_{2,i}x_i\leq b_2\\ \quad\quad\quad\cdots\\ \sum_{i=1}^na_{m,i}x_i\leq b_m\\ \forall x_i\geq0 \end{cases} \]

其中 \(n\geq m\)

,否則沒有意義

這樣的形式是不利於我們計算的,我們考慮一個更好看的形式(標準形式):

\[max\ z=\sum_{i=1}^nc_ix_i=CX\\ s.t.\begin{cases} \sum_{i=1}^na_{1,i}x_i=b_1\\ \sum_{i=2}^na_{2,i}x_i=b_2\\ \quad\quad\quad\cdots\\ \sum_{i=1}^na_{m,i}x_i=b_m\\ \forall x_i\geq0 \end{cases} \]

當然,為了處理時的一致有序,我們把\(\,z\,\)的表示式也插入到矩陣中,並令其值為\(\,0\),這樣這一行最後的\(\,z\,\)

就是答案的相反數(也就是說後文中的\(\,C\,\)都是“答案行”消元后的係數)

下面給出一些簡單情況的轉化方法:

如果求的是min或約束條件中出現大於等於,全部取負即可

\[\sum_{j=1}^na_{i,j}x_j\leq b_i\Longrightarrow\sum_{j=1}^na_{i,j}x_j+x_{n+1}=b_i \\x\leq0\Longrightarrow x=y-z,y-z\leq0\,\and\,y,z\geq0 \]

如此,我們就得到了標準形式的線性約束條件

單純形的處理

關於矩陣的聯想

標準形式和線性方程組很像,我們不由得聯想到高斯消元,但是線性規劃是一個狹長的矩形(上文說了,總存在\(\,n\geq m\,\)

)

這時我們就不能完全消元,只能選擇其中一個\(\,m\,\)階矩陣將其變為單位矩陣,而單純形法就是告訴我們應該選擇那些來消元

更具體的步驟

選擇基變數

要求\(\,z=CX\,\)的最大值,我們不難發現,對於任意\(\,c_i\leq0\),我們可以直接令\(\,x_i=0\,\)(當然得保證有解)

聯絡幾何意義,線性規劃實際上就是在一個超平面上的凸包裡選擇一個點,使其座標的一個線性組合最大,那麼不難發現是凸包最外圍的“界”上的點滿足性質

而“界”的代數含義就是\(\,\exists x_i=0\),於是我們可以讓所有我們不準備進行消元的變數為\(\,0\),之後我們稱這樣的變數為非基變數,反之叫做基變數

顯然,我們希望基變數在\(\,C\,\)中對應的係數越大越好,因為這樣答案收斂快

不過除了第一次,在選擇基變數時也應注意解的可行性,記基變數全體為\(\,J\,\),有定義有

\[\forall i\in J,i\geq0 \]

於是我們採用最為樸素的方法,列舉所有的\(\,x\in J\),假設我們要將\(\,y\,\)加入\(\,J\,\)並將\(\,x\,\)刪除,那麼我們可以直接令\(\,x=0\,\),並計算\(\,y\,\)值,代回去驗證解的可行性(注意此時除了\(\,y\,\)的非基變數依然都是\(\,0\,\)而基變數經過消元后每行只有一個),然後選擇最大的合法\(\,y\,\)值即可

在得到新的\(\,J\,\)之後,重新消元重複上述步驟

終止條件

結合上文,注意到當所有非基變數在\(\,C\,\)中對應的係數都不大於\(\,0\,\)時為最優解(值得一提的是,如果此時存在一個非基變數在\(\,C\,\)中的對應係數恰為\(\,0\),有無窮種構造方案)

因為如果存在對應係數大於\(\,0\,\)的情況,那麼可以將其作為新的基變數,並且一定會使得答案增大

又是沒有實現的一天

如有錯誤,歡迎指正