最近工作中涉及到一个在零和博弈中求解Minimax的问题,算出的纯策略解效果并不好,于是想试试用线性规划来求解混合策略均衡解。
log😄😅=💧
线性规划主要解决的问题为:
xmincTxs.t.⎩⎨⎧Ax≤bAeqx=beqlb≤x≤ub,
其中c为价值向量,A和b为线性不等式约束,Aeq和beq为线性等式约束,lb和ub为变量下界和上界。
在Python中可以使用scipy.optimize.linprog
来求解线性规划问题。
1
| scipy.optimize.linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=None, method='simplex', callback=None, options=None)
|
其中method是求解器的类型,比如单纯形法simplex。
案例:
xminf=−1×x0+4×x1s.t.⎩⎨⎧−3×x0+1×x1≤61×x0+2×x1≤4x1≥−3
用代码求解:
1 2 3 4 5 6 7
| from scipy.optimize import linprog c = [-1, 4] A = [[-3, 1], [1, 2]] b = [6, 4] x0_bounds = (None, None) x1_bounds = (-3, None) res = linprog(c, A_ub=A, b_ub=b, bounds=(x0_bounds, x1_bounds), method='simplex')
|
运行结果:
1 2 3 4 5 6
| message: Optimization terminated successfully. success: True status: 0 fun: -22.0 x: [ 1.000e+01 -3.000e+00] nit: 5
|
最优解为f=22,x0=10,x1=−3。
对于最大值问题,只需将其转化为最小值问题即可。
Minimax问题
在零和博弈中,玩家的目标是最大化自己的收益,同时最小化对手的收益。换句话说,是在考虑对手选取其最优策略时,使其收益尽可能小,即求解双方收益的Minimax问题。
Maximin 和 Minimax 的区别
Maximin 和 Minimax 是博弈论和决策理论中两种基础策略,用于分析对抗性决策问题。它们的主要区别在于计算的目标和视角:
1. Maximin 策略
-
定义: 决策者假设对手会采取对自己最不利的策略,因此选择自己所有行动中收益的最小值中的最大值。
-
目标: 保证自己的“最坏情况”收益尽可能大。
-
步骤:
- 对于自己每个策略,计算在对手的所有可能反应下,自己能获得的最小收益。
- 从这些最小收益中选择最大值。
数学表达:
如果玩家 1 的收益矩阵为 ( M ),玩家 2 的策略为 ( j ),则:
Maximin=imaxjminM[i,j]
2. Minimax 策略
-
定义: 决策者假设对手会采取对自己最有利的策略,因此选择对手所有行动中收益的最大值中的最小值(即对手将最大化伤害自己)。
-
目标: 限制对手的“最优策略”给自己带来的损害。
-
步骤:
- 对于对手的每个策略,计算自己所有可能反应下对手能获得的最大收益。
- 从这些最大收益中选择最小值。
数学表达:
如果玩家 1 的收益矩阵为 (M ),玩家 1 的策略为 ( i ),则:
Minimax=jminimaxM[i,j]
直观理解
- Maximin: “我考虑所有最坏的可能情况,然后从中选择对我最不坏的一种策略。”
- Minimax: “我假设对手会选择最优策略来伤害我,然后我尽量限制对手的收益。”
无鞍点时:
- 如果博弈没有鞍点(例如收益矩阵不对称或无纯策略解),则 Maximin 和 Minimax 不相等。
- 此时需要引入混合策略,通过概率分布计算期望收益,使得 Maximin 和 Minimax 相等(即纳什均衡)。
策略 |
目标 |
数学表达 |
Maximin |
最大化自己在最坏情况下的收益 |
maximinjA[i,j] |
Minimax |
最小化对手在最优策略下能获得的收益(即限制对手的最大收益) |
minjmaxiA[i,j] |
对于零和博弈的Minimax问题,可以将其转化为线性规划问题来求解。
玩家1(最大化玩家)的线性规划形式:
xmaxv s.t. ⎩⎨⎧∑i=1nxiaij≥v∑i=1nxi=1xi≥0∀j∈{1,2,…,m}∀i∈{1,2,…,n}
其中:
- x=[x1,x2,…,xn] 是玩家1的混合策略概率分布(需要满足非负性和总和为1的约束)。
- aij 是收益矩阵,对应玩家1在策略i和玩家2在策略j时的收益。
- v 是玩家1的最小收益(即最大化的目标)。
玩家2(最小化玩家)的线性规划形式可以表示为:
yminw s.t. ⎩⎨⎧∑j=1myjaij≤w∑j=1myj=1yj≥0∀i∈{1,2,…,n}∀j∈{1,2,…,m}
其中:
- y=[y1,y2,…,ym] 是玩家2的混合策略概率分布。
- w 是玩家2的最大收益(即最小化的目标)。
将两者统一为一个线性规划问题
通过对偶性原理,零和博弈的 Minimax 问题可以简化为单个线性规划问题。这里以玩家1为主的最大化问题为例,将其转化为标准的线性规划问题:
v′,xminv′ s.t. ⎩⎨⎧−∑i=1nxiaij≤v′∑i=1nxi=1xi≥0∀j∈{1,2,…,m}∀i∈{1,2,…,n}
其中v′即为玩家1的最小收益的相反数。
示例代码
假设收益矩阵为:
A=[302114]
其中,玩家 1 有 2 种策略,玩家 2 有 3 种策略。通过线性规划求解玩家 1 的最优混合策略及其最小收益。
玩家1的最大化问题是:
v,xmaxvs.t.⎩⎨⎧3x1+0x2≥v2x1+1x2≥v1x1+4x2≥vx1+x2=1x1≥0,x2≥0
通过上述统一式,将其转化为标准形式:
v′,xminv′s.t.⎩⎨⎧−3x1−0x2≤v′−2x1−1x2≤v′−1x1−4x2≤v′x1+x2=1x1≥0,x2≥0
使用Python中的scipy.optimize.linprog
求解:
- c 为目标函数系数,这里为 [0,0,1]。
- A_ub 为不等式约束系数矩阵,这里为 [[−3,0,−1],[−2,−1,−1],[−1,−4,−1]]。
- b_ub 为不等式约束右侧常数向量,这里为 [0,0,0]。
- A_eq 为等式约束系数矩阵,这里为 [[1,1,0]]。
- b_eq 为等式约束右侧常数向量,这里为 [1]。
- bounds 为变量的上下界,这里为 [(0,None),(0,None),(None,None)]。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| from scipy.optimize import linprog import numpy as np
A = [[3, 2, 1], [0, 1, 4]]
A_ub = -1 * np.array(A).T A_ub = np.c_[A_ub, -1 * np.ones(len(A[0]))] b_ub = [0] * len(A[0])
c = [0, 0, 1] A_eq = [[1, 1, 0]] b_eq = [1] bounds = [(0, None), (0, None), (None, None)]
res = linprog(c, A_ub=A_ub, b_ub=b_ub, A_eq=A_eq, b_eq=b_eq, bounds=bounds, method='simplex')
print("Optimal value (v):", -res.fun) print("Optimal strategy for Player 1 (x):", res.x[:2])
|
输出:
1 2
| Optimal value (v): 1.75 Optimal strategy for Player 1 (x): [0.75 0.25]
|
即玩家1的最优混合策略为[0.75,0.25],最小期望收益为1.75。