小例子

import numpy as np
import pandas as pd
import time

N_STATES=6 #1维世界的宽度
ACTIONS=['left','right'] #探索者的可用动作
EPSILON=0.9 #贪婪度 greedy
ALPHA=0.1 #学习率
GAMMA=0.9 #奖励递减值
MAX_EPISODES=13 #最大回合数
FRESH_TIME=0.001 #移动间隔时间


def build_q_table(n_states,actions):
    table=pd.DataFrame(
        np.zeros((n_states,len(actions))),
        columns=actions
    )
    return table

#在某个state地点,选择行为
def choose_action(state,q_table):
    state_actions=q_table.iloc[state,:] #选出这个state的所有行为
    if (np.random.uniform()>EPSILON) or (state_actions.all()==0):
        action_name=np.random.choice(ACTIONS)
    else:
        action_name=state_actions.argmax()  #贪婪模式
    return action_name


#环境反馈S_,R
#做出行为后,环境也要给我们行为一个反馈
def get_env_feedback(S,A):
    if A =='right':
        if S==N_STATES -2:
            S_='terminal'
            R=1
        else:
            S_=S+1
            R=0
    else:
        R=0
        if S==0:
            S_=S
        else:
            S_=S-1

    return S_,R

#环境更新
def update_env(S, episode, step_counter):
    # This is how environment be updated
    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():
    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) #选择行为
            S_,R=get_env_feedback(S,A)  #实施行为并得到环境的反馈
            q_predict=q_table.loc[S,A]   #估算的状态行为值
            if S_ !='terminal':
                q_target=R+ GAMMA * q_table.iloc[S_, :].max() #实际的(状态-行为)值(回合没结束)
            else:
                q_target=R
                is_terminated=True
            q_table.loc[S,A]+=ALPHA * (q_target - q_predict)  #q_table更新
            S=S_   #探索者移动到下一个state
            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)


Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