J'ai essayé de faire une stratégie de blackjack tout en étudiant Python et en renforçant l'apprentissage. Il existe une stratégie basée sur la probabilité d'une stratégie de base, mais je vais essayer de la rattraper.
Je vais procéder comme ça
C'est une plateforme utilisée comme environnement de recherche pour un apprentissage intensif. Les environnements (jeux) tels que CartPole et labyrinthe sont préparés et vous pouvez facilement essayer un apprentissage amélioré. L'environnement OpenAI Gym a une interface commune qui reçoit les actions des agents et, par conséquent, renvoie l'état et la récompense suivants. L'installation peut être effectuée facilement comme suit, mais veuillez vous référer aux autres pages pour la méthode détaillée. Dans ce qui suit, on suppose que l'installation est terminée.
pip install gym
Cette fois, je vais enregistrer mon propre blackjack dans cet environnement Open AI Gym afin de pouvoir faire un apprentissage amélioré.
Tout d'abord, un bref aperçu de l'apprentissage par renforcement. L '«état» est observé à partir de «l'environnement», et «l'agent» prend «une action» en réponse à cela. «Environnement» renvoie le «Statut» et la «Récompense» mis à jour à «Agent». Le but de l'apprentissage par renforcement est d'acquérir une méthode «d'action» (= politique) qui maximise le montant total de «récompenses» qui seront obtenues à l'avenir.
Dans ce Blackjack, nous considérerons l'apprentissage par renforcement comme suit.
--Environnement: Blackjack --Agent: Joueur --Statut: carte de joueur, carte de croupier, etc. --Action: sélection du joueur. Frapper, se tenir debout, etc.
Suivez les étapes ci-dessous pour enregistrer votre propre environnement dans OpenAI Gym.
La structure des fichiers est la suivante. Veuillez noter qu'il existe deux fichiers nommés \ _ \ _ init \ _ \ _. Py.
└─ myenv
├─ __init__.py --->Appeler BlacJackEnv
└─env
├─ __init__.py --->Indique où se trouve le BlackJack Env
├─ blackjack.py --->Jeu BlackJack lui-même
└─ blackjack_env.py --->Gymnase OpenAI Gym.Créer une classe BlackJackEnv qui hérite d'Env
Ensuite, suivez la procédure pour enregistrer l'environnement.
myenv/env/blackjack.py Laissez le code de Blackjack créé la dernière fois tel quel. Importez-le avec blackjack_env.py ci-dessous et utilisez-le.
myenv/env/blackjack_env.py Créez la classe "BlackJackEnv" de l'environnement de jeu BlackJack que vous souhaitez enregistrer dans OpenAI Gym. Héritez de gym.Env et implémentez les 3 propriétés et 5 méthodes suivantes.
--action_space: indique quelle action le joueur (l'agent) peut sélectionner. --observation_space: informations sur l'environnement de jeu que le joueur (agent) peut observer --reward_range: Plage de récompense minimale à maximale
--reset: méthode de réinitialisation de l'environnement. --step: méthode qui exécute une action dans l'environnement et renvoie le résultat. --render: une méthode pour visualiser l'environnement. --close: une méthode pour fermer l'environnement. Il est utilisé en fin d'apprentissage. --Seed: Une méthode pour fixer une graine aléatoire.
Cela montre que vous pouvez effectuer quatre actions: se tenir debout, frapper, doubler et se rendre.
action_space
self.action_space = gym.spaces.Discrete(4)
Observez les quatre états du score total de la main du joueur, le score de la main révélée par le croupier, le drapeau indiquant la main douce (A est inclus dans la main du joueur) et le drapeau indiquant si le joueur a été touché. Déterminez les valeurs maximum et minimum pour chacun.
observation_space
high = np.array([
30, # player max
30, # dealer max
1, # is_soft_hand
1, # hit flag true
])
low = np.array([
2, # player min
1, # dealer min
0, # is_soft_hand false
0, # hit flag false
])
self.observation_space = gym.spaces.Box(low=low, high=high)
Déterminez la gamme de récompenses. Ici, il est décidé d'inclure les valeurs minimales et maximales des puces pouvant être obtenues.
reward_range
self.reward_range = [-10000, 10000]
Initialisez self.done, initialisez la main du joueur et du croupier avec self.game.reset_game (), pariez des jetons (Bet) et distribuez des cartes (Deal). Comme mentionné dans la méthode par étapes, self.done est une valeur booléenne qui indique s'il y a ou non gain ou perte. Observez et renvoyez 4 états avec self.observe (). Cependant, cette fois, nous avons décidé de former le joueur en supposant que le nombre de jetons possédés par le joueur ne diminue pas.
reset()
def reset(self):
#Initialise l'état et retourne l'observation initiale
#Initialiser diverses variables
self.done = False
self.game.reset_game()
self.game.bet(bet=100)
self.game.player.chip.balance = 1000 #Le montant d'argent dont vous disposez ne sera jamais nul pendant vos études
self.game.deal()
# self.bet_done = True
return self.observe()
Le joueur prend soit Stand, Hit, Double down ou Surrender par rapport à l'environnement. Si le tour du joueur est terminé, le jeton sera réglé. Enfin, les quatre informations suivantes sont renvoyées.
--observation: l'état de l'environnement observé. --Reward: le montant de la récompense gagnée par l'action. --done: valeur booléenne indiquant si l'environnement doit être réinitialisé à nouveau. Dans BlackJack, une valeur booléenne qui indique s'il y a ou non une victoire ou une perte. --info: un dictionnaire qui peut définir des informations utiles pour le débogage.
De plus, dans cet environnement d'apprentissage, si vous doublez ou abandonnez après avoir frappé, vous serez pénalisé pour avoir enfreint les règles.
step()
def step(self, action):
#Exécuter l'action et renvoyer le résultat
#Décrivez le processus pour avancer d'une étape. La valeur de retour est observation, reward,fait (le jeu est-il terminé), info(Dictionnaire d'informations complémentaires)
if action == 0:
action_str = 's' # Stand
elif action == 1:
action_str = 'h' # Hit
elif action == 2:
action_str = 'd' # Double down
elif action == 3:
action_str = 'r' # Surrender
else:
print(action)
print("Action non définie")
print(self.observe())
hit_flag_before_step = self.game.player.hit_flag
self.game.player_step(action=action_str)
if self.game.player.done:
#À la fin du tour du joueur
self.game.dealer_turn()
self.game.judge()
reward = self.get_reward()
self.game.check_deck()
print(str(self.game.judgment) + " : " + str(reward))
elif action >= 2 and hit_flag_before_step is True:
reward = -1e3 #Donnez une pénalité si vous enfreignez les règles
else:
#Lors de la poursuite du tour d'un joueur
reward = 0
observation = self.observe()
self.done = self.is_done()
return observation, reward, self.done, {}
Cette fois, les méthodes render, close et seed ne sont pas utilisées.
Le code complet de blackjack_env.py ressemble à ceci:
myenv/env/blackjack_env.py
import gym
import gym.spaces
import numpy as np
from myenv.env.blackjack import Game
class BlackJackEnv(gym.Env):
metadata = {'render.mode': ['human', 'ansi']}
def __init__(self):
super().__init__()
self.game = Game()
self.game.start()
# action_space, observation_space, reward_Définir la plage
self.action_space = gym.spaces.Discrete(4) # hit, stand, double down, surrender
high = np.array([
30, # player max
30, # dealer max
1, # is_soft_hand
1, # hit flag true
])
low = np.array([
2, # player min
1, # dealer min
0, # is_soft_hand false
0, # hit flag false
])
self.observation_space = gym.spaces.Box(low=low, high=high)
self.reward_range = [-10000, 10000] #Liste des récompenses minimales et maximales
self.done = False
self.reset()
def reset(self):
#Initialise l'état et retourne l'observation initiale
#Initialiser diverses variables
self.done = False
self.game.reset_game()
self.game.bet(bet=100)
self.game.player.chip.balance = 1000 #Le montant d'argent dont vous disposez ne sera jamais nul pendant vos études
self.game.deal()
# self.bet_done = True
return self.observe()
def step(self, action):
#Exécuter l'action et renvoyer le résultat
#Décrivez le processus pour avancer d'une étape. La valeur de retour est observation, reward,fait (le jeu est-il terminé), info(Dictionnaire d'informations complémentaires)
if action == 0:
action_str = 's' # Stand
elif action == 1:
action_str = 'h' # Hit
elif action == 2:
action_str = 'd' # Double down
elif action == 3:
action_str = 'r' # Surrender
else:
print(action)
print("Action non définie")
print(self.observe())
hit_flag_before_step = self.game.player.hit_flag
self.game.player_step(action=action_str)
if self.game.player.done:
#À la fin du tour du joueur
self.game.dealer_turn()
self.game.judge()
reward = self.get_reward()
self.game.check_deck()
print(str(self.game.judgment) + " : " + str(reward))
elif action >= 2 and hit_flag_before_step is True:
reward = -1e3 #Donnez une pénalité si vous enfreignez les règles
else:
#Lors de la poursuite du tour d'un joueur
reward = 0
observation = self.observe()
self.done = self.is_done()
return observation, reward, self.done, {}
def render(self, mode='human', close=False):
#Visualisez l'environnement
#Dans le cas de l'humain, il est émis vers la console. Renvoie StringIO pour ansi
pass
def close(self):
#Fermez l'environnement et effectuez un post-traitement
pass
def seed(self, seed=None):
#Réparer les graines aléatoires
pass
def get_reward(self):
#Récompense de retour
reward = self.game.pay_chip() - self.game.player.chip.bet
return reward
def is_done(self):
if self.game.player.done:
return True
else:
return False
def observe(self):
if self.game.player.done:
observation = tuple([
self.game.player.hand.calc_final_point(),
self.game.dealer.hand.calc_final_point(), #Score total de la carte du concessionnaire
int(self.game.player.hand.is_soft_hand),
int(self.game.player.hit_flag)])
else:
observation = tuple([
self.game.player.hand.calc_final_point(),
self.game.dealer.hand.hand[0].point, #Carte du concessionnaire uniquement
int(self.game.player.hand.is_soft_hand),
int(self.game.player.hit_flag)])
return observation
myenv/__init__.py
Enregistrez BlackJackEnv avec gym en utilisant la fonction gym.envs.registration.register.
Ici, nous déclarons que nous appellerons la classe BlackJackEnv
sous le répertoire env sous le répertoire myenv avec l'ID BlackJack-v0
.
myenv/__init__.py
from gym.envs.registration import register
register(
id='BlackJack-v0',
entry_point='myenv.env:BlackJackEnv',
)
myenv/env/__init__.py
Ici, nous déclarons que la classe BlakcJackEnv
est dans blackjack_env.py
sous le répertoire env sous le répertoire myenv.
myenv/env/__init__.py
from myenv.env.blackjack_env import BlackJackEnv
Dans le code d'entraînement, vous pouvez utiliser l'environnement en définissant ʻenv = gym.make ('BlackJack-v0') `.
Cette fois, l'enregistrement de l'environnement est le principal, je vais donc l'omettre, mais le prochain article le créera.
J'ai enregistré mon propre jeu de blackjack dans l'environnement OpenAI Gym. J'ai réalisé que je devais réfléchir attentivement à ce qu'il fallait faire, à ce qu'il fallait observer en tant qu'état, à ce qu'il fallait récompenser et à l'endroit où passer d'une étape à l'environnement que j'avais créé. .. Au début, la longueur d'un pas était considérée comme ridiculement longue. .. ..
Ensuite, j'aimerais utiliser cet environnement pour apprendre la stratégie du Blackjack.
Recommended Posts