写在前面

创作目的?

将自己求学期间所学所知进行总结;也希望阅读的同学有所收获。

如果对内容有疑惑、发现有错误?

希望在评论区提出,我会及时回复。

希望引用?

若不以盈利为目的,尽情引用;否则请注明出处。

目录

写在前面

1 引言

2 重现论文

3 使用Python进行仿真复现

4 参考文献


1 引言

由于微分方程在数学上优秀的解析性质,基于微分方程的复制动态演化机制是应用最广、研究最多的演化动态,同时在数值仿真上对于微分方程的求解也有易用的工具,如使用Matlab的基于四阶-五阶Runge-Kutta算法的ODE45函数、使用Python的Scipy包中的ode求解包。

但复制动态方程有一个极强的假设:假设个体均匀混合、随机交互,这个假设对于博弈主体间的交互关系考虑的过于理想化,与实际情况差距较大,现实情境中博弈主体间的接触是有限的,有选择的。

因此,主体间的博弈可以看作在特定的拓扑结构的复杂网络上,博弈主体通过互动、学习等非线性作用机制进行博弈(王旭坪等, 2022)。如果将种群中的个体看作点,个体间发生的联系或有可能发生的联系看作连边,种群的组织形式就可以用网络来描述。因此,复杂网络作为研究复杂连接的结构关系及动态变化的工具,学者们将演化博弈放在复杂网络上进行分析。

复杂网络上的演化博弈研究,最早开始于对规则方格网络上的博弈行为的探讨,Nowak和May (1992)首次将囚徒困境博弈引入到空间方格网络,发现合作者会通过聚集来抵御背叛策略的入侵,网络拓扑结构所引起的博弈个体之间的局域相互作用对群体合作行为的积极作用被首次发现,为后续的研究提供了新方法和新思路,后续学者们在不同拓扑结构的网络上应用不同的策略学习和更新规则、博弈模型开展了研究。

相较于演化博弈论依靠演化动态刻画博弈主体的策略更新,网络上的演化博弈需要相应的机制模拟博弈主体选择邻居、收益对比和更新决策的过程,目前学者们广泛应用这四种学习机制
(1)模仿最优机制:博弈主体选择上一轮博弈中收益最大的邻居的策略作为自身下一轮参与博弈时采取的策略;
(2)模仿优胜机制:博弈主体选取上一轮博弈中比自身收益大的邻居,以正比于这部分邻居的收益的概率选择相应策略作为自身下一轮参与博弈时采取的策略;
(3)配对比较:博弈主体随机选择某个邻居进行收益比较,以一定概率选择该邻居策略作为自身下一轮参与博弈时采取的策略;
(4)随机Moran过程:在每一个时间步,按群体中正比于个体的适应度的概率选择个体,此个体按照相应规则繁殖一个后代,以该后代随机替换一个邻居。
在实际问题中,学者们根据个体情形,如不完全信息、记忆能力等因素,不断提出新的学习机制。

复杂网络上演化博弈的基本过程如下:在每一个时间步,网络上的所有个体和自身邻居进行交互,并累积交互中所获得的收益,个体的收益函数经某种关系转化为适应度函数,个体根据适应度进行策略更新。基于此,复杂网络上的演化博弈研究的基本研究思路可以归纳为:(1)用博弈模型描述博弈参与个体的博弈情境;(2)用复杂网络模型刻画博弈个体之间的相互作用关系;(3)基于有限理性假设,初始时博弈个体随机选取策略空间中的一个博弈策略,在之后的博弈过程中,博弈个体根据某种策略更新规则进行策略更新,随着演化的不断进行,系统最终进入稳态。

2 重现论文

以一篇应用复杂网络演化博弈的论文为例:

王璐,马庆庆,杨劼等.基于复杂网络演化博弈的绿色消费者对新能源汽车扩散的影响研究[J].中国管理科学,2022,30(04):74-85.DOI:10.16381/j.cnki.issn1003-207x.2020.1508.

论文下载可前往《演化博弈的Python实现》专栏复现论文辑录

3 使用Python进行仿真复现

(很抱歉选择复现了一篇自己并没太搞懂的论文,这篇论文的参数赋值、学习规则让人迷惑,始终没能完美复现,在此仅展示模型相应赋值下的仿真代码和结果)

