首先创建虚拟环境并使用清华镜像安装Gym(开源游戏环境Gym是一个国外的开源测试平台)。
conda create -n game python=3.7
activate game
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple gym
pip install gym[all]
最后一句安装所有gym游戏时发现报错,Windows不支持gym的某些游戏。这时,我们可以安装Atari游戏。
pip install --no-index -f https://github.com/Kojoley/atari-py/releases atari_py
首先查看cartpole的游戏介绍与系统参数。
首先对游戏进行随机动作选取测试,按照官网给的程序测试
import gym
env=gym.make('CartPole-v0')#1.配置游戏环境
for i in range(20):#2.游戏迭代20次
observation =env.reset()#3.每次迭代时环境重置(游戏开始时的动作状态)
for t in range(100):#4.每轮游戏的迭代的最大次数
env.render()#5.环境根据动作渲染
print(observation)#6.当前的环境状态
action=env.action_space.sample()#7.当前环境的最优动作,这里随机产生
observation,reward,done,info=env.step(action)#8.采取最优动作后更新的1环境状态2动作后的奖励值3是否gameover4对调试有用的诊断信息
if done:
print("episode finished after {} timesteps".format(t+1))#9.这局第几步就gameover了
break#10.跳出
env.close()#玩20把结束
然后强化学习的知识,可以看看莫凡的视频,然后自己消化一下强化学习的逻辑
import numpy as np
import pandas as pd
import time
np.random.seed(2)#随机种子2
N_STATES=6#环境共有6种状态
ACTIONS=['left','right']#动作有这2种
EPSILON=0.9#贪婪策略占90%
ALPHA=0.1#学习率是0.1
GAMMA=0.9#衰减率discount factor
MAX_EPISODES=13#游戏最多玩13局
FRESH_TIME=0.1#渲染更新时间0.1秒
#1.创建初始化q表格
def build_q_table(n_states,actions):
table=pd.DataFrame(np.zeros((n_states,len(actions))),columns=actions)
return table
#2.根据现在的状态和q表格(预测值)选择动作
def choose_action(state,q_table):
state_actions=q_table.iloc[state,:]#选出这个状态下所有动作的预测值
#如果是非贪婪策略或者所有动作都没预测值,则动作随机选择一个(左或者右)
if (np.random.uniform()>EPSILON) or (state_actions.all()==0):
action_name=np.random.choice(ACTIONS)
#否则选择预测值最大的动作
else:
action_name=state_actions.idxmax()#返回最大值的索引Left/Right
return action_name
#3.根据现在的状态和动作更新出下一个状态和这次的奖励
def get_env_feedback(S,A):
if A=='right':
if S==N_STATES-2:#如果现在的状态是结束的前一步,并此时的动作是向右
S_='terminal'#则到达了终点
R=1#奖励1
else:
S_=S+1#向右走
R=0
else: #向左走
R=0#奖励都是0
if S==0:
S_=S#还再最左边
else:
S_=S-1#向左走
return S_,R
#4.根据现在的状态进行显示,即环境渲染
def update_env(S,episode,step_counter):
env_list=['-']*(N_STATES-1)+['T']#初始化的环境状态
if S=='terminal':#如果状态更新到了终点
interaction='Episode %s:total_steps=%s'%(episode+1,step_counter)
print('\r{}'.format(interaction),end='')#打印出第几局第几次到达终点
time.sleep(2)#暂停2秒
else:#如果更新没到终点
env_list[S]='o'#此时的状态
interaction=''.join(env_list)#把列表打印出来
print('\r{}'.format(interaction),end='')
time.sleep(FRESH_TIME)#暂停0.1秒
#5.开始进行学习
def rl():
q_table=build_q_table(N_STATES,ACTIONS)#初始化q表格
#开始进行13局训练
for episode in range(MAX_EPISODES):
step_counter=0#每局游戏开始时初始化,步数计数
S=0#最初的状态
is_terminated=False#这局是否应该结束
update_env(S,episode,step_counter)#状态初始化
while not is_terminated:#如果这句没结束就继续更新
A=choose_action(S,q_table)#先选动作
q_predict=q_table.loc[S,A]#得到这个状态选这个动作的q表预测值
S_,R=get_env_feedback(S,A)#得到更新的状态和动作的奖励
if S_!='terminal':#没结束
q_target=R+GAMMA*q_table.iloc[S_,:].max()#下一状态的最大概率值*衰减率+得到的奖励,真实值
else:#结束了
q_target=R#结束了的奖励值是1
is_terminated=True#此时可以结束,结束标志更新
q_table.loc[S,A]+=ALPHA*(q_target-q_predict)#=q表里这个状态和动作的概率值(q表的更新公式)
S=S_#更新状态
update_env(S,episode,step_counter+1)#显示更新,环境渲染
step_counter+=1
return q_table
if __name__=='__main__':
q_table=rl()
print('\n')
print(q_table)
可以开始对cartpole游戏进行强化训练
【1】https://blog.csdn.net/u012465304/article/details/80905202?spm=1001.2014.3001.5501