線性規劃

線性規劃（Linear Programming，簡稱LP）是一種數學方法，通過線性方程或不等式描述問題的約束條件和目標，以實現最佳結果（例如利潤最大化或成本最小化）。作為最優化的一種特例，線性規劃在許多領域都有重要應用。

更嚴謹地說，線性規劃旨在優化一個線性目標函數，該函數需滿足一定的線性等式和不等式約束。其解的可行域是一個凸多胞形，這一區域由若干線性不等式描述的有限半空間的交集定義。目標函數本質上是定義在這一凸多面體上的實值仿射函數。通過線性規劃演算法，可以在多胞形內找到目標函數的最大值或最小值（若解存在）。

線性規劃問題通常用標準型表達為：

$$\begin{align} & \text{Find a vector} && \mathbf{x} \\ & \text{that maximizes} && \mathbf{c}^\mathsf{T} \mathbf{x}\\ & \text{subject to} && A \mathbf{x} \le \mathbf{b} \\ & \text{and} && \mathbf{x} \ge \mathbf{0}. \end{align}$$

其中，$\mathbf{x}$是待求解的變量向量，$\mathbf{c}$和$\mathbf{b}$是已知向量，$A$是已知矩陣。需要最大化的$\mathbf x\mapsto\mathbf{c}^\mathsf{T}\mathbf{x}$被稱為目標函數，而約束條件$A \mathbf{x} \le \mathbf{b}$和$\mathbf{x} \geq \mathbf{0}$定義了目標函數優化範圍內的凸多面體。

線性規劃的應用覆蓋多個領域。它在數學研究中尤為常見，同時也在商業、經濟學以及某些工程問題中具有重要價值。線性規劃與特徵方程、馮·諾依曼的總體均衡模型及結構均衡模型緊密相關（詳見對偶線性規劃）。

目前，運輸、能源、電信和製造業等行業廣泛使用線性規劃模型。通過這種方法，可以高效解決規劃、路由、日程安排、任務分配和設計等各類複雜問題，為實際應用提供精確的數學支持。

## 歷史

<image>

<image>

線性不等式組求解問題可追溯到傅立葉的時期，他於1827年發表了一種求解方法，這一方法後來被稱為傅立葉-莫茨金消元法。

20世紀30年代末期，蘇聯數學家康托羅維奇和美國經濟學家列昂惕夫各自獨立開展了線性規劃的應用研究。康托羅維奇致力於解決生產調度問題，列昂惕夫則專注於經濟領域的應用。然而，他們的開創性成果在相當長的時期內並未受到應有的重視。

二戰期間，線性規劃迎來了重大轉機。這一數學工具在應對戰時各種複雜挑戰時展現出獨特優勢，特別是在運輸物流、任務調度和資源分配等方面。考慮到成本和資源限制等現實約束條件，線性規劃在優化這些環節時發揮了不可替代的作用。

正是戰時的顯著成效讓線性規劃逐漸受到廣泛關注。二戰結束後，這一方法獲得了學界普遍認可，並在運籌學、經濟學等諸多領域奠定了基礎性地位。康托羅維奇和列昂惕夫在30年代末期提出的理論貢獻，最終成為線性規劃在決策優化領域廣泛應用的重要基石。

康托羅維奇的研究成果起初在蘇聯並未得到重視。同一時期，美籍荷蘭經濟學家庫普曼斯開始用線性規劃方法處理經典經濟問題。兩位學者後來共同獲得了1975年諾貝爾經濟學獎。1941年，希區柯克（Frank Lauren Hitchcock）將運輸問題也納入線性規劃框架，提出了一種與後來的單純形法極為相似的解法。可惜希區柯克於1957年去世，而諾貝爾獎是不能追授的。

1946年至1947年間，丹齊格獨立開發了通用線性規劃方法，用於解決美國空軍的規劃難題。1947年，他發明了單純形法，這是首個能夠高效解決大多數線性規劃問題的方法。當丹齊格與馮·諾伊曼會面討論單純形法時，後者敏銳地發現這一理論與其正在研究的博弈論問題本質上是等價的，由此提出了對偶理論。丹齊格在1948年1月5日完成的未發表報告《線性不等式定理》（A Theorem on Linear Inequalities）中對此作出了嚴格證明。他的研究成果於1951年正式發表，此後在戰後各行業的日常規劃中得到廣泛應用。

