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