python博弈论代码_使用 40 多行的 Python 代码实现一个简单的演化过程
Python部落(python.freelycode.com)組織翻譯,禁止轉(zhuǎn)載,歡迎轉(zhuǎn)發(fā)。
在納米比亞的 PyCon 會(huì)議上,我發(fā)表了一篇名為 《使用 Python 解決“升級(jí)版的剪刀石頭布”》(Rock, Paper, Scissors, Lizard, Spock with Python )的文章。在這篇文章中,介紹到用Nashpy 來(lái)計(jì)算兩個(gè)玩家的平衡是很簡(jiǎn)單的事情,但是其中只是涉及了一點(diǎn)點(diǎn)演化穩(wěn)定性的內(nèi)容。 在這篇博文中,我將闡述一下如何在 Python + Numpy 環(huán)境下,使用大概 40 行代碼來(lái)建立一個(gè)簡(jiǎn)單的演化過(guò)程模型。
我想講的第一個(gè)游戲是“旅行者困境”問(wèn)題。這里給出一個(gè)簡(jiǎn)化的版本:
我不想過(guò)多的講解這個(gè)游戲的數(shù)學(xué)模型如何建立。在建模后,我們只需要知道一件事情,那就是我們有兩個(gè)玩家:
行玩家:選擇我們處于哪一行;
列玩家:選擇我們處于哪一列。
如果,行玩家選擇的是第二行,列玩家選擇的是第三列,則得分為:5,1。即行玩家得 5 分,而列玩家得 1 分。這個(gè)時(shí)候列玩家可能會(huì)傾向于選擇第一列,這樣的話(huà)得分就是 0,4 了。
下面,我們可以使用 Nashpy 來(lái)計(jì)算這個(gè)游戲的平衡位置。
我們可以看到,納什平衡是由兩個(gè)向量組成的單個(gè)集合,向量表明了玩家應(yīng)該如何玩這個(gè)游戲:
行玩家應(yīng)該按照 [1,0,0] 來(lái)玩
列玩家也應(yīng)該按照 [1,0,0] 來(lái)玩
在這里,[1,0,0] 是概率向量,表示一個(gè)玩家的游戲策略的概率。所以,在這種情況下,兩位玩家都應(yīng)該選擇第一個(gè)選擇,這樣的話(huà)得分為 2,2。這位置稱(chēng)為納什平衡,因?yàn)樗型婕叶疾荒芷x這個(gè)點(diǎn)(一旦偏離,就可能得到比別人低的分?jǐn)?shù))。
我們可以對(duì)“升級(jí)版的剪刀石頭布”這個(gè)游戲進(jìn)行同樣的建模,其數(shù)學(xué)模型如下:
接下來(lái),使用如下的程序計(jì)算其納什平衡:
我們可以看到每個(gè)位置都是 1/5 的概率,所以?xún)晌煌婕铱梢噪S意的選擇。這完全可以憑借個(gè)人直覺(jué),因?yàn)楫?dāng)兩位玩家都這么做的時(shí)候,實(shí)際上就是隨機(jī)不可預(yù)測(cè)的。
所有結(jié)果都很合理。納什平衡是博弈論中一個(gè)很有用且很重要的概念,但是當(dāng)我們以演化的視角看這些游戲的時(shí)候,會(huì)發(fā)生什么呢?
如果我們有一大群人,并且這群人總是會(huì)選擇與他們?nèi)藬?shù)相同的多種選擇。他們每個(gè)都和另外一大群人玩這個(gè)游戲,如果他們比對(duì)手得分要高,他們繼續(xù)。反之則他們的對(duì)手繼續(xù)。
下面是我們使用 Python 和 Numpy 來(lái)進(jìn)行模擬的代碼。
首先,得到一個(gè)隨機(jī)的人數(shù):
然后開(kāi)始游戲:
接下來(lái)進(jìn)行變化(將那些獲勝的策略進(jìn)行匯總):
最后將上面的這些進(jìn)行匯總,給定一個(gè)游戲的迭代次數(shù),重復(fù)的運(yùn)行 mutate 函數(shù):
下面讓我們看看最后畫(huà)出來(lái)的曲線(xiàn)圖(點(diǎn)擊這里下載?Jupyter notebook):
首先我們看看玩“旅行者困境”這個(gè)游戲時(shí)會(huì)發(fā)生什么(回顧上面講的納什平衡,兩位玩家應(yīng)該選擇第一種策略):
我們可以看到,人群中的玩家很快都選擇了第一種策略。當(dāng)然這也可能是我們使用了特定的隨機(jī)數(shù)種子所引起的人為結(jié)果。下面的圖片展示了使用不同的隨機(jī)數(shù)種子所得到的結(jié)果圖片。
他們的初始條件皆不相同但是結(jié)果相同:人群中的人們使用都是納什平衡策略。
接下來(lái)的是比較酷的一部分了,讓我們看看在“升級(jí)版的剪刀石頭布”的曲線(xiàn)圖中會(huì)發(fā)生了什么:
我們可以看到結(jié)果不是很穩(wěn)定。下面的圖片顯示了不同隨機(jī)數(shù)種子的結(jié)果:
關(guān)于兩者穩(wěn)定性的差異有個(gè)直觀的解釋:在“旅行者困境”游戲中納什平衡策略是非常強(qiáng)的:如果每個(gè)人都按照納什平衡來(lái)決策,我們就沒(méi)法作出改變,我們只能跟別人一樣。在“升級(jí)版的剪刀石頭布”游戲中:如果每個(gè)人都是隨機(jī)的玩,或者所謂的人群是由玩家或者策略進(jìn)行隨機(jī)的組合,你就很有可能碰見(jiàn)那些戰(zhàn)勝你的人。
從這篇文章中,我們有兩點(diǎn)需要注意:
這只是使用 Python 模擬一個(gè)簡(jiǎn)單的演化過(guò)程。
人數(shù)的動(dòng)態(tài)變化為這個(gè)游戲添加了一個(gè)迷人的維度。我在這里使用的演化過(guò)程非常的簡(jiǎn)單,一般情況都是使用馬爾科夫隨機(jī)過(guò)程來(lái)研究這類(lèi)問(wèn)題。你也可以使用 Python 的庫(kù)來(lái)研究這類(lèi)“囚徒困境”問(wèn)題,使用的庫(kù)的鏈接為:?axelrod.readthedocs.io/en/latest/tutorials/getting_started/moran.html
英文原文:http://vknight.org/unpeudemath/mathematics/2017/03/08/simple-evolutionary-process.html
譯者:無(wú)
總結(jié)
以上是生活随笔為你收集整理的python博弈论代码_使用 40 多行的 Python 代码实现一个简单的演化过程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 等式成立JAVA_java – 找到两个
- 下一篇: Centos7安装Python3.7