[PYTHON] Denken Sie an Transformation Janken durch Optimierung

Was ist das

Strategie für 3 Personen über das Problem von S. 136 des Buches "Enzyklopädie der Mathematik-Puzzlespiele der Mittelstufe, die im Unterricht verwendet werden können" Erwägen.

Dieses Problem (arrangieren)

Drei Personen werden eine Transformation durchführen. Jeder streckt gleichzeitig 0, 1 oder 2 Finger aus. Der Gewinner ist die Person, die einen Finger ausstreckt, der der Summe der drei Finger geteilt durch drei entspricht.

--0 Leute gewinnen: 0 Punkte für alle

Denkweise 1

Lösen wir die gemischte Strategie, indem wir sie unter Bezugnahme auf "Lösen der Spieltheorie durch Kombinationsoptimierung" optimieren.

Die Wahrscheinlichkeit, jeden Finger von mir (k) auszustrecken, sei "xyz = [x, y, z]". Maximieren Sie die Mindestpunktzahl für die Finger von zwei Personen (i und j).

Die Formulierung wird auf die gleiche Weise wie das Referenzziel betrachtet. Lass es uns lösen.

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

def val(i, j, k):
    """k Punktzahl"""
    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])

Ausgabe

-0.5 [0.0, 0.5, 0.5]

Die Ausgabe ist der Zielfunktionswert und der Wert von "xyz". Ich verliere. Dies liegt daran, dass zwei Personen (i und j) zusammen kämpfen, um mich zu schlagen (k).

Denkweise 2

Nehmen wir an, dass die beiden nicht zusammen kämpfen. Sobald einer (j) einer gemischten Strategie folgt (pjs), tut einer (i) sein Bestes, um mich zu schlagen (k). Setzen Sie vorerst "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])

Ausgabe

-0.5 [0.0, 0.0, 1.0]

Immerhin verliere ich. Liegt das daran, dass eine Person (i) auf mich schießt (k)?

Denkweise 3

Mal sehen, ob Sie eine gemischte Strategie für zwei Personen kennen (sagen wir i und 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])

Ausgabe

1.0 [1.0, 0.0, 0.0]

Ich habe gewonnen. Dies liegt wahrscheinlich daran, dass die beiden (i und j) meine (k) Strategie nicht kennen, nur ich kenne ihre Strategie.

Denkweise 4

Wenn Sie die gemischte Strategie kennen, werden Sie durch Maßnahmen benachteiligt. Was soll ich machen? Versuchen wir die gemischte Strategie einer Person (j) als "[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])

Ausgabe

0.0 [0.33333333, 0.33333333, 0.33333333]

Wenn eine Person (j) gleichmäßig und ich (k) gleichmäßig verteilt, könnte ich im schlimmsten Fall zeichnen.

Denkweise 5

Wenn die beiden (i und j) gleichmäßig verteilt sind, versuchen Sie, die beste Mischstrategie für den Rest zu finden.

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])

Ausgabe

0.0 [0.0, 0.0, 1.0]

Obwohl ich die gemischte Strategie der beiden kannte, war die erwartete Punktzahl 0. Übrigens ist der erwartete Wert von "xyz" 0, egal was passiert.

Unter der Voraussetzung, dass "niemand zusammen kämpfen wird", scheint der erwartete Wert 0 zu sein, selbst wenn andere Personen Maßnahmen gegen die gemischte Strategie ergreifen, wenn sie gleichmäßig ausgegeben werden.

Dies ist wahrscheinlich die Strategie, die Sie verfolgen müssen, wenn Sie es nicht einmal schaffen, werden Sie behandelt und verlieren.

das ist alles

Recommended Posts

Denken Sie an Transformation Janken durch Optimierung
Über Menüs durch Kombinationsoptimierung nachdenken
Über die Optimierung des Vanille-Kontinents
Gruppierung nach Kombinationsoptimierung
Affine Transformation durch OpenCV (CUDA)
Informationen zu den von keras angegebenen batch_size
Sazaes Janken-Vorhersage von LightGBM
Denken Sie an Aussetzer mit MNIST