强化学习代码分析之回收机器人
前言
主要参考的是《Reinforcement Learning: An introduction Second Edition》这本书里的例子
英文版地址:http://incompleteideas.net/book/first/ebook/the-book.html
代码源文件可以参考这篇回答:https://zhuanlan.zhihu.com/p/79701922 采用Matlab实现
问题描述
该问题主要是对贝尔曼方程的应用,利用环境模型对状态值函数进行估计,做出决策。在分析决策问题时,必须明确可以做哪些决策,决策造成什么结果。翻译在强化学习中就是需要知道状态、状态对应可实施的动作、动作造成的结果(什么样的状态转移,也可以说成是状态转移规律)。
问题设定:回收机器人在办公环境中收集废弃易拉罐。具有检测易拉罐的传感器,可以拿起易拉罐放入垃圾箱,由可充电电池供电。
问题分析:动作包括主动搜索、等待投喂、返回充电;状态包括高电量和低电量。
问题假设:主要是对动作造成的状态转移规律进行假设。(环境模型的构建)
状态S | 动作A | 下一步状态S‘ | 发生概率P | 奖励R |
---|---|---|---|---|
H | search | H | \(\alpha\) | \(r_{search}\) |
H | search | L | \(1-\alpha\) | \(r_{search}\) |
H | wait | H | \(1\) | \(r_{wait}\) |
H | wait | L | \(0\) | \(r_{wait}\) |
L | search | L | \(\beta\) | \(r_{search}\) |
L | search | H | \(1-\beta\) | \(-3\) |
L | wait | L | \(1\) | \(r_{wait}\) |
L | wait | H | \(0\) | \(r_{wait}\) |
L | recharge | L | \(0\) | \(0\) |
L | recharge | H | \(1\) | \(0\) |
贝尔曼方程:\(v_{\pi}(s)=\sum\limits_a \pi(a|s)\sum\limits_{s',r}p(s',r|s,a)[r+\gamma v_\pi(s')]\)
代码实现
- 环境参数设置,\(\alpha\) \(\beta\) reward
- 指标初始化,主要是决策问题 故设置最大迭代次数和收敛误差限
- 贝尔曼最优状态方程就是把和贝尔曼方程对动作求和的那些项分别拿出来取最大值,得到最优状态。
- 利用贝尔曼方程求解动作状态值函数就是当前选取动作回报 + 采取当前动作后其余状态的回报(请想起来什么叫回报哦 是什么级数 前边是否需要系数)
- 贝尔曼最优动作状态方程就是:动作状态值函数 = 采取当前动作回报 + 采取当前动作后下一个状态的最好的动作状态值函数(最大的那个)
- 根据公式写出来,不断迭代计算。即可得到要估计的状态值函数和动作状态值函数
% 环境初始化
alpha = 0.8;
beta = 0.2;
% the learning rate:
gamma = 0.9;
Rsearch = 2.0; % <- the reward given to searching
Rwait = 1.0; % <- the reward given to waiting
% 求解最优状态值函数
MAX_N_ITERS = 100; iterCnt = 0;
CONV_TOL = 1e-3; delta = 1e10;
% 代入公式迭代计算
while( (delta > CONV_TOL) && (iterCnt <= MAX_N_ITERS) )
delta = 0;
% update states in the order high then low: 更新状态顺序:先高后低
v = V(1); % save the old "high" state ...
V(1) = max( [ Rsearch + gamma*( alpha*V(1) + (1-alpha)*V(2) ), Rwait + gamma*V(1) ] );
delta = max( [ delta, abs( v-V(1) ) ] );
v = V(2); % save the old "low" state ...
V(2) = max( [ beta*Rsearch - 3*(1-beta) + gamma*( (1-beta)*V(1) + beta*V(2) ), Rwait + gamma*V(2), gamma*V(1) ] );
delta = max( [ delta, abs( v-V(2) ) ] );
%V, delta
iterCnt=iterCnt+1;
end
%% 求解最优动作状态值函数
MAX_N_ITERS = 100; iterCnt = 0; %最大迭代次数;迭代计数器
CONV_TOL = 1e-3; delta = 1e10;
while( (delta > CONV_TOL) && (iterCnt <= MAX_N_ITERS) )
delta = 0;
% update action states in the following order:
%
q = Q(h,s); %高电量,搜索
Q(h,s) = Rsearch + alpha*gamma*max( [ Q(h,s), Q(h,w) ] ) + (1-alpha)*gamma*max( [ Q(l,s), Q(l,w), Q(l,rc) ] )
delta = max( [ delta, abs( q-Q(h,s) ) ] );
q = Q(h,w); %高电量,等待
Q(h,w) = Rwait + gamma*max( [ Q(h,s), Q(h,w) ] );
delta = max( [ delta, abs( q-Q(h,w) ) ] );
q = Q(l,s); %低电量,搜索
Q(l,s) = (1-beta)*(-3 + gamma*max( [ Q(h,s), Q(h,w) ] ) ) + beta*( Rsearch + gamma*max( [ Q(l,s), Q(l,w), Q(l,rc) ] ) );
delta = max( [ delta, abs( q-Q(l,s) ) ] );
q = Q(l,w); %低电量,等待
Q(l,w) = Rwait + gamma*max( [ Q(l,s), Q(l,w), Q(l,rc) ] );
delta = max( [ delta, abs( q-Q(l,w) ) ] );
q = Q(l,rc); %低电量充电
Q(l,rc) = gamma*max( [ Q(h,s), Q(h,w) ] );
delta = max( [ delta, abs( q-Q(l,rc) ) ] );
%Q, delta
iterCnt=iterCnt+1;
end
总结
主要用于环境已知的情况(对状态转移规律很熟悉的情况)