④[リスク支配]ゲーム理論をClaudeとMathematicaで勉強
複数のナッシュ均衡があった時、リスクが低い方は「リスクを支配する」という… よくわからないな… 例題をMathematicaで解いてみる。
利得行列を
a b
a 3,3 0,0
b 0,0 1,1
だとすると、どう見てもナッシュ均衡は3,3か1,1の2つになる。
しかし、リスクが低い=リターンが大きいのは3,3の方だ。
これをリスク支配と言うらしい。ふむ。
では次の例題。
そこで、ClaudeとMathematicaに依頼。
もはや呪文なんですけど… 実行
(*利得行列の定義*)
payoffMatrix = {{{5.0, 2.0}, {0.0, 0.0}}, {{0.0, 0.0}, {3.0, 6.0}}};
(*プレイヤーの戦略*)
strategies = {"a", "b"};
(*純粋戦略ナッシュ均衡を見つける関数*)
findPureNashEquilibria[matrix_] :=
Module[{n = Length[matrix], equilibria = {}},
For[i = 1, i <= n, i++,
For[j = 1, j <= n, j++,
If[And[matrix[[i, j, 1]] == Max[matrix[[All, j, 1]]],
matrix[[i, j, 2]] == Max[matrix[[i, All, 2]]]],
AppendTo[equilibria, {i, j}]]]];
equilibria];
(*混合戦略ナッシュ均衡を計算する関数*)
findMixedNashEquilibrium[matrix_] :=
Module[{p, q},(*プレイヤー1の混合戦略 p を求める*)
q = NSolve[{q*(matrix[[1, 1, 2]] - matrix[[2, 1, 2]]) + (1 -
q)*(matrix[[1, 2, 2]] - matrix[[2, 2, 2]]) == 0,
0 <= q <= 1}, q, Reals][[1, 1, 2]];
(*プレイヤー2の混合戦略 q を求める*)
p = NSolve[{p*(matrix[[1, 1, 1]] - matrix[[1, 2, 1]]) + (1 -
p)*(matrix[[2, 1, 1]] - matrix[[2, 2, 1]]) == 0,
0 <= p <= 1}, p, Reals][[1, 1, 2]];
{p, q}];
(*リスクを評価する関数*)
evaluateRisk[strategy_, matrix_] :=
Module[{worstCase}, worstCase = Min[matrix[[strategy, All, 1]]];
-worstCase (*リスクは最悪の結果のマイナス*)];
(*純粋戦略ナッシュ均衡の計算*)
pureNashEquilibria = findPureNashEquilibria[payoffMatrix];
(*結果の表示*)
Print["純粋戦略ナッシュ均衡:"];
For[k = 1, k <= Length[pureNashEquilibria], k++,
Print["プレイヤー1: ", strategies[[pureNashEquilibria[[k, 1]]]],
", プレイヤー2: ", strategies[[pureNashEquilibria[[k, 2]]]]]];
(*複数の均衡がある場合、リスクの少ない方を選択*)
If[Length[pureNashEquilibria] > 1,
Print["\n複数の均衡が存在します。リスク評価を行います:"];
risks =
Table[{strategies[[eq[[1]]]], strategies[[eq[[2]]]],
evaluateRisk[eq[[1]], payoffMatrix]}, {eq, pureNashEquilibria}];
sortedRisks = SortBy[risks, Last];
Print["最もリスクの低い均衡: ", "プレイヤー1: ", sortedRisks[[1, 1]], ", プレイヤー2: ",
sortedRisks[[1, 2]]];,
If[Length[pureNashEquilibria] == 1, Print["\n唯一の純粋戦略ナッシュ均衡が存在します。"],
Print["\n純粋戦略ナッシュ均衡は存在しません。混合戦略を計算します。"];
{p1, p2} = findMixedNashEquilibrium[payoffMatrix];
Print["混合戦略ナッシュ均衡:"];
Print["プレイヤー1がaを選ぶ確率: ", N[p1, 4]];
Print["プレイヤー2がaを選ぶ確率: ", N[p2, 4]];]];
(*利得行列のビジュアル表現*)
visualizePayoffMatrix[matrix_, strats_] :=
Module[{gridData, styled},
gridData = {{"",
Column[{Style["プレイヤー2", Bold],
Style["\[DownArrow]", Small]}]}, {Column[{Style["プレイヤー1",
Bold], Style["\[RightArrow]", Small]}],
Grid[Table[{Style[strats[[i]], Bold],
"(" <> ToString[matrix[[i, j, 1]]] <> ", " <>
ToString[matrix[[i, j, 2]]] <> ")"}, {i,
Length[strats]}, {j, Length[strats]}]]}};
styled =
Grid[gridData, Alignment -> {Center, Center},
Dividers -> {{2 -> True}, {2 -> True}},
Background -> {{Gray}, {Gray}},
ItemStyle -> {{Automatic, Bold}, {Bold, Automatic}}];
Print["\n利得行列のビジュアル表現:"];
Print[styled];];
visualizePayoffMatrix[payoffMatrix, strategies]
なるほど、左上の(5,2)の方が良いらしい。