我正在尝试了解马尔可夫决策问题,并且我获得了Value Iteration的算法,但我很困惑如何将它们转换为实际的C ++代码。主要是总结等发生的部分。这是算法:
function VALUE-ITERATION(P;R) returns a utility matrix
inputs: P, a transition-probability matrix
R, a reward matrix
local variables: U, utility matrix, initially identical to R
U', utility matrix, initially identical toR
repeat
U <- U'
for each state i do
U'(s_i) <- R(s_i) + max_a Summation_j P^a_ij*U(s_j)
end
until max_(s_i) |U(s_i) - U'(s_i)| < e
return U
对我来说,这看起来像是象形文字,是否有更简单的算法对我更有帮助?或者有人可能会为我愚蠢吗?
答案 0 :(得分:3)
我很容易找到这篇文章:Value iteration and policy iteration algorithms for Markov decision problem [PDF file]。它解释了发生了什么。
从概念上讲,您的系统可以处于多种状态,可以从一种状态转换为另一种状态,以及有时可以导致状态转换的操作。基本的想法是继续迭代,直到你到达一个不会改变的效用矩阵这就是最终测试max_(s_i) | U(s_i) - U'(s_i)| < e
寻找的东西。 (这里,e
是epsilon的缩写,是一个很小的数字,可能应该是一个额外的输入。)
对于每次迭代,您希望为每个状态采取最佳操作。最好的行动是产生最大奖励的行动,按概率加权。这就是max_a Summation_j P^a_ij*U(s_j)
所做的:找出产生最佳回报的动作,按概率加权。
答案 1 :(得分:2)
我可以翻译点点滴滴,但是你的代码中有很多信息只在上下文中有意义,而且我们无法知道上下文。
此外,似乎有些格式化在此过程中丢失了,因为P ^ a_ij看起来像是在某一点P到a_i次j的幂。 David似乎知道如何解释这个疯狂的位。
条件循环在伪代码中使用|
,这很奇怪,但我从字面上理解了它。
utility_matrix VALUE_ITERATION(const probability_matrix& P,
const reward_matrix& R)
{
utility_matrix U(R);
utility_matrix UP(R);
do {
U = UP;
for(int s_i : ????) //for each state in what?
UP[s_i] = R[s_i] + ???? //max_a Summation_j P^a_ij*U(s_j)
while(max(s_i) ???? std::abs(U[s_i] - UP[s_i])<e);
return U;
}
正如akira所说,可理解的部分很简单,如果你不能这样做,你可能需要在解决这个问题之前了解更多有关C ++的知识。
根据您的评论,我发现C代码看起来有点像您的算法here。 (第62-76行)