Q_learningに基づくトレジャーハンター

序文

このブログ投稿では、Q学習を使用して例を実装します。世界の右側には宝物があります。探検家が宝物を手に入れて甘さを味わう限り、彼は宝物を入手する方法を覚えています。未来。これは彼が強化学習で学んだ行動です。

-o-T
Tは宝物の場所、oは探検家の場所です

Q学習は、行動値(Q値)を記録する方法です。特定の状態のすべての行動には値Q(s、a)があります。つまりs状態の行動aの値はQ(s、a)です。 )S上記探検ゲームがあるでoを各位置探査における一方、2つの作用を行うことができ場所右/左、これはすべての可能探検です特定の場所s1で、エクスプローラーが持つことができる2つの動作a1 / a2 = left / rightを計算し、計算結果がQ(s1、a1)> Q(s1、a2)である場合、エクスプローラーはこれはQ学習行動選択の単純なルールです。

デフォルト値

今回必要なモジュールとパラメータの設定:

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.3    # 移动间隔时间

Qテーブル

表形式のQ学習では、すべてのQ値(動作値)をq_tableに配置する必要があり、q_tableを更新すると、彼の行動規範も更新されます.q_tableのインデックスは、対応するすべての状態(エクスプローラーの位置)であり、列は対応するアクションです(エクスプローラーの動作)。

def build_q_table(n_states, actions):
    table = pd.DataFrame(
        np.zeros((n_states, len(actions))),     # q_table 全 0 初始
        columns=actions,    # columns 对应的是行为名称
    )
    return table

# q_table:
"""
   left  right
0   0.0    0.0
1   0.0    0.0
2   0.0    0.0
3   0.0    0.0
4   0.0    0.0
5   0.0    0.0
"""

アクションを定義する

次に、探索者がどのように行動を選択するかを定義します。これは、イプシロングリーディを導入した概念です。初期段階では、ランダムな探索環境が固定の行動パターンよりも優れていることが多いため、これは経験を蓄積する段階でもあります。エクスプローラーはそれほど貪欲ではありません(貪欲)。したがって、EPSILONは貪欲の程度を制御するために使用される値です。EPSILONは探索時間とともに改善し続けることができます(ますます貪欲)が、この例では、EPSILON = 0.9を修正しました。 、90%の時間は最適な戦略を選択することであり、10%の時間は探索することです。

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

環境フィードバックS_、R

私たちが行動した後、環境は私たちの行動に関するフィードバック、次の状態(S_)、前の状態(S)でアクション(A)を実行することによって得られる報酬®もフィードバックする必要があります。ここで定義されるルールは、 o Tに移動すると、エクスプローラーは唯一の報酬、報酬値R = 1を取得し、それ以外の場合は報酬がありません。

def get_env_feedback(S, A):
    # This is how agent will interact with the environment
    if A == 'right':    # move right
        if S == N_STATES - 2:   # terminate
            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 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)

強化学習のメインループ

最も重要な場所はここです。定義したRLメソッドはすべてここに反映されます。次のチュートリアルでは、RLのさまざまなメソッドについて詳しく説明します。次のコンテンツをご覧ください。このセクションのコンテンツいいえ注意深く勉強する必要があります。
ここに画像の説明を挿入

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    # terminate this episode

            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)

参照

https://mofanpy.com/tutorials/machine-learning/reinforcement-learning/general-rl/

おすすめ

転載: blog.csdn.net/weixin_42990464/article/details/111880783