Je l'ai posté car cela fonctionnait bien lorsque j'ai déplacé CartPole-v0 d'OpenAI Gym avec contrôle PD. L'utilisation est trop différente, mais je pense que c'est suffisant en tant que démo pour apprendre à l'utiliser.
L'algorithme de contrôle est un contrôle PD avec des applaudissements positifs et négatifs (c'est-à-dire -1 ou +1).
Le code est ci-dessous. Toutes les explications détaillées sont écrites dans le code. Il est également répertorié sur github.
cart_pole_pd.py
# coding : utf-8
#CartPole utilisant un agent de contrôle PD a applaudi positif et négatif-Démonstration de la v0
#Signification de la valeur
# observation : [Position du chariot(Unité inconnue),Vitesse du chariot(Unité inconnue),Angle de pôle(Radian),Vitesse angulaire du pôle(Unité inconnue)]
# action : 0->-1, 1->+1
# step : 100step =1 seconde
#Conditions de sortie:Inclinaison de plus de 15 degrés ou 2.4(Unité inconnue)Déplacez-vous du centre ou 200 étapes
import agents
import gym
from gym import wrappers
video_path = './video' #Chemin pour enregistrer la vidéo
n_episode = 1 #Nombre d'épisodes
n_step = 200 #Nombre d'étapes
#Paramètres de contrôle PD(Au fait, cela ne fonctionne pas si seul le contrôle P est utilisé.)
#* Puisqu'il est applaudi en positif et en négatif, seul le ratio est significatif
kp = 0.1
kd = 0.01
myagent = agents.PDAgent(kp, kd) #Agent de contrôle PD applaudi par positif et négatif
env = gym.make('CartPole-v0') #Création d'environnement
#Classe Wrap pour l'environnement qui enregistre les vidéos dans le répertoire spécifié
# force=Vrai: efface automatiquement le fichier du moniteur précédent
env = wrappers.Monitor(env, video_path, force=True)
for i_episode in range(n_episode):
observation = env.reset() #Initialisation environnementale et acquisition d'observation initiale
for t in range(n_step):
env.render() #Afficher l'environnement(Mais il s'affiche sans utiliser Monitor)
print(observation)
action = myagent.action(observation) #Obtenir une action de la classe d'agent
observation, reward, done, info = env.step(action) #Faites un pas
if done: #Drapeau de fin
print('Episode finished after {} timesteps'.format(t+1))
break
agents.py
# coding: utf-8
import random
#Agent aléatoire
class RandomAgent():
def action(self):
return random.randint(0, 1) #Renvoie un nombre aléatoire entier compris entre 0 ou plus et 1 ou moins
#Agent de contrôle PD applaudi par positif et négatif
class PDAgent():
def __init__(self, kp, kd):
self.kp = kp
self.kd = kd
def action(self, observation):
m = self.kp * observation[2] + self.kd * observation[3] #Calculer le montant de l'opération
if m >= 0:
return 1
if m < 0:
return 0
Recommended Posts