リソースのダウンロード アドレス: https://download.csdn.net/download/sheziqiong/85631466
トピックの背景
1.1 実験テーマ
この実験では、ロボットの自動迷路を完成させるために、基本探索アルゴリズムとDeep QLearningアルゴリズムを使用する必要があります。
図1 地図(サイズ10)
上の図に示すように、左上隅の赤い楕円はロボットの開始点と初期位置の両方であり、右下隅の緑色の四角形は出口です。
ゲームのルールは、スタート地点からスタートし、入り組んだ迷路を抜けて目標地点(出口)に到達することです。
-
任意の位置で実行できるアクションには、 go up
'u'
、 go right'r'
、 go down'd'
、 go leftが含まれます'l'
。 -
アクションを実行すると、状況に応じて異なる報酬が得られますが、具体的には以下のような場合があります。
- 壁に当たる
- 出口まで歩いてください
- その他の場合
-
ロボットが迷路の出口に自動的に移動できるように、基本探索アルゴリズムとDeep QLearning アルゴリズムに基づいてロボットを実装する必要があります。
1.2 実験要件
- Python言語を使用します。
- 基本的な検索アルゴリズムを使用して、ロボットの迷路を完成させます。
- Deep QLearningアルゴリズムを使用してロボット迷路を完成させます。
- アルゴリズム部分は独自に実装する必要があり、既製のパッケージ、ツール、インターフェイスは使用できません。
1.3 実験では重要な Python パッケージを使用します
import os
import random
import numpy as np
import torch
2 つの迷路の紹介
迷路クラスMazeを使用すると、迷路をランダムに作成できます。
- Maze(maze_size=size)を使用して、サイズ * サイズの迷路をランダムに生成します。
- print()関数を使用して迷路のサイズを出力し、迷路マップを描画します
- 赤丸はロボットの初期位置です
- 緑色の四角が迷路の出口位置です
図 2 gif マップ (サイズ 10)
Maze クラスの重要なメンバー メソッドは次のとおりです。
- sense_robot() : 迷路内のロボットの現在位置を取得します。
return: 迷路内のロボットの現在位置。
- move_robot(direction) : 入力された方向に従ってデフォルトのロボットを移動し、方向が不正な場合はエラー メッセージを返します。
方向: 移動方向。例: "u"、有効な値: ['u'、'r'、'd'、'l']
return: アクションの実行に対する報酬値
- can_move_actions(position): 現在のロボットが移動できる方向を取得します。
位置: 迷路内の任意の座標点
return: この時点で実行できるアクション (例: ['u','r','d'])
- is_hit_wall(self, location, Direction): 移動方向が壁に当たるかどうかを判定します。
location、direction: 現在の場所と移動方向 ((0,0)、「u」など)
return: True (壁にぶつかる) / False (壁にぶつからない)
- draw_maze(): 現在の迷路を描画します
3 つのアルゴリズムの概要
3.1 深さ優先アルゴリズム
アルゴリズム固有の手順:
-
グラフ内の頂点V i V_iを選択しますV私は開始点として、頂点にアクセスしてマークを付けます。
-
Vi を現在の頂点として、V i V_iを順番に検索します。V私は隣接する各点V j V_jVj、V j V_jの場合Vj訪問していない場合は、隣接する点V j V_jを訪問してマークします。Vj、V j V_jの場合Vjにアクセスした場合は、V i V_iを検索しますV私は; の次に隣接する点。
-
Vj V_jありVj現在の頂点について、グラフとV i V_iが得られるまで、前のステップを繰り返します。V私は相互リンクされたパスを持つ頂点はすべて訪問されます。
-
グラフ内にまだ訪問されていない頂点がある場合 (非接続の場合)、グラフ内の未訪問の頂点を開始点として取り、グラフ内のすべての頂点が訪問されるまで上記のプロセスを繰り返すことができます。 。
時間計算量:
各頂点の近傍を見つけるのに必要な時間はO ( n 2 ) O(n^2)です。O ( n2 )、n は頂点の数、アルゴリズムの時間計算量はO ( n 2 ) O(n^2)O ( n2 )
3.2 強化学習 QLearning アルゴリズム
Q-Learning は値反復アルゴリズムです。ポリシー反復 (ポリシー反復) アルゴリズムとは異なり、値反復アルゴリズムは、各「状態」または「状態アクション」の値 (Value) またはユーティリティ (Utility) を計算し、この値の最大化を試みます。したがって、各状態値の正確な推定が値反復アルゴリズムの中核となります。通常、アクションを最大化することによる長期的な報酬が考慮されます。つまり、現在のアクションによってもたらされる報酬だけでなく、アクションの長期的な報酬も考慮されます。
3.2.1 Q値の計算と反復
Q 学習アルゴリズムは、状態 (state) とアクション (action) を Q_table テーブルに構築して Q 値を保存します。Q テーブルの行は状態 (state) を表し、列はアクション (action) を表します。
Q-Learningアルゴリズムでは、この長期報酬が Q 値として記録され、各「状態-アクション」の Q 値が考慮されます。具体的には、その計算式は次のとおりです: Q ( st , a ) = R t
+ 1 + γ × max a Q ( a , st + 1 ) Q(s_{t},a) = R_{t+1} + \gamma \times\max_a Q(a,s_{t+1})Q ( sた、)_=Rt + 1+c×あるマックスQ ( 、_st + 1)
つまり、現在の「状態アクション」( st , a ) (s_{t},a)の場合( sた、a )、アクションaa環境後の報酬R t + 1 R_{t+1}Rt + 1、アクションaaを実行しますa はst+1 s_{t+1}に達しますst + 1その後、任意のアクションを実行することで得られる最大の Q 値max a Q ( a , st + 1 ) \max_a Q(a,s_{t+1})最大あQ ( 、_st + 1),γ \ガンマγは割引係数です。
新しい Q 値が計算された後、Q テーブルを更新するより保守的な方法、つまりスラック変数alpha alphaの導入が一般に使用されます。a l p h aは次の式に従って更新され、Q テーブルの反復変更がより緩やかになります。
Q ( st , a ) = ( 1 − α ) × Q ( st , a ) + α × ( R t + 1 + γ × max a Q ( a , st + 1 ) ) Q(s_{t},a ) = (1-\alpha) \times Q(s_{t},a) + \alpha \times(R_{t+1} + \gamma \times\max_a Q(a,s_{t+1}))Q ( sた、)_=( 1−)_×Q ( sた、)_+ある×( Rt + 1+c×あるマックスQ ( 、_st + 1) )
3.2.2 ロボットの動作の選択
強化学習において、探索・活用問題は非常に重要な問題です。具体的には、上記の定義に従って、ロボットは長期的な報酬を最大化するために毎回最適な決定を選択するよう最善を尽くします。しかし、そうすることには次のような欠点があります。
- 初期学習ではQ値が正確ではないため、この時のQ値に従って選択すると間違いの原因となります。
- 一定期間学習した後、ロボットのルートは比較的固定されるため、ロボットは環境を効果的に探索できません。
したがって、上記の問題を解決し、ロボットの探索を向上させる方法が必要です。通常は、 epsilon-greedyアルゴリズムが使用されます。
- ロボットが行動を選択する際、その行動は一部の確率でランダムに選択され、また一部の確率で最適なQ値に応じて行動が選択されます。
- 同時に、ランダムなアクションが選択される確率は、トレーニング プロセスとともに徐々に減少するはずです。
3.2.3 Q-Learning アルゴリズムの学習プロセス
3.2.4 ロボットクラス
この割り当てではQRobotfrom QRobot import QRobot
クラスが提供され、インポートで使用できるQ テーブルの反復とロボット アクションの選択戦略を実装します。
QRobot クラスのコアメンバーメソッド
- sense_state(): ロボットの現在位置を取得します。
return: ロボットの位置座標 (0, 0) など
- current_state_valid_actions(): 現在のロボットが合法的に移動できるアクションを取得します
return: 現在合法的なアクションのリスト (例: ['u','r'])
- train_update():トレーニング状態でQLearning アルゴリズム戦略に従ってアクションを実行します。
return: 現在選択されているアクション、および現在のアクションの実行に対する報酬 (例: 'u'、-1)
- test_update():テスト状態でQLearning アルゴリズム戦略に従ってアクションを実行します。
return: 現在選択されているアクション、および現在のアクションの実行によって取得される戻り値 (例: 'u'、-1)
- リセット()
return: 迷路内のロボットの位置をリセットします。
3.2.5 ランナークラス
QRobotクラスは、 QLearningアルゴリズムの Q 値の反復とアクション選択戦略を実装します。迷路を自動歩行するロボットのトレーニング プロセス中は、 QLearningアルゴリズムを継続的に使用して Q 値テーブルを繰り返し更新し、「最適な」状態を達成する必要があるため、ロボットのトレーニングと視覚化のためにクラスRunnerがパッケージ化されています。輸入経由で入手可能from Runner import Runner
。
Runner クラスのコア メンバー メソッド:
- run_training(training_epoch, training_per_epoch=150): ロボットをトレーニングし、Q テーブルを常に更新し、トレーニング結果をメンバー変数 train_robot_record に保存します。
training_epoch、training_per_epoch: トレーニングの合計回数、ロボットが毎回移動する最大ステップ数
-
run_testing(): ロボットが迷路から抜け出せるかどうかをテストします。
-
generate_gif(filename): トレーニング結果を指定された gif 画像に出力します
filename: 正当なファイル パス。ファイル名
.gif
には
- Lot_results(): トレーニング プロセス中の指標をグラフで表示します: 成功時間、累積報酬、エポックごとの実行時間
3.3 DQN
DQN アルゴリズムは、ニューラル ネットワークを使用して値関数を近似します。アルゴリズムのブロック図は次のとおりです。
今回の実験では、提供したニューラルネットワークを用いて4つのアクションの評価点を予測し、同時に出力します。
ReplayDataSet クラスのコア メンバー メソッド
- add(self, state, action_index, award, next_state, is_terminal) トレーニング データを追加します
状態: 現在のロボットの位置
action_index: アクションを実行するインデックスを選択します
報酬: アクションの実行に対する報酬
next_state: アクション実行後のロボットの位置
is_terminal: ロボットが終端ノードに到達したかどうか (端に到達したか、壁にぶつかったか)
- random_sample(self,batch_size): データセットから固定のbatch_sizeデータをランダムに抽出します。
batch_size: 整数。データセット内のデータ数を超えることはできません。
- build_full_view(self, maze): チートを開いて全体ビューを取得します
maze: Maze クラスでインスタンス化されたオブジェクト
4 つのソリューション結果
4.1 深さ優先
深さ優先検索アルゴリズムを作成してテストし、スタックを使用してレイヤーごとに反復し、最終的にパスを検索します。主なプロセスは、エントリ ノードをルート ノードとして使用し、そのノードが探索されたかどうか、子ノードが存在するかどうかを確認し、条件が満たされている場合はノードが展開され、そのノードの子ノードが存在するかどうかを確認します。順番にスタックにプッシュされます。ノードが探索されたが、そのノードがエンドポイントではなく、展開できる子ノードがない場合は、このポイントをスタックからポップし、エンドポイントが見つかるまでループで動作します。
テスト結果は次のとおりです。
- の場合
maze_size=5
、基本的な検索アルゴリズムを実行すると、最終結果は次のようになります。
搜索出的路径: ['r', 'd', 'r', 'd', 'd', 'r', 'r', 'd']
恭喜你,到达了目标点
Maze of size (5, 5)
図3 基本検索マップ(size5)
- の場合
maze_size=10
、基本的な検索アルゴリズムを実行すると、最終結果は次のようになります。
搜索出的路径: ['r', 'r', 'r', 'r', 'r', 'r', 'r', 'd', 'r', 'd', 'd', 'd', 'r', 'd', 'd', 'd', 'l', 'd', 'd', 'r']
恭喜你,到达了目标点
Maze of size (10, 10)
図4 基本検索マップ(size10)
- の場合
maze_size=20
、基本的な検索アルゴリズムを実行すると、最終結果は次のようになります。
搜索出的路径: ['d', 'r', 'u', 'r', 'r', 'r', 'r', 'd', 'r', 'd', 'r', 'r', 'r', 'r', 'd', 'd', 'r', 'd', 'd', 'd', 'd', 'r', 'r', 'r', 'r', 'r', 'd', 'r', 'r', 'd', 'r', 'd', 'd', 'l', 'l', 'd', 'd', 'd', 'd', 'd', 'r', 'd', 'd', 'r']
恭喜你,到达了目标点
Maze of size (20, 20)
図5 基本検索マップ(サイズ20)
コードの一部は次のとおりです。
def myDFS(maze):
"""
对迷宫进行深度优先搜索
:param maze: 待搜索的maze对象
"""
start = maze.sense_robot()
root = SearchTree(loc=start)
queue = [root] # 节点堆栈,用于层次遍历
h, w, _ = maze.maze_data.shape
is_visit_m = np.zeros((h, w), dtype=np.int) # 标记迷宫的各个位置是否被访问过
path = [] # 记录路径
peek = 0
while True:
current_node = queue[peek] # 栈顶元素作为当前节点
#is_visit_m[current_node.loc] = 1 # 标记当前节点位置已访问
if current_node.loc == maze.destination: # 到达目标点
path = back_propagation(current_node)
break
if current_node.is_leaf() and is_visit_m[current_node.loc] == 0: # 如果该点存在叶子节点且未拓展
is_visit_m[current_node.loc] = 1 # 标记该点已拓展
child_number = expand(maze, is_visit_m, current_node)
peek+=child_number # 开展一些列入栈操作
for child in current_node.children:
queue.append(child) # 叶子节点入栈
else:
queue.pop(peek) # 如果无路可走则出栈
peek-=1
return path
4.2 Qラーニング
アルゴリズムの学習では、まずロボットの現在位置を読み取り、現在の状態を Q 値テーブルに追加しますが、現在の状態がすでにテーブルに存在する場合は、繰り返し追加する必要はありません。その後、生成されたロボットはアクションを実行し、マップ報酬値を返し、ロボットの現在位置を見つける必要があります。次に、Q 値テーブルを再度確認して更新し、アクションがランダムに選択される可能性を軽減します。
QLearningアルゴリズムの実装プロセスでは、主に Q 値テーブルの計算更新が修正および調整され、調整された Q 値テーブルは、実行時のパフォーマンスが優れ、計算速度が速く、精度が高く、安定性が高いです。次に、アクションがランダムに選択される確率の減衰率が調整されます。減衰速度が遅すぎるとランダム性が強すぎて間接的に報酬の効果が弱まってしまうことがテスト中に判明したため、調整後減衰速度 0.5 が優れていることがわかりました。そして安定した価値。
コードの一部は次のとおりです。
def train_update(self):
"""
以训练状态选择动作,并更新相关参数
:return :action, reward 如:"u", -1
"""
self.state = self.maze.sense_robot() # 获取机器人当初所处迷宫位置
# 检索Q表,如果当前状态不存在则添加进入Q表
if self.state not in self.q_table:
self.q_table[self.state] = {
a: 0.0 for a in self.valid_action}
action = random.choice(self.valid_action) if random.random() < self.epsilon else max(self.q_table[self.state], key=self.q_table[self.state].get) # action为机器人选择的动作
reward = self.maze.move_robot(action) # 以给定的方向移动机器人,reward为迷宫返回的奖励值
next_state = self.maze.sense_robot() # 获取机器人执行指令后所处的位置
# 检索Q表,如果当前的next_state不存在则添加进入Q表
if next_state not in self.q_table:
self.q_table[next_state] = {
a: 0.0 for a in self.valid_action}
# 更新 Q 值表
current_r = self.q_table[self.state][action]
update_r = reward + self.gamma * float(max(self.q_table[next_state].values()))
self.q_table[self.state][action] = self.alpha * self.q_table[self.state][action] +(1 - self.alpha) * (update_r - current_r)
self.epsilon *= 0.5 # 衰减随机选择动作的可能性
return action, reward
テスト結果は次のとおりです。
- 強化学習検索アルゴリズムを実行すると
maze_size=3
、最終結果は次のようになります。
図6 強化学習検索GIFマップ(サイズ3)
- 強化学習検索アルゴリズムを実行すると
maze_size=5
、最終結果は次のようになります。
図 8 強化学習検索 gif マップ (サイズ 5)
図9 訓練結果
- 強化学習検索アルゴリズムを実行すると
maze_size=10
、最終結果は次のようになります。
図 10 強化学習検索 gif マップ (サイズ 10)
図 11 トレーニング結果
- 強化学習検索アルゴリズムを実行すると
maze_size=11
、最終結果は次のようになります。
図 12 強化学習検索 gif マップ (サイズ 11)
図 13 トレーニング結果
テスト後、強化学習探索アルゴリズムは迷路から抜け出す道をすぐに導き出すことができ、トレーニング ラウンドの数が増えるにつれて成功率は徐々に上昇します。トレーニングラウンドの数が十分であれば、最終的な正解率は 100% に達する可能性があります。
4.3 DQN
Q-Learningに基づき、ニューラルネットワークを用いて意思決定後の行動に対する評価点を推定します。これをQ-Learningの対応する部分のニューラル ネットワークの出力に置き換えるだけです。
テスト結果は次のとおりです。
-
の場合
maze_size=3
、DQNアルゴリズムを実行すると、最終結果は次のようになります。図 14 トレーニング結果
-
の場合
maze_size=5
、DQNアルゴリズムを実行すると、最終結果は次のようになります。図 15 トレーニング結果
-
の場合
maze_size=10
、DQNアルゴリズムを実行すると、最終結果は次のようになります。図 16 トレーニング結果
4.4 結果テストの提出
4.4.1 基本的な検索アルゴリズムのテスト
図 17 基本的な検索アルゴリズムのパス
0秒
4.4.2 強化学習アルゴリズム (初級)
図18 強化学習アルゴリズム(一次)
0秒
4.4.3 強化学習アルゴリズム (中級)
図 19 強化学習アルゴリズム (中級)
0秒
4.4.4 強化学習アルゴリズム (上級)
図20 強化学習アルゴリズム(上級)
0秒
4.4.5 DQN アルゴリズム (プライマリ)
図 21 DQN アルゴリズム (プライマリ)
2秒
4.4.6 DQN アルゴリズム (中級)
図22 DQNアルゴリズム(中級)
3秒
4.4.7 DQN アルゴリズム (上級)
図 23 DQN アルゴリズム (上級)
リソースのダウンロード アドレス: https://download.csdn.net/download/sheziqiong/85631466