MATLAB Reinforcement Learning Toolbox(5)カスタム関数を使用してMATLAB環境を作成する

この例は、MATLAB®でカスタム動的関数を提供して環境を作成する方法を示しています。

rlFunctionEnv関数を使用すると、MATLAB集中学習環境のステップ関数とリセット関数を、観測仕様、アクション仕様、およびユーザー定義から作成できます。次に、この環境で強化学習エージェントをトレーニングできます。この例では、必要なステップおよびリセット機能が定義されています。

カスタム関数を使用して環境を作成すると、動的なダイナミクスが少ない環境、特別な視覚化要件のない環境、またはサードパーティのライブラリインターフェイスがある環境で非常に役立ちます。より複雑な環境の場合は、テンプレートクラスを使用して環境オブジェクトを作成できます。

カートポールMATLAB環境

ロッド環境は、トロリーのドライブレスジョイントに取り付けられたロッドであり、摩擦のないトラックに沿って移動します。トレーニングの目標は、振り子が倒れることなく直立することです。
ここに画像の説明を挿入します
この環境の場合:

  1. バランス振り子の上方位置はθ\ thetaです。θラジアン、下向きの吊り下げ位置はπ\ piですπラジアン。
  2. 振り子は直立し始め、初期角度は-0.5〜0.05です。
  3. 環境へのエージェントの力信号は10〜10Nです。
  4. トロリーの位置、トロリーの速度、スイング角度、および環境から派生したスイング角度を観察します。
  5. ロッドが垂直から12度を超えるか、キャディが元の位置から2.4メートル以上移動すると、ロッドは終了します。
  6. 柱が直立するたびに、報酬は+1になります。振り子が落ちると、10ポイントがペナルティになります。

観察と行動の規範

トロリーの位置、トロリーの速度、スイング角度、および環境から派生したスイング角度を観察します。

ObservationInfo = rlNumericSpec([4 1]);
ObservationInfo.Name = 'CartPole States';
ObservationInfo.Description = 'x, dx, theta, dtheta';

環境には、エージェントが車に2つの可能な力の値(-10または10N)のいずれかを適用できる個別のアクションスペースがあります。

ActionInfo = rlFiniteSetSpec([-10 10]);
ActionInfo.Name = 'CartPole Action';

関数名で環境を作成する

カスタム環境を定義するには、最初にカスタムステップとリセット機能を指定します。これらの関数は、現在の作業フォルダーまたはMATLABパスにある必要があります。

カスタムリセット機能は、環境のデフォルト状態を設定します。この関数には、次の署名が必要です。

 [InitialObservation,LoggedSignals] = myResetFunction()

表示さ
ここに画像の説明を挿入します
れる矢印をクリックして、サンプルフォルダー、ファイルに移動するか、独自の.m
ここに画像の説明を挿入します
作成します。環境条件など、あるステップから次のステップに情報を伝達するには、LoggedSignalsを使用します。この例では、LoggedSignalsには、車のロッド環境の状態(トロリーの位置と速度、スイング角度、スイング角度の導関数)が含まれています。リセット機能は、環境がリセットされるたびにカートの角度をランダムな値に設定します。

この例では、myResetFunction.mで定義されているカスタムリセット関数を使用します。

type myResetFunction.m

次のコンテンツが表示されます

function [InitialObservation、LoggedSignal] = myResetFunction()
%関数をリセットして、カスタムカートポール環境をランダムな
%初期状態にします。
%シータ(ランダム化)
T0 = 2 * 0.05 * rand()-0.05;
%Thetadot
Td0 = 0;
%X
X0 = 0;
%Xdot
Xd0 = 0;
%初期環境状態変数をログ信号として返します。
LoggedSignal.State = [X0; Xd0; T0; Td0];
InitialObservation = LoggedSignal.State;
終わり

カスタムステップ関数は、指定された操作に従って環境が次の状態に進む方法を指定します。この関数には、次の署名が必要です。

[Observation,Reward,IsDone,LoggedSignals] = myStepFunction(Action,LoggedSignals)

新しい状態を取得するために、環境は動的方程式をLoggedSignalsに格納されている現在の状態に適用します。これは、微分方程式に初期条件を与えるのと似ています。新しい状態はLoggedSignalsに保存され、出力として返されます。

この例では、myStepFunction.mで定義されているカスタムステップ関数を使用します。実装を簡素化するために、この関数は、カートの品質など、すべてのタイムステップで実行される物理定数を再定義します。

