[PYTHON] J'ai essayé de créer un environnement d'apprentissage amélioré pour Othello avec Open AI gym

introduction

J'ai essayé de créer un environnement pour renforcer l'apprentissage d'Othello avec OpenAI gym. J'espère que cela sera utile pour ceux qui souhaitent créer un environnement propice à un apprentissage amélioré à l'avenir. L'algorithme d'apprentissage n'est pas implémenté. Je vais étudier à partir de maintenant. Cliquez-ici pour le code https://github.com/pigooosuke/gym_reversi

Par défaut, gym / envs contient divers environnements d'apprentissage. Au fait, dans le système de jeu de société, il y a Go et hex. Cette fois, je l'ai créé en référence à ces codes.

Procédure de création

  1. Créez un environnement d'apprentissage original sous gym / envs /
  2. Enregistrez l'environnement créé dans gym / envs / \ _ \ _ init \ _ \ _. Py avec les valeurs par défaut. Ce sera le flux.

L'env créé peut être appelé comme suit.

import gym
env = gym.make('Reversi8x8-v0')

Fichier env

Description de la classe

Classe créée ReversiEnv En gros, il est nécessaire d'écrire du code centré sur 5 méthodes en Env. _step Avancez le nombre de pas de un (Sortez la main du joueur et la main de l'adversaire et vérifiez si le jeu est terminé)

_reset Chargez les paramètres par défaut d'Env (Chargement du plateau, première et deuxième attaque, etc.)

_render Illustrez l'état d'Env (l'image, RVB, le texte sont définis) (Affiche l'état des pierres sur le plateau)

_close Supprimer toutes les informations Env (Inutilisé cette fois)

_seed Utilisé pour déterminer l'action par graine aléatoire (Réglage)

classe init

La valeur initiale est player_color: Couleur de la pierre du joueur (noir en premier) adversaire: stratégie de l'adversaire (aléatoire cette fois) observation_type: encodage de l'état (paramètres inutiles? Vous pouvez peut-être le supprimer. Déclaration indiquant que l'état est géré par numpy3c. Je l'ai laissé pour le moment) legal_place_mode: Pénalités pour erreur de jeu (perte, etc.) board_size: taille de la carte (8 cette fois)

Est réglé.

action action décide de l'action à entreprendre contre Env. Puisqu'il s'agit d'une planche 8x8, 0-63 est la position de l'attaquant, 64 est la fin et 65 est la passe. C'est une image pour introduire la sortie de l'apprentissage par renforcement dans la partie action

done Plus tard dans le processus d'étape, vous devez vérifier si le jeu est terminé à la suite de cette étape.

reward La méthode d'évaluation est définie pour gagner ou perdre 1, -1.

Confirmation de la fin du jeu

def game_finished(board):
    # Returns 1 if player 1 wins, -1 if player 2 wins and 0 otherwise
    d = board.shape[-1]

    player_score_x, player_score_y = np.where(board[0, :, :] == 1)
    player_score = len(player_score_x)
    opponent_score_x, opponent_score_y = np.where(board[1, :, :] == 1)
    opponent_score = len(opponent_score_x)
    if player_score == 0:
        return -1
    elif opponent_score == 0:
        return 1
    else:
        free_x, free_y = np.where(board[2, :, :] == 1)
        if free_x.size == 0:
            if player_score > (d**2)/2:
                return 1
            elif player_score == (d**2)/2:
                return 1
            else:
                return -1
        else:
            return 0
    return 0

Histoire d'échec

