matlab增強學習之小球不落地
- 2019 年 10 月 7 日
- 筆記
訓練1000次之後的agent效果
在利用之前FrozenLake環境訓練當中那種面向對象方式管理程式時發現訓練後期運行速度變慢、而且是肉眼可觀察到的變慢,所以採用了matlab另一種程式文件管理方式packages
以+和名稱命名文件夾形成一個包、在包內可以新建函數或者前面用到的class
這裡就直接使用函數文件、調用函數時需要寫明包的名字、比如env.step()
可以觀察到在訓練1000後運行速度也不會出現肉眼可見的變化
這種方式比起面向對象模式簡單遊戲環境搭建要更容易上手
在傳參和調用的時候採取結構體變數存儲原先的對象參數、也就是原先那種一個文件夾下十幾個函數文件一個main文件模式下的全局變數、比如
function self = step(self,action)
% 一步動作
self.done = 0;
self.reward=0;
temp_w=self.agent(5)+5*(2-action);
if temp_w<5
temp_w=5;
end
if temp_w>25
temp_w=25;
end
self.reward=0;
ballPos = self.observation(1:2);
ballVel = self.observation(3:4);
if ballPos(1) > self.weight
ballPos(1) = self.weight;
ballVel(1) = -ballVel(1); % 邊界
elseif ballPos(1) < 0.1
ballPos(1) = 0.1;
ballVel(1) = -ballVel(1);
elseif ballPos(2) >= self.height
ballPos(2) = self.height;
ballVel(2) = -ballVel(2); % 頂部牆
self.score=self.score+1;
elseif ballPos(2) < 1
if abs(self.agent(5) – ballPos(1)) <= 5 % 底部方塊
ballVel(2) = -ballVel(2);
self.reward=10;
else % 方塊沒接住球
self.reward=-1;
self.done=1;
end
end
ballPos = ballPos + ballVel;
self.observation=[ballPos;ballVel;temp_w];
end
這是agent執行一個動作的函數、把這個環境中所以變數存儲在self參數中、在env.step(env,A)中傳遞進來、最後再返回出去
對比原先的oop模式、可以看出就是再傳參的時候顯式的傳入整個環境
matlab強化學習Sarsa與Sarsa(lambda)對比
最後就是這個訓練程式了、依然採用q-table、所以沒有太多變化、將之前提出的幾個優化想法都加進來
% 強化學習
ccc
% rng('default');
env0=env.single_pong(30,30,0.001);
single_pong_rl=rl.rl_q_table(env0.actions,0.9,0.2,0.9);
fig.fig=figure(1);
fig.base=0;
%%
for episode =1:env0.max_episodes*1
fig.show = ~mod(episode,1);
env0=env.reset(env0);
fig=env.render(env0,fig);
while 1
A = rl.choose_action(single_pong_rl,env0.agent);
env0 = env.step(env0,A); % 採取動作獲得狀態和獎勵
single_pong_rl=rl.learn(single_pong_rl,env0, A); % 更新
rl.dump(single_pong_rl,fig.show);
env0.agent=env0.observation;
fig=env.render(env0,fig);
if env0.done
break
end
end
end
%%
clear fig A episode
close all
save(filename);
相關工具方法在
https://gitee.com/sickle12138/MatGamer
幫你學MatLab