type myStepFunction.m

次のコンテンツが表示されます

function [NextObs、Reward、IsDone、LoggedSignals] = myStepFunction(Action、LoggedSignals)
%関数の
名前の場合のカートポール環境を構築するためのカスタムステップ関数
%%
この関数は、指定されたアクションを環境に適用し、
1つのシミュレーションステップのシステムダイナミクスを評価します。
%環境定数を定義します。
%重力による加速度(m / s ^ 2)
重力= 9.8;
カートの質量%
CartMass = 1.0;
%極の
質量PoleMass = 0.1;
%ポールの長さの半分
HalfPoleLength = 0.5;
%入力が適用できる最大力
MaxForce = 10;
%サンプル時間
Ts = 0.02;
エピソードを失敗させる%
極角AngleThreshold = 12 * pi / 180;
エピソードを失敗させるカートの距離%
DisplacementThreshold = 2.4;
%各タイムステップの報酬カートポールのバランスが取れている
RewardForNotFalling = 1;
カートポールのバランスが
取れていない場合のペナルティ%PenaltyForFalling = -10;
%指定されたアクションが有効かどうかを確認します。
if〜ismember(Action、[-MaxForce MaxForce])
error( 'アクションは、左に移動する場合は%g、右に移動する場合は%gである必要があります。'、…
-MaxForce、MaxForce);
終了
力=アクション;
%ログに記録された信号から状態ベクトルを解凍します。
状態= LoggedSignals.State;
XDot = State(2);
シータ=状態(3);
ThetaDot = State(4);
%再計算を回避するためのキャッシュ。
CosTheta = cos(Theta);
SinTheta = sin(Theta);
SystemMass = CartMass + PoleMass;
temp =(Force + PoleMass HalfPoleLength ThetaDot ThetaDot SinTheta)/ SystemMass;
%運動方程式を適用します。
ThetaDotDot =(Gravity SinTheta-CosTheta temp)/…
(HalfPoleLength *(4.0 / 3.0-PoleMass CosTheta CosTheta / SystemMass));
XDotDot = temp-PoleMass HalfPoleLength ThetaDotDot CosTheta / SystemMass;
%オイラー統合を実行します。
LoggedSignals.State = State + Ts。
[XDot; XDotDot; ThetaDot; ThetaDotDot];
%状態を観測に変換します。
NextObs = LoggedSignals.State;
%端末の状態を確認してください。
X = NextObs(1);
シータ= NextObs(3);
IsDone = abs(X)> DisplacementThreshold || abs(Theta)> AngleThreshold;
%報酬を得る。
〜IsDone
Reward = RewardForNotFallingの場合;
else
Reward = PenaltyForFalling;
エンド
エンド

定義された観測仕様、操作仕様、関数名を使用して、カスタマイズされた環境を構築します。

env = rlFunctionEnv(ObservationInfo,ActionInfo,'myStepFunction','myResetFunction');

環境の動作を確認するために、環境の作成後にrlFunctionEnvはvalidateEnvironmentを自動的に呼び出します。

関数ハンドルを使用して環境を作成する

最低限必要なセットを超える追加の入力パラメーターを使用してカスタム関数を定義することもできます。たとえば、追加のパラメーターarg1とarg2をstep関数とrest関数に渡すには、次のコードを使用します。

[InitialObservation,LoggedSignals] = myResetFunction(arg1,arg2)
[Observation,Reward,IsDone,LoggedSignals] = myStepFunction(Action,LoggedSignals,arg1,arg2)

rlFunctionEnvでこれらの関数を使用するには、無名関数ハンドルを使用する必要があります。

ResetHandle = @()myResetFunction(arg1,arg2);
StepHandle = @(Action,LoggedSignals) myStepFunction(Action,LoggedSignals,arg1,arg2);

他の入力パラメーターを使用すると、より効率的な環境実装を作成できます。たとえば、myStepFunction2.mには、環境定数を入力パラメーター(envConstants)として受け取るカスタムステップ関数が含まれています。このように、この関数は、各ステップで環境定数を再定義することを回避します。

type myStepFunction2.m

機能内容の表示

