當前位置:
首頁 > 知識 > 40行Python代碼實現一個簡單的演化過程

40行Python代碼實現一個簡單的演化過程

40行Python代碼實現一個簡單的演化過程

Python部落(python.freelycode.com)組織翻譯,禁止轉載,歡迎轉發。

在納米比亞的 PyCon 會議上,我發表了一篇名為 《使用 Python 解決「升級版的剪刀石頭布」》(Rock, Paper, Scissors, Lizard, Spock with Python )的文章。在這篇文章中,介紹到用Nashpy 來計算兩個玩家的平衡是很簡單的事情,但是其中只是涉及了一點點演化穩定性的內容。 在這篇博文中,我將闡述一下如何在 Python + Numpy 環境下,使用大概 40 行代碼來建立一個簡單的演化過程模型。

我想講的第一個遊戲是「旅行者困境」問題。這裡給出一個簡化的版本:

40行Python代碼實現一個簡單的演化過程

我不想過多的講解這個遊戲的數學模型如何建立。在建模後,我們只需要知道一件事情,那就是我們有兩個玩家:

  1. 行玩家:選擇我們處於哪一行;

  2. 列玩家:選擇我們處於哪一列。

如果,行玩家選擇的是第二行,列玩家選擇的是第三列,則得分為:5,1。即行玩家得 5 分,而列玩家得 1 分。這個時候列玩家可能會傾向於選擇第一列,這樣的話得分就是0,4了。

下面,我們可以使用 Nashpy 來計算這個遊戲的平衡位置。

40行Python代碼實現一個簡單的演化過程

我們可以看到,納什平衡是由兩個向量組成的單個集合,向量表明了玩家應該如何玩這個遊戲:

  1. 行玩家應該按照 [1,0,0] 來玩

  2. 列玩家也應該按照 [1,0,0] 來玩

在這裡,[1,0,0] 是概率向量,表示一個玩家的遊戲策略的概率。所以,在這種情況下,兩位玩家都應該選擇第一個選擇,這樣的話得分為 2,2。這位置稱為納什平衡,因為所有玩家都不能偏離這個點(一旦偏離,就可能得到比別人低的分數)。

我們可以對「升級版的剪刀石頭布」這個遊戲進行同樣的建模,其數學模型如下:

40行Python代碼實現一個簡單的演化過程

接下來,使用如下的程序計算其納什平衡:

40行Python代碼實現一個簡單的演化過程

我們可以看到每個位置都是 1/5 的概率,所以兩位玩家可以隨意的選擇。這完全可以憑藉個人直覺,因為當兩位玩家都這麼做的時候,實際上就是隨機不可預測的。

所有結果都很合理。納什平衡是博弈論中一個很有用且很重要的概念,但是當我們以演化的視角看這些遊戲的時候,會發生什麼呢?

如果我們有一大群人,並且這群人總是會選擇與他們人數相同的多種選擇。他們每個都和另外一大群人玩這個遊戲,如果他們比對手得分要高,他們繼續。反之則他們的對手繼續。

下面是我們使用 Python 和 Numpy 來進行模擬的代碼。

首先,得到一個隨機的人數:

40行Python代碼實現一個簡單的演化過程

然後開始遊戲:

40行Python代碼實現一個簡單的演化過程

接下來進行變化(將那些獲勝的策略進行匯總):

40行Python代碼實現一個簡單的演化過程

最後將上面的這些進行匯總,給定一個遊戲的迭代次數,重複的運行 mutate 函數:

40行Python代碼實現一個簡單的演化過程

下面讓我們看看最後畫出來的曲線圖(點擊這裡下載 Jupyter notebook)

首先我們看看玩「旅行者困境」這個遊戲時會發生什麼(回顧上面講的納什平衡,兩位玩家應該選擇第一種策略):

40行Python代碼實現一個簡單的演化過程

我們可以看到,人群中的玩家很快都選擇了第一種策略。當然這也可能是我們使用了特定的隨機數種子所引起的人為結果。下面的圖片展示了使用不同的隨機數種子所得到的結果圖片。

40行Python代碼實現一個簡單的演化過程

他們的初始條件皆不相同但是結果相同:人群中的人們使用都是納什平衡策略。

接下來的是比較酷的一部分了,讓我們看看在「升級版的剪刀石頭布」的曲線圖中會發生了什麼:

40行Python代碼實現一個簡單的演化過程

我們可以看到結果不是很穩定。下面的圖片顯示了不同隨機數種子的結果:

40行Python代碼實現一個簡單的演化過程

關於兩者穩定性的差異有個直觀的解釋:在「旅行者困境」遊戲中納什平衡策略是非常強的:如果每個人都按照納什平衡來決策,我們就沒法作出改變,我們只能跟別人一樣。在「升級版的剪刀石頭布」遊戲中:如果每個人都是隨機的玩,或者所謂的人群是由玩家或者策略進行隨機的組合,你就很有可能碰見那些戰勝你的人。

從這篇文章中,我們有兩點需要注意:

  1. 這只是使用 Python 模擬一個簡單的演化過程。

  2. 人數的動態變化為這個遊戲添加了一個迷人的維度。我在這裡使用的演化過程非常的簡單,一般情況都是使用馬爾科夫隨機過程來研究這類問題。你也可以使用 Python 的庫來研究這類「囚徒困境」問題,使用的庫的鏈接為: axelrod.readthedocs.io/en/latest/tutorials/getting_started/moran.html

英文原文:http://vknight.org/unpeudemath/mathematics/2017/03/08/simple-evolutionary-process.html
譯者:無

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python部落 的精彩文章:

Python寫的Crontab替代品,支持Docker
Python代碼的性能優化:測試內存消耗
在公司工作兩年以上的員工少賺一半的薪水
月考+Python在嵌入式系統中的崛起
用Python分析購物籃

TAG:Python部落 |

您可能感興趣

Magic Leap 首次對外講述產品演化過程 | GDC 2018
從當年 PPCoin的PoS 模式看 PoS 的演化
Magic Leap 首次對外講述產品演化過程
Science:非洲鼴鼠不怕疼,是演化加了什麼buff?
無線耳機演化新方向 索尼Xperia Ear Duo體驗
2018 春一·演化 NEW
喜加一!太空模擬飛行射擊《演化》Steam免費領
Uber 開源「神經演化」可視化工具 VINE
Uber開源「神經演化」可視化工具VINE
圍繞共生恆星R Aquarii的星雲演化
古代名片,2000年演化簡史
谷歌演化AutoML自動發現神經網路新架構
中國發現1.27億年前迷惑巾幗鳥,或為原始鳥類演化飛行的關鍵
一場跨越300萬年的太空漫遊,一部重構人類文明演化的史詩
MOL摩爾鏈學堂-區塊鏈數字貨幣的前生後世,人類貨幣演化史
世界觀 1-演化的邏輯
第49講:人類文明的階梯與社會演化的階段
天文學家震驚了 通過90TB數據還原140億年宇宙演化史
改寫人類的演化史 以色列發現18萬年前遺骸
單體到微服務是一個演化過程,別在一開始就過度設計