2021年4月5日 星期一

決斷的演算

看完了《決斷的演算》,討論電腦科學的演算法如何應用到日常生活上。作者指出,與面對日常問題一樣,現代電腦並不是以冗長運算找出絕對正確的答案,特別是困難問題的演算法,必須接受機率、取捨時間與精確性,並運用近似法,不是必須追求最好的結果。

作者在討論秘書問題——在錄取新入職者時,如何提高找到最佳人選機率,屬於最佳停止問題——時,提到37%法則︰面試的前面37%應徵者時只觀察不錄取,接著看到比先前更好的人就錄用。採用此策略時,找到最佳人選的機率也是37%——更精確來說是1/e(natural log)。

37%法則的前提是,當不錄取某個應徵者後,就不能再回頭錄取,而決定錄取應徵者時,對方不會拒絕;只知道不同應徵者的相對等級,沒有絕對標準;延遲決定沒有成本。現實情況比較複雜,拒絕與回頭的機率會影響最佳策略;假如擁有絕對標準,剩餘應徵者越多,取錄標準就應定得越高;尋找成本會影響成交臨界值,但停止價格不會隨尋找過程降低——換言之,考慮尋找成本後,不要回顧過去。在時間本身就是成本的現實中,決策過程最重要的面向,就是何時應該拿定主意。

重複過去還是嘗試新事物在電腦科學稱為開發/善用權衡(explore/exploit tradeoff),開發是蒐集資料,善用是運用現有資訊得到已知結果。開發與善用的矛盾體現在「多臂土匪問題」︰假如有許多報酬率不同的老虎機,怎樣知道哪一部較易贏錢?開發(試另一部未玩過的)與善用(只玩已知報酬率最高的一部)的相對價值,取決於可用的時間有多少︰時間越多,開發的價值越高;越接近離場時間,善用的價值越高。

多臂土匪問題有一種簡單策略︰贏錢繼續玩、輸錢換一台。這種策略表現比完全隨機好,但沒有考慮前述的時間因素。在考慮過往機率與時間折現後,我們可以按照「吉廷斯指數」決定是否繼續在同一部機下注。 吉廷斯指數的啟發是,完全未開發的機器指數相當高,在時間折現不太嚴重的情況下,未開發機器比已經10注贏7次的機器吸引力更大。

吉廷斯指數的前設是,時間折現以幾何級數進行,而改變不需要成本,這都不一定與現實一致。而且吉廷斯指數計算複雜,不容易應用在各種情況。另一種選擇方式是特別注意遺憾,目標是讓遺憾減至最少。遺憾的特性是︰因為最佳策略並非完美,即使運用最佳策略,也會產生遺憾,但選擇最佳策略遺憾會增加得比較慢,對問題的了解也會隨時間增加。

讓遺憾減至最少的方式,是遺憾隨下注次數對數增加,例如n次下注的遺憾次數是log n,這樣遺憾次數應該會逐年遞減。信賴上界演算法是減少遺憾次數的演算法,遇到多臂土匪問題時,信賴上界演算法指出應選擇信賴區間最高的選項。這種演算法展現出「面對不確定時的樂觀」,根據現有證據只看選項的最好情況。樂觀是防止遺憾的最佳方法。

A/B測試是網絡經營常見的測試方法,將兩種展示方式隨機分配給兩組瀏覽者,測試一段時間後採用兩者中的勝利者。A/B測試也是醫療實驗的常見形式,但引起傷害受驗者的爭議。有專家認為選擇治療方式可看成多臂土匪問題,這會在實驗進行中為患者提供更好治療。

當多臂土匪問題變成不定土匪,即贏錢機率會隨時間改變,問題將變得更為困難。當世界變化不定,生活可能也需要變化不定的特質。我們一輩子要做許多決定,在人生初期強調開發才是真正合理的選擇,而在生命接近終結時,善用則更有價值。年輕人善變,老人不喜歡改變,都是依據自己的時間做出完全適宜的行為。

電腦科學的重點比較不是最佳情況,而是平均速度與最差情況。演算法的最差情況以"Big O notation"表示,常數時間問題,即處理時間不受數目影響的,表記為O(1);線性時間問題,即處理時間與數目同等加倍的,表記為O(n);平方時間問題,即處理數目線性增加時,處理時間以平方增加的,表記為O(n2);指數時間問題,即每增加一項處理時間加倍的,表記為O(2n);階乘時間問題,即每增加一項處理時間增加一階乘(factorial)的,表記為O(n!)。