import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
import math
import decimaldecimal.getcontext().prec = 50  # 设置计算精度,防止计算溢出# 参数初始值设定(论文并未系统整理参数赋值,本人也并没有认真学习,可根据自己的演化博弈模型赋值)
n, d, p, pnev, picev, cnev, cicev, I, g, s, f, beta, Q, k, alpha = 250, 4, 0.3, 26, 20, 23, 18, 1000, 5, 0.4, 0.0093, 0.2333, 1800000, 0.1, 0.2
iteration_times = 30  # 迭代周期
seed = 10  # 定义随机种子# 定义一个函数,对网络中agent寻找其邻居存储在list中
def find_neighbor(agent, edges_list):agent_neighbor = []for a in range(len(edges_list)):if edges_list[a][0] == agent:agent_neighbor.append(edges_list[a][1])elif edges_list[a][1] == agent:agent_neighbor.append(edges_list[a][0])else:passreturn agent_neighbor# 初始化复杂网络,应用了networkx包,也可以自行构建网络
enterprise_network = nx.barabasi_albert_graph(n, d, seed)
enterprise_nodes = np.array(list(enterprise_network.nodes), ndmin=1) + 1  # 节点列表,即[1, 2, ..., 257]
enterprise_edges = np.array(enterprise_network.edges, ndmin=2) + 1  # 节点间的连边列表# 初始化企业初始策略, (1, 0)为生产新能源汽车, (0, 1)为生产传统燃油汽车
enterprise_strategy_t0 = []
for i in range(len(enterprise_nodes)):if np.random.rand(1) <= alpha:  # alpha为初始新能源汽车生产企业比例enterprise_strategy_t0.append((1, 0))else:enterprise_strategy_t0.append((0, 1))# 开始博弈,博弈次数为times
times = 20
for time in range(times):enterprise_strategy = enterprise_strategy_t0[:]t = []t0 = []nev_enterprise_num_changelog = [0 for item in range(iteration_times)]nev_avg_payoff_changelog = [0 for item in range(iteration_times)]tfv_avg_payoff_changelog = [0 for item in range(iteration_times)]for i in range(iteration_times):t.append(i)t0.append(i + 1)# 计算该博弈周期开始时新能源汽车生产企业数量nev_enterprise_num = 0for e in range(len(enterprise_nodes)):if enterprise_strategy[e] == (1, 0):nev_enterprise_num = nev_enterprise_num + 1else:passnev_enterprise_num_changelog[i] = nev_enterprise_num_changelog[i] + nev_enterprise_num# 对每个企业e,先统计企业e的邻居企业中生产新能源汽车和传统燃油汽车的企业数量,再计算企业e在本次博弈中的收益enterprise_payoff = []for e in range(len(enterprise_nodes)):e_neighbor = find_neighbor(e + 1, enterprise_edges)  # 企业h的邻居e_neighbor_num = len(e_neighbor)  # 企业h的度e_nev_neighbor_num = 0e_tfv_neighbor_num = 0e_payoff = 0for l in range(len(e_neighbor)):if enterprise_strategy[e_neighbor[l] - 1] == (1, 0):e_nev_neighbor_num = e_nev_neighbor_num + 1else:e_tfv_neighbor_num = e_tfv_neighbor_num + 1if enterprise_strategy[e] == (1, 0):e_payoff = beta * (e_nev_neighbor_num * ((pnev - cnev + g * s) * Q / n - I) + e_tfv_neighbor_num * (((pnev - cnev + g * s) * Q / nev_enterprise_num - I))) / e_neighbor_num - (1 - beta) * Ielse:e_payoff = (e_nev_neighbor_num * ((picev - cicev - f) * Q / (n - nev_enterprise_num)) + e_tfv_neighbor_num * ((picev - cicev - f) * Q / n)) * (1 - beta) / e_neighbor_numenterprise_payoff.append(e_payoff)# 采取不同策略的企业的平均收益nev_avg_payoff = 0tfv_avg_payoff = 0for e in range(len(enterprise_nodes)):if enterprise_strategy[e] == (1, 0):nev_avg_payoff = nev_avg_payoff + enterprise_payoff[e] / nev_enterprise_numelse:tfv_avg_payoff = tfv_avg_payoff + enterprise_payoff[e] / (n - nev_enterprise_num)nev_avg_payoff_changelog[i] = nev_avg_payoff_changelog[i] + nev_avg_payofftfv_avg_payoff_changelog[i] = tfv_avg_payoff_changelog[i] + tfv_avg_payoff# 企业j的策略学习和策略更新for j in range(len(enterprise_nodes)):# 企业按相应概率挑选学习企业,这篇论文并没有注明邻居选取规则(可能是我读的太粗了,说实话基础博弈模型我也没看懂),代码按照以正比于度值的概率进行仿真j_neighbor = find_neighbor(j + 1, enterprise_edges)j_neighbor_neighbor_num = []for a in range(len(j_neighbor)):j_neighbor_neighbor_num.append(len(find_neighbor(j_neighbor[a], enterprise_edges)))j_neighbor_neighbor_sum = sum(j_neighbor_neighbor_num)choose_prob = 0k1 = 0choose_neighbor = 0l1 = np.random.rand(1)while choose_prob <= l1:choose_neighbor = j_neighbor[k1]choose_prob = choose_prob + j_neighbor_neighbor_num[k1] / j_neighbor_neighbor_sumk1 = k1 + 1# 进行收益比较和策略更新决策if enterprise_strategy[j] == enterprise_strategy[choose_neighbor - 1]:passelse:j_payoff = enterprise_payoff[j]choose_neighbor_payoff = enterprise_payoff[choose_neighbor - 1]ecp = (j_payoff - choose_neighbor_payoff) / kecp = np.sum(ecp)enterprise_change_prob = 1 / (1 + decimal.Decimal(math.e) ** decimal.Decimal(ecp))m = np.random.rand(1)if m <= enterprise_change_prob:enterprise_strategy[j] = enterprise_strategy[choose_neighbor - 1]else:passprint("第", time + 1, "轮结束")
# nev企业数量图
nev_enterprise_num_changelog = [item / times for item in nev_enterprise_num_changelog]
plt.subplot(2, 2, 1)
plt.plot(t, nev_enterprise_num_changelog, 'k-')
plt.xlabel('t')
plt.ylabel('NEV Enterprise Number')
plt.grid()
plt.ylim(0, 250)
x_ticks = np.arange(0, 31, 5)
plt.xticks(x_ticks)
# 收益图
nev_avg_payoff_changelog = [item / times for item in nev_avg_payoff_changelog]
tfv_avg_payoff_changelog = [item / times for item in tfv_avg_payoff_changelog]
plt.subplot(2, 2, 3)
plt.plot(t0, nev_avg_payoff_changelog, color='black', linestyle='-', label='NEV')
plt.plot(t0, tfv_avg_payoff_changelog, color='black', linestyle='--', label='TFV')
plt.xlabel('t')
plt.ylabel('Average Payoff')
plt.grid()
plt.legend()
x_ticks = np.arange(0, 31, 5)
plt.xticks(x_ticks)
plt.show()

