Q学习算法问题

时间:2014-03-20 15:11:24

标签: algorithm matlab reinforcement-learning q-learning temporal-difference

我正在尝试做一个简单的Q学习算法,但无论出于什么原因它都不会收敛。代理应该基本上从5x5网格上的一个点到目标1。当我运行它似乎找到了最佳的方式,但它没有收敛,我无法弄清楚为什么。任何帮助,将不胜感激。我觉得某处有一个小错误,所以我正在寻找一双新鲜的眼睛。

代码:

function Q=ReinforcementLearning

clc;

format short

format compact

% three input: R, alpha and gamma

% immediate reward matrix; 

% row and column = states; -Inf = no door between room

R=[-inf,-inf,    0,    0, -inf;

   -inf,-inf,    0,    0, -inf;

      0,   0, -inf, -inf,  100;

      0,   0, -inf, -inf, -inf;

   -inf,-inf,    0, -inf, 100];



gamma=0.8;            % learning parameter
alpha=0.5;
oldQ = 0;


Q=zeros(size(R));      % initialize Q as zero

q1=ones(size(R))*inf;  % initialize previous Q as big number

count=0;               % counter


for episode=0:50000   

   % random initial state

   y=randperm(size(R,1));

   state=y(1);




   % select any action from this state

   x=find(R(state,:)>=0);        % find possible action of this state

   if size(x,1)>0,

      x1=RandomPermutation(x);   % randomize the possible action

      x1=x1(1);                  % select an action 

   end


   MaxQ=max(Q,[],2);

   %Q(state,x1) = R(state,x1) + (gamma * MaxQ(x1)); %old function that works perfectly (converges)

   Q(state,x1)=  oldQ + alpha * (R(state,x1)+ (gamma * MaxQ(x1)) - oldQ); % new one that I need to implement

   oldQ = Q(state,x1);



   state=x1; %#ok<NASGU>


   %Q = round(Q);


   % break if convergence: small deviation on q for 1000 consecutive

   if sum(sum(abs(q1-Q)))<5 & sum(sum(Q > 0))

      if count>1000,

         episode        % report last episode

         break          % for

      else

         count=count+1; % set counter if deviation of q is small

      end

   else

      q1=Q;

      count=0; % reset counter when deviation of q from previous q is large

   end

end


%normalize q

g=max(max(Q));

episode

if g>0, 

   Q=100*Q/g;
   roundQ = round(Q);
   roundQ

end  

1 个答案:

答案 0 :(得分:1)

编辑:

问题在于:

Q(state,x1)=  oldQ + alpha * (R(state,x1)+ (gamma * MaxQ(x1)) - oldQ);

您正在使用 oldQ 值更新每个 Q(州,x1),而此值应按其自己的先前值 Q(状态, x1)在采取此行动之前。你看到了吗?最好有一个 Q 的矩阵,并保存以前可以在这里使用的值。我可以看到你对所有的** Q **都使用相同的 oldQ

实际上,您可以从 q1 加载以前的值,然后使用它们代替 oldQ