貪婪演算法與交換論證

貪婪選擇性質(greedy-choice property)

想像你正在為旅行打包,每一刻你只抓眼前看起來最好的東西,從不回頭重新考慮。貪婪演算法就是這樣運作的:它一步一步建造答案,每一步都依某個簡單的局部規則挑出當下看起來最好的選擇,絕不反悔。令人驚訝的問題是:這種短視的習慣何時仍能落在真正全域最佳的答案上。

貪婪選擇性質正是讓貪婪安全的明確條件:存在一個最佳解,它以局部最佳(貪婪)的選擇開頭。換句話說,你不必綜觀整個問題就能正確地走出第一步——某個最佳答案會與貪婪的第一選擇一致。常見的證明方式是交換論證:取任何一個不以貪婪選擇開頭的最佳解,證明你可以把貪婪選擇換進去而不使解變差,於是包含貪婪選擇的最佳解也存在。例如在一個房間裡安排最多工作時,挑最早結束的工作就是貪婪選擇,而你可以證明某個最佳排程同樣以那個最早結束的工作開頭。

這個性質正是貪婪與動態規劃的分水嶺。動態規劃在每一步考慮多個選擇並保留最好的;貪婪則一開始就鎖定一個選擇,因此較快,但只有在貪婪選擇性質成立時才正確。誠實的提醒:看起來局部最佳並不等於安全。對 0/1 背包來說,先抓單位重量價值最高的物品看似最好卻可能出錯,因為交換論證走不通。信任貪婪之前,務必先證明這個性質。

用硬幣 {25, 10, 5, 1} 找 30 分零錢:貪婪先取 25,再取 5——兩枚硬幣,這是最佳。但用硬幣 {25, 10, 1} 時,貪婪取 25 再取五枚 1(共六枚),而 10+10+10 只用三枚。同樣的貪婪規則,但這個性質只對第一組硬幣成立。

貪婪選擇性質是問題的性質,而非貪婪規則的性質——換掉硬幣,同一條規則就可能失敗。

看起來局部最佳的選擇只是一個假設,不是證明。若沒有交換論證(或擬陣)說明某個最佳解與它一致,貪婪可能悄悄出錯。

又称
greedy choice貪婪選擇