强化学习笔记

强化学习笔记

  • 1.环境配置
  • 2.CartPole游戏
  • 参考

工作需要,可能要自己了解一些DQN方面的知识,所以记录一下自己的学习笔记吧。

1.环境配置

首先创建虚拟环境并使用清华镜像安装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

2.CartPole游戏

首先查看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

你可能感兴趣的:(job,python)