電腦科學排序方式讓我們了解如何整理不同事物的順序。規模越大的事物,排序就越困難,因此減少排序麻煩的重點就是減少排序對象數量。氣泡排序(bubble sort)是單純、直覺、效率差的排序方法,做法是每次掃視序列,找到順序錯誤的兩項,將兩者對調,重複此過程直至沒有順序錯誤的項目。這種方法的最差情況是O(n2)。插入排序(insertion sort)則是將項目逐一排入序列,雖然比氣泡排序快一點,但最差情況仍然是O(n2)。

合併排序(mergesort)則是能將最差情況減少至線性時間與平方時間之間,即線性對數時間,表記為O(n log n)。做法是先排好兩疊,再對比合併,不斷重複這過程。如果知道項目的大致分布,將所有項目分成幾堆再分類會是更有效的方法,這種方式稱為桶排序(bucket sort),只要「桶」數目相對項目數目比起來相當小,最差情況就會減少至接近O(n)。

排序與搜尋之間需要互相權衡︰不會搜尋的資料不用浪費時間排序,沒有排序的資料則搜尋效率極差。當搜尋相當方便時,排序就會變得不必要。混亂有時也可以是最佳選擇。

運動比賽其實也是一種排序,或者說排序就是運動比賽的目的。單淘汰制除了第一名外,其餘名次的意義都不大,實力最強四位選手都獲得各自應得獎項的機率微乎其微。循環賽最為完整,但最花時間與體力。運動排程設計的主要目的,是盡可能讓整季比賽都精彩。電腦科學中浪費時間的做法,在運動比賽中卻會變成重點。

當面對有雜訊的環境時,效率較差的演算法,例如比較計數排序——將每個項目與其他項目比較,列出大於該項的項目數——表現最不受干擾。由於運動比賽總有運氣成分,比較計數排序——像是足球聯賽——就比較能夠反映球隊之間的實力。

當排序過程由下而上,為避免對抗次數以線性對數增加,就會出現替代行為︰預先建立順序,在遇到不值得對抗的對手時離開。自然界中分散式排序的關鍵,在於優勢階級掌握現行順序。

擁有可評量表現的數值可以令排序以常數時間進行,基準數值可以自然排序,不需要每次進行一對一的對決,就能產生優勢階級,節省時間並減少衝突。人與動物最重要的差別,或許就是以競賽取代打鬥。

從電腦科學的記憶體管理可以學習如何整理物品。電腦內部有許多不同階層的記憶以提高效率,容量較大的階層速度較慢,容量較小但速度較快的記憶階層稱為快取,用於暫存之後可能會再用的資料。快取系統需要替換策略以騰出空間,目標是盡量減少在快取中找不到所需資料。快取演算法需要預測未來需要甚麼資訊,方法包括隨機剔除舊資料、先進先出(FIFO)與最近最少使用法(LRU),除非情況特殊,一般情況下LRU與其稍微修改的版本表現較好。

快取演算法對圖書館如何排架也有啟發。參考LRU的優異表現,圖書館排架應把新進書籍放在後面,讓想看到的讀者自己去找,最近歸還的書籍則放在前廳,讓讀者知道其他讀者看過甚麼書。這可讓歸還的書跳過上架程序就能讓讀者看到,前廳的功能與電腦的快取一樣。

若是參考快取管理方式整理物品,首先要決定保留或捨棄甚麼,按照LRU的原則,很久沒使用的就丟棄,最近使用過的就保留。要充分運用物理環境,最常在哪裡使用某件物品,就將它放在那個地方附近。利用多層級記憶階層,將物品分為從容易取得但容量小,到難取得但容量大的階層,例如從衣帽架、收納箱、衣櫃、雜物房到迷你倉等,並以LRU原則決定物品如何從特定層級剔除。

LRU原則也適用於整理在同一層級中使用完後要怎樣放回物品︰用完後不要放回原處,而是放到最上面。由於我們無法預知未來,用完放到最上面就已經是最好的辦法。

