
Photo by
yudo_tanaka
③[施策が3つ]ゲーム理論をClaudeとMathematicaで勉強
次は2プレイヤーで、戦略が3つずつある場合。
まずは利得行列をビジュアルに表現してもらった。
Mathematicaでゲーム理論の均衡点を計算しています。 次の3行3列の利得行列を持ちます。
2戦略→1 2 3
プレイヤー1戦略1 3,3 1,1 0,0
↓ 2 1,1 1,1 2,0
3 0,0 0,2 2,2
利得行列をビジュアルに表現してください
(*利得行列の定義*)
payoffMatrix = {{{3, 3}, {1, 1}, {0, 0}}, {{1, 1}, {1, 1}, {2,
0}}, {{0, 0}, {0, 2}, {2, 2}}};
(*利得行列をビジュアル化する関数*)
visualizePayoffMatrix[matrix_] :=
Module[{rows, cols, cellStyle, gridLines}, {rows, cols} =
Dimensions[matrix][[1 ;; 2]];
cellStyle[{i_, j_}] :=
Flatten[{If[matrix[[i, j, 1]] == Max[matrix[[i, All, 1]]],
Background -> LightBlue, Background -> White],
If[matrix[[i, j, 2]] == Max[matrix[[All, j, 2]]],
Background -> LightGreen, Background -> White]}];
gridLines = {{2 -> Directive[Thick, Black]}, {2 ->
Directive[Thick, Black]}};
Grid[Join[{Join[{Style["", Bold]},
Table[Style["プレイヤー2: " <> ToString[j], Bold], {j, cols}]]},
Table[Join[{Style["プレイヤー1: " <> ToString[i], Bold]},
Table[Row[{matrix[[i, j, 1]], ",", matrix[[i, j, 2]]}], {j,
cols}]], {i, rows}]], Alignment -> Center,
Dividers -> {All, All}, Spacings -> {2, 1.5},
ItemStyle -> {Bold, 14},
Background -> {None, None,
Table[cellStyle[{i, j}], {i, rows}, {j, cols}]},
Epilog -> {Text[Style["プレイヤー1の最適反応: 青", 12, Bold],
Scaled[{0.2, -0.05}]],
Text[Style["プレイヤー2の最適反応: 緑", 12, Bold], Scaled[{0.8, -0.05}]]}]]
(*利得行列をビジュアル化して表示*)
visualizePayoffMatrix[payoffMatrix]

ここまで来ると人間が解ける問題じゃない。
Mathematicaの基本的な関数で均衡点を計算するコードを書いてください。
”基本的な関数で”と指定するのは、実際には使えないパッケージを使用するから。
(*利得行列の定義*)
payoffMatrix = {{{3, 3}, {1, 1}, {0, 0}}, {{1, 1}, {1, 1}, {2,
0}}, {{0, 0}, {0, 2}, {2, 2}}};
(*利得行列をビジュアル化する関数*)
visualizePayoffMatrix[matrix_] :=
Module[{rows, cols, cellStyle, gridLines}, {rows, cols} =
Dimensions[matrix][[1 ;; 2]];
cellStyle[{i_, j_}] :=
Flatten[{If[matrix[[i, j, 1]] == Max[matrix[[i, All, 1]]],
Background -> LightBlue, Background -> White],
If[matrix[[i, j, 2]] == Max[matrix[[All, j, 2]]],
Background -> LightGreen, Background -> White]}];
gridLines = {{2 -> Directive[Thick, Black]}, {2 ->
Directive[Thick, Black]}};
Grid[Join[{Join[{Style["", Bold]},
Table[Style["プレイヤー2: " <> ToString[j], Bold], {j, cols}]]},
Table[Join[{Style["プレイヤー1: " <> ToString[i], Bold]},
Table[Row[{matrix[[i, j, 1]], ",", matrix[[i, j, 2]]}], {j,
cols}]], {i, rows}]], Alignment -> Center,
Dividers -> {All, All}, Spacings -> {2, 1.5},
ItemStyle -> {Bold, 14},
Background -> {None, None,
Table[cellStyle[{i, j}], {i, rows}, {j, cols}]},
Epilog -> {Text[Style["プレイヤー1の最適反応: 青", 12, Bold],
Scaled[{0.2, -0.05}]],
Text[Style["プレイヤー2の最適反応: 緑", 12, Bold], Scaled[{0.8, -0.05}]]}]]
(*利得行列をビジュアル化して表示*)
visualizePayoffMatrix[payoffMatrix]
純粋戦略ナッシュ均衡: {{1,1},{2,2},{3,3}}
混合戦略ナッシュ均衡: No mixed strategy Nash equilibrium found
この場合は、混合戦略を持たないらしい。
更に、一般にはナッシュ均衡点は複数個存在して、ナッシュ均衡点の理論だけではどのナッシュ均衡点が実現されるのかは求める事ができないらしい。この問題を複数均衡または均衡選択の問題という、らしい。
施策が3つ以上あるということは、交渉問題に繋がっていく。
真面目にノート取って勉強しないといけないんだけど、業務ですぐに使いたいんで。後で復習する。