LoginSignup
12
10

More than 3 years have passed since last update.

組合せ最適化でゲーム理論を解く

Last updated at Posted at 2016-10-19

これなに

ゲーム理論において、零和ゲームの場合、最適混合戦略は線形最適化(LP)で求めることができるそうです1
アレンジしたじゃんけんを例にして、Pythonでやってみます。

線形最適化については、組合せ最適化を使おうを参考にしてください。

じゃんけんの利得表

利得表(の転置)を次のように決めます。自分がグー(G)で勝つと、得点が4倍になります。

相手\自分 G C P
G 0 -1 1
C 4 0 -1
P -1 1 0

定式化

  • 自分がグー、チョキ、パーを出す割合を$x, y, z$ とします。(混合戦略)
  • このとき、$x+y+z = 1$ です。
  • 期待値は、相手がグーの場合 $-y + z$、相手がチョキの場合 $4x - z$、相手がパーの場合 $-x + y$ になります。
  • この3つの期待値の最小値($w$)を最大化しましょう。こうすることによって、相手がどんな手を出そうが、期待値は $w$ 以上になります。
目的関数 $w$ → 最大化
制約条件 $x+y+z = 1$
$-y + z \ge w$
$ 4x - z \ge w$
$ -x + y \ge w$
$x,y,z \ge 0, ~~~ w: free$

Pythonで解く

python
from pulp import *
from ortoolpy import addvar, addvars

a = [[0, -1, 1], [4, 0, -1], [-1, 1, 0]]
m = LpProblem(sense=LpMaximize) # 数理モデル
xyz = addvars(3) # 変数 x,y,z
w = addvar(lowBound=None) # 変数 w
m += w # 目的関数
m += lpSum(xyz) == 1 # 制約条件
for i in range(3):
    m += lpDot(a[i], xyz) >= w # 制約条件
m.solve() # 求解
print(value(w), [value(v) for v in xyz])
>>>
0.16666667 [0.16666667, 0.33333333, 0.5]

自分がグー、チョキ、パーを[1/6, 1/3, 1/2] の割合で出すと、相手がどんな手を出してきても、期待値を1/6にできることがわかります。

非協力ゲームでは、自分に有利な手(グー)の割合を小さくした方が、期待値が高くなるという面白い結果になります。

以上

12
10
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
10