人類記憶同樣需要快取與遺忘,在經過一段時間沒使用後,記得某項資料的機率就會減少。當記憶必須進行取捨,遇到越多資訊,需要管理的記憶越多,搜尋與取出資料所需時間越長。當記憶的基本挑戰是整理而非儲存,年齡較大的頭腦,必須解決的問題就會越艱難。記憶隨著老化出現遲緩現象,有一部分是因為已知的經驗增加。

分配時間的排程問題也可以用演算法方式描述。最重要的單一機器排程問題就是關於我們自己。單一機器排程的重點是,只有一部機器完成所有工作,以任何次序執行工作,花費時間都會相同。何謂好的排序方式取決於測量標準。如果希望盡量減少最大的延遲,最佳策略就是先處理到期日最早的工作。

假如不同項目的到期日有別,例如不同食物腐壞速度不同,而目標是盡量減少腐壞的食物,那麼摩爾演算法表現會較好︰一開始依腐壞日期順序食用,但在下一種食物可能無法及時食用時,先暫停再規劃,棄掉需要花最多時間才能吃完的項目。這種做法可以盡量減少延遲的項目數,但不在乎已經延遲的項目如何執行。

若要減少總延遲時間,則可以運用最短處理時間演算法,永遠處理能最快完成的工作。其重點放在減少待辦事項清單的項目數。這種方法也可將各項目的重要程度加權,將權重除以所需時間,再從重要性最高的工作開始,以盡量減少工作過程中的總負擔。

電腦運行排程演算法可能會出現另一問題︰命令系統執行一大堆瑣碎工作,無法處理真正重要的事。優先權反轉(priority inversion)就是低優先權工作取得系統資源,但中途遭計時器干擾令工作中斷,呼叫排程器,而已排程的高優先權工作因為資料庫被佔用而無法執行。解決方法是優先權繼承,讓佔資源的低優先權工作暫時成為高優先權工作,繼續受它阻擋那些工作的優先權。

排程問題中有許多屬難解問題,沒有明確演算法能在合理時間內找出最佳時程。當其中幾項工作有優先權限制,即某項工作必須等待另一項工作完成才能進行,找出最短處理時間的演算法就屬於難解問題。必須在特定時間才能開始工作,也會令絕大多數原本具有效解的排程問題變成難解問題。學者調查後發現,大多數排程問題都沒有現成解決方案。

中途停止工作改做另一項稱為佔先(preemption),允許佔先可令部份排程難解暇題得到有效解。只要在某項工作踏入開始時間時,以最早到期日或最短處理時間原則決定展開新工作還是繼續原有工作,仍然是最佳策略。最短處理時間的加權版——一出現新工作,就將其重要性除以所需時間,與現有工作比較——可說是不確定狀況下最佳通用排程策略之一。

在單一機器運用佔先的特點是,重新排程本身也是待辦事項之一,而且同樣需要成本。切換次數越多,間接成本越高,最極端會導致往復移動(trashing),即超過臨界點後,系統全速運作,但完全沒有結果。為節省運算時間,我們可以用隨機排程決定工作次序,即使這並不聰明,但總比空轉好。

電腦會設定每項作業的最小執行時間,防止為確保反應能力而忽視處理能力。電腦也會用中斷接合方式處理排程問題,在固定間隔才檢視所有狀況,以避免經常需要切換。人類希望好好完成工作,也可以決定好自己的反應速度,並在特定的時間間隔後才一次過回應問題。

如果我們事先對某種彩券的中獎率一無所知,而且只買了一張就中獎,那麼預期中獎率會是多少?數學家拉普拉斯運用貝斯的逆向推理,推論出一條簡單的公式︰買了n張獎券並有w張中獎,預期中獎率就是(w+1)/(n+2)。拉普拉斯也指出,面對已知看法與觀察結果相結合的問題時,只要直接把兩個機率相乘就能解決。這種關係現在稱為貝氏法則,前提是必須有事前機率。

在我們一無所知的狀況下,貝氏法則就會是稱為哥白尼原理的特例︰某事物已存在多久,就將會繼續存在多久。代入的事前資訊越多,得出的預測就越有用。「自然」值事物大致遵循常態分布,但有許多現象則屬冪次分布,數量可分散在許多尺度。

