基于Python实现计算纳什均衡的示例详解
作者:梦想橡皮擦 发布时间:2022-03-03 12:44:27
标签:Python,纳什均衡
纳什均衡是一种博弈论中的概念,它描述了一种平衡状态,其中每个参与者都不能通过独立改变其决策来提高自己的利益。
在 Python 中,可以使用一些第三方库,例如 Gambit 或 Nashpy,来计算纳什均衡。
Nashpy 库计算两个参与者的纳什均衡
注意安装 nashpy 库。
import nashpy as nash
import numpy as np
A = np.array([[1, -1], [-1, 1]])
game = nash.Game(A)
equilibrium = game.vertex_enumeration()
print("纳什均衡是: ", next(equilibrium))
在上述代码中,先导入了 nashpy 库,并使用其中的 Game() 函数创建一个游戏。
然后,使用 vertex_enumeration() 方法找到纳什均衡,并使用 next() 函数从生成器中提取第一个均衡。
手动计算纳什均衡
下面是使用原生 Python 手动计算纳什均衡的代码示例:
import numpy as np
from scipy.optimize import linprog
def nash_equilibrium(payoff_matrix_a, payoff_matrix_b):
"""
计算二人非合作博弈的纳什均衡。
"""
num_actions_a = payoff_matrix_a.shape[1]
num_actions_b = payoff_matrix_b.shape[1]
# 定义优化问题
c = -np.ones(num_actions_a + num_actions_b)
A = np.zeros((num_actions_b, num_actions_a + num_actions_b))
for j in range(num_actions_b):
A[j, :num_actions_a] = -payoff_matrix_b[:, j]
A[j, num_actions_a:] = np.ones(num_actions_b)
b = np.zeros(num_actions_b)
bounds = [(0, None) for _ in range(num_actions_a + num_actions_b)]
# 解决优化问题
res = linprog(c, A_ub=A, b_ub=b, bounds=bounds, method='simplex')
# 提取混合策略
mixed_strategy_a = res.x[:num_actions_a]
mixed_strategy_b = res.x[num_actions_a:]
return mixed_strategy_a, mixed_strategy_b
payoff_matrix_a = np.array([[1, 5], [0, 5]])
payoff_matrix_b = np.array([[3, 7], [2, 3]])
mixed_strategy_a, mixed_strategy_b = nash_equilibrium(payoff_matrix_a, payoff_matrix_b)
print("混合策略 A:", mixed_strategy_a)
print("混合策略 B:", mixed_strategy_b)
该代码仅适用于 2 名玩家的博弈,如果您需要计算多名玩家的博弈,则需要进行一些修改。
代码运行结果如下。
上述代码使用 scipy 库的 linprog() 函数来解决博弈矩阵。它将约束条件和目标函数作为输入,返回纳什均衡策略。
使用了 PuLP 库计算纳什均衡
下面是简单的代码实现:
from pulp import *
# 创建一个线性规划模型
prob = LpProblem("纳什均衡", LpMaximize)
# 创建玩家1的策略变量
p1 = LpVariable("p1", 0, 1)
# 创建玩家2的策略变量
p2 = LpVariable("p2", 0, 1)
# 设置目标函数
prob += 5 * p1 + 4 * p2, "Total Utility"
# 设置约束条件
prob += p1 + 2 * p2 <= 1, "玩家 1 约束条件"
prob += 3 * p1 + 2 * p2 <= 2, "玩家 2 约束条件"
# 解决问题
prob.solve()
# 输出结果
print("玩家1策略: ", value(p1))
print("玩家2策略: ", value(p2))
以上方法是通过线性规划计算纳什均衡的方法,学习的时候可以自行设置约束条件。
来源:https://blog.csdn.net/hihell/article/details/128892402
0
投稿
猜你喜欢
- 做教育业的网站,会将此遇到这个问题:如何在网页上显示音标?音标为什么显示为乱字符?等等类似的问题。前两天做沪江网某英语页面的时候也碰到了这个
- WebSocket 是什么?摘抄网上的一些解释:WebSocket 协议是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工(f
- 前段时间我通过观察韩国网站和其他作品发现了普遍存在黄金分割这样一个规律,不过只跟色相有关,明度、纯度还没做研究,今天看到论坛一篇“网页配色之
- 前言pydub是Python中用户处理音频文件的一个库。本文主要介绍了关于Python音频处理库pydub使用的相关内容,分享出来供大家参考
- Python中yaml文件的读写(使用PyYAML库)。最近在搭建自动化测试项目过程中经常遇到yaml文件的读写,为了方便后续使用,决定记下
- 阅读目录什么是设计模式单体模式:工厂模式:单例模式观察者模式(发布订阅模式)策略模式模板模式代理模式外观模式设计模式太多了,貌似有23种,其
- 这些年来,我发现许多开发者对于何时使用数据操纵语言(DML)触发器与何时使用约束感到迷惑。许多时候,如果没有正确应用这两个对象,就会造成问题
- 有空余的时候自己写了一下,代码没有进行很好的规整。如果发现bug请及时通告我,谢谢 主要功能:1、点击插入表情,可选
- 一、使用三种方法实现0-n累加求和定义函数分别使用while循环、for循环、递归函数实现对0-n的累加求和1、使用while循环定义一个累
- tkinter改变下拉列表(Combobox)的选项值定义下拉列表:# 此处省略父容器的定义 ... # 定义下拉列表
- 去空格函数有如下两种:·LTRIM()LTRIM() 函数把字符串头部(左)的空格去掉,其语法如下:LTRIM (<character
- 这系列文章将介绍一下Oracle的基础知识,将会使用docker下运行的oracle11g的精简版进行说明。这篇文章介绍一下oracle的版
- 我有大量的重要数据要从SQL Server导出到Access或Excel文件中去,手工做太麻烦,还有其它的好办法吗?有,我们在 SQL Se
- 对于变量的访问和设置,我们可以使用get、set方法,如下:class student: def __init__(self,n
- 解决中文输入的两种应用:在脚本中加语言编码声明 “-*- coding: uft-8 -*-”应用一:print中出现中文方法一:用unic
- 本文实例讲述了Python编程实现控制cmd命令行显示颜色的方法。分享给大家供大家参考,具体如下:基于win7 + python3.4运行效
- php代码很简单:$server="127.0.0.1";println("Begin");$lin
- 网上广泛流传的取 object 的绝对位置的做法是:var getAbsPos = function(pTar
- 腾讯“月捐计划”倡导爱心人士,通过每月小额捐款的形式,长期关注和支持公益项目。并和亿万爱心网友一起,每人每月1份爱,点滴付出,汇成爱海,形成
- 关于oracle 优化的内容很多,概念庞杂,不过可以总结出一个大纲性的东西作为需要考虑的方向,然后再逐步细化。oracle优化按重要性需要考