丹齊格最初研究的是一個70人對應70個崗位的最優分配問題。若要窮舉所有可能的排列組合來尋找最佳方案，所需的計算量是天文數字，甚至超過了可觀測宇宙中的粒子總數。然而，將這一問題轉化為線性規劃模型並使用單純形法，卻能在很短時間內求得最優解。這得益於線性規劃理論大幅降低了需要檢驗的可行解數量。

1979年，哈奇揚（Leonid Khachiyan）首次證明了線性規劃問題可在多項式時間內求解。而該領域更具突破性的理論與實踐進展出現在1984年，當時卡馬卡（Narendra Karmarkar）提出了求解線性規劃的新型內點法。

## 用途

線性規劃作為一個被廣泛應用的優化領域，這絕非偶然。運籌學中大量的實際問題都可以轉化為線性規劃問題。在線性規劃領域，網路流問題和多商品流問題等特殊案例因其重要性而催生了大量針對性的演算法研究。許多其他類型的優化演算法也往往通過解決線性規劃的子問題來實現其目標。從發展歷程來看，線性規劃孕育了優化理論中的諸多核心理念，包括對偶性、分解，以及凸性及其推廣的重要性等。線性規劃不僅在微觀經濟學的創立期發揮了重要作用，如今在企業管理中仍然扮演著關鍵角色，廣泛應用於規劃、生產、運輸和技術等領域。雖然現代企業面臨的管理挑戰日新月異，但在有限資源條件下實現利潤最大化和成本最小化始終是企業追求的目標。值得一提的是，谷歌也將線性規劃應用於YouTube影片的穩定性優化。

## 標準型

標準型是描述線性規劃問題時最常用、最直觀的形式。其由以下三個部分組成：

- 需要最大化的線性（或仿射）目標函數

e.g. $f(x_{1},x_{2}) = c_1 x_1 + c_2 x_2$

- 問題約束條件，形式如下：

e.g.

$$\begin{matrix} <pre> a_{11} x_1 + a_{12} x_2 &\leq b_1 \\ a_{21} x_1 + a_{22} x_2 &\leq b_2 \\ a_{31} x_1 + a_{32} x_2 &\leq b_3 \\ </pre> \end{matrix}$$

- 非負變量

e.g.

$$\begin{matrix} <pre> x_1 \geq 0 \\ x_2 \geq 0 </pre> \end{matrix}$$

問題通常以矩陣形式表達，形式如下：

$$\max \{\, \mathbf{c}^\mathsf{T} \mathbf{x} \mid \mathbf{x}\in\mathbb{R}^n\land A \mathbf{x} \leq \mathbf{b} \land \mathbf{x} \geq 0 \,\}$$

其他形式，例如最小化問題、包含其他形式約束條件的問題以及涉及負變量的問題，均可以重寫為等價的標準型問題。

### 示例

<image>

假設一位農民有一片面積為 L 公頃的農田，可以種植小麥或大麥，或者兩者的組合。農民擁有 F 千克的肥料和 P 千克的農藥。每公頃小麥需要 F1 千克肥料和 P1 千克農藥，而每公頃大麥需要 F2 千克肥料和 P2 千克農藥。設 S1 和 S2 分別為每公頃小麥和大麥的售價。如果用 x1 和 x2 分別表示種植小麥和大麥的面積，則通過選擇 x1 和 x2 的最佳值可以實現利潤最大化。這個問題可以表示為以下標準型的線性規劃問題：

max:｜$S_1\cdot x_1+S_2\cdot x_2$｜（最大化收益，即小麥總銷售額加大麥總銷售額，收益是「目標函數」）

s.t.｜$x_1 + x_2\leq L$｜（總面積限制）

$F_1\cdot x_1+F_2\cdot x_2\leq F$｜（肥料限制）

$P_1\cdot x_1 + P_2\cdot x_2\leq P$｜（農藥限制）

