Ich habe versucht, eine Blackjack-Strategie zu entwickeln, während ich Python studiert und das Lernen gestärkt habe. Es gibt eine Strategie, die auf der Wahrscheinlichkeit einer Grundstrategie basiert, aber ich werde versuchen, sie einzuholen.
Ich werde so vorgehen
Dieses Mal werden wir Q-Learning verwenden, einen der grundlegenden Lernalgorithmen für die Verstärkung.
Die Dateistruktur ist wie folgt. Der diesmal erstellte Code zur Stärkung des Lernens lautet "q-learning_blackjack.py". Andere Dateien werden als "In OpenAI-Fitnessumgebung registrieren" erstellt.
├─ q-learning_blackjack.py
└─ myenv
├─ __init__.py --->Rufen Sie BlacJackEnv an
└─env
├─ __init__.py --->Gibt an, wo sich das BlackJack Env befindet
├─ blackjack.py --->BlackJack-Spiel selbst
└─ blackjack_env.py --->OpenAI Fitnessstudio.Erstellen Sie eine BlackJackEnv-Klasse, die Env erbt
self.Q
wird zu einer Tabelle, die die Q-Werte zusammenfasst und im Verlauf des Lernens aktualisiert wird. Dies wird hier als Q-Tabelle bezeichnet.
In der Q-Tabelle für ** Status (Spielerpunkte, Dealer-Punkte, Spieler besitzt Ass, Spieler wurde getroffen) **, Spieler ** Stand **, ** Treffer ** , ** Double Down ** , ** Surrender ** Repräsentiert den Wert, wenn die Aktion ausgeführt wird.
Die Richtlinienmethode wählt Aktionen gemäß der ε-gierigen Methode aus. Wählen Sie zufällig eine Aktion mit der Wahrscheinlichkeit "Epsilon" aus und wählen Sie eine Aktion gemäß der Q-Tabelle mit der Wahrscheinlichkeit "1-Epsilon" aus.
Agentenklasse
class Agent():
def __init__(self, epsilon):
self.Q = {}
self.epsilon = epsilon
self.reward_log = []
def policy(self, state, actions):
if np.random.random() < self.epsilon:
return np.random.randint(len(actions))
else:
if state in self.Q and sum(self.Q[state]) != 0:
return np.argmax(self.Q[state])
else:
return np.random.randint(len(actions))
def init_log(self):
self.reward_log = []
def log(self, reward):
self.reward_log.append(reward)
def show_reward_log(self, interval=100, episode=-1):
if episode > 0:
rewards = self.reward_log[-interval:]
mean = np.round(np.mean(rewards), 3)
std = np.round(np.std(rewards), 3)
print("At Episode {} average reward is {} (+/-{}).".format(episode, mean, std))
else:
indices = list(range(0, len(self.reward_log), interval))
means = []
stds = []
for i in indices:
rewards = self.reward_log[i:(i + interval)]
means.append(np.mean(rewards))
stds.append(np.std(rewards))
means = np.array(means)
stds = np.array(stds)
plt.figure()
plt.title("Reward History")
plt.xlabel("episode")
plt.ylabel("reward")
plt.grid()
plt.fill_between(indices, means - stds, means + stds, alpha=0.2, color="g")
plt.plot(indices, means, "o-", color="g", label="Rewards for each {} episode".format(interval))
plt.legend(loc="best")
plt.savefig("Reward_History.png ")
plt.show()
Es erbt die oben erstellte Agentenklasse. Die Lernmethode ist die Hauptlernmethode. Eine Episode entspricht einem Blackjack-Spiel. Wählen Sie mit "a = self.policy (s, action)" eine Aktion entsprechend dem Status aus und mit "n_state, belohnung, erledigt, info = env.step (a)" den Status als Ergebnis der tatsächlichen Ausführung dieser Aktion. Beobachten Sie die Belohnung. Die Schrittfunktion ist wie in "In OpenAI-Fitnessraumumgebung registrieren" implementiert.
Die folgenden drei Codezeilen sind die Q-Learning-Formel
Q(s_t, a_t)\leftarrow(1-\alpha)Q(s_t, a_t)+\alpha(r_{t+1}+\gamma \max_{a_{t+1}}Q(s_{t+1}, a_{t+1}))
Entspricht.
$ \ Gamma $ (gamma
) ist der Parameter dafür, wie viel der zukünftige Wert mit dem Abzinsungssatz abgezinst wird, $ \ alpha $ ( learning_rate
) ist die Lernrate und wie schnell der Q-Wert aktualisiert wird. Es ist ein zu steuernder Parameter.
Q-Lernformel
gain = reward + gamma * max(self.Q[n_state])
estimated = self.Q[s][a]
self.Q[s][a] += learning_rate * (gain - estimated)
QLearningAgent-Klasse
class QLearningAgent(Agent):
def __init__(self, epsilon=0.1):
super().__init__(epsilon)
def learn(self, env, episode_count=1000, gamma=0.9,
learning_rate=0.1, render=False, report_interval=5000):
self.init_log()
actions = list(range(env.action_space.n))
self.Q = defaultdict(lambda: [0] * len(actions))
for e in range(episode_count):
s = env.reset()
done = False
reward_history = []
while not done:
if render:
env.render()
a = self.policy(s, actions)
n_state, reward, done, info = env.step(a)
reward_history.append(reward)
gain = reward + gamma * max(self.Q[n_state])
estimated = self.Q[s][a]
self.Q[s][a] += learning_rate * (gain - estimated)
s = n_state
else:
self.log(sum(reward_history))
if e != 0 and e % report_interval == 0:
self.show_reward_log(episode=e, interval=50)
env.close()
Laden Sie Ihre eigene Blackjack-Umgebung mit "env = gym.make (" BlackJack-v0 ")".
Informationen zur Erstellungsmethode finden Sie unter Blackjack-Implementierung und In OpenAI-Fitnessumgebung registrieren. Bitte.
Ich habe eine save_Q-Methode zum Speichern der Q-Wertetabelle und eine show_reward_log-Methode zum Anzeigen des Belohnungsprotokollverlaufs erstellt.
Zugfunktion und Ausführungsteil
def train():
agent = QLearningAgent()
env = gym.make('BlackJack-v0')
agent.learn(env, episode_count=50000, report_interval=1000)
agent.save_Q()
agent.show_reward_log(interval=500)
if __name__ == "__main__":
train()
Die Lernergebnisse sind wie folgt. Die horizontale Achse ist die Episode und die vertikale Achse ist die Belohnung. Die grüne Linie ist die durchschnittliche Belohnung für 500 Folgen, und die grüne Füllung ist die Standardabweichung für die Belohnung für 500 Folgen. Es ist seit der Folge von 20000 fast flach. Und ich bin traurig, dass die durchschnittliche Belohnung selbst zum Zeitpunkt des Lernens von 50.000 Folgen unter 0 liegt. .. ..
Vergleichen Sie die gelernte Q-Tabelle mit der Grundstrategie. Extrahieren Sie die Aktion, die den Q-Wert für jeden Status der Q-Tabelle maximiert, und erstellen Sie eine Strategietabelle für jede harte und weiche Hand auf dieselbe Weise wie für die Basisstrategie.
Die linke Spalte ist die in Q-Learning erlernte Strategie und die rechte Spalte ist die Grundstrategie. Die obere Reihe ist eine harte Hand (wenn A nicht in der Hand enthalten ist) und die untere Reihe ist eine weiche Hand (wenn A in der Hand enthalten ist). Die Zeilen jeder Tabelle stehen für Spielerpunkte und die Spalten für Händlerpunkte. Die Alphabete in der Tabelle stellen die Aktionen dar, die der Spieler ausführen sollte.
Die Split-Funktion ist bei diesem selbst erstellten Blackjack nicht implementiert. Daher werden Aktionen auch dann zugewiesen, wenn der Spieler mit der harten Hand 4 Punkte (2, 2) und der Spieler mit der weichen Hand 12 Punkte (A, A) hat.
Wenn man die erlernten Ergebnisse mit der Grundstrategie vergleicht, ist die Tendenz von Treffer, wenn der Punkt des Spielers niedrig ist, und Bleiben, wenn der Punkt des Spielers hoch ist, gleich. Ich möchte, dass Sie zumindest diesen Bereich lernen. Wenn Sie sich jedoch die Details ansehen, trifft der Soft-Hand-Spieler in der Regel 19 Punkte. Selbst wenn Sie es treffen, wird es keine Büste sein, aber wenn Sie still bleiben, ist es ein starker Schachzug. Hier konnte ich nicht gut lernen. Warum. .. .. Außerdem gibt es weniger Double Down und mehr Surrender. Wir können sehen, dass die Tendenz besteht, Risiken einzugehen und Verluste zu minimieren.
Ich habe versucht, 100 Spiele x 1000 Mal zu spielen, basierend auf der erlernten Q-Tabelle und der Grundstrategie. Wir setzen 100 $ auf jedes Spiel und berechnen die durchschnittliche Anzahl der Chips, die 1000 Mal für 100 Spiele verdient wurden. Die folgende Abbildung zeigt das Histogramm der durchschnittlichen Erfassungschips.
Je verteilter auf der rechten Seite der Abbildung, desto besser die Ergebnisse, aber die Grundstrategie liefert bessere Ergebnisse. Übrigens betrug der Durchschnittswert basierend auf der Q-Tabelle \ $ -8,2 und der Durchschnittswert basierend auf der Grundstrategie \ $ -3,2. Natürlich war der Fall mit einem hoch durchschnittlich verdienten Chip eine Grundstrategie, aber der Fall mit einem niedrig durchschnittlich verdienten Chip war auch eine Grundstrategie. Die Grundstrategie ist weiter verbreitet. Die Verteilung der Q-Tabelle ist enger, wahrscheinlich weil es weniger Double Downs und mehr Surrenders gibt.
In drei Schritten habe ich meine eigene Blackjack-Umgebung erstellt und versucht, die Strategie zu stärken und zu lernen. Infolgedessen erhielt ich keine Ergebnisse, die über die Grundstrategie hinausgingen, aber ich konnte mein Verständnis für das Lernen und Programmieren von Verstärkung vertiefen. Es gibt noch Raum für Verbesserungen beim Lernen. Da ich meine eigene Umgebung erstellt habe, kann ich auch die erwarteten Werte der Karten beobachten, die aus den verbleibenden Decks kommen. Es ist ein bisschen schlampig, aber ich würde gerne experimentieren. (Natürlich kann es nicht in Casinos verwendet werden ...)
Recommended Posts