運用貝氏法則預測時,最重要的條件就是擁有正確的事前分佈。在冪次分布中貝氏法則運用的是乘法法則,即是將觀察到的數字乘以某個常數;在常態分布中貝氏法則運用的是平均分則,即以「自然」平均值為指引。還有一種事物已持續時間對結束機率沒有影響,其分布稱為厄蘭分布,例如放射性衰變。厄蘭分布的預測法則是加法法則︰事物的持續時間總是會加長,而加長的時間固定。

實驗發現,我們人類對甚麼情況下運用哪種預測法則表現不錯。我們從周遭世界吸收不同事物的資訊,在預測前腦中儲存許多事前分布。反過來說,透過一般人的期望值也可以間接地探察世界,例如預測等待客服時間呈乘法法則,顯示等待時間可能以冪次分布。然而,當我們沒有適當的事前分布,預測就不會那麼準確。我們對未來的期望,會透露我們過去的經驗。

如果我們對事物的認知不是來自個人經驗,而是從他人聽聞而來,我們的預測就不會那麼準確。我們偏向想說與想聽引入入勝的故事。這種故事傳播給他人的機會更高,讓我們難以擁有正確的事前分布。奇怪的是,假如要保護事前分布以進行較準確的預測,應該做的反而是少看新聞。

在進行預測時,納入更多因素會令預測模型更符合現有資訊,但這並不一定代表做出更好的預測。少量的資料點變化就會令多因素模型大幅改變,這種情況稱為過度配適(overfitting)。只要資料有雜訊或測量失準——幾乎無可避免——過度配適模型就只是反映雜訊造成的幻影。

對於如何察覺機器過度配適,研究提出最重要的一項策略是交叉驗證(cross-validation),即評估模型在看不見的資料的一般狀況,例如採用另一種測驗測試同一種技能。

要減輕過度配適的危害,最直接的方法是壓抑要找出完全符合模型複雜度的念頭︰要讓模型更複雜,就先要證明這樣做表現會好上許多。運用拉素(Lasso)演算法,可以令只有對結果有明顯影響的因素,才允許保留在模型中。這種運用限制懲罰複雜模型的原理稱為正則化(Regularization)。

要減少過度配適的影響,我們可以抑制模型受輸入資料影響的程度。生物演化的變化速度緩慢,許多生物特徵並不是最佳配置,但這可以令生物不會對環境過於敏感,有助生物適應未知的未來。許多演算法也會一開始先找出最重要因素,而不是立刻建立多因素模型,防止過度配適出現。

在面對複雜的真實生活時,比起複雜模型,單純試探法可能是更理性的選擇。決策越複雜、越不穩定、越不確定,跟著直覺走的方法就越理性。

電腦科學家發現,有一類問題不可能找出完美解決方案,例如屬於階乘時間O(n!)的業務員問題。在面對無法解法的挑戰時,既不應該堅持也不應該放棄,而是應該運用鬆弛法(relaxation)。最簡單的鬆弛法是限制鬆弛法(constraint relaxation)︰先去除問題的某些限制,再著手解決問題;到有一定進展後,再逐漸加上限制。鬆弛法不保證提供找到完美解答的捷徑,但可以告訴我們時間與解答品質如何取捨。

對於離散最適化(discrete optimization)問題,即解答非此即彼,沒有灰色地帶的難解問題,我們可以先將離散問題放鬆成連續問題,得到鬆弛的解,再考慮如何還原至現實生活中,並比較鬆弛的解與實際最佳解相比表現如何。

另一種鬆弛法稱為拉氏鬆弛法(Lagrangian Relaxation),將規則當成是計分制,考慮違反問題中某些限制會有甚麼後果。只要可以超越界線,難解問題都會變得可解。

鬆弛法顯示出,與其浪費時間尋求完美答案,先假設比較容易的問題並加以解決,是取得進展的最佳對策。鬆弛法為真實解答設下品質界限,有助於面對完整問題時設定自己的預期,與現實互相調和。

隨機在電腦科學扮演的角色日益重要。處理困難問題時,比起各種已知的確定性演算法,隨機性演算法有時更快提出不錯的近似答案,甚至在特定問題上超越最好的確定性演算法。這表示問題最佳解法方法有時候是交給機率決定,而不是自己試圖推出答案。

