Dans Théorie du jeu Dans le cas du jeu à somme nulle, la stratégie de mélange optimale peut être obtenue par optimisation linéaire (LP) [^ 1]. Essayons d'utiliser Python, en utilisant le Janken arrangé comme exemple.
Pour l'optimisation linéaire, reportez-vous à Use Combination Optimization.
[^ 1]: Du séminaire "OU commencer avec le solveur Excel"
Déterminez la table de gain (translocation) comme suit. Si vous gagnez le Goo (G), votre score sera quadruplé.
Adversaire \ moi-même | G | C | P |
---|---|---|---|
G | 0 | -1 | 1 |
C | 4 | 0 | -1 |
P | -1 | 1 | 0 |
Supposons que le ratio de vous-même donnant goo, choki et par est $ x, y, z $. (Stratégie mixte) --A ce moment, $ x + y + z = 1 $.
Fonction objectif | $ w $ → Maximiser |
---|---|
Contraintes | $ x + y + z = 1 $ |
$ 4x - z \ge w$ | |
$ -x + y \ge w$ | |
python
from pulp import *
from ortoolpy import addvar, addvars
a = [[0, -1, 1], [4, 0, -1], [-1, 1, 0]]
m = LpProblem(sense=LpMaximize) #Modèle mathématique
xyz = addvars(3) #Variable x,y,z
w = addvar(lowBound=None) #Variable w
m += w #Fonction objective
m += lpSum(xyz) == 1 #Contraintes
for i in range(3):
m += lpDot(a[i], xyz) >= w #Contraintes
m.solve() #Solution
print(value(w), [value(v) for v in xyz])
>>>
0.16666667 [0.16666667, 0.33333333, 0.5]
Si vous sortez goo, choki et par à un ratio de [1/6, 1/3, 1/2], vous pouvez voir que la valeur attendue peut être réduite à 1/6 quel que soit le type de mouvement de l'adversaire.
Dans les jeux non coopératifs, le résultat intéressant est que la valeur attendue sera plus élevée si le ratio de mains (goo) qui vous est avantageux est réduit.
c'est tout
Recommended Posts