【强化学习】python回顾与python实现Q-learning

一、python回顾

  1. 类与实例
    • 类有自己的属性和方法。(例:class Person:)
    • 想要调用方法需要创建实例:实例要创建变量,指向类的名字(p1=Person()),调用方法的话在变量的后边句号方法的名字+括号。(p1.greet())
    • 如果想把属性进行隐藏,可以把名字前边加两个下划线
    • __init__帮助class初始化
  2. 继承和多态(例:class Animal: class Dog:)                                                                          1、继承父类的方法(class Dog(Animal)):

           想改变方法的话可以进行重新定义   

         2、多态

           定义def hello(aninmal):

          Animal.greet()

          Dog=Dog(‘dog’)

          Hello(dog)

         Cat=Cat(‘cat’)

        Hello(cat)

       也可直接被调用

二、强化学习之Q-learning

建立Q(s,a)表,来进行动作的选取。

import numpy as np

import pandas as pd

import time

np.random.seed(2)#产生伪随机数列

N_STATES=6#离宝藏的距离有多少步

ACTIONS=['left','right']#有两个可以选的动作

EPSILON=0.9#贪心策略

ALPHA=0.1#学习率

LAMBDA=0.9#折扣率

MAX_EPISODES=13# 玩的回合数

FRESH_TIME=0.01 #f走一步花的时间有多长

#建立Q-table

def build_q_table(n_states,actions):

    table=pd.DataFrame(

        np.zeros((n_states,len(actions))),#全零进行初始化

        columns=actions,)#进行表格创建

    # print(table)

    return (table)

# build_q_table(N_STATES,ACTIONS)

def choose_action(state,q_table):#选动作

    state_actions=q_table.iloc[state,:]#将state所处的行赋值到state_actions

    if(np.random.uniform()>EPSILON)or((state_actions==0).all()):#0%进行随机选择(初始值为0也是随机选择),90%选择q-table中最大的值

        action_name=np.random.choice(ACTIONS)

    else:#act greedy

        action_name=state_actions.idxmax()

    return action_name

# 环境反馈

def get_env_feedback(S,A):

    if A=='right':#move right

        if S==N_STATES-2:# -2是因为状态从0开始

            S_='terminal'#终止

            R=1

        else:

            S_=S+1

            R=0

    else:#move left

        R=0

        if S==0:

            S_=S #reach the wall

        else:

            S_=S-1

    return S_,R

    # 没必要仔细看下边这个定义的函数

def update_env(S,episode,step_counter):

    #This is how environment update

    env_list=['-']*(N_STATES-1)+['T']#'------T'our environment

    if S=='terminal':

        interaction='Episode %s:total_steps=%s'%(episode+1,step_counter)

        print('\r{}'.format(interaction),end='')

        time.sleep(2)

        print('\r                              ',end='')

    else:

        env_list[S]='o'

        interaction=''.join(env_list)

        print('\r{}'.format(interaction),end='')

        time.sleep(FRESH_TIME)

# 主循环

def rl():

    #main part of RL loop

    q_table=build_q_table(N_STATES,ACTIONS)#创建q-table

    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)#根据初始state选择动作

            S_,R=get_env_feedback(S,A)#take action&get next state and reward

            q_predict=q_table.loc[S,A]#估计值

            if S_ !='terminal':

                q_target=R+LAMBDA*q_table.iloc[S_,:].max()#next state is not terminal,真实值

            else:

                q_target=R#next state is teminal

                is_terminated=True #terminate this epsispde

            q_table.loc[S,A]+=ALPHA*(q_target-q_predict)#update

            S=S_#move to next state

            #update_env(S,episode,step_counter+1)

            update_env(S,episode,step_counter+1)

            step_counter+=1

    return q_table

if __name__=="__main__":

    q_table=rl()

    print('\r\nQ-table:\n')

    print(q_table)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值