$x_1\geq 0, x_2\geq 0$｜（種植面積不能為負）

矩陣形式表示為：

max $\begin{bmatrix} S_1 & S_2 \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \end{bmatrix}$

s.t. $\begin{bmatrix} 1 & 1 \\ F_1 & F_2 \\ P_1 & P_2 \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \end{bmatrix} \le \begin{bmatrix} L \\ F \\ P \end{bmatrix}, \, \begin{bmatrix} x_1 \\ x_2 \end{bmatrix} \ge \begin{bmatrix} 0 \\ 0 \end{bmatrix}.$

## 增廣型（鬆弛型）

線性規劃問題可以轉換為增廣型，以便使用單純形法的通用形式求解。這種形式引入非負的鬆弛變量（slack variable），將約束中的不等式轉化為等式。此時問題可以用以下分塊矩陣形式表示：

max $z$：

$$<pre> \begin{bmatrix} 1 & -\mathbf{c}^\mathsf{T} & 0 \\ 0 & \mathbf{A} & \mathbf{I} \end{bmatrix} \begin{bmatrix} z \\ \mathbf{x} \\ \mathbf{s} \end{bmatrix} = \begin{bmatrix} 0 \\ \mathbf{b} \end{bmatrix} </pre>$$

$$\mathbf{x} \ge 0, \mathbf{s} \ge 0$$

其中，$\mathbf{s}$是新引入的鬆弛變量，$\mathbf{x}$是決策變量，$z$是需要最大化的變量。

### 示例

上述例子可轉換為以下增廣型：

max: $S_1\cdot x_1+S_2\cdot x_2$｜（目標函數）

s.t.｜$x_1 + x_2 + x_3 = L$｜（增廣約束）

$F_1\cdot x_1+F_2\cdot x_2 + x_4 = F$｜（增廣約束）

$P_1\cdot x_1 + P_2\cdot x_2 + x_5 = P$｜（增廣約束）

$$x_1,x_2,x_3,x_4,x_5 \ge 0.$$

其中$x_3, x_4, x_5$是（非負的）鬆弛變量，分別表示未使用的面積、未使用的肥料量和未使用的農藥量。

矩陣形式表示為：

max $z$：

$$<pre> \begin{bmatrix} 1 & -S_1 & -S_2 & 0 & 0 & 0 \\ 0 & 1 & 1 & 1 & 0 & 0 \\ 0 & F_1 & F_2 & 0 & 1 & 0 \\ 0 & P_1 & P_2 & 0 & 0 & 1 \\ \end{bmatrix} \begin{bmatrix} z \\ x_1 \\ x_2 \\ x_3 \\ x_4 \\ x_5 \end{bmatrix} = \begin{bmatrix} 0 \\ L \\ F \\ P \end{bmatrix}, \, \begin{bmatrix} x_1 \\ x_2 \\ x_3 \\ x_4 \\ x_5 \end{bmatrix} \ge 0. </pre>$$

## 對偶

每個線性規劃問題，稱為原問題，都可以變換為一個對偶問題。可將「原問題」表達成矩陣形式：

max $\mathbf{c}^T \mathbf{x}$

s.t. $\mathbf{A}\mathbf{x} \le \mathbf{b}, \, \mathbf{x} \ge 0$

而相應的對偶問題就可以表達成以下矩陣形式：

min $\mathbf{y}^T \mathbf{b}$

s.t. $\mathbf{y}^T \mathbf{A} \ge \mathbf{c}^T, \, \mathbf{y} \ge 0$

這裡用$y$來作為未知向量。

### 例子

上述線性規劃例子的對偶問題：

假如有一個種植園主缺少肥料和農藥，他希望同這個農夫談判付給農夫肥料和農藥的價格。可以構造一個數學模型來研究如何既使得農夫覺得有利可圖肯把肥料和農藥的資源賣給他，又使得自己支付的金額最少？

問題可以表述如下

假設$y_1, y_2$分別表示每單位肥料和農藥的價格，則所支付租金最小的目標函數可以表示為

$$\min E=F y_1 + P y_2$$ $$s.t.$$