结果预览:

4 参考文献

  1. 王旭坪, 马睿泽, 阮俊虎, 等. 区块链环境下农户和合作社上链行为网络演化博弈[J]. 管理工程学报, 2022. 36(3): 225-235.
  2. Nowak Martin, Robert May. 1992. Evolutionary games and spatial chaos [J] . Nature, 359: 826-829.

演化博弈的Python实现:基础篇2 基于复杂网络的演化博弈相关推荐

  1. 演化博弈的Python实现:基础篇3 基于双层网络的演化博弈

    写在前面 创作目的? 将自己求学期间所学所知进行总结:也希望阅读的同学有所收获. 如果对内容有疑惑.发现有错误? 希望在评论区提出,我会及时回复. 希望引用? 若不以盈利为目的,尽情引用:否则请注明出 ...

  2. 演化博弈的Python实现:基础篇1 基于复制动态的演化博弈

    写在前面 创作目的? 将自己求学期间所学所知进行总结:也希望阅读的同学有所收获. 如果对内容有疑惑.发现有错误? 希望在评论区提出,我会及时回复. 希望引用? 若不以盈利为目的,尽情引用:否则请注明出 ...

  3. 【目录】Python 入门基础篇 <(^-^)>

    Python 入门基础篇 一.关于Python的介绍与准备工作 Python基础介绍 Jupyter notebook基础介绍 Jupyter notebook打开问题 Jupyter noteboo ...

  4. 从零开始学 Python 之基础篇

    从零开始学 Python 之基础篇 前言 大家好,这里是「痴海」从零开始学习 Python 系列教程.此文首发于「痴海」公众号,欢迎大家去关注.学习一门语言最好的办法,就是教懂别人.在这公众号,我会从 ...

  5. Python机器学习基础篇三《无监督学习与预处理》

    前言 前期回顾: Python机器学习基础篇二<为什么用Python进行机器学习> 上面这篇里面写了文本和序列相关. 我们要讨论的第二种机器学习算法是无监督学习算法.无监督学习包括没有已知 ...

  6. Python入门基础篇 No.8 —— 时间的表示_unix时间点_毫秒_time模块

    Python入门基础篇 No.8 -- 时间的表示_unix时间点_毫秒_time模块 文章目录 Python入门基础篇 No.8 -- 时间的表示_unix时间点_毫秒_time模块 前言 一.时间 ...

  7. Python机器学习基础篇二《监督学习》

    前言 前期回顾: Python机器学习基础篇一<为什么用Python进行机器学习> 前面说过,监督学习是最常用也是最成功的机器学习类型之一.本章将会详细介绍监督学 习,并解释几种常用的监督 ...

  8. “笨办法”学Python 3基础篇-文件操作

    "笨办法"学Python 3基础篇系列文章 "笨办法"学Python 3基础篇 第一部分-打印与输入 "笨办法"学Python 3基础篇 第 ...

  9. python 动态执行条件判断_【人生苦短,我学 Python】基础篇——条件判断与循环语句(Day12)_不积跬步,无以至千里!-CSDN博客...

    原文作者:AI 菌 原文标题:[人生苦短,我学 Python]基础篇--条件判断与循环语句(Day12) 发布时间:2021-02-08 23:17:06 写在前面:大家好!我是[AI 菌],一枚爱弹 ...

