十一、進(jìn)化
譯者:飛龍
協(xié)議:CC BY-NC-SA 4.0
自豪地采用谷歌翻譯
生物學(xué)乃至整個(gè)科學(xué)最重要的思想,是通過自然選擇的進(jìn)化論宗弯,它聲稱由于自然選擇而創(chuàng)造出新的物種并改變現(xiàn)有的物種。自然選擇是個(gè)體間遺傳差異導(dǎo)致生存和繁殖差異的過程搂妻。
在了解生物學(xué)的人中蒙保,進(jìn)化論被廣泛認(rèn)為是一個(gè)事實(shí),也就是它足以接近事實(shí)欲主,如果將來得到糾正邓厕,糾正將使中心思想基本保持完整。
盡管如此扁瓢,許多人并不相信進(jìn)化論详恼。在皮尤研究中心進(jìn)行的一項(xiàng)調(diào)查中,被調(diào)查者被問到引几,以下哪些斷言更貼近他們的觀點(diǎn):
- 人類和其他生物隨時(shí)間而進(jìn)化昧互。
- 起初,人類和其他生物就以其現(xiàn)在的形式存在。
約有 34% 的美國(guó)人選擇了第二個(gè)(見 http://www.thearda.com/Archive/Files/Codebooks/RELLAND14_CB.asp)敞掘。
即使在那些認(rèn)為生物已經(jīng)進(jìn)化的人中叽掘,只有一半以上的人認(rèn)為進(jìn)化的原因是自然選擇。 換句話說渐逃,只有三分之一的美國(guó)人相信進(jìn)化論是真實(shí)的够掠。
這怎么可能? 在我看來茄菊,促成因素包括:
- 有些人認(rèn)為進(jìn)化論與他們的宗教信仰之間有沖突疯潭。 感覺就像他們不得不拒絕一個(gè),他們拒絕了進(jìn)化論面殖。
- 其他人經(jīng)常被第一組成員積極誤導(dǎo)竖哩,以至于他們對(duì)進(jìn)化論的許多認(rèn)識(shí)都是錯(cuò)誤的。
- 許多人根本就不了解進(jìn)化脊僚。
對(duì)于第一組相叁,我可能沒有太多可以做的事,但我認(rèn)為我可以幫助其他人辽幌。 經(jīng)驗(yàn)上增淹,進(jìn)化論很難讓人理解。 同時(shí)乌企,它非常簡(jiǎn)單:對(duì)很多人來說虑润,一旦他們了解進(jìn)化論,它似乎既明顯又無可辯駁加酵。
為了幫助人們從困惑轉(zhuǎn)變?yōu)榍逦鳎艺业降淖顝?qiáng)大的工具就是計(jì)算。 我們看到猪腕,理論上很難理解的想法冗澈,在模擬中出現(xiàn)時(shí)很容易理解。 這是本章的目標(biāo)陋葡。
本章的代碼位于chap11.ipynb
中亚亲,該書是本書倉庫中的 Jupyter 筆記本。使用此代碼的更多信息腐缤,請(qǐng)參見第朵栖?節(jié)。
11.1 簡(jiǎn)單的進(jìn)化
我將從一個(gè)簡(jiǎn)單的模型開始柴梆,演示一種基本的進(jìn)化形式陨溅。 根據(jù)該理論,以下特征足以產(chǎn)生進(jìn)化:
- 復(fù)制者:我們需要一批能夠以某種方式復(fù)制的智能體绍在。 我們將以復(fù)制者開始门扇,它們生成它們自己的完美的副本雹有。 稍后我們將添加不完美的副本,即突變臼寄。
- 突變:我們還需要一些種群中的變化霸奕,也就是個(gè)體之間的差異。
- 生存和繁殖差異:個(gè)體之間的差異必須影響其生存或繁殖的能力吉拳。
為了模擬這些特征质帅,我們將定義智能體種群,智能體代表個(gè)體留攒。 每個(gè)智能體都有遺傳信息煤惩,稱為基因型,這是智能體繁殖時(shí)復(fù)制的信息炼邀。 在我們的模型中 [1]魄揉,基因型由N
個(gè)二進(jìn)制數(shù)字(零和一)的序列表示,其中N
是我們選擇的參數(shù)拭宁。
[1] 模型是主要由 Stuart Kauffman 開發(fā)的 NK 模型的變體(參見 https://en.wikipedia.org/wiki/NK_model)洛退。
為了產(chǎn)生突變,我們創(chuàng)建了具有多種基因型的種群杰标;稍后我們將探討創(chuàng)造或增加突變的機(jī)制兵怯。
最后,為了產(chǎn)生生存和繁殖差異腔剂,我們定義了一個(gè)函數(shù)摇零,將每個(gè)基因型映射為一個(gè)適應(yīng)度,其中適應(yīng)度是一個(gè)數(shù)量桶蝎,有關(guān)智能體的生存或繁殖能力。
11.2 適應(yīng)性景觀
將基因型映射為適應(yīng)性函數(shù)谅畅,稱為適應(yīng)性景觀登渣。 在景觀的隱喻中,每個(gè)基因型對(duì)應(yīng)于N
維空間中的一個(gè)位置毡泻,并且適應(yīng)性對(duì)應(yīng)于該位置處的景觀的“高度”胜茧。對(duì)于能夠解釋這個(gè)隱喻的可視化,參見 https://en.wikipedia.org/wiki/Fitness_landscape仇味。
在生物學(xué)術(shù)語中呻顽,適應(yīng)性景觀代表一種信息,它是生物體的基因型與其物理形式和能力的關(guān)系丹墨,后者稱為其表現(xiàn)型廊遍,以及表現(xiàn)型如何與其環(huán)境相互作用。
在現(xiàn)實(shí)世界中贩挣,適應(yīng)性景觀很復(fù)雜喉前,但我們不需要建立現(xiàn)實(shí)模型没酣。 為了誘導(dǎo)進(jìn)化,我們需要基因型和適應(yīng)性之間的某種關(guān)系卵迂,但事實(shí)證明它可以是任何關(guān)系裕便。 為了證明它,我們將使用完全隨機(jī)的適應(yīng)性景觀见咒。
這是代表適應(yīng)性景觀的類的定義:
class FitnessLandscape:
def __init__(self, N):
self.N = N
self.one_values = np.random.random(N)
self.zero_values = np.random.random(N)
def fitness(self, loc):
fs = np.where(loc, self.one_values,
self.zero_values)
return fs.mean()
智能體的基因型偿衰,對(duì)應(yīng)其在適應(yīng)性景觀中的位置,由一個(gè) NumPy 的零一數(shù)組來表示改览,稱為loc
下翎。 給定基因型的適應(yīng)性,是N
個(gè)適應(yīng)性貢獻(xiàn)的平均值恃疯,loc
的每個(gè)元素都是一個(gè)漏设。
為了計(jì)算基因型的適應(yīng)性,FitnessLandscape
使用兩個(gè)數(shù)組:one_values
今妄,其中包含loc
的每個(gè)元素都為 1 時(shí)的適應(yīng)性貢獻(xiàn)郑口,以及zero_values
,其中包含為 0 時(shí)的適應(yīng)度貢獻(xiàn)盾鳞。
fitness
方法使用np.where
犬性,如果loc
中的值為 1,它從one_values
中選擇一個(gè)值腾仅,如果loc
中的值為 0乒裆,它從zero_values
中選擇一個(gè)值。
例如推励,假設(shè)N=3
:
one_values = [0.1, 0.2, 0.3]
zero_values = [0.4, 0.7, 0.9]
這種情況下鹤耍,loc = [0, 1, 0]
的適應(yīng)性是[0.4, 0.2, 0.9]
的均值,為 0.5验辞。
11.3 智能體
接下來我們需要智能體稿黄,這是類定義:
class Agent:
def __init__(self, loc, fit_land):
self.loc = loc
self.fit_land = fit_land
self.fitness = fit_land.fitness(self.loc)
def copy(self):
return Agent(self.loc, self.fit_land)
智能體的屬性是:
loc
:智能體在適應(yīng)性景觀中的位置。
fit_land
:FitnessLandscape
對(duì)象的引用跌造。
fitness
:智能體在FitnessLandscape
中的適應(yīng)性杆怕,表示為 0 到 1 之間的數(shù)字。
Agent
的這個(gè)定義提供了一種簡(jiǎn)單的copy
方法壳贪,可以精確復(fù)制基因型陵珍;之后,我們將看到一個(gè)帶有突變的版本违施,但突變對(duì)于進(jìn)化來說不是必需的互纯。
11.4 模擬
現(xiàn)在我們有了智能體和適應(yīng)性景觀,我將定義一個(gè)名為Simulation
的類磕蒲,用于模擬智能體的創(chuàng)建伟姐,繁殖和死亡收苏。 為了避免陷入困境,我將在這里提供一個(gè)簡(jiǎn)化版本的代碼愤兵;你可以在本章的筆記本上看到細(xì)節(jié)鹿霸。
這是Simulation
的定義:
class Simulation:
def __init__(self, fit_land, agents):
self.fit_land = fit_land
self.agents = agents
Simulation
的屬性是:
-
fit_land
:FitnessLandscape
對(duì)象的引用。 -
agents
:Agent
對(duì)象的數(shù)組秆乳。
Simulation
中最重要的函數(shù)是step
懦鼠,它模擬了單個(gè)時(shí)間步驟:
# 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
在每個(gè)時(shí)間步驟中,一些智能體死亡屹堰,一些智能體繁殖肛冶。 step
使用另外三個(gè)方法:
-
get_fitnesses
返回一個(gè)數(shù)組,包含每個(gè)智能體的適應(yīng)性扯键,按照它們?cè)谥悄荏w數(shù)組中出現(xiàn)的順序睦袖。 -
choose_dead
決定哪些智能體在此時(shí)間步中死亡,并返回一個(gè)數(shù)組荣刑,包含死亡智能體的索引馅笙。 -
choose_replacements
決定哪些智能體在此時(shí)間步中繁殖,在每個(gè)智能體上調(diào)用copy
厉亏,并返回一個(gè)新的Agent
對(duì)象的數(shù)組董习。
在這個(gè)版本的模擬中,每個(gè)時(shí)間步中新智能體的數(shù)量等于死亡智能體的數(shù)量爱只,所以活動(dòng)智能體的數(shù)量是恒定的皿淋。
11.5 沒有差異
在我們運(yùn)行模擬之前,我們必須指定choose_dead
和choose_replacements
的行為恬试。 我們將從這些函數(shù)的簡(jiǎn)單版本開始氢伟,它們不依賴于適應(yīng)性:
# class Simulation
def choose_dead(self, fits):
n = len(self.agents)
is_dead = np.random.random(n) < 0.1
index_dead = np.nonzero(is_dead)[0]
return index_dead
def choose_replacements(self, n, fits):
agents = np.random.choice(self.agents, size=n, replace=True)
replacements = [agent.copy() for agent in agents]
return replacements
在choose_dead
中螟够,n
是智能體的數(shù)量矫夯,is_dead
是一個(gè)布爾數(shù)組决帖,對(duì)于此時(shí)間步驟內(nèi)死亡的智能體為True
砸烦。 在這個(gè)版本中频祝,每個(gè)智能體都有相同的死亡概率:0.1绍填。 choose_dead
使用np.nonzero
來查找is_dead
的非零元素的索引(True
被視為非零)喉镰。
在choose_replacements
中乖阵,n
是在此時(shí)間步驟中復(fù)制的智能體數(shù)量宣赔。 它使用np.random.choice
帶替換地選擇n
個(gè)智能體。 然后它在每個(gè)上調(diào)用copy
瞪浸,并返回一個(gè)新的Agent
對(duì)象列表儒将。
這些方法不依賴于適應(yīng)性,所以這種模擬沒有生存或繁殖差異对蒲。 因此钩蚊,我們不應(yīng)期待看到進(jìn)化贡翘。 但是,我們?cè)趺幢鎰e呢砰逻?
11.6 進(jìn)化的證據(jù)
進(jìn)化的最具包容性的定義是鸣驱,種群中基因型分布的變化。 進(jìn)化是一種聚合效應(yīng):換句話說蝠咆,個(gè)體不會(huì)進(jìn)化踊东;但種群會(huì)。
在這個(gè)模擬中刚操,基因型是高維空間中的位置闸翅,因此很難將其分布中的變化可視化。 但是菊霜,如果基因型改變坚冀,我們預(yù)計(jì)它們的適應(yīng)性也會(huì)改變。 所以我們將將適應(yīng)性分布的變化用作進(jìn)化的證據(jù)鉴逞。 具體來說记某,我們將看看種群中適應(yīng)性的均值和標(biāo)準(zhǔn)差。
在我們運(yùn)行模擬之前华蜒,我們必須添加一個(gè)Instrument
辙纬,它是在每個(gè)時(shí)間步驟后更新的對(duì)象,計(jì)算一個(gè)感興趣的統(tǒng)計(jì)量叭喜,并將結(jié)果存儲(chǔ)在一個(gè)序列中贺拣,我們稍后可以繪制它。
這是所有儀器的父類:
class Instrument:
def __init__(self):
self.metrics = []
下面是MeanFitness
的定義捂蕴,MeanFitness
是一個(gè)儀器譬涡,計(jì)算每個(gè)時(shí)間步的種群平均適應(yīng)性:
class MeanFitness(Instrument):
def update(self, sim):
mean = np.nanmean(sim.get_fitnesses())
self.metrics.append(mean)
現(xiàn)在我們準(zhǔn)備好運(yùn)行模擬了。 為了最小化起始種群中隨機(jī)變化的影響啥辨,我們使用同一組智能體啟動(dòng)每個(gè)模擬涡匀。 為了確保我們探索整個(gè)適應(yīng)性景觀,我們由每個(gè)位置的一個(gè)智能體開始溉知。 以下是創(chuàng)建模擬的代碼:
N = 8
fit_land = FitnessLandscape(N)
agents = make_all_agents(fit_land, Agent)
sim = Simulation(fit_land, agents)
make_all_agents
為每個(gè)位置創(chuàng)建一個(gè)智能體陨瘩; 本章的實(shí)現(xiàn)在筆記本中。
現(xiàn)在我們可以創(chuàng)建并添加MeanFitness
儀器级乍,運(yùn)行模擬并繪制結(jié)果:
instrument = MeanFitness()
sim.add_instrument(instrument)
sim.run()
sim.plot(0)
模擬維護(hù)了Instrument
對(duì)象列表舌劳。 在每個(gè)時(shí)間步之后,它在列表中的每個(gè)儀器上調(diào)用update
玫荣。
模擬運(yùn)行后甚淡,我們使用Simulation.plot
繪制結(jié)果,它接受索引作為參數(shù)捅厂,使用索引從列表中選擇一個(gè)Instrument
并繪制結(jié)果贯卦。 在這個(gè)例子中资柔,只有一個(gè)Instrument
,索引為 0撵割。
圖 11.1:隨著時(shí)間的推移贿堰,10 次模擬的平均適應(yīng)性,沒有生存或繁殖差異
圖睁枕?顯示了運(yùn)行這個(gè)模擬 10 次的結(jié)果官边。 種群的平均適應(yīng)性隨機(jī)移動(dòng)。 由于適應(yīng)性的分布隨時(shí)間變化外遇,我們推斷表現(xiàn)型的分布也在變化注簿。 按照最具包容性的定義,這種隨機(jī)游走是一種進(jìn)化跳仿。 但它不是一個(gè)特別有趣的類型诡渴。
特別是,這種進(jìn)化并不能解釋生物物種如何隨時(shí)間變化菲语,或者如何出現(xiàn)新的物種妄辩。 進(jìn)化論是強(qiáng)大的,因?yàn)樗忉屃宋覀冊(cè)谧匀唤缈吹降乃坪鯚o法解釋的現(xiàn)象:
- 適應(yīng)性:物種與其環(huán)境的相互作用似乎太復(fù)雜山上,太巧妙眼耀,并且偶然發(fā)生。 自然系統(tǒng)的許多特征看起來好像是設(shè)計(jì)出來的佩憾。
- 增加的多樣性:地球上的物種數(shù)量隨時(shí)間而普遍增加(盡管有幾個(gè)時(shí)期的大規(guī)模滅絕)哮伟。
- 增加的復(fù)雜性:地球上的生命史起始于相對(duì)簡(jiǎn)單的生命形式,后來在地質(zhì)記錄中出現(xiàn)了更復(fù)雜的生物體妄帘。
這些是我們想要解釋的現(xiàn)象楞黄。 到目前為止,我們的模型并沒有完成這個(gè)任務(wù)抡驼。
11.7 生存差異
讓我們?cè)偬砑右环N成分鬼廓,生存差異。 以下是繼承Simulation
并覆蓋choose_dead
的類的定義:
class SimWithDiffSurvival(Simulation):
def choose_dead(self, fits):
n = len(self.agents)
is_dead = np.random.random(n) > fits
index_dead = np.nonzero(is_dead)[0]
return index_dead
現(xiàn)在生存的概率取決于適應(yīng)性致盟;事實(shí)上碎税,在這個(gè)版本中,智能體在每個(gè)時(shí)間步驟中幸存的概率是其適應(yīng)性馏锡。
由于適應(yīng)性低的智能體更有可能死亡雷蹂,因此適應(yīng)性高的智能體更有可能生存足夠長(zhǎng)的時(shí)間來繁殖。 我們預(yù)計(jì)適應(yīng)性低的智能體的數(shù)量會(huì)隨時(shí)間而減少眷篇,適應(yīng)性高的智能體的數(shù)量會(huì)增加萎河。
圖 11.2:隨著時(shí)間的推移荔泳,10 次模擬中的適應(yīng)性均值蕉饼,帶有生存差異
圖虐杯?顯示了隨著時(shí)間的推移,10 次模擬中的適應(yīng)性均值昧港,帶有生存差異擎椰。 平均適應(yīng)性起初會(huì)迅速增加,但會(huì)逐漸平穩(wěn)创肥。
你或許可以弄清楚為什么它會(huì)平穩(wěn):如果在特定位置只有一個(gè)智能體并且它死了达舒,它就會(huì)使這個(gè)位置變空。沒有突變叹侄,就沒有辦法讓它再次被占領(lǐng)巩搏。
在N = 8
的情況下,該模擬以 256 個(gè)智能體開始趾代,它們占用了所有可能位置贯底。 占用位置的數(shù)量隨時(shí)間而減少;如果模擬運(yùn)行時(shí)間足夠長(zhǎng)撒强,最終所有智能體將占用相同的位置禽捆。
所以這個(gè)模擬開始解釋適應(yīng)性:增加的適應(yīng)性意味著,物種在它的環(huán)境中生存得更好飘哨。 但是占用位置的數(shù)量隨時(shí)間而減少胚想,所以這個(gè)模型根本無法解釋增加的多樣性。
在本章的筆記本中芽隆,你將看到差異化繁殖的效果浊服。 正如你所預(yù)料的那樣,差異化繁殖也會(huì)增加平均適應(yīng)性摆马。但沒有突變臼闻,我們?nèi)匀粵]有看到增加的多樣性。
11.8 突變
在目前的模擬中囤采,我們以可能的最大多樣性開始 - 在景觀的每個(gè)位置都有一個(gè)智能體 - 并以可能的最小多樣性結(jié)束述呐,所有智能體都在一個(gè)位置。
這與自然界發(fā)生的情況幾乎相反蕉毯,它顯然以單個(gè)物種開始乓搬,這種物種隨時(shí)間而分化為今天的地球上數(shù)百萬甚至數(shù)十億物種(見 https://en.wikipedia.org/wiki/Global_biodiversity)。
使用我們模型的完美復(fù)制代虾,我們從未看到增加的多樣性进肯。 但是如果我們加上突變,再加上生存和繁殖差異棉磨,我們距離理解自然界的進(jìn)化就更近了一步江掩。
以下是繼承Agent
并覆蓋copy
的類定義:
class Mutant(Agent):
prob_mutate = 0.05
def copy(self):
if np.random.random() > self.prob_mutate:
loc = self.loc.copy()
else:
direction = np.random.randint(self.fit_land.N)
loc = self.mutate(direction)
return Mutant(loc, self.fit_land)
在這種突變模型中,每次我們調(diào)用copy
時(shí),都有 5% 的突變機(jī)會(huì)环形。 在突變的情況下策泣,我們從當(dāng)前位置選擇一個(gè)隨機(jī)方向 - 即基因型中的一個(gè)隨機(jī)位 - 并翻轉(zhuǎn)它。 這是mutate
:
def mutate(self, direction):
new_loc = self.loc.copy()
new_loc[direction] ^= 1
return new_loc
運(yùn)算符^=
計(jì)算“異或”抬吟;操作數(shù) 1 具有翻轉(zhuǎn)一位的效果(請(qǐng)參閱 https://en.wikipedia.org/wiki/Exclusive_or#Bitwise_operation)萨咕。
現(xiàn)在我們有了突變,我們不必在每個(gè)位置都放置一個(gè)智能體火本。 相反危队,我們可以以最小變化開始:所有智能體在同一位置。
圖 11.3:隨著時(shí)間的推移钙畔,10 次模擬中的適應(yīng)性均值茫陆,帶有突變、生存繁殖差異
圖擎析?顯示了 10 次模擬的結(jié)果盅弛,帶有突變和生存繁殖差異。 在任何情況下叔锐,種群都會(huì)向最大適應(yīng)性的位置進(jìn)化挪鹏。
圖 11.4:隨著時(shí)間的推移,10 次模擬的占用位置的數(shù)量愉烙,帶有突變和生存繁殖差異讨盒。
為了測(cè)量種群的多樣性,我們可以繪制每個(gè)時(shí)間步后占用位置的數(shù)量步责。 圖返顺?展示了結(jié)果。 我們以同一地點(diǎn)的 100 個(gè)智能體開始蔓肯。 隨著突變的發(fā)生遂鹊,占用位置的數(shù)量迅速增加。
當(dāng)智能體發(fā)現(xiàn)適應(yīng)性高的位置時(shí)蔗包,它更有可能生存和繁殖秉扑。 適應(yīng)性較低的位置上的智能體最終消失。 種群在整個(gè)景觀中隨時(shí)間而移動(dòng)调限,直到大多數(shù)智能體處于適合性最高的位置舟陆。
此時(shí),系統(tǒng)達(dá)到平衡耻矮,突變以相同的速率占據(jù)新的位置秦躯,生存差異導(dǎo)致適合性低的位置清空。
平衡中的占用位置的數(shù)量裆装,取決于突變率和生存差異的程度踱承。 在這些模擬中倡缠,任何點(diǎn)處的獨(dú)特占用位置的數(shù)量通常為 10-20。
重要的是要記住茎活,這個(gè)模型中的智能體不會(huì)移動(dòng)毡琉,就像生物體的基因型沒有改變一樣。 當(dāng)智能體死亡時(shí)妙色,它可能會(huì)留下一個(gè)空位。 當(dāng)發(fā)生突變時(shí)慧耍,它可以占據(jù)一個(gè)新的位置身辨。 當(dāng)智能體從某些地方消失并出現(xiàn)在其他地方時(shí),種群會(huì)在景觀中移動(dòng)芍碧,就像生命游戲中的滑翔機(jī)一樣煌珊。 但生命體不會(huì)進(jìn)化;但種群可以泌豆。
11.9 物種形成
進(jìn)化論說定庵,自然選擇改變了現(xiàn)有的物種并創(chuàng)造了新的物種。 在我們的模型中踪危,我們看到了變化蔬浙,但我們并沒有看到新的物種。 在模型中贞远,還不清楚新物種是什么樣畴博。
在有性繁殖的物種中,如果兩種生物能夠繁殖并產(chǎn)生豐富的后代蓝仲,則被視為同一物種俱病。 但是模型中的智能體不會(huì)再現(xiàn)性行為,所以這個(gè)定義不適用袱结。
在無性繁殖的生物中亮隙,如細(xì)菌,物種的定義并不明確垢夹。 一般來說溢吻,如果一個(gè)種群的基因型形成一個(gè)簇,那么它就被認(rèn)為是一個(gè)物種果元,也就是說煤裙,如果種群內(nèi)的遺傳差異比種群間的差異小。
在我們可以對(duì)新物種建模之前噪漾,我們需要能夠識(shí)別景觀中的智能體簇硼砰,這意味著我們需要定義位置之間的距離。 由于位置是用二進(jìn)制數(shù)字串表示的欣硼,因此我們將距離定義為基因型中不同的位數(shù)题翰。 FitnessLandscape
提供了distance
方法:
# class FitnessLandscape
def distance(self, loc1, loc2):
return np.sum(np.logical_xor(loc1, loc2))
圖 11.5:智能體隨時(shí)間變化的平均距離
logical_xor
函數(shù)計(jì)算“異或”,不同的元素為True
,相同的元素為False
豹障。
為了量化種群的分散冯事,我們可以計(jì)算每對(duì)智能體之間距離的平均值。 在本章的筆記本中血公,你會(huì)看到MeanDistance
儀器昵仅,它會(huì)在每個(gè)時(shí)間步驟后計(jì)算這個(gè)度量。
圖累魔? 展示了智能體隨時(shí)間的平均距離摔笤。 因?yàn)槲覀儚南嗤耐蛔冮_始,所以初始距離為 0垦写。隨著突變的發(fā)生吕世,平均距離增加,在種群遍布景觀時(shí)達(dá)到最大值梯投。
一旦智能體發(fā)現(xiàn)最佳位置命辖,平均距離就會(huì)減小,直到種群達(dá)到平衡分蓖,由于突變引起的距離增加通過距離的減小而平衡尔艇,因?yàn)檫h(yuǎn)離最佳位置的智能體更有可能死亡。 在這些模擬中么鹤,平衡時(shí)的平均距離接近 1.5漓帚;也就是說,大多數(shù)智能體距離最佳位置只有 1-2 個(gè)突變午磁。
現(xiàn)在我們準(zhǔn)備尋找新的物種尝抖。 為了模擬一種簡(jiǎn)單的物種形成,假設(shè)一個(gè)種群在不變的環(huán)境中演化迅皇,直到它達(dá)到穩(wěn)定狀態(tài)(就像我們?cè)谧匀唤绨l(fā)現(xiàn)的一些物種昧辽,似乎在很長(zhǎng)一段時(shí)間內(nèi)變化很小)登颓。
現(xiàn)在假設(shè)我們改變環(huán)境搅荞,或者將種群轉(zhuǎn)移到新的環(huán)境中。 一些舊環(huán)境中適應(yīng)性較高的特性框咙,可能會(huì)在新環(huán)境中適應(yīng)性較低咕痛,反之亦然。
我們可以通過運(yùn)行模擬來模擬這些情景喇嘱,直到種群達(dá)到穩(wěn)定狀態(tài)茉贡,然后改變適應(yīng)性景觀,然后恢復(fù)模擬者铜,直到種群再次達(dá)到穩(wěn)定狀態(tài)腔丧。
圖 11.6:隨時(shí)間變化的適應(yīng)性均值放椰。在 500 步之后,我們改變了適應(yīng)性景觀
圖愉粤?展示了這樣的模擬結(jié)果砾医。 再次,我們從隨機(jī)位置開始衣厘,使用 100 個(gè)相同的突變體如蚜,并運(yùn)行 500 個(gè)時(shí)間步驟的模擬。 在這個(gè)時(shí)候影暴,許多智能體處于最佳位置错邦,在這個(gè)例子中,其適應(yīng)性接近 0.65坤检。 智能體的基因型形成一個(gè)簇,智能體之間的平均距離接近 1期吓。
經(jīng)過 500 步之后早歇,我們運(yùn)行FitnessLandscape.set_values
,這改變了適應(yīng)性景觀讨勤; 然后我們恢復(fù)模擬箭跳。 平均適應(yīng)性會(huì)立即下降,因?yàn)榕f景觀中的最佳位置并不比新景觀中的隨機(jī)位置好潭千。
然而谱姓,當(dāng)種群遷移到新景觀時(shí),平均適應(yīng)性會(huì)迅速增加刨晴,最終會(huì)找到新的最佳值屉来,其適應(yīng)度接近 0.75(在這個(gè)例子中恰好更高,但不一定是)狈癞。
一旦種群達(dá)到穩(wěn)定狀態(tài)茄靠,它就會(huì)形成一個(gè)新的簇,智能體之間的平均距離再次接近 1蝶桶。
現(xiàn)在慨绳,如果我們計(jì)算智能體之前和之后的位置之間的距離,平均而言真竖,它們相差超過 6脐雪。 簇之間的距離遠(yuǎn)大于每個(gè)簇內(nèi)的距離,因此我們可以將這些簇解釋為不同的物種恢共。
11.10 總結(jié)
我們已經(jīng)看到战秋,突變以及生存和繁殖差異,足以導(dǎo)致適應(yīng)性的增加讨韭,多樣性的增加获询,并產(chǎn)生簡(jiǎn)單形式的物種涨岁。 這種模型并不是現(xiàn)實(shí)的;自然系統(tǒng)中的進(jìn)化要比這復(fù)雜得多吉嚣。 相反梢薪,它意味著一個(gè)“充足定理”;也就是說尝哆,模型的特征足以產(chǎn)生我們?cè)噲D解釋的行為(參見 https://en.wikipedia.org/wiki/Necessity_and_sufficiency)秉撇。
從邏輯上講,這個(gè)“定理”并不能證明秋泄,自然界中的進(jìn)化僅僅由這些機(jī)制引起琐馆,但是由于這些機(jī)制確實(shí)以多種形式出現(xiàn)在生物系統(tǒng)中,所以認(rèn)為它們至少有助于自然進(jìn)化恒序,是合理的瘦麸。
同樣,該模型并不能證明這些機(jī)制總是會(huì)導(dǎo)致進(jìn)化歧胁。 但是我們?cè)谶@里看到的結(jié)果是可靠的:在幾乎所有包含這些特征的模型中 - 不完美的復(fù)制者滋饲,變異性和繁殖差異 - 發(fā)生了進(jìn)化。
我希望這一觀察有助于揭開進(jìn)化的神秘面紗喊巍。 當(dāng)我們觀察自然系統(tǒng)時(shí)屠缭,進(jìn)化看起來很復(fù)雜。 而且由于我們主要看到了進(jìn)化的結(jié)果崭参,而沒有看到這個(gè)過程呵曹,所以難以想象和相信。
但在模擬中何暮,我們看到整個(gè)過程奄喂,而不僅僅是結(jié)果。 通過包含最少的一系列特征來產(chǎn)生進(jìn)化 - 暫時(shí)忽略了生物生命的巨大復(fù)雜性 - 我們可以將進(jìn)化看作是一個(gè)令人驚訝的簡(jiǎn)單海洼,不可避免的想法砍聊。
11.11 練習(xí)
本章的代碼位于本書倉庫的 Jupyter 筆記本chap11.ipynb
中。 打開筆記本贰军,閱讀代碼并運(yùn)行單元格玻蝌。 筆記本包含本章的練習(xí)。 我的解決方案在chap11soln.ipynb
中词疼。