強化學習——Q學習算法

強化學習的一些相關概念

  • 智能體(Agent): 智能體對環境進行觀察,決策出行動,獲得一個從環境返回的獎勵
  • 決策(Decision):意識層面的
  • 行動(Action , a):物質層面的
  • 環境(Environment):與智能體交互的對象
  • 狀態(State,s):是歷史信息的函數,包含所有已有的信息。
  • 獎勵(Reward,R):是智能體採取行動後環境的一個反饋
  • 策略(Policy):是狀態到動作的函數
  • 價值函數(Value function):是評價狀態的一個指標
  • 模型(Model):是個體對環境的建模

例題 1

背景描述:假設某個樓層共有 5 個房間,房間之間通過一道門相連,正如下圖所示。我們將
房間編號爲房間 0 到房間 4,樓層的外部,編號爲 5。注意到房間 1 和房間 4 都可以直接通
到外部 5。

在這裏插入圖片描述
問題:假設有一個機器人對樓層的佈局事先不知道,如何讓一個機器人,從任意房間出發,能走到外面嗎?

從獎勵矩陣 R 出發來理解各個概念:
智能體(Agent):機器人
決策(Decision):從當前所在房間準備往哪裏去
行動(Action):決策好到哪裏去後行動到那裏去
環境(Environment):樓層佈局
狀態(State):當前所在房間
獎勵(Reward):從當前房間走到另一個房間的獎勵值(獎勵矩陣中-1 表示無效值)

獎勵矩陣 R(state, action)或 R(s, a): 每個元素值 R(s,a)表示在當前狀態 s 下,採取行動 a 後
的即時獎勵。

Q-學習簡介

Q 矩陣:跟 R 矩陣維數相同,不同的是 Q(s, a)表示在當前狀態 s 下,採取行動 a 後的累計
獎勵。
假定已經獲得一個最優的 Q 矩陣,則對任意狀態 s 出發,到達目標狀態的算法如下
在這裏插入圖片描述

步驟 1:隨機選擇一個初始狀態 s
步驟 2:確定行動 a,使它滿足 a = argmax{ Q(s , a~\widetilde{a})},a~\widetilde{a}∈A ,A是所有可能行動集合
步驟 3:令 s = s~\widetilde{s},(s~\widetilde{s}爲執行動作 a 後對應的下一個狀態)
步驟 4:返回步驟 2

假定初始狀態爲 2,根據最優 Q 矩陣,有 2→3→1(4) →5→5;
假定初始狀態爲 1,根據最優 Q 矩陣,有 1→5→5;
假定初始狀態爲 0,根據最優 Q 矩陣,有 0→4→5→5;

如何獲取最優的 Q 矩陣?
答案:Q-學習算法
在這裏插入圖片描述

Q-學習算法流程

步驟 1:給定獎勵矩陣 R 和學習參數 γ,初始化 Q = 0,
步驟 2:隨機選擇一個初始狀態 s,在當前狀態 s 的所有可能行動中選取一個行動 a
步驟 3:利用選定的行爲 a , 得到下一個狀態 s~\widetilde{s}
步驟 4:按照轉移規則,計算Q(s,a)
步驟 5:s = s~\widetilde{s},判斷得到的Q矩陣是否收斂,不收斂則返回步驟 2,收斂則退出,完成q矩陣的學習

matlab算法如下

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 機器人如何從五個房間中的任意一個走出來?
% 中南大學 自動化學院 智能控制與優化決策課題組
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Q學習算法
% function Q = Reinforcement_Learning(R,gamma)
clear all
clc;
format short    %顯示4位小數
format compact  %壓縮空格

% 輸入: R and gamma
% R:即時獎勵矩陣; 行、列表示狀態
% -1 = 表示無效值
R = [-1,-1,-1,-1,0, -1;
     -1,-1,-1,0,-1, 100;
     -1,-1,-1,0,-1, -1;
     -1, 0, 0,-1,0, -1;
      0,-1,-1,0,-1, 100;
     -1,0, -1,-1,0, 100];
gamma = 0.80;            % 學習參數

N = size(R,1); % R的行數,所有狀態的個數,一行代表一個狀態的所有信息
Q  = zeros(size(R));     % 初始化Q矩陣,其行數和列數和R一樣。Q初始全是0
Q1 = ones(size(R))*inf;  % 前一次比較對象,判定收斂,Q初始全是無窮大
count = 0;               % 計數器
    
    for episode = 0:50000
       % 產生隨機初始狀態
       state = ceil(N*rand);    %產生1-N之間的隨機數
       % 從當前狀態出發,選擇一個行動
       x = find(R(state,:)>=0);   % 所有可能行動,R(state,:)代表R的第state行,find(R(state,:)>=0)代表R的第state行裏面大於0的數的列位置集合,是個行向量,
       %上一句代碼理解成找出當前狀態可以向那些狀態轉移
       if ~isempty(x)   %如果有可以轉移的
          x1= x((ceil(length(x)*rand)));                  % 隨機選擇一個行動,理解成隨機向一個狀態轉移,x1代表第幾行(即爲第幾個狀態)
       end

       qMax = max(Q,[],2);   %返回矩陣中每行的最大值,是一個列向量,大小是Q的行數,每行最大值物理含義是這個狀態下的最好獎勵(最好出路)
       Q(state,x1) = R(state,x1) + gamma*qMax(x1);   % 轉移規則。qMax(x1)代表x1這個狀態下的最好獎勵
       
       % 判定是否收斂  其實就是前後兩個Q矩陣的差很小就認爲是收斂了
       if sum(sum(abs(Q1-Q)))<0.0001 && sum(sum(Q>0)) %sum(sum(Q>0))代表Q大於0的數的個數,sum(sum(abs(Q1-Q)))代表Q1與Q對應位置相減絕對值之和
          if count > 1000         %且學習了超過1千次
              disp(strcat('強化學習的總次數: ',num2str(episode)));     
             break                %跳出for循環
          else                    %沒有學習了超過1萬次
             count = count+1; 
          end
       else  %不收斂,差距很大
          Q1 = Q;  %把最新的一個Q作爲比較對象,覆蓋掉原來的
          count = 0; 
       end
    end

% 歸一化
Qmax = max(max(Q));%max(max(Q))代表Q裏面最大的元素,max(Q)代表每一列最大的元素
if Qmax >0
    Q = 100*Q/Qmax;
end
Q

本文來源於中南大學 自動化學院 智能控制與優化決策課題組周曉君老師的學習筆記,加了一些我自己對代碼的註釋,

還有兩個問題未解決

1、Q-學習算法的轉移規則可以換成其他的公式來產生新解迭代嗎

2、除了Q-學習算法還可以用其他方法來解決Q矩陣的求取嗎?

繼續學強化學習,看看有啥新的體會與想法沒

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章