Au début, je n'ai défini aucune règle du tout, je l'ai réglé pour qu'il prenne 0-63 en action dans n'importe quel statut (je peux mettre des pierres n'importe où) et j'ai essayé d'apprendre les règles elles-mêmes, mais cela a convergé en apprenant les premier et deuxième coups Je n'ai pas bien appris car j'ai fini par limiter la valeur de l'action.

Vérifiez les candidats pour placer des pierres

python


def get_enable_to_actions(board, player_color):
    actions=[]
    d = board.shape[-1]
    opponent_color = 1 - player_color
    for pos_x in range(d):
        for pos_y in range(d):
            if (board[2, pos_x, pos_y]==0):
                continue
            for dx in [-1, 0, 1]:
                for dy in [-1, 0, 1]:
                    if(dx == 0 and dy == 0):
                        continue
                    nx = pos_x + dx
                    ny = pos_y + dy
                    n = 0
                    if (nx not in range(d) or ny not in range(d)):
                        continue
                    while(board[opponent_color, nx, ny] == 1):
                        tmp_nx = nx + dx
                        tmp_ny = ny + dy
                        if (tmp_nx not in range(d) or tmp_ny not in range(d)):
                            break
                        n += 1
                        nx += dx
                        ny += dy
                    if(n > 0 and board[player_color, nx, ny] == 1):
                        actions.append(pos_x*8+pos_y)
    if len(actions)==0:
        actions = [d**2 + 1]
    return actions

Recommended Posts

J'ai essayé de créer un environnement d'apprentissage amélioré pour Othello avec Open AI gym
Je veux escalader une montagne avec l'apprentissage par renforcement
Quand j'ai essayé de créer un environnement virtuel avec Python, cela n'a pas fonctionné
J'ai essayé de créer un bouton pour Slack avec Raspeye + Tact Switch
J'ai essayé de créer automatiquement un rapport avec la chaîne de Markov
J'ai essayé de créer un bot pour annoncer un événement Wiire
J'ai essayé d'écrire dans un modèle de langage profondément appris
J'ai essayé de créer un environnement d'apprentissage automatique avec Python (Mac OS X)
J'ai essayé de faire d'Othello AI que j'ai appris 7,2 millions de mains par apprentissage profond avec Chainer
J'ai essayé de créer un environnement serveur qui fonctionne sous Windows 10
J'ai essayé de créer une liste de nombres premiers avec python
J'ai essayé l'apprentissage par renforcement profond (Double DQN) avec ChainerRL
J'ai essayé de créer des taureaux et des vaches avec un programme shell
J'ai essayé de faire une étrange citation pour Jojo avec LSTM
J'ai essayé de créer un linebot (implémentation)
J'ai essayé de créer Othello AI avec tensorflow sans comprendre la théorie de l'apprentissage automatique ~ Introduction ~
J'ai essayé de créer Othello AI avec tensorflow sans comprendre la théorie de l'apprentissage automatique ~ Implémentation ~
J'ai essayé de faire un diagnostic de visage AI pour les golfeuses professionnelles ①
J'ai essayé de créer un programme qui convertit les nombres hexadécimaux en nombres décimaux avec python
J'ai essayé de faire un diagnostic de visage AI pour les golfeuses professionnelles ②
J'ai essayé de créer un plug-in avec HULFT IoT Edge Streaming [Development] (2/3)
J'ai essayé de créer un plug-in avec HULFT IoT Edge Streaming [Execution] (3/3)
[Outlook] J'ai essayé de créer automatiquement un e-mail de rapport quotidien avec Python
J'ai essayé de créer un plug-in avec HULFT IoT Edge Streaming [Setup] (1/3)
J'ai essayé de créer un environnement de développement Mac Python avec pythonz + direnv
J'ai essayé de prédire l'année prochaine avec l'IA
J'ai essayé de faire de l'IA pour Smash Bra
[Mac] J'ai essayé de renforcer l'apprentissage avec Open AI Baselines
J'ai essayé de créer Othello AI avec tensorflow sans comprendre la théorie de l'apprentissage automatique ~ Battle Edition ~
Je veux créer un bel environnement de développement Python pour mon nouveau Mac
J'ai essayé de créer facilement un système de présence entièrement automatique avec Selenium + Python
J'ai essayé d'extraire le dessin au trait de l'image avec Deep Learning
J'ai essayé de créer un environnement à vérifier régulièrement en utilisant Selenium avec AWS Fargate
Un débutant en apprentissage automatique a tenté de créer une IA de jugement Sheltie en un jour
J'ai essayé de créer un modèle avec l'exemple d'Amazon SageMaker Autopilot
Créer un ensemble de données d'images à utiliser pour la formation
J'ai essayé de déplacer l'apprentissage automatique (détection d'objet) avec TouchDesigner
[Go + Gin] J'ai essayé de créer un environnement Docker
Je souhaite créer manuellement une légende avec matplotlib
J'ai essayé un RPA simple pour me connecter avec du sélénium
Créez un environnement d'apprentissage automatique à partir de zéro avec Winsows 10
J'ai essayé de créer un environnement avec WSL + Ubuntu + VS Code dans un environnement Windows
J'ai essayé de faire une simulation de séparation de source sonore en temps réel avec l'apprentissage automatique Python
Essayez de faire une stratégie de blackjack en renforçant l'apprentissage (② Enregistrer l'environnement dans le gymnase)
Comment créer rapidement un environnement d'apprentissage automatique à l'aide de Jupyter Notebook avec UbuntuServer 16.04 LTS
[Python] J'ai essayé de créer automatiquement un rapport quotidien de YWT avec la messagerie Outlook
Étapes pour créer rapidement un environnement d'apprentissage en profondeur sur Mac avec TensorFlow et OpenCV
J'ai essayé de faire de l'art créatif avec l'IA! J'ai programmé une nouveauté! (Article: Réseau Adversaire Créatif)
J'ai essayé de créer une classe pour rechercher des fichiers avec la méthode Glob de Python dans VBA
J'ai essayé de créer un cadre de données pandas en grattant les informations de rappel d'aliments avec Python
J'ai essayé d'implémenter une ligne moyenne mobile de volume avec Quantx
Je veux démarrer un environnement Jupyter avec une seule commande
Créez un environnement pour "Deep Learning from scratch" avec Docker
J'ai essayé d'utiliser Tensorboard, un outil de visualisation pour l'apprentissage automatique
J'ai essayé de résoudre le problème d'optimisation des combinaisons avec Qiskit
J'ai essayé de commencer avec Hy ・ Définir une classe
Mayungo's Python Learning Episode 3: J'ai essayé d'imprimer des nombres
Je souhaite utiliser un environnement virtuel avec jupyter notebook!