$F_1 y_1 + P_1 y_2 \ge S_1$｜(控制肥料與農藥的價格，使得農夫覺得比起拿那些肥料和農藥去種植小麥，賣給園主更有利可圖)

$F_2 y_1 + P_2 y_2 \ge S_2$｜(與上相似，但改為大麥)

$y_1 \ge 0,\, y_2 \ge 0$｜（不可用負數單位金額購買）

## 理論

幾何上，線性約束條件的集合相當於一個凸包或凸集，叫做可行域。因為目標函數亦是線性的，所以其極值點會自動成為最值點。線性目標函數亦暗示其最優解只會出現在其可行域的邊界點中。

在兩種情況下線性規劃問題沒有最優解。其中一種是在約束條件相互矛盾的情況下（例如$x \ge 2$和$x \le 1$），其可行域將會變成空集，問題沒有解，因此亦沒有最優解。在這種情況下，該線性規劃問題會被稱之為「不可行」。

另一種情況是，約束條件的多面體可以在目標函數的方向無界（例如：$\max z = x_1 + 3x_2\ s.t.\ x_1 \ge 0, x_2 \ge 0, x_1 + x_2 \ge 10$），目標函數可以取得任意大的數值，所以沒有最優解。

除了以上兩種病態的情況以外（問題通常都會受到資源的限制，如上面的例子），最優解永遠都能夠在多面體的頂點中取得。但最優解未必是唯一的：有可能出現一組最優解，覆蓋多面體的一條邊、一個面、甚至是整個多面體（最後一種情況會在目標函數只能等於0的情況下出現）。

## 演演算法

<image>

單純形演算法利用多面體的頂點構造一個可能的解，然後沿著多面體的邊走到目標函數值更高的另一個頂點，直至到達最優解為止。雖然這個演演算法在實際上很有效率，在小心處理可能出現的「迴圈」的情況下，可以保證找到最優解，但它的最壞情況可以很壞：可以構築一個線性規劃問題，單純形演演算法需要問題大小的指數倍的運行時間才能將之解出。事實上，有一段時期內人們曾不能確定線性規劃問題是NP完全問題還是可以在多項式時間裏解出的問題。

第一個在最壞情況具有多項式時間複雜度的線性規劃演算法在1979年由前蘇聯數學家列昂尼德·哈奇揚提出。這個演算法建基於非線性規劃中瑙姆·Z·索爾發明的橢球法（ellip-soid method），該法又是阿爾卡迪·內米羅夫斯基（2003年約翰·馮·諾伊曼理論獎得主）和 D. Yudin的凸集最優化橢球法的一般化。

理論上，「橢球法」在最惡劣的情況下所需要的計算量要比「單形法」增長的緩慢，有希望用之解決超大型線性規劃問題。但在實際應用上，Khachiyan的演算法令人失望：一般來說，單純形演演算法比它更有效率。它的重要性在於鼓勵了對內點法的研究。內點演演算法是針對單形法的「邊界趨近」觀念而改採「內部逼近」的路線，相對於只沿著可行域的邊沿進行移動的單純形演演算法，內點演演算法能夠在可行域內移動。

1984年，貝爾實驗室印度裔數學家納倫德拉·卡爾瑪卡爾提出了投影尺度法（又名卡爾瑪卡爾演演算法）。這是第一個在理論上和實際上都表現良好的演算法：它的最壞情況僅為多項式時間，且在實際問題中它比單純形演演算法有顯著的效率提升。自此之後，很多內點演演算法被提出來並進行分析。一個常見的內點演演算法為Mehrotra predictor-corrector method。儘管在理論上對它所知甚少，在實際應用中它卻表現出色。

單形法沿著邊界由一個頂點移動到「相鄰」的頂點，內點演演算法每一步的移動考量較周詳，「跨過可行解集合的內部」去逼近最佳解。當今的觀點是：對於線性規劃的日常應用問題而言，如果演演算法的實現良好，基於單純形法和內點法的演演算法之間的效率沒有太大差別，只有在超大型線性規劃中，頂點幾成天文數字，內點法有機會領先單形法。

線性規劃的求解程式在各種各樣的工業最優化問題裡被廣泛使用，例如運輸網路的流量的最優化問題，其中很多都可以不太困難地被轉換成線性規劃問題。

