Q_learningの紹介と例

1.アルゴリズムのアイデア

QLearningは、強化学習アルゴリズムの値ベースのアルゴリズムです。Qは、特定の環境で、Q(状態、アクション)が特定の時間にs状態(s∈S)でアクションa(a∈A)を実行することを意味します。収益の獲得を期待するために、環境はエージェントのアクションに応じて対応する報酬r(スコア)をフィードバックします。

したがって、アルゴリズムの主なアイデアは、Q値を格納するための状態とアクションのQテーブルを作成し、Q値に基づいて最大の利益を得ることができるアクションを選択することです。

ここに写真の説明を挿入

2.例とコアフォーミュラ

ここに写真の説明を挿入
:開始点から開始して終了円に到達することは勝利-追加ポイントであり、三角形は敗北-控除です。最初のラウンドはランダムウォークで、スコアが出るまで、高い確率で続きます。

  • エージェントキューブ
  • 環境(環境)-ここではtk形式でシミュレートされています
  • 報酬-アクションの報酬と罰のスコア
  • アクション-上、下、左、右

問題は、マルコフの決定プロセスに抽象化することができます。

各グリッドは状態sと見なされます
。q(a | s)は
s状態でアクションaを実行する確率です。p(s '| s、a)は、s状態で次の状態s'に遷移するアクションを選択する確率です。
R(s '| s、a)は、アクションaを実行し、状態sでs'に転送することの報酬を表します。

目標は、最大の報酬を得るために最後に到達できる戦略を見つけ、最大の報酬式を取得することです。
ここに写真の説明を挿入

Qlearningの主な利点は、时间差分法オフライン学習TD(モンテカルロと動的プログラミングの組み合わせ)を使用することと、マルコフプロセスの最適な戦略を解決するためにベルマン方程式を使用することです。
参照:時差法

コアフォーミュラ
ここに写真の説明を挿入

更新公式
ここに写真の説明を挿入

コアコード:

import numpy as np
import random
from environment import Env
from collections import defaultdict


class QLearningAgent:
    def __init__(self, actions):
        # actions = [0, 1, 2, 3]
        self.actions = actions      # 动作
        self.learning_rate = 0.01   # 学习率
        self.discount_factor = 0.9  # 折扣因子
        self.epsilon = 0.1          # [ˈepsɪlɒn]
        self.q_table = defaultdict(lambda: [0.0, 0.0, 0.0, 0.0])

    # 采样 <s, a, r, s'>
    def learn(self, state, action, reward, next_state):
        current_q = self.q_table[state][action]
        # 贝尔曼方程更新
        new_q = reward + self.discount_factor * max(self.q_table[next_state])
        self.q_table[state][action] += self.learning_rate * (new_q - current_q)

    # 从Q-table中选取动作
    def get_action(self, state):
        if np.random.rand() < self.epsilon:
            # 贪婪策略随机探索动作
            action = np.random.choice(self.actions)
        else:
            # 从q表中选择
            state_action = self.q_table[state]
            action = self.arg_max(state_action)  # 选组最大效益动作
        return action
        
 	# 选取最大分数
    @staticmethod
    def arg_max(state_action):
        max_index_list = []
        max_value = state_action[0]
        for index, value in enumerate(state_action):
            if value > max_value:
                max_index_list.clear()
                max_value = value
                max_index_list.append(index)
            elif value == max_value:
                max_index_list.append(index)
        return random.choice(max_index_list)


if __name__ == "__main__":
    env = Env()     # 初始化tk窗口
    agent = QLearningAgent(actions=list(range(env.n_actions)))  # 初始化物体实例
    for episode in range(1000):
        state = env.reset()
        while True:
            env.render()
            # agent产生动作
            action = agent.get_action(str(state))
            next_state, reward, done = env.step(action)
            # 更新Q表 -- 核心更新公式
            agent.learn(str(state), action, reward, str(next_state))
            state = next_state
            env.print_value_all(agent.q_table)
            # 当到达终点就终止游戏开始新一轮训练
            if done:
                break


別のQ学習例:ゆるい鳥(フライングバード)
Q学習例:ゆるい鳥
ここに写真の説明を挿入

おすすめ

転載: blog.csdn.net/GeniusXYT/article/details/103007836