基于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


猜你喜欢
- vue-admin-element项目突然就起不来INFO Starting development server...&nbs
- 背景故事:我需要对一张图片做一些处理,是在图像像素级别上的数值处理,以此来反映图片 * 定区域的图像特征,网上查了很多,大多关于opencv的
- 线程锁相当于同时只能有一个线程申请锁,有的场景无数据修改互斥要求可以同时让多个线程同时运行,且需要限制并发线程数量时可以使用信号量impor
- 一、Pylint 是什么Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准和有潜在
- 本文实例主要是实现爬取一个网页上的图片地址,具体如下。读取一个网页的源代码:import urllib.requestdef getHtml
- 写入文件使用open()函数和write()函数但是有两种写法,分别是'a'和'w'。'a'
- 前言前一篇autoit实现文件上传打包成.exe可执行文件后,每次只能传固定的那个图片,我们实际测试时候希望传不同的图片。这样每次调用的时候
- 一、添加SVN(1)添加svn插件(2)安装的svn最好是默认路径安装的,不要问我为什么,因为很多软件都是按照默认路径找到bin的表示安装正
- 前言有时候python自带异常不够用,如同java,python也可以自定义异常,并且可以手动抛出。注意,自定义异常只能由自己抛出。pyth
- 复制是将主数据库的DDL和DML操作通过二进制日志传到从库上,然后再从库重做,从而使得从库和主库保持数据的同步。MySQL可以从一台主库同时
- vm.$delete()vm.$delete用法见官网。为什么需要Vue.delete()?在ES6之前, JS没有提供方法来侦测到一个属性
- Python求解微分方程(数值解法)对于一些微分方程来说,数值解法对于求解具有很好的帮助,因为难以求得其原方程。比如方程:但是我们知道了它的
- 首先获取ip:<% userip=Request.ServerVariables(&qu
- shutil --High-level file operations 高级的文件操作模块os模块提供了对目录或者文件的新建/删除/查看文件
- 训练完train_datasets之后,model要来测试样本了。在model(test_datasets)之前,需要加上model.eva
- 简介概念散列算法(Hash Algorithm),又称哈希算法,杂凑算法,是一种从任意文件中创造小的数字「指纹」的方法。与指纹一样,散列算法
- 本文实例为大家分享了Python将一个Excel拆分为多个Excel的具体代码,供大家参考,具体内容如下原始文档如下图所示将销售部门一、二、
- 很久没有上过天极网,今天偶然兴起跑上去看了一下,看到消息说天极网深圳站隆重上线,于是也顺便去溜了一把,打开页面的时候差点有种不知所措的感觉,
- 本文主要介绍的是MySQL慢查询分析方法,前一段日子,我曾经设置了一次记录在MySQL数据库中对慢于1秒钟的SQL语句进行查询。想起来有几个
- 如下所示:logprobs.new_zeros(logprobs.size())pytorch 0.4版本中用到的新建一个与logprobs