數學趣題

為何「足夠好」成為新的完美:啟發式方法導論

從有限理性、滿意化與貪婪搜尋,理解啟發式規則如何以有限時間換取有用答案,以及何時會失效。

2025年12月7日 · 約 5 分鐘閱讀

想像你站在自動售賣機前。你很餓,而巴士一分鐘後到站;機內有四十款零食,包括薯片、朱古力、果仁與燕麥棒。

一位數學家可能說:「要作出最優選擇,我必須計算每件食品每元的營養價值,再按目前渴望程度與朱古力在口袋融化的機率加權。」

算完之前,巴士已經離開。

一般人則會說:「我喜歡朱古力,這包 KitKat 看起來不錯。」然後買下零食,趕上巴士。

這個情境顯示決策的核心張力:最優性——找出絕對最佳解——與效率——立即找出可行解——之間的競爭。在電腦科學與運籌學中,協助我們作出快速實際決策的工具稱為啟發式方法

過去我們經常以複雜方程追求完美模型,但現實很少給予完美的時間與資訊。現在暫時離開「最佳」的微積分,進入「足夠好」的哲學。

簡單而言:在混亂、受時間限制的決策中,「足夠好」往往勝過「完美」。貪婪步、局部微調、隨機跳躍、族群混合與群體訊號,都以放棄窮舉換取有用答案。它們在目標門檻清楚、計算預算有限,而且有回饋令規則持續適應時最有價值。

三十秒啟發式工具箱

貪婪法每步拿眼前最好選擇,速度快卻容易受困局部最優。局部搜尋稍微修改目前解,只保留較好的版本。模擬退火偶爾接受較差移動,以逃離陷阱。遺傳演算法保存一個解的族群,再作混合與突變。蟻群方法讓大量小型代理探索路徑,並像費洛蒙一樣加強有潛力的選擇。

啟發式方法早已參與日常生活

地圖在駕駛途中改道,使用捷徑近似最佳路線,而不是每次重新計算所有道路。垃圾郵件過濾器快速評分文字、寄件者紀錄與互動。搜尋自動完成依賴查詢頻率、個人歷史甚至時段。交友應用的滑動決策使用快速個人規則。電腦 cache 亦在你提出要求前,猜測下一步需要的資料。

「全取 A」思維的陷阱

學校訓練我們相信每個問題只有一個正確答案。若 2x=42x=4,則 x=2x=2;回答 1.91.9 就是錯。

這種思維在封閉、整齊而定義完整的課本問題中運作得很好。一進入現實或複雜計算問題,它便可能成為陷阱。

電腦科學有一類 NP-hard 問題。對一般輸入,現時並沒有已知的多項式時間演算法可以保證找出精確最優解。例子包括大型旅行商、背包與學校排課問題。這不代表每個實例必須運行數百萬年,但問題規模增加時,窮舉組合通常會迅速變得不可行。

如果堅持先找到完美答案才行動,就會像售賣機前的數學家:巴士離開時仍被「正確答案」困住。

啟發式方法:聰明捷徑

Heuristic 源於希臘文 heuriskō,意為「我發現」,與 Eureka 同源。

啟發式方法是一條經驗規則,把複雜問題簡化。它一般不保證完美解,甚至不一定保證每次都有好解;它追求的是在合理時間內經常產生可接受結果。

精確最佳化/演算法啟發式捷徑
檢查餐牌上的每個選項。「我通常喜歡雞肉,所以先看雞肉菜式。」
計算地圖上每條可能路線。「先向目的地大致方向走。」
若條件成立,可保證全局最佳。通常快速得到實用結果,但未必有最優保證。
成本可能很高。計算成本通常較低。

需要注意,「演算法」與「啟發式」並非完全對立:啟發式本身也可以是一套演算法;真正差別在於它採用甚麼近似、停止規則與保證。

為何「足夠好」可以很理性

1950 年代,Herbert Simon 提出有限理性。人類沒有無限處理能力、資訊或時間,因此不把所有選項計算至完美,不一定代表不理性。資源有限時,一旦找到符合需要的方案便停止搜尋,反而可以是合理策略。

Simon 稱之為 satisficing,結合 satisfysuffice。最佳化是在草堆尋找最尖的一支針;滿意化則拿起足以縫衣的針,讓衣服可以在日落前完成。

貪婪策略

最著名的啟發式之一是貪婪演算法:每一步都選擇當下看來最好的一項。

想像在濃霧中爬山。你希望到達最高峰,卻看不見山頂。貪婪規則說:「看腳下,向最陡的上坡方向行。」優點是立即開始;缺點是短視,可能只走到一座小山頂,錯過山谷另一邊的真正高峰。

即使有缺點,貪婪策略往往仍比原地站着、嘗試計算整片山脈地形更實際。

十二行硬幣找換

coins = [25, 10, 5, 1]  # US cents
amount = 63
take = []
for c in coins:
    while amount >= c:
        take.append(c)
        amount -= c
print(take)  # -> [25, 25, 10, 1, 1, 1]

程式每次先取最大硬幣。對美國硬幣系統,它能給出最少硬幣數;對某些面額則會失敗。例如硬幣 [4, 3, 1]、金額 6,貪婪法取 4+1+1,但最優解是 3+3。這正好提醒我們:啟發式方法依賴情境。

啟發式方法何時反過來傷害決策

局部陷阱會令搜尋停在「足夠好」的小山。帶偏訊號亦會扭曲結果,例如垃圾郵件過度重視一個關鍵字,或招聘規則重複過往偏見。環境轉移也會令去年有效的定價規則,在市場衝擊中失效。

快速不等於公平,簡單亦不等於可解釋。當啟發式影響人、資源或安全時,必須審核失效群體、最差結果與分佈轉移。

使用啟發式方法的護欄

先定義何謂「足夠好」——時間、成本、準確率或風險——再設定計算上限。加入隨機性或重啟,減少局部最優。若可取得精確或下界,追蹤 regret 或 optimality gap。保存回饋迴路,讓規則在條件改變時接受重新評估,而不是永久沿用。

小案例:升降機排程

升降機控制可使用「留在人群附近」的規則:召喚集中時,升降機停留較久,再沿主要方向掃過樓層,例如早上向上、下班時向下。這可減少平均等候,而毋須模擬每位乘客完整路徑。

當召喚稀疏而不規則,單獨乘客可能等候太久。加入最大等候時間,或偶爾向相反方向掃一次,可緩和失效。這顯示平均表現與最差服務需要同時設計。

「兩條規則」挑戰

下次面對太多選擇——例如在串流平台選電影——留意自己正在做甚麼。你是否閱讀所有評論、嘗試最佳化?還是使用「有我喜歡的演員便播放」之類規則?

再寫下第二條護欄,例如「十分鐘內仍未選好,便從候選清單隨機選一套」。第一條規則加速選擇,第二條限制第一條規則的失效成本。

啟發式方法不是懶惰,而是有限系統在複雜世界中運作的工具。往後可再研究蟻群如何形成路徑、退火如何利用溫度逃離陷阱,以及隨機性為何有時反而是最聰明的策略。

下一篇:攀越看不見的山:演算法如何迷路與找到出口