function [NextObs、Reward、IsDone、LoggedSignals] = myStepFunction2(Action、LoggedSignals、EnvConstants)
%関数
ハンドルケースのカートポール環境を構築するためのカスタムステップ関数
%%
この関数は、指定されたアクションを環境に適用し、
1つのシミュレーションステップのシステムダイナミクスを評価します。
%指定されたアクションが有効かどうかを確認します。
if〜ismember(Action、[-EnvConstants.MaxForce EnvConstants.MaxForce])
error( 'アクションは、左に移動する場合は%g、右に移動する場合は%gである必要があります。'、…
-EnvConstants.MaxForce、EnvConstants.MaxForce);
終了
力=アクション;
%ログに記録された信号から状態ベクトルを解凍します。
状態= LoggedSignals.State;
XDot = State(2);
シータ=状態(3);
ThetaDot = State(4);
%再計算を回避するためのキャッシュ。
CosTheta = cos(Theta);
SinTheta = sin(Theta);
SystemMass = EnvConstants.MassCart + EnvConstants.MassPole;
temp =(Force + EnvConstants.MassPole EnvConstants.Length ThetaDot ThetaDot SinTheta)/ SystemMass;
%運動方程式を適用します。
ThetaDotDot =(EnvConstants.Gravity SinTheta-CosTheta temp)…
/(EnvConstants.Length *(4.0 / 3.0-EnvConstants.MassPole CosTheta CosTheta / SystemMass));
XDotDot = temp-EnvConstants.MassPole EnvConstants.Length ThetaDotDot CosTheta / SystemMass;
%オイラー統合を実行します。
LoggedSignals.State = State + EnvConstants.Ts。
[XDot; XDotDot; ThetaDot; ThetaDotDot];
%状態を観測に変換します。
NextObs = LoggedSignals.State;
%端末の状態を確認してください。
X = NextObs(1);
シータ= NextObs(3);
IsDone = abs(X)> EnvConstants.XThreshold || abs(Theta)> EnvConstants.ThetaThresholdRadians;
%報酬を得る。
〜IsDone
Reward = EnvConstants.RewardForNotFalling;
else
Reward = EnvConstants.PenaltyForFalling;
エンド
エンド

環境定数を含む構造を作成します。

% Acceleration due to gravity in m/s^2
envConstants.Gravity = 9.8;
% Mass of the cart
envConstants.MassCart = 1.0;
% Mass of the pole
envConstants.MassPole = 0.1;
% Half the length of the pole
envConstants.Length = 0.5;
% Max force the input can apply
envConstants.MaxForce = 10;
% Sample time
envConstants.Ts = 0.02;
% Angle at which to fail the episode
envConstants.ThetaThresholdRadians = 12 * pi/180;
% Distance at which to fail the episode
envConstants.XThreshold = 2.4;
% Reward each time step the cart-pole is balanced
envConstants.RewardForNotFalling = 1;
% Penalty when the cart-pole fails to balance
envConstants.PenaltyForFalling = -5;

カスタムステップ関数の無名関数ハンドルを作成し、追加の入力パラメーターとしてenvConstantsを渡します。StepHandleの作成時にenvConstantsを使用できるため、関数ハンドルにはこれらの値が含まれています。変数をクリアしても、これらの値は関数ハンドルに保存されます。

StepHandle = @(Action,LoggedSignals) myStepFunction2(Action,LoggedSignals,envConstants);

名前を使用する代わりに関数ハンドルとして指定して、同じリセット関数を使用します。

ResetHandle = @myResetFunction;

カスタム関数ハンドルを使用して環境を作成します。

env2 = rlFunctionEnv(ObservationInfo,ActionInfo,StepHandle,ResetHandle);

カスタム機能を確認する

ご使用の環境でエージェントをトレーニングする前に、ベストプラクティスはカスタム関数の動作を確認することです。これを行うには、reset関数を使用して環境を初期化し、step関数を使用してシミュレーションステップを実行します。再現性を確保するために、検証前にランダムジェネレータシードを設定します。

関数名で作成された環境を確認してください。

rng(0);
InitialObs = reset(env)

ここに画像の説明を挿入します

[NextObs,Reward,IsDone,LoggedSignals] = step(env,10);
NextObs

ここに画像の説明を挿入します
関数ハンドルで作成された環境を確認します。

rng(0);
InitialObs2 = reset(env2)

ここに画像の説明を挿入します

[NextObs2,Reward2,IsDone2,LoggedSignals2] = step(env2,10);
NextObs

ここに画像の説明を挿入します
両方の環境が正常に初期化およびシミュレーションされ、NextObsで同じ状態値が生成されます。

おすすめ

転載: blog.csdn.net/wangyifan123456zz/article/details/109472901