十二、合作進(jìn)化
譯者:飛龍
協(xié)議:CC BY-NC-SA 4.0
自豪地采用谷歌翻譯
在最后一章中,我們提出兩個(gè)問(wèn)題,一個(gè)來(lái)自生物學(xué),一個(gè)來(lái)自哲學(xué):
- 在生物學(xué)中,“利他主義問(wèn)題”是自然選擇與利他主義之間的明顯沖突,自然選擇表明動(dòng)物生存在不斷競(jìng)爭(zhēng)的狀態(tài)中來(lái)生存和繁殖,利他主義是許多動(dòng)物幫助其他動(dòng)物的傾向,甚至是顯然對(duì)他們不利。見(jiàn) https://en.wikipedia.org/wiki/Altruism_(biology)。
- 在道德哲學(xué)中,人性問(wèn)題是,人類是否從根本上是善良的,或者邪惡的,或者是由環(huán)境塑造的空白狀態(tài)。見(jiàn) https://en.wikipedia.org/wiki/Human_nature。
我們將用來(lái)解決這些問(wèn)題的工具,(同樣)是基于智能體的模擬和博弈論,博弈論是一組抽象模型,旨在描述智能體交互的各種方式。具體來(lái)說(shuō),我們會(huì)考慮囚徒困境。
本章的代碼位于chap12.ipynb中,該書是本書倉(cāng)庫(kù)中的Jupyter筆記本。使用此代碼的更多信息,請(qǐng)參見(jiàn)第?節(jié)。
12.1 囚徒困境
囚徒困境是博弈論中的一個(gè)話題,但它不是一種有趣的博弈。相反,這種博弈揭示了人類的動(dòng)機(jī)和行為。以下是來(lái)自維基百科的它的介紹(http://en.wikipedia.org/wiki/Prisoner's_dilemma):
兩名犯罪團(tuán)伙成員被逮捕并囚禁。每個(gè)囚犯都被單獨(dú)監(jiān)禁,無(wú)法與另一方交流。檢察官缺乏足夠的證據(jù),來(lái)證明這兩個(gè)人的主要指控。他們希望以較輕的指控被判處兩年徒刑。同時(shí),檢察官為每個(gè)囚犯提供商量的余地。每個(gè)囚犯都有機(jī)會(huì):(1)通過(guò)證明對(duì)方犯罪出賣對(duì)方,或(2)通過(guò)保持沉默與另一方合作。出價(jià)是:
- 如果 A 和 B 各自背叛對(duì)方,每個(gè)人都服刑 2 年。
- 如果 A 背叛 B 但 B 保持沉默,A 將被釋放,B 將被監(jiān)禁 3 年(反之亦然)。
- 如果 A 和 B 都保持沉默,他們兩人只會(huì)服刑 1 年(較輕的質(zhì)控)。
很顯然,這種情況是假想的,但它用于代表各種不同的互動(dòng),其中智能體必須選擇是相互“合作”還是“背叛”,以及每個(gè)智能體的獎(jiǎng)勵(lì)(或懲罰)取決于他人的選擇。
有了這套獎(jiǎng)懲,我們很有可能說(shuō)智能體應(yīng)該合作,也就是說(shuō),雙方都應(yīng)該保持沉默。 但兩個(gè)智能體不知道對(duì)方會(huì)做什么,所以每個(gè)人都必須考慮兩種可能的結(jié)果。 首先,從 A 的角度來(lái)看它:
- 如果 B 保持沉默,A 最好是背叛;他會(huì)無(wú)罪而不是服刑 1 年。
- 如果 B 背叛,A 最好也是背叛;他只會(huì)服刑 2 年而不是 3 年。
不管 B 做什么,A 最好都是背叛。 而且因?yàn)椴┺氖菍?duì)稱的,所以從 B 的角度來(lái)看這個(gè)分析是一樣的:不管 A 做什么,B 最好也是背叛。
在這個(gè)博弈的最簡(jiǎn)單版本中,我們假設(shè) A 和 B 沒(méi)有考慮其他因素。 他們不能互相溝通,所以他們不能協(xié)商,作出承諾或相互威脅。 他們只考慮直接目標(biāo),最小化他們的判決;他們不考慮任何其他因素。
在這些假設(shè)下,兩個(gè)智能體的理性選擇都是背叛。 這可能是一件好事,至少在刑事司法方面是這樣。 但對(duì)囚犯來(lái)說(shuō),這令人沮喪,因?yàn)轱@然,他們無(wú)法獲得他們雙方都想要的結(jié)果。 而且這種模式適用于現(xiàn)實(shí)生活中的其他場(chǎng)合,其中合作有更大的好處以及對(duì)于玩家來(lái)說(shuō)都會(huì)更好。
研究這些場(chǎng)景以及擺脫困境的方法,博弈論研究者關(guān)注的焦點(diǎn),但這不是本章的重點(diǎn)。 我們正朝著不同的方向前進(jìn)。
12.2 善良的問(wèn)題
自 20 世紀(jì) 50 年代,囚徒困境被首次討論以來(lái),它一直是社會(huì)心理學(xué)研究的熱門話題。根據(jù)前一節(jié)的分析,我們可以說(shuō)一個(gè)理想的智能體應(yīng)該做什么; 很難預(yù)測(cè)真正的人究竟做了些什么。 幸運(yùn)的是,實(shí)驗(yàn)已經(jīng)完成了 [1]。
[1] 這里有一個(gè)最近的報(bào)告,提到以前的實(shí)驗(yàn):Barreda-Tarrazona, Jaramillo-Gutiérrez, Pavan, and Sabater-Grande, “Individual Characteristics vs. Experience: An Experimental Study on Cooperation in Prisoner’s Dilemma", Frontiers in Psychology, 2017; 8: 596. https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5397528/。
如果我們假設(shè)人們足夠聰明地進(jìn)行分析(或者在解釋時(shí)理解它),并且他們通常為了自己的利益而行事,那么我們預(yù)計(jì)他們幾乎總是背叛。 但他們沒(méi)有。 在大多數(shù)實(shí)驗(yàn)中,受試者的合作遠(yuǎn)遠(yuǎn)超過(guò)理性的智能體模型的預(yù)測(cè) [2]。
[2] 有個(gè)不錯(cuò)的視頻歸納了我們目前討論的內(nèi)容:https://www.youtube.com/watch?v=t9Lo2fgxWHw。
這個(gè)結(jié)果最明顯的解釋是,人們不是理性的智能體,這對(duì)任何人都不應(yīng)該感到驚訝。 但為什么不是呢? 是因?yàn)樗麄儾粔蚵斆?,無(wú)法理解這種情況,還是因?yàn)樗麄児室膺`背自己的利益行事?
根據(jù)實(shí)驗(yàn)結(jié)果,似乎至少有一部分解釋是純粹的利他主義:許多人愿意為了讓別人受益而承擔(dān)成本?,F(xiàn)在,在你提出《Journal of Obvious Results》上發(fā)表的結(jié)論之前,讓我們繼續(xù)問(wèn)為什么:
- 為什么人們會(huì)幫助別人,即使自己會(huì)付出代價(jià)?至少部分原因是他們想這樣;這讓他們對(duì)自己和世界感覺(jué)良好。
- 為什么善良讓人感覺(jué)良好?誘人的說(shuō)法是,有人跟他們提出這是正確的,或者更普遍來(lái)說(shuō),他們被社會(huì)訓(xùn)練為想要做好事。但毫無(wú)疑問(wèn) [3],至少有一大部分利他主義是天生的;在不同程度上,利他主義的傾向是正常大腦發(fā)育的結(jié)果。
- 那么,為什么呢?大腦發(fā)育的內(nèi)在部分,以及隨后的個(gè)體特征,是基因的結(jié)果。當(dāng)然,基因與利他主義的關(guān)系是復(fù)雜的,可能有許多基因與環(huán)境因素相互作用,導(dǎo)致人們?cè)诓煌闆r下或多或少是無(wú)私的。盡管如此,幾乎可以肯定的是基因?qū)е氯藗冏兊脽o(wú)私。
- 最后,為什么呢?如果在自然選擇下,動(dòng)物為了生存和繁殖而彼此不斷競(jìng)爭(zhēng),似乎顯然利他主義會(huì)適得其反。在一個(gè)種群中,有些人幫助別人,甚至是為別人傷害自己,其他人純粹是自私的,似乎自私者會(huì)受益,利他者會(huì)受到影響,并且利他主義的基因?qū)⒈或?qū)逐而滅絕。
[3] 我希望你能原諒我在這里用“毫無(wú)疑問(wèn)”代替實(shí)驗(yàn)的參考資料,我想在本章中介紹一些理由,而不會(huì)陷入太深。
這個(gè)明顯的矛盾是“利他主義問(wèn)題”:為什么利他主義的基因沒(méi)有消失?
在生物學(xué)家中,有很多可能的解釋,包括互惠利他主義,性選擇,親屬選擇和群體選擇。而在非科學(xué)家中,還有更多的解釋。我把它交給你去探索別的假說(shuō);現(xiàn)在我想專注于一種解釋,可以說(shuō)是最簡(jiǎn)單的一種解釋:也許利他主義是適應(yīng)性的。換句話說(shuō),利他主義的基因可能使人們更容易生存和繁殖。
事實(shí)證明,引發(fā)利他主義問(wèn)題的囚徒困境,也可能有助于解決問(wèn)題。
12.3 囚徒困境比賽
在 20 世紀(jì) 70 年代后期,密歇根大學(xué)的政治學(xué)家羅伯特阿克塞爾羅德(Robert Axelrod)組織了一場(chǎng)比賽來(lái)比較囚徒困境(PD)的策略。
他邀請(qǐng)參與者以計(jì)算機(jī)程序的形式提交策略,然后相互對(duì)抗并保持得分。具體來(lái)說(shuō),他們玩的是 PD 的迭代版本,其中智能體針對(duì)同一對(duì)手進(jìn)行多輪比賽,因此他們的決定可以基于歷史。
在 Axelrod 的比賽中,一個(gè)簡(jiǎn)單的策略出人意料地好,稱為“針?shù)h相對(duì)”,即 TFT,TFT 在第一輪迭代比賽中總是合作;之后,它會(huì)復(fù)制上一輪對(duì)手所做的任何事情。對(duì)手繼續(xù)合作,TFT 保持合作,如果對(duì)手任何時(shí)候都背叛,下一輪 TFT 背叛,但如果對(duì)手變回合作,TFT 也會(huì)合作。
這些比賽的更多信息,以及 TFT 為何如此出色的解釋,請(qǐng)參閱以下視頻:https://www.youtube.com/watch?v=BOvAbjfJ0x0。
看看這些比賽中表現(xiàn)出色的策略,Alexrod 發(fā)現(xiàn)了他們傾向于分享的特點(diǎn):
- 善良:表現(xiàn)好的策略在第一輪比賽中合作,并且通常會(huì)在隨后的幾輪中合作。
- 報(bào)復(fù):始終合作的策略,并不如如果對(duì)手背叛就報(bào)復(fù)的策略好。
- 寬?。旱沁^(guò)于斗氣的策略往往會(huì)懲罰自己以及對(duì)手。
- 不嫉妒:一些最成功的策略很少超過(guò)對(duì)手;他們成功了,因?yàn)樗麄儗?duì)各種各樣的對(duì)手都做得足夠好。
TFT 具有所有這些屬性。
Axelrod 的比賽為利他主義問(wèn)題提供了部分可能的答案:也許利他主義的基因是普遍存在的,因?yàn)樗鼈兪沁m應(yīng)性的。 許多社會(huì)互動(dòng)可以建模為囚徒困境的變種,就這種程度而言,如果將一個(gè)大腦設(shè)定為善良,平衡報(bào)復(fù)和寬恕,就會(huì)在各種各樣的情況下表現(xiàn)良好。
但是 Axelrod 比賽中的策略是由人們?cè)O(shè)計(jì)的;他們并不進(jìn)化。 我們需要考慮,善良、報(bào)復(fù)和寬恕的基因是否可以通過(guò)突變出現(xiàn),成功侵入其他策略的種群,并抵制后續(xù)突變的侵入。
12.4 合作進(jìn)化的模擬
合作進(jìn)化是第一本書的標(biāo)題,Axelrod 展示了來(lái)自囚徒困境比賽的結(jié)果,并討論了利他主義問(wèn)題的影響。 從那以后,他和其他研究人員已經(jīng)探索了 PD 比賽的進(jìn)化動(dòng)態(tài)性,也就是說(shuō),PD 選手的總體中,策略的分布隨時(shí)間如何變化。 在本章的其余部分中,我運(yùn)行這些實(shí)驗(yàn)的一個(gè)版本并展示結(jié)果。
首先,我們需要一種將 PD 策略編碼為基因型的方法。 在這個(gè)實(shí)驗(yàn)中,我考慮了一些策略,其中智能體每一輪的選擇僅取決于前兩輪中對(duì)手的選擇。 我用字典來(lái)表示策略,它將對(duì)手的前兩個(gè)選擇映射為智能體的下一個(gè)選擇。
以下是這些智能體的類定義:
class Agent:
keys = [(None, None),
(None, 'C'),
(None, 'D'),
('C', 'C'),
('C', 'D'),
('D', 'C'),
('D', 'D')]
def __init__(self, values, fitness=np.nan):
self.values = values
self.responses = dict(zip(self.keys, values))
self.fitness = fitness
keys是每個(gè)智能體的詞典中的鍵序列,其中元組('C', 'C')表示對(duì)手在前兩輪合作;(None, 'C')意味著只有一輪比賽并且對(duì)手合作;(None, None)表示還沒(méi)有回合。
在__init__方法中,values是對(duì)應(yīng)于鍵的一系列選項(xiàng),'C'或'D'。 所以如果值的第一個(gè)元素是'C',那就意味著這個(gè)智能體將在第一輪合作。 如果值的最后一個(gè)元素是'D',那么如果對(duì)手在前兩輪中背叛,該智能體將會(huì)背叛。
在這個(gè)實(shí)現(xiàn)中,總是背叛的智能體的基因型是'DDDDDDD'; 總是合作的智能體的基因型是'CCCCCCC',而 TFT 的基因型是'CCDCDCD'。
Agent類提供copy,它使其它智能體具有相同的基因型,但具有一定的變異概率:
prob_mutate = 0.05
def copy(self):
if np.random.random() > self.prob_mutate:
values = self.values
else:
values = self.mutate()
return Agent(values, self.fitness)
突變的原理是,在基因型中選擇一個(gè)隨機(jī)值并從'C'翻轉(zhuǎn)到'D',或者相反:
def mutate(self):
values = list(self.values)
index = np.random.choice(len(values))
values[index] = 'C' if values[index] == 'D' else 'D'
return values
既然我們有了智能體,我們還需要比賽。
12.5 Tournament
Tournament類封裝了 PD 比賽的細(xì)節(jié):
payoffs = {('C', 'C'): (3, 3),
('C', 'D'): (0, 5),
('D', 'C'): (5, 0),
('D', 'D'): (1, 1)}
num_rounds = 6
def play(self, agent1, agent2):
agent1.reset()
agent2.reset()
for i in range(self.num_rounds):
resp1 = agent1.respond(agent2)
resp2 = agent2.respond(agent1)
pay1, pay2 = self.payoffs[resp1, resp2]
agent1.append(resp1, pay1)
agent2.append(resp2, pay2)
return agent1.score, agent2.score
payoffs是一個(gè)字典,將從智能體的選擇映射為獎(jiǎng)勵(lì)。例如,如果兩個(gè)智能體合作,他們每個(gè)得到 3 分。如果一個(gè)背叛而另一個(gè)合作,背叛者得到 5 分,而合作者得到 0 分。如果他們都背叛,每個(gè)都會(huì)得到 1 分。這些是 Axelrod 在他的比賽中使用的收益。
play運(yùn)行幾輪 PD 游戲。它使用Agent類中的以下方法:
-
reset:在第一輪之前初始化智能體,重置他們的分?jǐn)?shù)和他們的回應(yīng)的歷史記錄。 -
respond:考慮到對(duì)手之前的回應(yīng),向每個(gè)智能體詢問(wèn)回應(yīng)。 -
append:通過(guò)存儲(chǔ)選項(xiàng),并將連續(xù)輪次的分?jǐn)?shù)相加,來(lái)更新每個(gè)智能體。
在給定的回合數(shù)之后,play將返回每個(gè)智能體的總分?jǐn)?shù)。我選擇了num_rounds = 6,以便每個(gè)基因型的元素都以大致相同的頻率訪問(wèn)。第一個(gè)元素僅在第一輪訪問(wèn),或在六分之一的時(shí)間內(nèi)訪問(wèn)。接下來(lái)的兩個(gè)元素只能在第二輪中訪問(wèn),或者每個(gè)十二分之一。最后四個(gè)元素在六分之一時(shí)間內(nèi)訪問(wèn),平均每次訪問(wèn)六次,或者平均每個(gè)六分之一。
Tournament提供了第二種方法,即melee,確定哪些智能體互相競(jìng)爭(zhēng):
def melee(self, agents, randomize=True):
if randomize:
agents = np.random.permutation(agents)
n = len(agents)
i_row = np.arange(n)
j_row = (i_row + 1) % n
totals = np.zeros(n)
for i, j in zip(i_row, j_row):
agent1, agent2 = agents[i], agents[j]
score1, score2 = self.play(agent1, agent2)
totals[i] += score1
totals[j] += score2
for i in i_row:
agents[i].fitness = totals[i] / self.num_rounds / 2
melee接受一個(gè)智能體列表和一個(gè)布爾值randomize,它決定了每個(gè)智能體每次是否與同一鄰居競(jìng)爭(zhēng),或者匹配是否隨機(jī)化。
i_row和j_row包含匹配的索引。 totals包含每個(gè)智能體的總分?jǐn)?shù)。
在循環(huán)內(nèi)部,我們選擇兩個(gè)智能體,調(diào)用play和更新totals。 最后,我們計(jì)算每個(gè)智能體獲得的,每輪和每個(gè)對(duì)手的平均點(diǎn)數(shù),并將結(jié)果存儲(chǔ)在每個(gè)智能體的fitness屬性中。
12.6 Simulation
本章的Simulation類基于第?章的中的那個(gè);唯一的區(qū)別是__init__和step。
這是__init__方法:
class PDSimulation(Simulation):
def __init__(self, tournament, agents):
self.tournament = tournament
self.agents = np.asarray(agents)
self.instruments = []
Simulation對(duì)象包含一個(gè)Tournament對(duì)象,一系列的智能體和一系列的Instrument對(duì)象(就像第?章中一樣)。
以下是step方法:
def step(self):
self.tournament.melee(self.agents)
Simulation.step(self)
此版本的step使用Tournament.melee,它為每個(gè)智能體設(shè)置fitness屬性;然后它調(diào)用父類的step方法,父類來(lái)自第?章:
# class Simulation
def step(self):
n = len(self.agents)
fits = self.get_fitnesses()
# see who dies
index_dead = self.choose_dead(fits)
num_dead = len(index_dead)
# replace the dead with copies of the living
replacements = self.choose_replacements(num_dead, fits)
self.agents[index_dead] = replacements
# update any instruments
self.update_instruments()
Simulation.step將智能體的適應(yīng)性收集到一個(gè)數(shù)組中; 然后它會(huì)調(diào)用choose_dead來(lái)決定哪些智能體死掉,并用choose_replacements來(lái)決定哪些智能體繁殖。
我的模擬包含生存差異,就像第?章那樣,但不包括繁殖差異。 你可以在本章的筆記本上看到細(xì)節(jié)。 作為練習(xí)之一,你將有機(jī)會(huì)探索繁殖差異的效果。
12.7 結(jié)果
假設(shè)我們從三個(gè)智能體開(kāi)始:一個(gè)總是合作,一個(gè)總是背叛,另一個(gè)執(zhí)行 TFT 策略。 如果我們?cè)谶@個(gè)種群中運(yùn)行Tournament.melee,合作者每輪獲得 1.5 分,TFT 智能體獲得 1.9 分,而背叛者獲得 3.33 分。 這個(gè)結(jié)果表明,“總是背叛”應(yīng)該很快成為主導(dǎo)策略。
但是“總是缺陷”包含著自我破壞的種子,如果更好的策略被驅(qū)使而滅絕,那么背叛者就沒(méi)有人可以利用,他們的適應(yīng)性下降,并且容易受到合作者的入侵。
根據(jù)這一分析,預(yù)測(cè)系統(tǒng)的行為不容易:它會(huì)找到一個(gè)穩(wěn)定的平衡點(diǎn),還是在基因型景觀的各個(gè)位置之間振蕩? 讓我們運(yùn)行模擬來(lái)發(fā)現(xiàn)它!
我以 100 個(gè)始終背叛的相同智能體開(kāi)始,并運(yùn)行 5000 個(gè)步驟的模擬:
tour = Tournament()
agents = make_identical_agents(100, list('DDDDDDD'))
sim = PDSimulation(tour, agents)

圖 12.1:平均適應(yīng)性(囚徒困境的每個(gè)回合的所得點(diǎn)數(shù))
圖?展示了隨時(shí)間變化的平均適應(yīng)性(使用第?章的MeanFitness儀器)。最初平均適應(yīng)性是 1,因?yàn)楫?dāng)背叛者面對(duì)對(duì)方時(shí),他們每輪只能得到 1 分。
經(jīng)過(guò)大約 500 個(gè)時(shí)間步,平均適應(yīng)性增加到近 3,這是合作者面對(duì)彼此時(shí)得到的。但是,正如我們所懷疑的那樣,這種情況不穩(wěn)定。在接下來(lái)的 500 個(gè)步驟中,平均適應(yīng)性下降到 2 以下,回到 3,并繼續(xù)振蕩。
模擬的其余部分變化很大,但除了一次大的下降之外,平均適應(yīng)性通常在 2 到 3 之間,長(zhǎng)期平均值接近 2.5。
而且這還不錯(cuò)!它不是一個(gè)合作的烏托邦,每輪平均得 3 分,但距離始終背叛的烏托邦還很遠(yuǎn)。這比我們所期待的,自利智能體的自然選擇要好得多。
為了深入了解這種適應(yīng)性水平,我們來(lái)看看更多的儀器。Niceness在每個(gè)時(shí)間步驟之后測(cè)量智能體的基因型的合作比例:
class Niceness(Instrument):
def update(self, sim):
responses = np.array([agent.values
for agent in sim.agents])
metric = np.mean(responses == 'C')
self.metrics.append(metric)

圖 12.2:種群中所有基因組的平均友善度(左)和第一輪合作的種群比例(右)
圖?(左圖)展示結(jié)果:平均友善度從 0 迅速上升到 0.75,然后在 0.4 到 0.85 之間波動(dòng),長(zhǎng)期平均值接近 0.65。 同樣,這相當(dāng)好!
具體看開(kāi)始的移動(dòng),我們可以追蹤第一輪合作的智能體的比例。 這是這個(gè)儀器:
class Retaliating(Instrument):
def update(self, sim):
after_d = np.array([agent.values[2::2]
for agent in sim.agents])
after_c = np.array([agent.values[1::2]
for agent in sim.agents])
metric = np.mean(after_d=='D') - np.mean(after_c=='D')
self.metrics.append(metric)
報(bào)復(fù)行為將所有基因組中的元素?cái)?shù)量,其中對(duì)手背叛后智能體也背叛(元素 2, 4 和 6),與其中的元素?cái)?shù)量,其中對(duì)手合作后智能體背叛相比較。正如你現(xiàn)在的預(yù)期,結(jié)果差異很大(你可以在筆記本中看到圖形)。平均而言,這些分?jǐn)?shù)之間的差異小于 0.1,所以如果智能體在對(duì)手合作后,30% 的時(shí)間中背叛,他們可能會(huì)在背叛后的 40% 時(shí)間中背叛。
這個(gè)結(jié)果為這個(gè)斷言提供了較弱的支持,即成功的策略會(huì)報(bào)復(fù)。也許所有智能體甚至很多智能體都沒(méi)有必要進(jìn)行報(bào)復(fù);如果整個(gè)種群中至少存在一定的報(bào)復(fù)傾向,那么這可能足以阻止高度報(bào)復(fù)策略的普及。
為了衡量寬恕,我再次定義了一個(gè)工具,來(lái)查看在前兩輪之后,智能體是否更有可能在 D-C 之后進(jìn)行合作,與 C-D 相比。在我的模擬中,沒(méi)有證據(jù)表明這種特殊的寬恕。另一方面,這些模擬中的策略在某種意義上是必然的寬容,因?yàn)樗鼈冎豢紤]前兩輪的歷史。
12.8 總結(jié)
Axelrod 的比賽提出了解決利他主義問(wèn)題的一個(gè)可能的解決辦法:或許善良,但不是太善良,是適應(yīng)性的。但是原始比如中的策略是由人們,而不是進(jìn)化論設(shè)計(jì)的,并且策略的分布在比賽過(guò)程中沒(méi)有改變。
所以這就提出了一個(gè)問(wèn)題:像 TFT 這樣的策略可能會(huì)在固定的人為設(shè)計(jì)策略中表現(xiàn)良好,但它們是否會(huì)進(jìn)化?換句話說(shuō),他們是否可以通過(guò)變異出現(xiàn)在種群中,與祖先競(jìng)爭(zhēng)成功,并抵抗他們的后代的入侵?
本章中的模擬表明:
- 背叛者種群容易受到更善良的策略的入侵。
- 過(guò)于善良的種群容易受到背叛者的入侵。
- 所以,善良的平均程度有所波動(dòng),但善良的平均數(shù)量普遍較高,而平均適應(yīng)程度一般更接近合作烏托邦而不是偏差異議程度。
- 在 Alexrod 的比賽中,TFT 是一項(xiàng)成功的戰(zhàn)略,但對(duì)于不斷發(fā)展的種群來(lái)說(shuō),這似乎不是一個(gè)最佳策略。事實(shí)上,可能沒(méi)有穩(wěn)定的最佳策略。
- 某種程度的報(bào)復(fù)可能是適應(yīng)性的,但對(duì)所有智能體來(lái)說(shuō),可能沒(méi)有必要進(jìn)行報(bào)復(fù)。 如果在整個(gè)種群中有足夠的報(bào)復(fù)行為,這可能足以防止背叛者入侵 [4]。
[4] 這就引入了博弈論中一個(gè)全新的話題 - 搭便車問(wèn)題(見(jiàn) https://en.wikipedia.org/wiki/Free-rider_problem)。
很明顯,這些模擬中的智能體很簡(jiǎn)單,而囚徒困境是一種有限范圍的社交互動(dòng)的高度抽象模型。 盡管如此,本章的結(jié)果對(duì)人性提供了一些見(jiàn)解。 也許我們對(duì)合作,報(bào)復(fù)和寬恕的傾向是天生的,至少部分是。 這些特征是我們的大腦的工作機(jī)制的結(jié)果,至少部分是由我們的基因控制的。 也許我們的基因這樣來(lái)構(gòu)建我們的大腦,因?yàn)樵谌祟愡M(jìn)化史上,自私的大腦的基因不太可能傳播。
所以也許這就是為什么自私基因會(huì)建立無(wú)私的大腦。
12.9 練習(xí)
本章的代碼位于本書倉(cāng)庫(kù)的 Jupyter 筆記本chap12.ipynb中。打開(kāi)筆記本,閱讀代碼并運(yùn)行單元個(gè)。你可以使用這個(gè)筆記本來(lái)練習(xí)本章的練習(xí)。我的解決方案在chap12soln.ipynb中。
練習(xí) 1
本章中的模擬取決于我任意選擇的條件和參數(shù)。作為練習(xí),我鼓勵(lì)你去探索其他條件,看看他們對(duì)結(jié)果有什么影響。這里有一些建議:
- 改變初始條件:不要從所有背叛者開(kāi)始,看看如果從所有合作者,所有 TFT 或隨機(jī)智能體開(kāi)始會(huì)發(fā)生什么。
- 在
Tournament.melee中,我在每個(gè)時(shí)間步驟開(kāi)始時(shí)洗牌,所以每個(gè)玩家對(duì)抗兩個(gè)隨機(jī)選擇的玩家。如果你不洗牌會(huì)怎么樣?在這種情況下,每個(gè)智能體都會(huì)反復(fù)與相同的鄰居進(jìn)行比賽。這可能會(huì)讓少數(shù)人的戰(zhàn)略,更容易通過(guò)利用局部性入侵大多數(shù)。 - 由于每個(gè)智能體只與另外兩個(gè)智能體進(jìn)行比賽,因此每輪比賽的結(jié)果都是非常不同的:在任何一輪比賽中,勝過(guò)大部??分智能體的智能體可能會(huì)運(yùn)氣不好,或者相反。如果增加每個(gè)智能體在每輪中的對(duì)手?jǐn)?shù)量會(huì)發(fā)生什么?或者如果在每一步結(jié)束時(shí),智能體的適應(yīng)性是上一輪結(jié)束時(shí)其當(dāng)前得分和適應(yīng)性的平均值,會(huì)怎么樣?
- 我為
prob_survival函數(shù)選擇的值從 0.7 到 0.9 不等,所以適應(yīng)性最差的智能體p = 0.7,生存了 3.33 個(gè)時(shí)間步驟,適應(yīng)性最強(qiáng)的智能體生存了 10 個(gè)。如果你使prob_survival更加或更加不“激進(jìn)”,會(huì)發(fā)生什么情況。 - 我選擇了
num_rounds = 6,以便基因組的每個(gè)元素對(duì)比賽的結(jié)果具有大致相同的影響。 但這比 Alexrod 在他的比賽中使用的值要小得多。 如果增加num_rounds會(huì)發(fā)生什么? 注意:如果你研究這個(gè)參數(shù)的效果,你可能想修改Niceness來(lái)衡量基因組中最后4個(gè)元素的友善度,隨著num_rounds的增加,它會(huì)受到更多的選擇性壓力。 - 我的實(shí)現(xiàn)擁有生存差異和隨機(jī)繁殖。 如果添加繁殖差異會(huì)發(fā)生什么?
練習(xí) 2
在我的模擬中,種群從未收斂到一個(gè)狀態(tài),其中多數(shù)人共享相同的,據(jù)推測(cè)是最佳的基因型。對(duì)于這個(gè)結(jié)果有兩種可能的解釋:一是沒(méi)有最佳策略,因?yàn)闊o(wú)論何時(shí)種群被大多數(shù)基因型控制,這種狀況為少數(shù)人入侵提供了機(jī)會(huì);另一種可能性是,突變率高到足以維持多種基因型,即使多數(shù)是非最佳的。為了辨別這些解釋,請(qǐng)嘗試降低突變率來(lái)查看發(fā)生了什么?;蛘?,從隨機(jī)種群開(kāi)始,并且不帶突變來(lái)運(yùn)行,直到只有一個(gè)基因型存活?;蛘邘蛔儊?lái)運(yùn)行,直到系統(tǒng)達(dá)到穩(wěn)定狀態(tài);然后關(guān)閉突變并運(yùn)行,直到只有一個(gè)幸存的基因型。這些情況下基因型的特征是什么?
練習(xí) 3
我的實(shí)驗(yàn)中的智能體是“反應(yīng)型”的,因?yàn)樗麄冊(cè)诿枯喼械倪x擇只取決于對(duì)手在前幾輪中的做法??紤]探索一些策略,它們也考慮到智能體過(guò)去的選擇。這樣的策略將能夠區(qū)分報(bào)復(fù)性對(duì)手,和沒(méi)有挑釁而背叛的對(duì)手。