世界太吵,來原聲聽播客

StatQuest

線性規劃最優解不在內部:單純形法只沿邊界頂點爬

線性規劃的最優解總在某個邊界頂點上,所以單純形法不搜索區域內部:從原點出發,用最大負數列選方向、最小比率定步長,不斷換到收益更高的相鄰頂點。

線性規劃單純形法鬆弛變量高斯消元運籌學算法細節
這集把「沿邊界頂點爬」的幾何直覺落實成每一步矩陣操作,講清方向、步長和停止條件。手算一遍後,再看優化器文檔體感完全不同。

核心論點 · 點時間戳可跳到原聲

1:06

在相鄰頂點間爬坡

線性規劃要在一組直線約束圍成的可行域裡找目標函數的最值。單純形法並不搜索區域內部,而是從原點出發,沿著邊移動到能提高收入的相鄰頂點;到達新頂點後再看下一個相鄰頂點,直到移動不再增加收入為止。因為算法「看不見」圖形,後面所有看似複雜的矩陣操作,本質都是在用數字回答方向與距離這兩個問題。

— Josh Starmer
4:06

先把約束統一成小於等於

正式進入迭代之前要先做標準化:帶大於等於號的約束必須兩邊同乘 -1 翻轉成小於等於;帶等號的約束則拆成小於等於與大於等於兩個不等式,再把大於等於那個乘 -1 翻轉,兩個不等式形成一種「不等式三明治」,等價於原來的等式。節目解釋這樣做的目的是讓算法每一步只需要處理同一種符號,不需要在迭代中為不同約束形態分叉檢查。

— Josh Starmer
5:08

鬆弛變量把不等式補成等式

即使表達式變成小於等於,左側和右側仍可能不相等。辦法是給每個方程追加一個非負的鬆弛變量,欠多少就補多少。節目舉的例子是生產 10 kg 餅乾混合料和 8 kg 甜甜圈混合料時,麵粉實際只用了 8 kg,而可用量是 10 kg,於是麵粉對應的鬆弛變量設為 2 kg;其餘約束的鬆弛變量因係數為 0 而在計算中消失。補完鬆弛變量後所有方程格式一致,才能統一放進矩陣。

— Josh Starmer
7:10

裝進矩陣再把首行取負

格式化的最後一步是把所有係數與總量填進矩陣,並把第一行乘以 -1。取負只是為符合單純形法的通常定義,讓「下一步往哪走」可以直接讀成第一行裡的最負係數;此時收益初始值為 0,因為搜索從原點開始。矩陣整理完成後,每一輪迭代都圍繞同一個動作展開:先選方向,再定距離,最後用行變換把新頂點的座標顯式讀出來。

— Josh Starmer
9:11

最小比率才落在邊界上

算法本身看不見可行域,所以它用比率檢驗來定步長:拿每一行約束右側的總量,除以當前列中對應的正係數,商就是沿這根軸可能到達的座標。節目用 cookie mix 軸上的三個候選點說明:比值 25、16.7 分別對應黃線、藍線與軸的交點,都在可行域外;最低的 10 落在棕線交點,也就是邊界上。因此總是選最小比率,比值更大的點必然越界;若最小比率並列,慣例選行號最小的一行。

— Josh Starmer
16:17

高斯消元讓座標自己浮現

選好主元列與主元行之後,用高斯消元把主元位置變成 1,再通過行的倍加把同一列其餘位置全部清成 0。消元完成後,讀數規則很簡單:如果某一列只有一個 1、其餘全是 0,就把這一列對應行上的總量值讀成當前頂點在該軸上的座標;多個變量列同時滿足時,座標會一起出現,右上角數值直接給出該頂點的收入。節目用這個方式讀出第二個頂點 (10,10) 與收入 50。

— Josh Starmer
18:19

第一行沒有負數時就停

何時停止與如何移動同樣重要。只要第一行裡還有可作為候選的最負係數,算法就會繼續檢驗是否能提高收入;一旦第一行不再有負數,單純形法就宣布當前頂點是最優。第一個例子的第二站 (10,10) 就滿足這一條件,收入 50 是在麵粉、糖、巧克力三項約束下能取得的最好值。這個停止條件正是「相鄰頂點無法再提高收入」的幾何直覺在矩陣語言裡的等價表述。

— Josh Starmer
25:33

三維算例沒有新增機制

把算例從兩個產品擴展到三個,單純形法依舊成立。節目把甜甜圈、餅乾、布朗尼混合料記成 x、y、z,五條約束各配一個鬆弛變量,從原點出發後每一步仍是同一套流程:用第一行的最負係數選列,用最小比率選主元行,再做高斯消元。遇到多個最負係數並列時,取最靠左的一列先走。經過幾次移動後第一行不再有負數,算法停在 (9,9,4),對應最大收入 22。

— Josh Starmer

原話 · 已逐字校驗

The simplex algorithm starts at the origin and then moves to neighboring vertices that increase revenue until moving to the next vertex does not increase the revenue. Bam.

單純形法從原點出發,移動到能使收入增加的相鄰頂點,直到移動到下一個頂點不再增加收入為止。Bam。

Josh Starmer1:06

Now the two inequalities give us a sort of inequality sandwich that is the equivalent of the original equality.

這兩個不等式構成一種「不等式三明治」,它等價於原來的等式。

Josh Starmer4:06

The idea is that when the total amount of something like flour used by the cookie and doughnut mixes on the left is less than the amount available on the right, the slack variables make up the difference.

思路是:當左側餅乾和甜甜圈混合料使用的麵粉總量小於右側可用量時,鬆弛變量把差額補上。

Josh Starmer5:08

In this example, the largest negative number in the first row, -3, is in the first column, the column for cookie mix. So, we could decide to go along the cookie mix axis.

在這個例子中,第一行最負的數是 -3,位於第一列 cookie mix,於是我們決定先沿 cookie mix 軸移動。

Josh Starmer8:10

Again, in general, the simplex algorithm selects the lowest value because larger values are always outside of the feasible region.

還是一樣,單純形法通常選最小的比值,因為更大的比值一定落在可行域外面。

Josh Starmer15:16

In other words, the point 10, 10, which represents a revenue of 50, is the best we can do given the constraints on the amount of flour, sugar, and chocolate that we can use.

也就是說,點 10,10 對應收入 50,是在麵粉、糖、巧克力用量約束下我們能達到的最好結果。

Josh Starmer18:19

數字與實體

第一個例子的第一步移動終點cookie mix = 10,doughnut mix = 013:16
該頂點的收入3013:16
第一個例子的第二步移動終點cookie mix = 10,doughnut mix = 1017:17
該頂點的收入提升從 30 提升到 5018:19
三維算例的最優頂點x = 9,y = 9,z = 425:33
三維算例的最大收入2225:33

術語

simplex algorithm單純形法
從原點出發、沿相鄰邊界頂點逐步尋找線性規劃最優解的算法。
feasible region可行域
由全部約束圍成的所有可行解所在區域。
objective function目標函數
要最大化或最小化的線性方程,例中是收入方程。
slack variable鬆弛變量
為把不等式補成等式而加入的非負變量。
Gaussian elimination高斯消元
用行變換化矩陣為階梯形,從而讀出交點座標。
ratio test最小比率檢驗
用約束總量除以當前列正係數,取最小比值定步長。

收聽指南

誰該聽

適合會調優化庫卻沒手推過單純形法的工程師、運籌學學生,以及準備講線性規劃的老師。

可跳過

片頭 Gurobi 廣告、開頭線性規劃回顧與片尾書籍周邊推銷可跳過,其餘都是手算細節。