定義
一般存在兩種形式:標准型和松弛形。
標准型形如:
松弛形是由標准型轉化而來的,當然也可以轉化回標准型。
具體地,對於每條不等式添加輔助變量 \(x_{i + n}\),將不等式寫成等式的形式:
一般地,對於 \(a = b\) 限制,我們將其看作 \(a \le b, -a \le -b\) 轉化為標准型。
全幺模矩陣
以下三個條件同時滿足的矩陣 \(A\) 我們稱之為全幺模矩陣:
- 矩陣中只存在 \(-1, 0, 1\) 這三種數字。
- 矩陣中同一列中至多兩個位置非 \(0\)。
- 能將行分為兩個集合,滿足 \(\forall i, j, k, A_{i, k} \ne 0, A_{j, k} \ne 0\) 若 \(A_{i, k} = A_{j, k}\) 那么 \(i, j\) 划分在不同集合,否則划分在相同集合。(這一條限制沒有那么重要,下文可能將不存在該限制的矩陣也稱之為全幺模矩陣)
引理
我們不加證明地給出(利用下文的單純性法不難證明):
若標准型線性規划中 \(a\) 構成的矩陣為全幺模矩陣,那么該線性規划的最優解變量取到的一定為整數。
基本的例子
最短路
定義 \(d_i\) 為起點 \(s\) 到 \(i\) 的最短路。
最大流
定義 \(f_{u, v}\) 為 \(u \rightarrow v\) 的流量函數,為了方便我們加入邊 \(t \rightarrow s\) 流量為 \(\infty\),同時要求源匯點流量守恆:
單純性法
解決一般線性規划問題方法。
引理一
- 標准型線性規划的可行域為 \(n\) 維空間中的凸多邊形
考慮使用歸納法,以三維空間中為例,多維空間中類似:
一條限制本質上是規定解在一個平面的一側,也即將可行域削去一部分,易知不斷消去凸多邊形的一部分后還是凸多邊形。
引理二
- 線性規划的解關於可行域的函數為單峰函數(可能有平台)
反證法,以二維線性規划為例:
假設存在兩個峰 \((x_1, y_1, z_1), (x_2, y_2, z_2)\) 那么存在 \((x, y)\) 在兩峰連線投影的平面上(可行域為凸多邊形),滿足該點在兩峰連接直線上對應點為 \((x, y, z)\) 原本的函數值為 \(z'\) 有 \(z' < z\)。
又因為目標函數為線性函數,直線上的點位置線性變化,則有函數值也應該線性變化,所以應該有 \(z = z'\) 矛盾。
引理三
- 線性規划的最優解在可行域的邊界上取到
反證法,以二維線性規划為例:
因為不在可行域的邊界上,那么對於任意一個變量都可以自由加減。
若目標函數中存在系數 \(> 0\) 的變量,那么直接將其變大,矛盾;否則最優解唯一,全為 \(0\),處在邊界上。
由引理二,不難得到一個初步的想法:不斷調整解使得答案變大,迭代到不存在更優解為止。
那么存在兩個問題:
- 如何找到一組初始解。
- 如何進行調整,並且判斷不存在更優解。
為了方便起見,我們僅解決松弛形線性規划。
對於問題 \(1\) 若滿足 \(\forall i \in [1, m], b_i \ge 0\) 那么可以直接令:\(x_i = 0(i \in [1, n]), x_{i + n} = b_i(i \in [1, m])\) 即可得到初始解。
若不滿足 \(b\) 非負,暫時先不考慮,先解決 \(b\) 非負的情況。
在解決問題 \(2\) 之前,先引入一些定義:
一些定義
在松弛形當中,\(x_{1 \sim n}\) 出現在所有式子當中(包含目標函數),\(x_{n + 1 \sim n + m}\) 僅出現在一個式子當中,我們將所有限制變形為:
那么在所有等式當中 \(x_{n + 1 \sim n + m}\) 只出現在等式左側且只出現一次並且不在目標函數當中,\(x_{1 \sim n}\) 只出現在等式右側以及目標函數當中我們稱 \(x_{n + 1 \sim n + m}\) 為基變量,\(x_{1 \sim n}\) 為非基變量。
同時因為 \(x_{1 \sim n}, x_{n + 1 \sim n + m}\) 的地位實際上是 等價 的,因此我們可以選擇第 \(o\) 個式子,非基變量 \(x_e\) 滿足 \(a_{o, e} \ne 0\) 將 \(x_e\) 看作基變量,\(x_{o + n}\) 看作非基變量,再將其他等式和目標函數中的 \(x_e\) 用等式右側表示,這樣就完成了基變量和非基變量的互換,我們稱這個操作為轉軸 \(pivot(o, e)\)。
同時,在轉軸過程中本質上是將 \(x_e\) 卡到了上限,也就是達到了可行域邊界上,這也是為什么這個過程叫做轉軸的原因(從一個邊界轉到另一個邊界)。
有了轉軸操作和引理三,我們可以自然地聯想到:
- 使用轉軸操作進行調整,直到不存在方法繼續轉軸調整停止
此時我們發現,只需要找到 \(c_e > 0\) 的變量 \(x_e\),然后找到滿足 \(a_{o, e} > 0\) 的 \(o\) 那么轉軸 \(pivot(o, e)\) 則有:
因為一開始保證了 \(b_o > 0\) 所以將其帶入目標函數時常數變大。
同時由於上述的策略,可知 \(\forall i, c_i \le 0\) 時達到最優,答案即為常數部分。
但這里存在兩個問題:
- 可能 \(\forall o, a_{o, e} \le 0\)
- 轉軸時將上式帶入其他式子后我們無法保證其他式子常數項繼續非負(上式常數項顯然仍非負)。
對於問題 \(1\),可知此時 \(x_e\) 可取 \(+\infty\) 因此可以直接判斷原問題無界。
對於問題二,我們發現只需 \(\forall i\) 滿足:
移項(由之前的限制 \(a_{o, e} > 0\) 得 \(a_{i, e} > 0\) 否則一定可行)可得:
那么只需挑選 \(\frac{b_i}{a_{i, e}}\) 最小的 \(o \leftarrow i\) 即可。
回到一開始不保證 \(b_i\) 非負的限制,此時我們發現我們必須將原線性規划轉化成另一個線性規划滿足該線性規划 \(b_i\) 非負才能進行。
根據上面挑選最小的思路,我們直接考慮引入輔助線性規划:
那么如果 \(x_0 = 0\) 那么此時的一組解帶入原問題也滿足,否則顯然原線性規划無解。
類似地,我們找到 \(b_i < 0\) 且最小的 \(b_o\),執行 \(pivot(o, 0)\) 此時所有 \(b_i \ge 0\) 即可進行之前所述說的流程。
執行完畢以后,我們需要把原線性規划轉化為該線性規划,由於此時滿足 \(x_0 = 0\),分以下兩種情況討論:
- 若 \(x_0\) 為非基變量,那么直接忽略 \(x_0\) 的限制(將 \(x_0\) 前系數置為 \(0\))即可。
- 否則,尋找合適的非基變量 \(e\) 進行轉軸操作轉化為 \(1\)。注意到此時最優解必然滿足非基變量為 \(0\) 又 \(x_0 = 0\) 可得 \(b_i = 0\) 因此隨意找一個 \(a \ne 0\) 的非基變量轉軸即可(若不存在則可直接忽略該式)。
同時,由於轉軸過程中目標函數也會改變,因此可以維護一個輔助數組以維護目標函數的變化。
事實上,單純性算法單次 \(pivot\) 復雜度 \(\mathcal{O(nm)}\) 但總調用次數卻是指數級的。
但在一般隨機數據下表現優秀,調用次數可以達到低於 \(n + m\) 級別,因此通常可以跑 \(n, m = 3e2\) 左右的數據,更大范圍也可以大膽嘗試。
實現時不需要真的加入基變量,因為所有變量互相等價且基變量系數恆定,因此只需記錄非基變量的系數即可。
若要輸出方案,則還需記錄基變量對應的原變量編號。
對偶原理
將線性規划描述成矩陣的形式:
兩者最優解的答案相同。
此原理在線性規划當中十分通用。
互松弛定理
給出原線性規划和對偶線性規划最優解之間的關系。
- 若 \(x, y\) 分別為原問題及其對偶問題的可行解,那么 \(x, y\) 同為最優解 當且僅當:
- \(\forall 1 \le i \le n:x_i = 0\) 或 \(\sum\limits_{j = 1} ^ m a_{j, i} \times y_j = c_i\)
- \(\forall 1 \le i \le m:y_i = 0\) 或 \(\sum\limits_{j = 1} ^ n a_{i, n} \times x_j = b_i\)
通常在求解出對偶線性規划的最優解后通過限制導出原問題最優解的方案。
舉例
最大流最小割
最小割可描述為:
最大流的對偶問題為:
令 \(h_u \leftarrow k_u - h_u\) 得:
此處不加證明地給出上述線性規划的最優解與最小割線性規划最優解相等。
二分圖最大權匹配與最小標頂和
易得二分圖最大權匹配線性規划:
易知該矩陣為全幺模矩陣,因此實數線性規划與整數線性規划結果相同。
其對偶問題:
即為二分圖最小標頂和。
應用
一般線性規划
例1. precious stones(TCO08 round2 1000)
簡化題意:有 \(n\) 個石頭,第 \(i\) 個石頭對 \(A\) 來說價值為 \(A_i\) 對 \(B\) 來說價值為 \(B_i\),現在需要將所有石頭分給兩個人(石頭可以切割)。對於任意一個石頭,每個人的收益為所得石頭所占原石頭的比例乘該石頭價值。在兩人收益相同的情況下最大化收益。
\(n \le 50, 0 \le A_i, B_i \le 100\)
令 \(A\) 獲得第 \(i\) 個石頭的 \(p_i\),那么該問題可以被描述為如下線性規划:
對於限制三,因為等價於 \(V_a \le V_b, -V_a \le -V_b\) 第二個式子常數項為負數,需要初始化,較為麻煩。
但仔細觀察可以發現,因為要最大化 \(V_a\) 同時等式兩側線性變化,因此可以將限制放縮為 \(V_a \le V_b\) 這樣就不需要初始化了。
一般地,需要初始化的題目往往能發掘性質使其不需要初始化。
例2. Flight Distance
簡化題意:給出一張無向圖 \(G = (V, E), |V| = n, |E| = m\) 邊 \((u, v)\) 權值為 \(w_{u, v}\)。定義一次操作為:\(w_{u, v} \leftarrow w_{u, v} \pm \Delta w\) 花費為 \(\Delta w\),可以進行任意多次操作,滿足操作完畢之后任意一條邊 \((u, v)\) 滿足 \(u \rightarrow v, v \rightarrow u\) 的最短路即為該邊,最小化操作花費。答案以分數形式輸出。
\(n \le 10, w_{u, v} \le 20\)
在將問題轉化為線性規划中發現主要存在如下兩個問題:
- 邊的增量不好表示為負,因為線性規划要求所有變量非負。
- 不好限制最短路的條件。
問題 \(1\) 較為好解決,我們設置兩個變化量 \(t_{u, v} ^ +, t_{u, v} ^ -\) 將每條邊的邊權描述為:\(w_{u, v} + t_{u, v} ^ + - t_{u, v} ^ -\) 即可。
問題 \(2\) 最暴力的方式可以將 \(u, v\) 間所有路徑拿出來,那么限制次數上界為 \(\sum\limits_{i = 1} ^ n \dbinom{n}{i} \times i \le \left(\sum\limits_i ^ n \dbinom{n}{i}\right) \times n \le n \times 2 ^ n\) 不能接受。
考慮直接描述 \(u, v\) 之間的最短路,令其為 \(d_{u, v}\),那么原問題可以描述為以下線性規划:
更進一步地,第三條限制可以被描述為:
雖然兩者限制次數理論上界均為 \(n ^ 3\) 但后者跑不滿該上界,實際效率下更為優秀,可以通過本題。
同時,將該問題描述為標准型后,常數項並不非負。注意到目標函數系數非負,於是直接取對偶問題即可不需初始化。
線性規划的轉化(組合意義)
線性規划轉化為半平面交
通常用於只存在兩個變量或兩個限制條件(對偶后兩個變量)的線性規划,此時一條限制為確定一個半平面,通過半平面交可得可行域對應凸多邊形,同時目標函數只有兩維可以直接在可行域上二分 / 三分。
例3. Equations
簡化題意:給定三個長度為 \(n\) 的序列 \(a, b, c\) 以及 \(m\) 次詢問,每次詢問給定參數 \(s, t\),求一組非負實數 \(x\),滿足:
的同時最大化 \(\sum\limits_{i = 1} ^ n c_i \times x_i\)。
\(n \le 10 ^ 5, m \le 10 ^ 4, 1 \le a_i, b_i, c_i, s, t \le 10 ^ 4\)
每次查詢可以描述為如下線性規划:
注意到 \(a, b, c \ge 0\) 那么不妨將原限制放縮為:
只存在且僅存在兩條限制,那么其對偶問題將只存在兩個變量,即:
注意到一條限制本質上是一個半平面,那么該線性規划的可行域即為 \(n\) 個半平面的交,且該半平面交與詢問無關,可以提前預處理。
根據之前單純性算法中提到的引理,最優解必定在半平面交的邊界上且目標函數為單峰函數。
因此可以三分求解,當然也可以直接二分凸包上的直線,復雜度 \(\mathcal{O((n + m) \log n)}\)。
線性規划轉化為二分圖最大權匹配
這類問題通常體現為線性規划的形式滿足二分圖最大權匹配的組合意義。
例4. [SHOI2004]最小生成樹
簡化題意:給定一張帶權無向圖,操作同例題 2,滿足操作完成后指定的生成樹為最小生成樹,最小化花費。
\(n \le 50, m \le 1500, 1 \le w \le 1000\)
首先不妨做出題目所給的生成樹,那么此時我們發現樹邊不會變大,非樹邊不會變小。
那么假設生成樹上第 \(i\) 條邊初始權為 \(a_i\) 那么其操作后應為:\(a_i - x_i\)
假設非生成樹上第 \(i\) 條邊初始權為 \(b_i\) 那么其操作后應為:\(b_i + y_i\)
使得該生成樹為最小生成樹的一個必要條件為:
- 對於任意的非樹邊 \((u, v)\) 其邊權不小於生成樹上 \(u, v\) 簡單路徑上的邊對應邊權。
同時也易證得該條件為充分條件,那么原問題可以被描述為如下線性規划:
令非樹邊構成集合為 \(Q\),樹上 \(u, v\) 簡單路徑的邊構成集合 \(path_{u, v}\),第 \(i\) 條非樹邊連接的兩個點分別為 \(e_{i_u}, e_{i_v}\)。
整理限制得:
即為二分圖最小標頂和問題,對偶后轉化為求解二分圖最大權匹配問題。
若使用 \(\tt zkw\) 費用流,復雜度 \(\mathcal{O(n ^ 2m ^ 2)}\);若使用 \(\tt KM\) 算法,復雜度 \(\mathcal{O(m ^ 3)}\) 效率差別不大。
當然,你也可以使用樹鏈剖分 + 前后綴優化建圖配合費用流,復雜度 \(\mathcal{O(nm ^ 2 \log n)}\) 意義不大。
上述三種做法均可以通過本題。
線性規划轉化為網絡流問題
這類問題的一般模型為限制矩陣為全幺模矩陣,利用網絡流流量平衡的特殊性質進行建圖。
例5. [NOI2008] 志願者招募
簡化題意:有 \(n\) 中志願者,有 \(m\) 天需要志願者工作,第 \(i\) 種志願者在 \([s_i, t_i]\) 這個時間段工作,聘請一個這樣的志願者花費為 \(c_i\)。要求第 \(i\) 天至少存在 \(d_i\) 個志願者,最小化招募的花費。
\(1 \le n \le 10 ^ 3, 1 \le m \le 10 ^ 4\)
假設第 \(i\) 種志願者招募 \(x_i\) 個,容易得到原問題的線性規划問題:
但這個限制矩陣並不是全幺模矩陣,考慮將其轉化為全幺模矩陣。
首先為了方便先將標准型轉化為松弛形:
注意到每一列的非 \(0\) 位 均 在一個區間內出現,不妨考慮將式子差分。
即將第 \(i\) 條式子替換為第 \(i\) 條式子減去第 \(i - 1\) 條式子所得的式子。
為了保證統一性,我們在式子的末尾添加等式 \(0 = 0\) 同樣進行差分。
那么 \(x_i(1 \le i \le n)\) 就會在第 \(s_i\) 條式子中以系數 \(+1\) 出現,在 \(t_i + 1\) 條式子中以系數 \(-1\) 出現。
\(x_{i + n}(1 \le i \le m)\) 就會在第 \(i\) 條式子中以系數 \(-1\) 出現,在第 \(i + 1\) 條式子中以系數 \(+1\) 出現。
此時限制矩陣即為全幺模矩陣。
因為每條式子需要保證左側為 \(0\),可以看作一個點的流量平衡方程,於是對第 \(i\) 條式子建點 \(i\)。
將系數為 \(-1\) 的量看作流出邊,系數為 \(+1\) 的量為流入邊(包括常量)。
為限制變量在不同式子中取值相同,要求所有變量恰好在一個式子中以系數 \(+1\) 出現,另一個式子中以系數 \(-1\) 出現(符合全幺模矩陣的性質)。此時我們從系數為 \(-1\) 的式子向系數為 \(+1\) 的式子連流量為變量上界,費用為目標函數系數的邊。
對於常量而言,若系數為 \(+1\) 那么從 \(S\) 向該式連費用為 \(0\) 流量為常量大小的邊,否則從該式向 \(T\) 連費用為 \(0\) 流量為其絕對值的邊。
那么我們只需保證常量流量流量流滿的情況下最優化解即可,具體情況視題目而定。
具體的,在本題中的連邊如下:
-
從 \(s \rightarrow i\) 連流量為 \(d_{i - 1}\) 費用為 \(0\) 的邊,從 \(i \rightarrow T\) 連流量為 \(d_i\) 費用為 \(0\) 的邊。
-
從 \(i + 1 \rightarrow i\) 連流量為 \(\infty\) 費用為 \(0\) 的邊。
-
從 \(t_i + 1 \rightarrow s_i\) 連流量為 \(\infty\) 費用為 \(c_i\) 的邊。
因為 \(s\) 點流出的只有常量流量,因此跑最小費用最大流即可。
例6. Chefbook
簡化題意:給定一張 \(n\) 個點 \(m\) 條邊的帶權有向圖。可以執行如下兩種操作:
- 將一個點 \(u\) 的所有出邊權值加上 \(p_u\),其中 \(p_u\) 可以為任意正實數
- 將一個點 \(u\) 的所有入邊權值減去 \(q_u\),其中 \(q_u\) 可以為任意正實數
要求操作完畢后 \(\forall (u, v) \in E, s_{u, v} \le w'_{u, v} \le t_{u, v}\),最大化:\(\sum\limits_{(u, v) \in E} w'_{u, v}\) 並 輸出方案
\(n \le 10 ^ 2, m \le n ^ 2\)
易得線性規划形式:
方便起見,直接忽略常量 \(w\) 的影響:
注意到每條式子 僅出現且恰好出現 系數 \(+1, -1\) 兩個變量,不妨將其對偶:
此時情況與上一題一致,直接做類似的即可。
但原題需要輸出方案,這里我們只能得到對偶問題的方案,需要近一步獲得原問題的方案。
考慮一開始提到的互松弛定理,得到原方案和對偶方案的關系。
則有(對 \(g\) 類似):
-
若 \(f_{u, v} = 0\) 那么原線性規划只需滿足:\(-p_u + q_v \le s_{u, v}\)
-
若 \(f_{u, v} > 0\) 那么原線性規划必須滿足:\(-p_u + q_v = s_{u, v}\)
此時對原線性規划只存在限制而不存在目標函數,注意到每條限制只涉及兩個數於是使用差分約束即可。