最新文章

  1. guice google_与Google Guice的动手实践
  2. Ubuntu环境下TensorFlow 的环境搭建(一)安装Anaconda
  3. wdcp 安装php_zip扩展
  4. jquery 源码分析九 - Sizzle
  5. elasticsearch分析系列
  6. 图像检索:再叙ANN Search
  7. AS打开速度慢,AS项目导入慢,新建项目导入慢
  8. 【pycharm使用指南】pycharm 取消连按两下shift出现的全局搜索 | pycharm误触出搜索弹窗
  9. 已知ABAP tcode,需要查找assign了该tcode的PFCG role
  10. php中对象的遍历输出,PHP中的对象遍历技巧
  11. java对象和字符串转换_java中字符串和JSON对象、Bean之间的相互转换
  12. vue怎么自己创建组件并引用_如何在组件库项目内直接引用vue-cli生成的组件库文件...
  13. java 斗地主_java 斗地主
  14. 如何用WGDI进行共线性分析(上)
  15. Devcpp、Codeblocks如何设置支持c++11
  16. 【SpringBoot】tk.mybatis集成,帮你更加傻瓜式的写代码~
  17. power automate desktop字符串处理
  18. 计算机毕业论文系统架构,基于B/S架构的毕业论文管理系统的设计与实现
  19. java正则校验-密码至少要由包括大小写字母、数字、标点符号的其中两项,共计8-16位编码组成
  20. 不能再让服务这么任性的被访问啦---分布式服务熔断降级限流利器至Hystrix

热门文章

  1. 破解学习笔记-----不脱壳破解
  2. ZigBee技术简述及与Wifi的比较
  3. android app在线商城,ECMobile:只需一步即可生成iOS或Android原生APP商城应用
  4. 一些改变世界的编程高手
  5. python基础语法—day15(笔记)
  6. 有用的win7快捷键
  7. Delphi多线程编程基础入门
  8. VC++6.0 MFC COleDateTime 格式化
  9. 服务器BIOS装光盘装系统设置,如何用光盘启动安装系统---BIOS设置
  10. iOS 高仿爱鲜蜂APP