以樣本模擬取代完整機率計算的方法稱法蒙地卡羅法(Monte Carlo Method),適用於次原子粒子交互作用這類計算非常困難的問題。即使不是計算機率,而是有明確答案的問題,例如找出質數,隨機性也可以快速提供非常確定的近似值,雖然答案不是百分之百確定。對於多項式是否相同的代數問題,隨機代入幾個數值測試也能快速獲得近似答案。在評估公其政策對社會的影響這類複雜問題時,仔細研究隨機樣本可能是最有效的方法。

在電腦科學中,時間、空間與誤差機率三者總是需要取捨。電腦給出的答案未必會是正確答案,因為有時要確認答案是否完全正確的解決方法可能比問題更嚴重。只要容許一定的錯誤率,就可以省下大量時間與空間。

隨機性也可用於解決離散最適化問題。以規劃經過不同城市的行程為例,假如目標是盡量節省航班費用,先選出離開出發點最便宜的航班,然後繼續選出離開每個地點最便宜的航班,這種演算法稱為貪婪演算法,選出的解決方案不會太差,但可能離最佳方案甚遠。之後可以對調行程中的城市順序,從中找出最佳方案。這種演算法稱為登山法,直至對調任何兩點都不會變得更好。但是這不代表結果是最佳方案,而只是局部最大值。

為了離開局部的峰項,有一種方法是增加抖動(jitter)︰隨機做幾項更改,即使結果較差也沒關係,然後再使用登山法。更徹底的是將解決方案全盤打亂,隨機選擇新起點登山,進而得出多個局部最大值。第三種方法則是不貫徹登山法,在任何一點既接受好的修改,也接受壞的修改,以避免陷於局部最大值太久。

電腦科學從材料冷卻快慢會大幅影響最終結構的特質——稱為退火——中得到啟發,將最適化問題當成退火問題處理,先「加熱」再「冷卻」。以上述的規劃行程問題為例,先隨機選出一種可能解決方案,形成「高溫」,再按機率調整城市順序,在改變令方案更佳時接受,在方案更差時則以一定機率接受,而接受更差方案的機率隨過程逐漸降低,形成慢慢「冷卻」的過程。再之後則與登山法相同,只接受更佳方案的改變,到局部最大值後停止。這種方法稱為模擬退火(stimulated annealing),是目前已知效能強大的最適化問題解決方法。

隨機性能激發創造力,可讓我們離開局部最佳狀態,繼續追尋整體的最佳狀態。從電腦科學中,我們知道應該怎樣運用隨機性︰每次都應該採用好點子,只有時採用壞用壞點子;採用壞點子的機率,與點子的糟糕程度成反比;盡早運用隨機性,快速離開完全隨機狀態,隨時間逐漸降低隨機性。

電腦間交換訊息不像人類那樣持續講話,而是一段時間講一大堆,接著沉默一陣子,再講一大堆。這種交流適合使用封包交換網絡,即把訊息切割成極小的封包,再把封包合位成共有的資料流,就像是每次寄一封信那樣。封包交換網絡除了更有效率使用頻寬,在網路劇烈變化時,也可透過演算法讓每條訊息到達目的地。

封包交換的問題是,我們不會自動知道訊息已經送到。封包有可能損壞或遺失,或者到達次序不對。在網絡上,封包遞送以應答封包(ACK)確認,方法是連接伺服器時會獲派一個序號,伺服器本身則會有另一個獨立序號,每次送出封包時ACK會將兩組序號加1,如果收到的封包跳過某個序號,並在呼叫三次都收不到跳過的封包時,另一方就會重新送出這個封包。

與不可靠的人或電腦時聯絡時,首要問題是要將多久沒有回應視為對話中斷,答案視乎網絡本身的特性,例如電話與電郵的預期等待時間就有差別。在網絡中讓雙方調整應答時效的期望,對系統正確運作十分重要。

在發現通訊中斷後,雙方安排重新發送訊息時需要考慮,同時再發送訊息可能會造成互相干擾。通訊雙方要協定如何禮讓時,可以先打破對稱︰一方先等一陣子,讓另一方先重新發送。具體方法是把嘗試重新傳送前的可能延後時間加倍,並在此範圍內隨機發送︰第一次一至兩輪,第二次一至四輪,第三次一至八輪,如此類推,這種方式稱為指數退讓(exponential backoff)。

