[PYTHON] Pensez à la transformation Janken par l'optimisation

Qu'est-ce que c'est

Stratégie pour 3 personnes sur le problème de la p136 du livre "Encyclopédie des jeux de puzzle de mathématiques du premier cycle du secondaire utilisables en classe" Considérer.

Ce problème (organisation)

Trois personnes feront une transformation. Tout le monde sort 0, 1 ou 2 doigts en même temps. Le gagnant est celui qui sort un doigt égal à la somme des trois doigts divisée par trois.

--0 personnes gagnent: 0 point pour tous

Façon de penser 1

Résolvons la stratégie mixte en l'optimisant en nous référant à "Résolution de la théorie des jeux par l'optimisation des combinaisons".

Soit la probabilité de sortir chaque doigt de moi (k) xyz = [x, y, z]. Maximisez le score minimum pour les doigts donnés par deux personnes (i et j).

La formulation est considérée de la même manière que la destination de référence. Résolvons-le.

from pulp import LpProblem, LpMaximize, LpVariable, lpSum, value

def val(i, j, k):
    """score k"""
    h = (i + j + k) % 3
    wini = i == h
    winj = j == h
    wink = k == h
    s = wini + winj + wink
    return 0 if s % 3 == 0 else (3 - s) / s if wink else -1

m = LpProblem(sense=LpMaximize)
w = LpVariable('w')
xyz = [LpVariable(c, 0, 1) for c in 'xyz']
m += w
m += lpSum(xyz) == 1
for i in range(3):
    for j in range(3):
        e = lpSum(val(i, j, k) * v for k, v in enumerate(xyz))
        m += w <= e
m.solve()
print(value(m.objective), [value(v) for v in xyz])

production

-0.5 [0.0, 0.5, 0.5]

Le résultat est la valeur de la fonction objectif et la valeur de «xyz». Je perd. C'est parce que les deux (i et j) se battent ensemble pour me battre (k).

Pensée 2

Supposons que les deux ne se battent pas ensemble. Une fois que l'un (j) suit une stratégie mixte (pjs), l'un (i) fait de son mieux pour me battre (k). Pour le moment, définissez pjs = [0.0, 0.5, 0.5].

pjs = [0.0, 0.5, 0.5]
m = LpProblem(sense=LpMaximize)
w = LpVariable('w')
xyz = [LpVariable(c, 0, 1) for c in 'xyz']
m += w
m += lpSum(xyz) == 1
for i in range(3):
    e = lpSum(pj * val(i, j, k) * v
              for j, pj in enumerate(pjs)
              for k, v in enumerate(xyz))
    m += w <= e
m.solve()
print(value(m.objective), [value(v) for v in xyz])

production

-0.5 [0.0, 0.0, 1.0]

Après tout, je perds. Est-ce parce qu'une personne (i) me tire dessus (k)?

Pensée 3

Voyons si vous connaissez une stratégie mixte pour deux personnes (disons i et j).

pis = [0.0, 0.5, 0.5]
pjs = [0.0, 0.0, 1.0]
m = LpProblem(sense=LpMaximize)
w = LpVariable('w')
xyz = [LpVariable(c, 0, 1) for c in 'xyz']
m += w
m += lpSum(xyz) == 1
e = lpSum(pi * pj * val(i, j, k) * v
          for i, pi in enumerate(pis)
          for j, pj in enumerate(pjs)
          for k, v in enumerate(xyz))
m += w <= e
m.solve()
print(value(m.objective), [value(v) for v in xyz])

production

1.0 [1.0, 0.0, 0.0]

J'ai gagné. C'est probablement parce que les deux (i et j) ne connaissent pas ma (k) stratégie, je connais seulement leur stratégie.

Pensée 4

Si vous connaissez la stratégie mixte, vous serez désavantagé en prenant des mesures. Que devrais-je faire? Essayons la stratégie mixte d'une personne (j) comme «[1/3, 1/3, 1/3]».

pjs = [1 / 3, 1 / 3, 1 / 3]
m = LpProblem(sense=LpMaximize)
w = LpVariable('w')
xyz = [LpVariable(c, 0, 1) for c in 'xyz']
m += w
m += lpSum(xyz) == 1
for i in range(3):
    e = lpSum(pj * val(i, j, k) * v
              for j, pj in enumerate(pjs)
              for k, v in enumerate(xyz))
    m += w <= e
m.solve()
print(value(m.objective), [value(v) for v in xyz])

production

0.0 [0.33333333, 0.33333333, 0.33333333]

Si une personne (j) sort uniformément et que je (k) sort uniformément, au pire je pourrais dessiner.

Pensée 5

Si les deux (i et j) sont uniformément répartis, essayez de trouver la meilleure stratégie de mélange pour le reste.

pis = [1 / 3, 1 / 3, 1 / 3]
pjs = [1 / 3, 1 / 3, 1 / 3]
m = LpProblem(sense=LpMaximize)
w = LpVariable('w')
xyz = [LpVariable(c, 0, 1) for c in 'xyz']
m += w
m += lpSum(xyz) == 1
e = lpSum(pi * pj * val(i, j, k) * v
          for i, pi in enumerate(pis)
          for j, pj in enumerate(pjs)
          for k, v in enumerate(xyz))
m += w <= e
m.solve()
print(value(m.objective), [value(v) for v in xyz])

production

0.0 [0.0, 0.0, 1.0]

Même si je connaissais la stratégie mixte des deux, le score attendu était de 0. Au fait, la valeur attendue de xyz est 0 quoi qu'il arrive.

Après tout, en partant du principe que "personne ne se battra ensemble", même si d'autres personnes prennent des mesures contre la stratégie mixte, la valeur attendue semble être de 0 si elles sont émises uniformément.

C'est probablement la stratégie à adopter, car si vous ne parvenez pas à égaliser, vous serez traité et perdez.

c'est tout

Recommended Posts

Pensez à la transformation Janken par l'optimisation
Penser les menus par l'optimisation des combinaisons
À propos de l'optimisation du continent vanille
Optimisation du regroupement par combinaison
Transformation affine par OpenCV (CUDA)
À propos de batch_size spécifié par keras
Prédiction de Janken de Sazae par LightGBM
Pensez aux abandons avec MNIST