RL-mofan

import numpy as np
import pandas as pd
import time

N_STATES = 6
ACTIONS = ['left', 'right']

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

def choose_action(state, q_table):
    state_actions = q_table.loc[state, :]
    if (np.random.uniform() > 0.9) or ((state_actions == 0).all()):
        action_name = np.random.choice(ACTIONS)
    else:
        action_name = state_actions.argmax()
    return action_name

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):
    env_list = ['-']*(N_STATES-1) + ['T']
    if S == 'terminal':
        print('\r{}'.format('-----o'), end='')
        time.sleep(0.5)
    else:
        env_list[S] = 'o'
        interaction = ''.join(env_list)
        print('\r{}'.format(interaction), end='')
        time.sleep(0.1)

def rl():
    q_table = build_q_table(N_STATES, ACTIONS)
    for _ in range(13):
        S = 0
        is_terminated = False
        update_env(S)
        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 + 0.9 * q_table.iloc[S_, :].max()
            else:
                q_target = R 
                is_terminated = True
            q_table.loc[S, A] += 0.1 * (q_target - q_predict)
            S = S_
            update_env(S)
    return q_table

if __name__ == "__main__":
    q_table = rl()
    print('\r\nQ-table:\n')
    print(q_table)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值