除了避免通訊衝突外,指數退讓也成為處理網絡失敗或不可靠的預設方法。當電腦嘗試連線停機的網站時,會使用指數退讓法,先是一秒後重試,然後是幾秒後,再不斷拉長。這種方式可避免伺服器重新上線後因要求太多而停擺,並防止我們自己的電腦做太多白工。指數退讓在網絡安全上也扮演要角,密碼輸入錯誤時鎖定時間會按指數方式延長,避免不斷輸入密碼入侵帳戶的情況,也不會令真正使用者忘記密碼時帳戶永遠鎖定。

指數退讓可用於考慮如何原諒他人行為︰一開始較寬容,懲罰較輕微,但重複犯錯後設定呈指數增長的冷靜期,或者指數增長的懲罰。這種做法讓人表達出仁慈無限但耐心有限,又不至於需要殘酷地完全放棄犯錯的人。

封包交換系統在網絡壅塞時不會完全停頓,而是速度大幅變慢。控制網絡壅塞的演算法稱為加法遞增乘法遞減(AIMD)。假如封包一直接收成功,傳送封包數目會雙倍增加。但在任何封包的ACK沒有傳回發送者後,AIMD就會接手,方式是當封包成功接收後,下次傳送的封包數目加1(加法遞增);當有封包遺失,傳輸率則減半(乘法遞減)。AIMD可以確保所有使用者速度不能超過令網絡過載速度,並防止急劇過載與復原循環。

AIMD顯示出,在無法預料且不斷變化的環境中,要充分運用全部資源,最好甚至唯一的方法,就是將狀況推到出現錯誤,確保錯誤可以迅速反應,而且很快能恢復。作者提議AIMD可用於職位升遷制度,每年員工不是晉升一級就是下降一級,不會有人長期負擔過重,也不會有人抱怨長期沒有獲得升遷。這種做法可以避免彼得原理︰所有員工通常晉升到無法勝任的職位。

網絡需要緩衝以消除暴增的流量,但緩衝的代價是傳送延遲。當緩衝爆滿(bufferbloat)時,通常會出現墜尾(tail drop)現象,指在此之後到達的所有封包都會被拒絕並刪除。假如緩衝一直滿載,則會出現無限延遲,同時沒有封包得以處理的現象。緩衝必須定期清空才能運作。

凱恩斯提出股票市場像是選美問題,每個人都在考慮別人想甚麼,並層層遞迴(resursion)︰我知道,你知道我知道,我知道你知道我知道,等等。電腦科學以停機問題(halting problem)說明這種情況,指出電腦程式永遠無法明確告訴我們,另一程式是否會永無止境計算下去。系統在模擬複雜程度與本身相仿的事物時,本身的資源會幾乎完全用盡。

要破除遞迴可以運用賽局理論,模擬雙方在各種情況下的損益,從中找出均衡(equilibrium),即雙方可遵循、在知道對方行動後也不想改變的策略。雙人賽局至少有一種均衡狀態,但賽局理論沒有說明如何可達到均衡。尋找均衡被證實是難解問題,這代表賽局參加者並不是那麼容易找到均衡策略。當均衡無法有效運用,賽局理論預測理性參加者行為的可信度就會大打折扣。

即使能達到均衡,這並不代表均衡策略就是讓所有參加者獲得最佳結果的策略。囚徒困境是在不知對方策略時,選擇與對方「合作」保持緘默還是背叛對方的賽局。假如對方合作,自己選擇背叛的報酬比合作好;假如對方背叛, 自己選擇背叛的報酬同樣會比合作好。換言之,不論對方如何選擇,背叛都是主導策略。然而,在對方的立場, 背叛同樣是主導策略,結果會是雙方都背叛,報酬比雙方都合作更差。

在現實的賽局中,自主行為的代價可高可低,需要按不同領域評估。當自主代價很低,糸統細心管理還是放任不管運作情況都差不多。例如道路駕駛者各行其是,有研究指這只比最佳狀態慢33%。反之,當自主行為代價很高,互相協調可以改善狀況,毫無介入則會造成災難。例如員工休假,假如沒有介入,員工之間會以他人為基準,比這基準放少一點假,以示自己忠誠認真,從而增加晉升機會。

