演算法設計雖似藝術,但存在行之有效的通用設計範式。貪婪算法是其中最直觀、最常用的一類——**每步做當下最優選擇,期望推導出全局最優解** 。本文建立最優化問題統一形式化框架,並解析貨箱裝載、渴嬰問題、最小代價通訊網絡三大經典模型。
每個最優化問題包含三要素:
x = (x₁, x₂, ..., xₙ)g(x) ≤ 0, h(x) = 0 (定義可行域)f(x)可行解:滿足所有約束的決策向量。
最優解:在可行域內使目標函數達到極值的可行解。
場景:嬰兒需飲 t 盎司飲料解渴,有 n 種飲料,第 i 種總量 aᵢ,單位滿意度 sᵢ。決定飲用量 xᵢ 最大化總滿意度。
xᵢ ≥ 0 (實數)Σ xᵢ = t, 0 ≤ xᵢ ≤ aᵢΣ sᵢ xᵢΣ aᵢ ≥ t貪婪策略:按 sᵢ 降序飲用,滿意度最高者優先喝完,直到解渴。此為分數背包問題,貪婪最優。
xᵢ ∈ {0,1}Σ wᵢ xᵢ ≤ cΣ xᵢ (裝載數量)貪婪策略:按 wᵢ 升序裝載。已證最優 (見 專文)。
G=(V,E),邊權 w(e) = 建設代價T ⊆ EΣ_{e∈T} w(e)貪婪策略:Kruskal/Prim 算法,每步選最小權邊且不成環。最優解 = 最小生成樹 (MST)。
滿足兩性質者,貪婪算法通常有效;否則需動態規劃、回溯或近似算法。
GreedySolve(Problem P):
1. 將 P 的所有候選對象按某優先級規則排序
2. 初始化解集 S = ∅, 資源/狀態 R = 初始值
3. for 每個候選對象 c (按優先級順序):
if c 滿足約束條件 (可行性檢查):
S ← S ∪ {c}
更新 R
4. return S
| 策略類型 | 排序鍵 | 典型問題 |
|---|---|---|
| 最小權優先 | 權重升序 | 貨箱裝載、霍夫曼編碼、最小生成樹 (Kruskal) |
| 最大價值優先 | 價值/單位價值降序 | 分數背包、任務調度最大化收益 |
| 最早截止優先 | 截止時間升序 | 單機調度最小化最大延遲、會議室安排 |
| 最短處理優先 | 處理時間升序 | 單機調度最小化平均完成時間 |
| 最大度優先 | 度數降序 | 圖著色近似、支配集近似 |
理解最優化問題的三要素建模、識別貪婪選擇性質與最優子結構、掌握常見貪婪策略分類,是靈活運用貪婪算法解決實際工程問題的核心內功。