40行Python代码实现“旅行者困境“演化过程!

在纳米比亚的 PyCon 会议上,我发表了一篇名为 《使用 Python 解决升级版的剪刀石头布”》(Rock,Paper,Scissors,Lizard,Spock with Python )的文章在这文章中,介绍到用Nashpy 来计算两个玩家的平衡是很简单的事情,但是其中只是涉及了一点点演化稳定性的内容在这篇博文中,我将阐述一下如何在 Python + Numpy 环境下,使用大概 40 行代码来建立一个简单的演化过程模型。

我想讲的第一个游戏是“旅行者困境”问题。这里给出一个简化的版本:

40行Python代码实现“旅行者困境“演化过程!

进群:548377875   即可获取数十套PDF哦!

我不想过多的讲解这个游戏的数学模型如何建立。在建模后,我们只需要知道一件事情,那就是我们有两个玩家:

  1. 行玩家:选择我们处于哪一行;
  2. 列玩家:选择我们处于哪一列。

如果,行玩家选择的是第二行,列玩家选择的是第三列,则得分为: 5,1。即行玩家得 5 分,而列玩家得 1 分。这个时候列玩家可能会倾向于选择第一列,这样的话得分就是 0,4 了。

下面,我们可以使用 Nashpy 来计算这个游戏的平衡位置。

40行Python代码实现“旅行者困境“演化过程!

我们可以看到,纳什平衡是由两个向量组成的单个集合,向量表明了玩家应该如何玩这个游戏:

  1. 行玩家应该按照 [1,0] 来玩
  2. 列玩家也应该按照 [1,0] 来玩

在这里,[1,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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


我最近重新拾起了计算机视觉,借助Python的opencv还有face_recognition库写了个简单的图像识别demo,额外定制了一些内容,原本想打包成exe然后发给朋友,不过在这当中遇到了许多小问题,都解决了,记录一下踩过的坑。 1、Pyinstaller打包过程当中出现warning,跟d
说到Pooling,相信学习过CNN的朋友们都不会感到陌生。Pooling在中文当中的意思是“池化”,在神经网络当中非常常见,通常用的比较多的一种是Max Pooling,具体操作如下图: 结合图像理解,相信你也会大概明白其中的本意。不过Pooling并不是只可以选取2x2的窗口大小,即便是3x3,
记得大一学Python的时候,有一个题目是判断一个数是否是复数。当时觉得比较复杂不好写,就琢磨了一个偷懒的好办法,用异常处理的手段便可以大大程度帮助你简短代码(偷懒)。以下是判断整数和复数的两段小代码: 相信看到这里,你也有所顿悟,能拓展出更多有意思的方法~
文章目录 3 直方图Histogramplot1. 基本直方图的绘制 Basic histogram2. 数据分布与密度信息显示 Control rug and density on seaborn histogram3. 带箱形图的直方图 Histogram with a boxplot on t
文章目录 5 小提琴图Violinplot1. 基础小提琴图绘制 Basic violinplot2. 小提琴图样式自定义 Custom seaborn violinplot3. 小提琴图颜色自定义 Control color of seaborn violinplot4. 分组小提琴图 Group
文章目录 4 核密度图Densityplot1. 基础核密度图绘制 Basic density plot2. 核密度图的区间控制 Control bandwidth of density plot3. 多个变量的核密度图绘制 Density plot of several variables4. 边
首先 import tensorflow as tf tf.argmax(tenso,n)函数会返回tensor中参数指定的维度中的最大值的索引或者向量。当tensor为矩阵返回向量,tensor为向量返回索引号。其中n表示具体参数的维度。 以实际例子为说明: import tensorflow a
seaborn学习笔记章节 seaborn是一个基于matplotlib的Python数据可视化库。seaborn是matplotlib的高级封装,可以绘制有吸引力且信息丰富的统计图形。相对于matplotlib,seaborn语法更简洁,两者关系类似于numpy和pandas之间的关系,seabo
Python ConfigParser教程显示了如何使用ConfigParser在Python中使用配置文件。 文章目录 1 介绍1.1 Python ConfigParser读取文件1.2 Python ConfigParser中的节1.3 Python ConfigParser从字符串中读取数据
1. 处理Excel 电子表格笔记(第12章)(代码下载) 本文主要介绍openpyxl 的2.5.12版处理excel电子表格,原书是2.1.4 版,OpenPyXL 团队会经常发布新版本。不过不用担心,新版本应该在相当长的时间内向后兼容。如果你有新版本,想看看它提供了什么新功能,可以查看Open
1. 发送电子邮件和短信笔记(第16章)(代码下载) 1.1 发送电子邮件 简单邮件传输协议(SMTP)是用于发送电子邮件的协议。SMTP 规定电子邮件应该如何格式化、加密、在邮件服务器之间传递,以及在你点击发送后,计算机要处理的所有其他细节。。但是,你并不需要知道这些技术细节,因为Python 的
文章目录 12 绘图实例(4) Drawing example(4)1. Scatterplot with varying point sizes and hues(relplot)2. Scatterplot with categorical variables(swarmplot)3. Scat
文章目录 10 绘图实例(2) Drawing example(2)1. Grouped violinplots with split violins(violinplot)2. Annotated heatmaps(heatmap)3. Hexbin plot with marginal dist
文章目录 9 绘图实例(1) Drawing example(1)1. Anscombe’s quartet(lmplot)2. Color palette choices(barplot)3. Different cubehelix palettes(kdeplot)4. Distribution
Python装饰器教程展示了如何在Python中使用装饰器基本功能。 文章目录 1 使用教程1.1 Python装饰器简单示例1.2 带@符号的Python装饰器1.3 用参数修饰函数1.4 Python装饰器修改数据1.5 Python多层装饰器1.6 Python装饰器计时示例 2 参考 1 使
1. 用GUI 自动化控制键盘和鼠标第18章 (代码下载) pyautogui模块可以向Windows、OS X 和Linux 发送虚拟按键和鼠标点击。根据使用的操作系统,在安装pyautogui之前,可能需要安装一些其他模块。 Windows: 不需要安装其他模块。OS X: sudo pip3
文章目录 生成文件目录结构多图合并找出文件夹中相似图像 生成文件目录结构 生成文件夹或文件的目录结构,并保存结果。可选是否滤除目录,特定文件以及可以设定最大查找文件结构深度。效果如下: root:[z:/] |--a.py |--image | |--cat1.jpg | |--cat2.jpg |
文章目录 VENN DIAGRAM(维恩图)1. 具有2个分组的基本的维恩图 Venn diagram with 2 groups2. 具有3个组的基本维恩图 Venn diagram with 3 groups3. 自定义维恩图 Custom Venn diagram4. 精致的维恩图 Elabo
mxnet60分钟入门Gluon教程代码下载,适合做过深度学习的人使用。入门教程地址: https://beta.mxnet.io/guide/getting-started/crash-course/index.html mxnet安装方法:pip install mxnet 1 在mxnet中使
文章目录 1 安装2 快速入门2.1 基本用法2.2 输出图像格式2.3 图像style设置2.4 属性2.5 子图和聚类 3 实例4 如何进一步使用python graphviz Graphviz是一款能够自动排版的流程图绘图软件。python graphviz则是graphviz的python实