建立Simulink環(huán)境,導入強化學習設計器里,添加代理,進行訓練
1. 建立Simulink環(huán)境
首先準備好你的Simulink模型,這里還用上節(jié)用到的水箱模型。
RL Agent模塊報錯是由于還沒有給其綁定代理,后續(xù)會在強化學習設計器里配置,暫時不用理會。
下一步,在MATLAB命令行窗口或腳本里為環(huán)境指定狀態(tài)空間和動作空間以及復位函數(shù),然后創(chuàng)建環(huán)境。
% 觀測空間形狀及每個變量取值上下限
obsInfo = rlNumericSpec([3 1],...
LowerLimit=[-inf -inf 0 ]',...
UpperLimit=[ inf inf inf]');
% Name and description are optional and not used by the software
obsInfo.Name = "observations";
obsInfo.Description = "integrated error, error, and measured height";
% Action info
actInfo = rlNumericSpec([1 1]);
actInfo.Name = "flow";
% 創(chuàng)建環(huán)境對象
env = rlSimulinkEnv("rlwatertank","rlwatertank/RL Agent",...
obsInfo,actInfo);
% 指定環(huán)境復位函數(shù),這里是自定義函數(shù)
env.ResetFcn = @(in)localResetFcn(in);
% 指定仿真時間T f TfTf和代理采樣時間T s TsTs,單位是s,這里只是該Simulink模型用到的參數(shù):
Ts = 1.0;
Tf = 200;
新建函數(shù)文件localResetFcn.m來提供該復位函數(shù):
function in = localResetFcn(in)
% Randomize reference signal
blk = sprintf("rlwatertank/Desired \nWater Level");
h = 3*randn + 10;
while h <= 0 || h >= 20
h = 3*randn + 10;
end
in = setBlockParameter(in,blk,Value=num2str(h));
% Randomize initial height
h = 3*randn + 10;
while h <= 0 || h >= 20
h = 3*randn + 10;
end
blk = "rlwatertank/Water-Tank System/H";
in = setBlockParameter(in,blk,InitialCondition=num2str(h));
end
運行上述代碼,使環(huán)境對象env出現(xiàn)在工作區(qū)。
2. 將環(huán)境導入RL設計器
命令行運行如下語句打開RL設計器,選擇導入環(huán)境env。
reinforcementLearningDesigner
導入后如圖所示,環(huán)境面板增加了環(huán)境env。
3. 配置代理
為導入的環(huán)境配置代理。在Reinforcement Learning標簽頁點擊New,在彈出的窗口里,修改隱藏層神經(jīng)元數(shù)量為50,默認的環(huán)境即為導入的環(huán)境,選擇DDPG算法,點擊OK。
建立好的代理如下圖,按需修改參數(shù):
可以查看Actor和Critic的結(jié)構(gòu),下圖是Actor的:
4. 訓練并導出訓練結(jié)果
轉(zhuǎn)到Train選項卡,修改訓練參數(shù),然后開始訓練。
訓練完成后如圖所示,點擊Accept保存訓練結(jié)果。
導出訓練結(jié)果agent1_Trained。
成功導出到MATLAB工作區(qū)。
5. 在Simulink里仿真
在Simulink模塊里雙擊RL Agent模塊,為模塊綁定訓練好的代理。
點擊Simulink運行仿真,仿真結(jié)果如圖。
當然,也可以通過MATLAB命令行運行仿真。
rng(1) % 固定隨機數(shù)種子方便復現(xiàn)結(jié)果
simOpts = rlSimulationOptions(MaxSteps=ceil(Tf/Ts),StopOnError="on");
experiences = sim(env,agent1_Trained,simOpts);
當然,不導出訓練結(jié)果,直接在RL設計器里運行也是可以的。如下:
先配置仿真參數(shù):
仿真完成后,會展示每輪獎勵以及所有輪獎勵均值和標準差。
點擊Inspect Simulation Data查看仿真結(jié)果,也可以點擊Clear and Inspect Simulation Data預先清除在上一個會話中加載的任何數(shù)據(jù)??梢栽诓煌膱D中選擇查看每一輪仿真的不同的數(shù)據(jù)。
回到仿真對話窗體,同樣點擊Accept保存仿真結(jié)果,在Results面板自動添加一條experience,雙擊它可以再次查看上述結(jié)果。
最后,保存會話后退出就可以了,后續(xù)可以用RL設計器再次打開此會話。
Tips
本節(jié)展示了如何用Simulink模型在RL設計器里進行訓練,同樣地,可以在RL設計器里建立好代理之后導出需要的內(nèi)容(可導出的內(nèi)容如下圖所示)到MATLAB工作區(qū),然后通過MATLAB腳本進行訓練,省去了在MATLAB腳本建立代理的部分過程,而且可以通過腳本修改更多的參數(shù)。文章來源:http://www.zghlxwxcb.cn/news/detail-845465.html
當然,綜合來看,還是像本節(jié)這樣直接使用RL設計器更方便更直觀,解決一般的問題足夠。文章來源地址http://www.zghlxwxcb.cn/news/detail-845465.html
到了這里,關(guān)于從零開始學MATLAB強化學習工具箱使用(五):Simulink+強化學習設計器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!