線性規劃理論中存在幾個尚未解決的問題，這些開放問題的答案將會是數學運算中的根本突破，並且很可能是解決大規模線性規劃問題的主要進展。

- LP存在強多項式時間演算法嗎？
- LP存在多項式時間演算法以得到一個嚴格互補解嗎?
- LP在實數（單位成本）模型下存在多項式時間演算法嗎?

這些問題已經由史蒂芬·斯梅爾在二十一世紀十八個尚未解決的最偉大的問題中應用。用斯梅爾的話來說，「第三個問題是線性規劃理論中最主要的尚未解決的問題」。然而，對於線性規劃問題存在弱多項式時間演算法，比如橢球法和內點法，尚未發現限制在約束條件個數和變量個數的強多項式時間演算法，此演算法的發展將會帶來理論上重大意義，或者是解決大規模線性規劃上的實際收益。

儘管赫爾希博士猜想近來被證明是錯誤的，但是它依舊留下下面的開放問題：

- Are there pivot rules which lead to polynomial-time Simplex variants?
- Do all polytopal graphs have polynomially-bounded diameter?

## 整數規劃

要求所有的未知量都為整數的線性規劃問題叫做整數規劃（integer programming, IP）或整數線性規劃（integer linear programming, ILP）問題。相對於即使在最壞情況下也能有效率地解出的線性規劃問題，整數規劃問題的最壞情況是不確定的，在某些實際情況中（有約束變量的那些）為NP困難問題。

0-1整數規劃是整數規劃的特殊情況，所有的變量都要是0或1（而非任意整數）。這類問題亦被分類為NP困難問題。

只要求當中某幾個未知數為整數的線性規劃問題叫做混合整數規劃（mixed integer programming, MIP）問題。這類問題通常亦被分類為NP困難問題。

存在著幾類IP和MIP的子問題，它們可以被有效率地解出，最值得注意的一類是具有完全單位模約束矩陣，和約束條件的右邊全為整數的一類。

一個解決大型整數線性規劃問題的先進演演算法為delayed column generation。

## 參見

- 單純形法，一種用於線性規劃問題求解的常用方法
- 列昂尼德·坎托羅維奇（線性規劃奠基者之一）
- 影子價格
- MPS file format
- LP example, Job Shop problem

## 參考書目

- Alexander Schrijver: "Theory of Linear and Integer Programming". John Wiley and Sons. 1998.
- Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. Introduction to Algorithms, Second Edition. MIT Press and McGraw-Hill, 2001. ISBN 978-0-262-03293-3. Chapter 29: Linear Programming, pp.770–821.
- A6: MP1: INTEGER PROGRAMMING, pg.245.

## 外部連結

- Guidance on Formulating LP problems
- 0-1 Integer Programming Benchmarks with Hidden Optimum Solutions
- COIN-OR- Open Source Library for linear programming
- Cplex - Commercial library for linear programming
- Xpress-MP - Optimization software free to students
- MOSEK - Optimization software for LP, QP, MIP, SOCP and more
- A Tutorial on Integer Programming
- The linear programming FAQ

求解軟體包

- —include linear programming in industry solutions (free trial license available);
- COIN-OR —COmputational INfrastructure for Operations Research, open-source library
- Cplex—Commercial library for linear programming
- HOPDM —Higher Order Primal Dual Method
- LINDO —LP, IP, Global solver/modeling language
- LiPS —Free easy-to-use program intended for solving linear, integer and goal programming problems.
- lp_solve
- MOSEK —Optimization software for LP, QP, MIP, SOCP and more
- Premium Solver —Spreadsheet add-in
- What's Best! —Spreadsheet add-in
- Xpress-MP —Optimization software free to students
- GIPALS —Linear programming environment and dynamic link library (DLL)
- DecisionPro Linear Programming Optimization Software
- QSopt Optimization software for LP (free for research purposes).
- Microarray Data Classification Server (MDCS) based on linear programming
- Linear programming and linear goal programming A freeware program for MS-DOS
- Simplex Method Tool A quick-loading web page