歡迎來到線性規劃的世界!
在算法建模 (Modelling with Algorithms) 的這一章中,你將學會如何做出「最佳」決策。無論是工廠如何在有限資源下實現利潤最大化,還是物流公司如何在控制燃料成本的同時提升效率,線性規劃 (Linear Programming, LP) 都是他們所依賴的數學工具。別擔心一開始會看到很多術語——其實線性規劃的核心非常簡單,就是找到善用現有資源的最佳方法!
1. 問題建模 (Formulation)
在解決問題之前,我們必須先將它從「文字描述」轉譯成「數學語言」,這個過程稱為建模 (Formulation)。
線性規劃的組成要素
- 決策變數 (Decision Variables): 代表你可以控制的項目。例如:設 \(x\) 為生產標準款單車的數量,\(y\) 為生產專業款單車的數量。
- 目標函數 (Objective Function): 這是你的最終目標。通常是想要極大化 (maximize)(例如利潤)或極小化 (minimize)(例如浪費)。公式看起來像這樣:\(P = 5x + 8y\)。
- 限制條件 (Constraints): 這是你面臨的限制(如資金、時間、原料)。它們通常以不等式表示。例如:\(2x + 3y \le 60\)(表示可用的勞動工時)。
- 非負限制 (Non-negativity): 在現實世界中,你不可能生產負數量的單車!因此,我們必須加上 \(x \ge 0, y \ge 0\)。
標準型 (Standard Form)
當你的目標是極大化一個線性函數,所有的限制條件皆為小於或等於 (\(\le\)) 一個常數,且所有變數皆為非負數時,該線性規劃問題即處於標準型。
重點速覽:
變數: 我們要選擇什麼?
目標: 我們的目標是什麼?
限制: 有什麼規則必須遵守?
核心觀念: 建模就是將文字題目轉化為一組方程式與不等式的過程。
2. 鬆弛變數與增廣型 (Slack Variables and Augmented Form)
直接處理不等式比較困難,我們更偏好使用等式。為了將 \(\le\) 不等式轉換為 \(=\) 等式,我們需要引入一個鬆弛變數 (slack variable)。
類比:想像你有 50 英鎊的預算,你花了 \(x\) 英鎊。那剩下的「鬆弛量」就是你口袋裡的零錢。花費 + 餘額 = 50 英鎊。
運作方式:
如果你的限制條件是 \(2x + y \le 10\),加上一個鬆弛變數 \(s_1\) 後會變成:
\(2x + y + s_1 = 10\),其中 \(s_1 \ge 0\)。
這就是所謂的增廣型 (augmented form)(也稱為鬆弛型)。
常見錯誤: 忘記鬆弛變數也必須是非負的 (\(s \ge 0\))。
3. 圖解法 (2-D 問題)
如果問題只有兩個變數 (\(x\) 和 \(y\)),你可以直接在圖表上畫出來解決!
解題步驟:
- 畫出直線: 將不等式視為方程式(例如,畫出直線 \(x + y = 10\))。
- 找出可行解區域 (Feasible Region): 這是圖表上滿足所有限制條件的區域。可以將其視為「安全區」。
- 處理無解情況: 如果沒有任何區域同時滿足所有規則,則該問題為不可行 (infeasible)——即無解!
- 找到最佳點: 最佳解總是在可行解區域的頂點 (vertex)(角落)。你可以通過以下方式找到它:
- 頂點測試 (Vertex Testing/Enumeration): 計算每一個角落的目標函數值進行比較。
- 目標線法 (Objective Line Method): 畫出一條代表目標函數的直線,並將其平行移動,直到接觸到「安全區」最遠的邊界點。
整數線性規劃 (Integer Linear Programming, ILP)
有時變數必須是整數(你不可能賣出半台單車)。這就是整數線性規劃 (ILP)。
警告: 最好的整數解可能不是「數學計算結果」最接近的整數。你必須檢查可行解區域內附近的所有整數點。
你知道嗎? 儘管我們生活在三維空間中,你依然可以想像三維的線性規劃,其可行解區域就像一個立體的晶體,而限制條件則是平面!
4. 單純形法 (The Simplex Method)
如果有 10 個變數怎麼辦?你沒法畫出 10 維的圖表!單純形法 (Simplex Method) 是一種代數算法,它會從可行解區域的一個角落移動到另一個「更好」的角落,直到找到最佳解為止。
關鍵術語:
- 單純形表 (Tableau): 用於組織方程式的表格。
- 主元 (Pivot): 表格中用來轉換到下一個角落的特定數值。
- 基變數 (Basic Variables): 當前頂點中「活躍」的變數。
- 非基變數 (Non-basic Variables): 當前頂點中值為零的變數。
運作邏輯:
算法會檢查單純形表的最後一行(目標函數行)。如果出現負數(在極大化問題中),代表我們還有提升利潤的空間!我們選擇一個主元列與行,執行「列運算」來建立新的表格,並不斷重複,直到最後一行所有的數值皆為正數或零。
別擔心這看起來很複雜! 只要把它想成一種系統性的方法,讓你不用畫圖也能檢查形狀的所有角落。
重點速覽: 當目標函數值無法再提升時,單純形法就會停止。
5. 非標準型問題
有時候規則會改變,以下是處理方法:
- 大於等於限制 (\(\ge\)): 這需要使用兩階段單純形法 (Two-Stage Simplex)。在第一階段,你需要先找到一個合法的起始頂點。
- 等式限制 (\(=\)): 可以拆解為兩個不等式:\(x \le 4\) 與 \(x \ge 4\)。
- 極小化問題: 大多數軟體與單純形法預設為極大化。若要極小化成本,你可以改為極大化成本的負值!
6. 作為線性規劃的網絡問題
線性規劃最酷的地方在於,它可以解決許多你已經學過的網絡問題!
- 最短路徑 (Shortest Path): 尋找最快路徑可以寫成一個極小化總距離的線性規劃問題。
- 最大流 (Maximum Flow): 計算管道流量可以寫成一個極大化流量變數的線性規劃問題。
- 配對/分配問題 (Matching/Allocation): 將工人和工作進行最佳化分配以最小化總成本,這也是經典的線性規劃問題。
核心觀念: 線性規劃是一個「通用」工具——幾乎任何涉及線性規則的問題都可以用它來處理。
7. 使用軟體
在現實世界中,我們使用電腦來解決複雜的線性規劃問題。你需要具備解讀輸出結果的能力:
- 最佳值 (Optimal Value): 最終的「最佳」結果(例如,最大利潤 = 500 英鎊)。
- 變數值 (Variable Values): 每一項應該生產多少數量(例如,\(x=10, y=5\))。
- 鬆弛量 (Slack): 告訴你某個資源是否被完全使用(鬆弛量 = 0),還是有剩餘(鬆弛量 > 0)。
總結: 無論是手算、作圖還是用電腦求解,線性規劃的核心都是壓力(限制條件)下的最佳化。只要掌握建模,剩下的就只是遵循算法步驟而已!