當賽局規則逼使我們作不好的策略,比起改變策略,我們或許應該試圖改變賽局。探討改變賽局在賽局理論中稱為機制設計,了解甚麼規則會產生我們希望看到的行為。以上述的員工放假例子來說,提高放假的誘因作用有限,因為升職前景遠比可能提供的誘因大。機制設計指出,這種情況下用棒子比用胡蘿蔔效果更佳,例如設定最低強制休假日數。

合作可以在某些賽局中帶來更佳結果,但如果合作只對群體有益,對個體幫助不大,合作從何而來?作者指或許必須來自個體無法完全控制的事物,例如宗教、合約、情緒。以婚姻為例,愛情產生的依附感讓人不至於過度思考伴侶的意圖,並令報酬本身改變,產生更好結果。

從他人學習可以擴充自己的世界觀,但有時候這不一定特別理性。賽局理論提出,即使沒有人有錯,跟隨他人行為都可以造成災難。我們可能都不知道其他參與者怎樣想,只知道他們做了甚麼;但其他人可能也只是看到其他人這樣做而遵循。一群行為理性合宜的參與者,仍可能受無限錯誤資訊左右,這種現象稱為「資訊瀑布」(information cascade)。

資訊瀑布給我們的教訓是,要留意在公開訊息多於私人訊息時的狀況,這種狀況下我們比較在乎自身判斷是否符合共識,而不是符合事實。要記住,人未必會根據自己的想法行事。否決自己的懷疑時必須格外謹慎,採取行動時也應該表達自己的懷疑。有時身陷賽局中後就會難以脫身,資訊瀑布理論或許能告訴我們如何避免陷入這類賽局。

有一種拍賣設計可以乾淨俐落解決遞迴問題,稱為維克里拍賣(Vickrey auction),運作方式是秘密出價,價高者得,但得標者要付的不是自己的出價,而是第二高的標金。維克里拍賣鼓勵參與者誠實,依據自己心目中對標的物的價值下標。在維克里拍賣中,無論其他參與者是否誠實,自己誠實依然是最佳策略。機制設計的揭示原理(revelation principle)證明,必須藉策略掩蓋事實的賽局,都可轉化成只需要誠實就好的賽局。尋找誠實才是主導策略的賽局,之後只需要好好做自己。

作者總結指,任何受空間與時間限制的動態系統,都會有運算問題,這點可以得出三個簡單的結論︰第一,某些問題電腦科學家與數學家已找到可用演算方法,例如37%法則、LRU準則、依據信賴上界決定是否開發;第二,即使沒有得到最理想結果,知道自己運用最佳演算法也能讓人放心。如果採取最佳可能過程,而且已盡己所能,結果不如願也不應該怪自己;第三,有明確解答的問題與沒有明確解答的問題可以清楚劃分。遇到難解問題,運用經驗法則、估計與隨機找到可用解答,夠好就真的已經夠好。

電腦科學有個原理是,運算是不好的,良好演算法的基本指令,是減少用於思考的腦力。本著「運算的善意」,我們可以適當界定問題,令隱含運算問題變得更容易。「隨便」、「你今晚想做甚麼?」這些話表面上是客氣,卻是將認知責任推給對方,並要對方臆測自己想法,讓對方面對最大的運算挑戰。

運算的善意與傳統禮儀有別,客氣表達自身偏好(我比較想……你覺得如何?)才能分擔認知負荷,幫助群體達成決議。給別人較少的選項,群體中每個人都先刪去最不偏好的選項,提出一兩個確定提議讓對方接受或拒絕等做法,都能明顯減少互動運算的成本。

運算的善意也是設計原則,讓使用者免除不必要的對立、摩擦與腦力消耗。例如停車場設計成向上延伸的螺旋車道,駕駛者只要向前開,看到有車位就停泊。餐廳登記等待顧客的順序,不用顧客每一刻留意有沒有空桌。公車顯示到站時間資訊,乘客就不需要一直盯著遠方。

最好的演算法是在最短時間內得出最合理的答案,而不是仔細考慮所有因素,進行所有可能的計算。面對難解問題時,有效的演算法會做出假設,偏向較簡單的解答,權衡誤差與延遲代價,接著冒險一試。這並不是對理性的讓步,它本身就是理性的方法。