いくつかの命令は、参照します
https://www.cnblogs.com/hhh5460/p/10134018.html
http://baijiahao.baidu.com/s?id=1597978859962737001&wfr=spider&for=pc
https://www.jianshu.com/p/29db50000e3f
問題が提起します
自走式のパスを達成し、パスを設計するために、障害物を回避しようとするために。
図示のように、図中の任意のグリッド内のロボットは、それを明確にする方法を取り巻く環境、最終的な目標位置。
ここでは、実行結果は次のとおりです。
識別位置として次のように最初にそれらの番号が付けられています。
そして、次のように最終的に更新されたデータの更新フォームのためのQ-Learningの報酬の仕組みを、使用しました:
最終的に選択された最大値テーブルによれば、実際のロボットの経路を選択したときの位置24に来ると、赤い正方形を避けます。
最初の左に最大値は3で下方最大値を選択し、最初の3つを選択する位置、8、次いで下方選択、等に、経路選択の最終完成として4。そして、この選択は、Q学習の実装を使用することです。
Q学習のアイデア
報酬メカニズム
それはパスを完了するために様々な方法を選択し、開始点から開始したときに奇妙な環境では、最初のロボットの方向にランダムに選択されます。
ロボットは赤い四角を打ったときしかし、いくつかのロボットが罰位置を避けることができます、その後の後、罰します。
ロボットは青色のボックス、または報酬を押すと、繰り返した後、ロボットは青い箱の場所に実行する傾向があります。
具体公式
報酬と罰の表現は、それの値で表されているのプロセスを完了します。
まず、テーブルは、このテーブルが空である以下、ある空のテーブルであり、すべての値が0です。
各操作の後、報酬と罰に応じて、テーブルを更新するには、学習プロセスを完了します。実装プロセスでは、報酬と罰をテーブルにコンパイルされます。図1と同様の表形式。
報酬と罰の更新式は次のとおりです。
ベルマン方程式:
これは現在のQテーブルを示し、図25は、4つの形式の行です。学習率を表し、彼は表現報酬と罰は次の動作になり、その値が比較的大きい場合には、遠い将来に報いるために、より傾斜され、ここで、貪欲率を表し式です。
可能なステップの数を()増減といくつかのケースでは、このような貪欲因子としてテキストなし、固定フォーマットの多くのページで(式。
推奨読書:
https://www.jianshu.com/p/29db50000e3f
数のQテーブルを更新するプロセスを含むなど、。
コードの実装 - 準備
私が言っているコードが前に持っていたということです。https://github.com/MorvanZhou/Reinforcement-learning-with-tensorflow/blob/master/contents/1_command_line_reinforcement_learning/treasure_on_right.py
説明するために彼のコード:https://morvanzhou.github.io/tutorials/machine-learning/reinforcement-learning/2-1-general-rl/
彼はどのように1次元に移動するロボットを実現するためのプログラムを設計しますが、障害を伴い、高いプログラミング能力を使用し、パスのプロセスを示していません。
この記事では、パスが示されているか、模範的な完全なアイデアに焦点を当てています。
ライブラリ関数、およびモデルの確立を、対応するインポート:
NPのようnumpyのインポート のPdなどの輸入パンダ インポート時
N_STATES = 25#2次元の世界の長さ [操作] = [ 'ダウン' '左'、 '右'、 'アップ'、]#使用可能なアクション EPSILON = 0.3#貪欲警察 ALPHA = 0.8#学習率 GAMMA = 0.9#割引因子 MAX_EPISODES = 100の#最大のエピソード FRESH_TIME = 1人の移動のための0.00001#新鮮な時間
Qは、関数テーブルを作成します。
デフ(n_states、アクション)build_q_table: テーブル= pd.DataFrame( np.zeros((n_states、LEN(アクション)))、#q_table初期値の 列=アクション、#アクションの名前 ) 戻りテーブル
関数の動作を選択します。
境界で一部ロボットが経路を選択することができない、またはテーブルのインデックスを超えたときに:選択プロセスの挙動は、そのような長い表現の使用は、発現させることです。。
場合貪欲係数が小さく、ランダム方式を使用する傾向、またはすべてのデータ・テーブルが最初に0、ランダム選択スキームの挙動である場合。
np.random.uniform()<時間= EPSILONは、最適解がQlearning行動の選択を完了するために選択された使用する場合、つまり、ロボットはこれまで未知の標的は欲を表していません。(役割の発現は、貪欲であり、方程式の係数の大きさは、反対の上にある場合)
DEF choose_action(状態、q_table): state_actions = q_table.iloc [状態:] もし(np.random.uniform()> EPSILON)または((state_actions == 0).ALL()):#行為非貪欲または状態アクション値を持たない 場合は状態== 0: ACTION_NAME = np.random.choice([ '右'、 'ダウン']) のelif状態> 0と状態<4: ACTION_NAME = np.random.choice([ '右」、 'ダウン'、 '左']) ELIF状態== 4: ACTION_NAME = np.random.choice([ '左'、 'ダウン']) ELIF状態== 5または状態== 15又は状態== 10 : ACTION_NAME = np.random.choice([ '右'、 'アップ'、 'ダウン']) ELIF状態== 9または状態== 14又は状態== 19: ACTION_NAME = np.random.choice([ '左'、 'アップ'、 'ダウン']) elifの状態== 20: ACTION_NAME = np.random.choice([ '右'、 'を']) のelif状態> 20と状態<24: ACTION_NAME = np.random.choice([ '右'、 'アップ'、 '左']) のelif状態== 24: ACTION_NAME = np.random.choice([ '左'、 'アップ']) 他: ACTION_NAME = np.random.choice(行動) 他:#行為貪欲 ACTION_NAME = state_actions.idxmax()#を置き換えるARGMAX ARGMAXはパンダの新しいバージョンで異なる機能を手段としてidxmaxする ACTION_NAMEを返します
式を報酬:
関数パラメータSは、状態(ステータス)を発現し、Aは、アクション(行動)、上下それぞれ0~3の挙動を表します。テーブルには、次の方向に導き、現在の状態での報酬や罰を与えます。
DEF get_init_feedback_table(S、A): タブ= np.ones((25.4)) タブ[8] [1] = - 10;タブ[4] [3] = - 10;タブ[14] [2] = -10 タブ[11] [1] = - 10;タブ[13] [0] = - 10;タブ[7] [3] = - 10;タブ[17] [2] = - 10 タブ[16] [ 0] = - 10;タブ[20] [2] = - 10;タブ[10] [3] = - 10。 タブ[18] [0] = - 10;タブ[16] [1] = - 10;タブ[22] [2] = - 1、タブ[12] [3] = - 10 タブ[23] [1] = 50;タブ[19] [3] 50 = リターンタブ[S、A]
報酬と罰を取得します。
この関数は、前記パラメータは、S、A、前掲、インセンティブ情報を取得するためのインセンティブで表される関数で呼び出されます。
状態S、最終結果、端部(終端)に沿って次のステップは、目標とタスクの完了を示す場合。それ以外の場合は、位置Sを更新
DEF(S、A)をget_env_feedback: アクション= { '左':0、 '右':1、 'アップ':2 'ダウン':3}。 R = get_init_feedback_table(S、アクション[A]) IF(Sの== 19とアクション[A] == 3)または(Sの== 23とアクション[A] == 1): S = '端末' 、Sを返しますR アクションなら[A] == 0: S- = 1 ELIFアクション[A] == 1: S + = 1 ELIFアクション[A] == 2: S- = 5 ほか: S + = 5 戻りS、R
コードの実装 - 研修を開始
Qは、最初の初期パスが0の位置にある設定され、その後、テーブルを初期化する(すなわち、位置0から開始し、各ロボットを言うことです)
トレーニングMAX_EPISODES前に反復回数が既に設定されています。
各世代におけるトレーニング処理において、(元のQを使用して、またはランダムテーブル)選択の行動、および行動および選択された現在位置に応じて、報酬と罰を取得する:S_、R
動作が起こることを約ない場合は、使用を時間の最終目的地に到達しません。
q_target = R + GAMMA * q_table.iloc [S_、:]。MAX() q_table.loc [S、A] + = ALPHA *(q_target - q_table.loc [S、A])
この2行は、更新Qテーブルを完了します。(コントロールベルマン方程式)
完了すると、終了したときに、次の世代を訓練開始。
DEF)(RL: #RLループの主要部 q_table = build_q_table(N_STATES、対応) の範囲内のエピソードのための(MAX_EPISODES): S = 0 is_terminated = Falseを is_terminatedないが: A = choose_action(S、q_table) S_、R = get_env_feedback (S、A)#テイクアクション&次の状態を取得し、報酬 = '端末の場合S_:!# 次の状態が端末でないMAX():q_target = R + GAMMA * q_table.iloc [S_、]。 :他 (プリント1) q_target = R#次の状態は端末である is_terminated =真#このエピソードを終了 #更新- q_table.loc [S、A] + = ALPHA *(q_table.loc [S、A] q_target) 次の状態にS = S_#移動 戻りq_table :もし__name__ == "__main__" q_table = RL() 印刷( '\ R \ NQ-テーブル:\ n') プリント(q_table)
効果 - 概要
実際には、最初と同じ効果は、適切なパラメータを調整するために、qは自然に影響を対応する最終出力テーブルです。
もちろん、それは貪欲係数はトレーニング時間に影響するで得ることができます。
すべてのコードは上記です。PyDevは、デバッグの日食を実行するために使用することができます。その効果は、テーブルの上にステップしませんでした