學習自 丁曉漫,再探線性規划對偶在信息學競賽中的應用,2021集訓隊論文。當然很多公式和圖片是直接抄下來的。
被迫營業
定義什么的全都跳過。
如果一開始就講對偶的定義,那做到最后一題的時候多半已經忘記定義了(比如我),所以學習筆記的寫作順序會和原論文不同。
因為是被迫營業,所以很多簡單的東西不會被略過,可能講得較慢。
通用解法
OI 中能用到的暫時只有單純形法。
可以在這里學習。
標准型對偶
(目前看來)最常用的對偶。
先把原線性規划寫成標准形式:
其中 \(x,c\) 是長度為 \(n\) 的向量,分別表示變量和目標函數系數。 \(A\) 是 \(m\times n\) 的矩陣,表示 \(m\) 個約束。 \(b\) 是長度為 \(m\) 的向量,表示約束中的常數。
這可以對偶成
其中 \(y\) 是新的變量。
方便背誦的形式:限制和變量對調,目標函數系數和約束常數對調,約束中的系數不變。
可以證明其中一邊有解時另一邊也一定有解,且目標函數的最優解相同。注意對偶是雙向的。
一個弱點是從對偶形式的 \(y\) 較難還原出原形式的 \(x\) (論文沒寫,我不會),所以對偶形式的 \(y\) 所具有的性質不能在 \(x\) 上找到對應的性質,並且在要求輸出方案時不太能做。
最小費用流模型
建議全文背誦,比每次重新推一遍快很多。
設 \(f_{uv},c_{uv},w_{uv}\) 分別表示流量、流量上界、代價。\(b_u\) 表示 \(u\) 的流量需求,即流出減流入至多是 \(b_u\) (論文中用了等號,效果略有不同,下面會講)。
直接把線性規划寫出來,得到
設 \(z_{uv}\) 是邊流量約束的對偶變量, \(p_u\) 是點流量約束的對偶變量。有
注意到 \(z_{uv}\) 的系數是非正數(這要求 \(c\) 是非負數),而且它只在一個約束中出現,所以容易發現它一定要取到下界 \(\max (0,p_v-p_u-w_{uv})\) 。然后把負號提出去,變成
其中 \(p_u,p_v,c_{uv}\) 都必須是非負數,\(b,w\) 沒有限制。
另外,如果要求“流出減流入恰好是 \(b_u\)”,就會使得 \(p_u\) 非負的限制被刪除。這是因為一個 \(=\) 要被拆成兩個相反的約束,對偶之后就是兩個相減的變量,也就相當於取值任意。
因為對偶是雙向的,所以如果題目可以轉化成最后這個形式,就一定可以用費用流求解。
整數性的探討
雖然費用流在流量都是整數的時候最優解也一定是整數,但這並不代表它的對偶問題也一定有整數最優解。
不過事實證明整數最優解是一定存在的:
把非整數的 \(p_u\) 拿出來,按照本質不同的非零小數部分分類,設有 \(k\) 種。
隨便拿一部分出來,考慮把它調大或者調小 \(\epsilon\)。
分類討論一下發現調大調小的 \(\Delta\) 之和恰好為 0 ,所以必然有一邊不劣。往這邊一直調直到 \(k\) 減小即可。
所以在這個模型中不再需要考慮整數解的存在性了。
例題
設置變量的一些技巧可以自己揣摩。
默認所有設出的變量都會帶 \(\ge0\) 的限制。
[ZJOI2013] 防守戰線
直接設 \(p_i\) 表示前 \(i\) 個位置一共建了幾個塔,就是
直接轉化成
[Aizu 2230] How to Create a Good Game
設 \(p_i\) 表示到 \(i\) 的最長路。設原圖 \(0\) 到 \(n-1\) 的最長路長度是 \(D\) 。設 \(x_{uv}\) 是增長的邊權。
雖然不能限制 \(p\) 恰好等於最長路,但是如果取到比最長路更長一定不優,所以只需要限制它不是太短,即滿足三角不等式。
仍然注意到 \(x_{uv}\) 只在一個約束中出現,所以它必然取到上界 \(p_v-p_u-w_{uv}\) ,而且這東西必須 \(\ge 0\) 。
該取反的取反,得到
動態規划模型
對偶時貢獻系數會變成約束的常數,那么如果貢獻系數很小,對偶之后的操作空間就很小。此時可能可以用 DP 解決。
當然還是逃不過證明整數最優解存在的這一步。
例題
[XX Open Cup. GP of Moscow] Circles
限制是一個環,要求相鄰兩個相加不超過 \(s_i\) ,貢獻系數是 1 。
容易發現對偶之后仍然是一個環,要求相鄰兩個相加至少是 1 ,貢獻系數是 \(s_i\) ,求最小值。
容易發現每個變量的取值都是 \([0,1]\) 。進一步地,可以發現所有變量都應當取 \(\{0,1\}\) ,或者是全部 \(0.5\) 。
證明:
對於偶環,可以奇數位置減、偶數位置加,或者反過來,則一定有一種調整方法不劣。調到出現 0 為止,那么它兩邊都是 1 ,與剩下的位置獨立,可以刪去。然后對剩下的位置接着操作即可。對於奇環,拿一個最優解出來,考慮是否有相鄰兩個位置相加大於 1 。如果不存在那么必須全都是 \(0.5\) ,否則從這里斷開之后可以一樣的方法操作。為了保證最優性,兩個方向調整都不會改變總和,所以奇數加偶數減直到出現 0 即可。
然后隨便 DP 。
[ZJOI2020] 序列
二三類操作是類似的,而一類操作和它們不太一樣。二三類操作之間又是獨立的。
如果只有其中一種操作,都很容易知道答案是差分之后 \(>0\) 位置的和。
那么設做完一類操作之后每個位置的值是 \(b_i\) ,則答案顯然是
轉化成最大費用流就是
(稍微注意一點:我們其實弄出了一個新的變量 \(t=0\) 。為了保證 \(t=0\) 就會在目標函數中加上 \(+\infty \cdot t\) ,也就相當於從 \(S\) 連向 \(t\) 的流量無窮的邊。那么 \(t\) 與 \(S,T\) 都有流量無窮的邊,所以它就是 \(S,T\) 的化身。連邊中所有不存在的變量都會視語境變成 \(S\) 或 \(T\) 。)
注意我們是最大費用流,所以 \(S\to b_i\) 的邊肯定是能不流就不流。而其他邊的流量非常小,跨度也很小,直接 DP 即可。
顯然這比貪心做法簡單一萬倍。唯一的壞處就是做完之后啥也沒學到(
拉格朗日對偶
一般的拉格朗日對偶
引入拉格朗日乘子 \(\lambda\) ,要求 \(\lambda\ge 0\) 。設 \(L(\lambda)=\max f(x)-\lambda g(x)\) 。(注意 \(x,\lambda\) 也可以同時是向量。)
由定義容易得到 \(\max f(x)\le \min L(\lambda)\) 。
由於 \(L(\lambda)\) 的 \(\max\) 里面關於 \(\lambda\) 線性,而外面套一層 \(\max\) ,所以容易發現 \(L({a+b\over 2})\le {1\over 2}(L(a)+L(b))\) ,即滿足凸性。
(不過暫時沒有看出凸性有什么用)
注意此時我們甚至不知道 \(\max f(x)\le \min L(\lambda)\) 的等號是否能取到。
線性規划中的拉格朗日對偶
設 \(f(x)={c}^{T} {x}, g(x)={A} {x}-{b}, \lambda=y^{T}\) ,其中 \(y\) 是對偶問題中的最優解。
那么就有 \(L(\lambda)=\max c^Tx-y^T(Ax-b)=\max (c^T-y^TA)x+y^Tb\) 。因為 \(c^T\le y^TA\) ,所以 \(x=0\) 時取到最大值 \(y^Tb\) ,恰好是 \(\max f(x)\) 。
可以看出在線性規划中對偶和拉格朗日對偶有着奧妙重重的關系。論文說它們本質相同,我頭腦愚鈍不知何為本質(
有什么用呢?可以正着做,也就是設出 \(\lambda\) 然后亂搞;也可以倒着做,見到 \(\min \{\max\{\}\}\) 的形式時反着推回普通線性規划的形式。
例題
[POJ Monthly 2015.5] Min-Max
沒有太多可解釋的。
直接對偶也是可以的。有兩個限制
根據前面所說,\(=\) 的限制對偶之后的變量可以在 \(\mathbb{R}\) 中任取,所以對偶之后的限制是半平面交,最值會在凸包頂點處取到。
[Utpc2012.10] きたまさの逆襲
設 \(\lambda_i\) 表示給 \(U_i\) 加的 buff 層數, \(f_{uv}\) 表示這條邊是否存在於完美匹配中,則答案顯然是
里層拆成兩部分,分別是
第一部分就是代價函數,第二部分就是限制函數。對偶的結果就是
可以看出是滿足一些條件的最小費用流,直接做即可。
最后還有整數性的問題。前面證明拉格朗日對偶時說的是 \(\lambda=y^T\) ,而由於費用流的對偶變量都是整數,所以一定存在合法的整數 \(\lambda\) 。