Java坦克機(jī)器人系列強(qiáng)化學(xué)習(xí)_第1頁
Java坦克機(jī)器人系列強(qiáng)化學(xué)習(xí)_第2頁
Java坦克機(jī)器人系列強(qiáng)化學(xué)習(xí)_第3頁
Java坦克機(jī)器人系列強(qiáng)化學(xué)習(xí)_第4頁
Java坦克機(jī)器人系列強(qiáng)化學(xué)習(xí)_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、精品Java 坦克機(jī)器人系列 強(qiáng)化學(xué)習(xí)人工智能Java坦克機(jī)器人系列:強(qiáng)化學(xué)習(xí)文檔選項img,8,1/ ibm /i/c.gifimg,16,16/ ibm /i/v14/icons/printer.gifurl=javascript:print()打印本頁/url');/-url=javascript:print()打印本頁/urlimg,8,1/ ibm /i/c.gifimg,16,16/ ibm /i/v14/icons/em.gifurl=javascript:document.email.submit();將此頁作為電子郵件發(fā)送/url');/-url=javasc

2、ript:document.email.submit();將此頁作為電子郵件發(fā)送/urlimg,8,1/ ibm /i/c.gifimg,16,16/ ibm /i/c.gif未顯示需要JavaScript的文檔選項級別:中級編程游戲愛好者,自由撰稿人本文中,我們將使用強(qiáng)化學(xué)習(xí)來實(shí)現(xiàn)一個機(jī)器人。使用強(qiáng)化學(xué)習(xí)能創(chuàng)立一個自適應(yīng)的戰(zhàn)斗機(jī)器人。這個機(jī)器人能在戰(zhàn)斗中根據(jù)環(huán)境取得最好的策略,并盡力使戰(zhàn)斗行為最正確。并在此過程中不斷學(xué)習(xí)以完善自身缺乏。Robocode是IBM開發(fā)的Java戰(zhàn)斗機(jī)器人平臺,游戲者可以在平臺上設(shè)計一個Java坦克。每個坦克有個從戰(zhàn)場上收集信息的感應(yīng)器,并且它們還有一個執(zhí)行動作的

3、傳動器。其規(guī)那么和原理類似于現(xiàn)實(shí)中的坦克戰(zhàn)斗。其融合了機(jī)器學(xué)習(xí)、物理、數(shù)學(xué)等知識,是研究人工智能的很好工具。在Robocode坦克程序中,很多愛好者喜歡設(shè)計一些策略與移動模式,讓自己的坦克機(jī)器人能更好的贏得戰(zhàn)斗。但是由于Robocode環(huán)境時刻在變化,手寫的代碼只能對的環(huán)境做一些預(yù)測,機(jī)器人不能根據(jù)環(huán)境的變化而自我學(xué)習(xí)和改善。本文中,將用強(qiáng)化學(xué)習(xí)實(shí)現(xiàn)一個機(jī)器人。使用強(qiáng)化學(xué)習(xí)能創(chuàng)立一個自適應(yīng)的戰(zhàn)斗機(jī)器人。這個機(jī)器人能在戰(zhàn)斗中根據(jù)環(huán)境取得最好的策略,并盡力使戰(zhàn)斗行為最正確。并在此過程中不斷學(xué)習(xí)以完善自身缺乏。強(qiáng)化學(xué)習(xí)強(qiáng)化學(xué)習(xí)(reinforcement learning)是人工智能中策略學(xué)習(xí)的一種

4、,是一種重要的機(jī)器學(xué)習(xí)方法,又稱再勵學(xué)習(xí)、評價學(xué)習(xí).是從動物學(xué)習(xí)、參數(shù)擾動自適應(yīng)控制等理論開展而來.強(qiáng)化學(xué)習(xí)一詞來自于行為心理學(xué),這一理論把行為學(xué)習(xí)看成是反復(fù)試驗的過程,從而把動態(tài)環(huán)境狀態(tài)映射成相應(yīng)的動作。它通過不斷嘗試錯誤,從環(huán)境中得到獎懲的方法來自主學(xué)習(xí)到不同狀態(tài)下哪些動作具有最大的價值,從而發(fā)現(xiàn)或逼近能夠得到最大獎勵的策略。它類似于傳統(tǒng)經(jīng)驗中的"吃一塹長一智"。原理與模型考慮建造一個可學(xué)習(xí)的機(jī)器人,該機(jī)器人(或agent)有一些傳感器可以觀察其環(huán)境的狀態(tài)(state)并能做出一組動作(action)來適應(yīng)這些狀態(tài)。比方:一個移動的機(jī)器人有攝像頭等傳感器來感知狀態(tài),并可

5、以做"前進(jìn)","后退"等動作。學(xué)習(xí)的任務(wù)是獲得一個控制策略(policy),以選擇能到達(dá)的目的的行為。強(qiáng)化學(xué)習(xí)根本原理也是基于上面的思想:如果Agent的某個行為策略導(dǎo)致環(huán)境正的獎賞(強(qiáng)化信號),那么Agent以后產(chǎn)生這個行為策略的趨勢便會加強(qiáng)。Agent的目標(biāo)可被定義為一個獎賞或回報函數(shù)(reward),它對Agent從不同狀態(tài)中選取的不同動作賦予一個數(shù)字值,即立即支付(immediate payoff)。比方機(jī)器人尋找箱子中的回報函數(shù):對能找到的狀態(tài)-動作賦予正回報,對其他狀態(tài)動作賦予零或負(fù)回報。機(jī)器人的任務(wù)執(zhí)行一系列動作,觀察結(jié)果,再學(xué)習(xí)控制策略,

6、我們希望的控制策略是在任何初始離散狀態(tài)中選擇動作,使Agent隨時間累積中發(fā)現(xiàn)最優(yōu)策略以使期望的折扣獎賞(回報)和最大。如圖描述:Agent選擇一個動作(action)用于環(huán)境,環(huán)境(Enviironment)接受該動作后狀態(tài)(state)發(fā)生變化,同時產(chǎn)生一個強(qiáng)化信號(獎賞reward)反應(yīng)給Agent,Agent根據(jù)強(qiáng)化信號和環(huán)境當(dāng)前狀態(tài)再選擇下一個動作,選擇的原那么是使受到正強(qiáng)化(獎)的概率增大。強(qiáng)化學(xué)習(xí)的根本模型Q學(xué)習(xí)(Q-learning)增強(qiáng)學(xué)習(xí)要解決的問題:一個能夠感知環(huán)境的自治Agent,怎樣通過學(xué)習(xí)選擇到達(dá)其目標(biāo)的最優(yōu)動作。這樣一個Agent在任意的環(huán)境中如何學(xué)到最優(yōu)策略是我

7、們要重點(diǎn)考慮的對象,下面介紹的稱為Q學(xué)習(xí)的算法,就是其中比擬好的一種強(qiáng)化學(xué)習(xí)算法,它可從有延遲的回報中獲取最優(yōu)控制策略。Q學(xué)習(xí)是強(qiáng)化學(xué)習(xí)的一種形式,機(jī)器人在任意的環(huán)境中直接學(xué)習(xí)最優(yōu)策略很難,因為訓(xùn)練數(shù)據(jù)中沒有提供s,a形式的訓(xùn)練樣例。而通過學(xué)習(xí)一個定義在狀態(tài)和動作上的數(shù)值評估函數(shù),然后以此評估函數(shù)的形式實(shí)現(xiàn)最優(yōu)策略將會使過程變得容易。我們在Q學(xué)習(xí)中把Q表示在狀態(tài)s進(jìn)行t動作的預(yù)期值;s是狀態(tài)向量;a是動作向量;r是獲得的立即回報;為折算因子。那么估計函數(shù)Q(s,a)被定義為:它的值是從狀態(tài)s開始并使用a作為第一個動作時可獲得的最大期望折算積累回報。也就是說Q值是從狀態(tài)s執(zhí)行動作a的立即回報加上

8、遵循最穩(wěn)定最優(yōu)策略的值(用折算)。公式如下:Q(s,a)=r(s,a)+maxQ(s'+a')我們用過程來表述Q學(xué)習(xí)算法如下:1.對每個s,a初始化表項Q(s,a)2.觀察當(dāng)前狀態(tài)s,一直重復(fù)做:a.選擇一個動作a并執(zhí)行它b.接收到立即回報r c.觀察新狀態(tài)s'd.對Q(s,a)按照下式更新表項Q(s,a)-r(s,a)+maxQ(s'+a')e.s-s'其中()是折算因子,為一常量。為了說明這些概念,我們用一些簡單的格狀確定世界來模擬環(huán)境。在這個環(huán)境下所有的動作轉(zhuǎn)換除了導(dǎo)向狀態(tài)G外,都被定義為0,agent一進(jìn)入狀態(tài)G,可選動作只能處在該狀態(tài)中

9、。圖中方格表示agent的6種可能狀態(tài)或位置,每個箭頭代表每個不同的動作。如果agent執(zhí)行相應(yīng)狀態(tài)動作可收到立即回報r(s,a),V?(s)為最優(yōu)策略的值函數(shù),即從最初狀態(tài)s到獲得的折算積累回報。此處立即回報函數(shù)把進(jìn)入目標(biāo)狀態(tài)G的回報賦予100,其他為0,V?(s)和Q(s,a)值來源于r(s,a),以及折算因子=0.9.定義了狀態(tài)、動作、立即回報和折算率,我們根據(jù)計算就能得出最優(yōu)策略圖4和它的值函數(shù)V?(s).該策略把a(bǔ)gent以最短路徑導(dǎo)向狀態(tài)G。圖3顯示了每個狀態(tài)的V?值,例如,圖3中下方的狀態(tài)中最優(yōu)策略使agent向右移動,得到為0的立即回報,然后向上,生成100的立即回報,此狀態(tài)的

10、折算回報計算為:0+100+=90,即中上方的V?值為90 Q學(xué)習(xí)的優(yōu)點(diǎn)是即使在學(xué)習(xí)不具有其動作怎樣影響環(huán)境的先驗知識情況下,此算法仍可應(yīng)用.強(qiáng)化學(xué)習(xí)的應(yīng)用強(qiáng)化學(xué)習(xí)主要應(yīng)用在三個方面:在機(jī)器人中的應(yīng)用,強(qiáng)化學(xué)習(xí)最適合、也是應(yīng)用最多的。Wnfriedllg采用強(qiáng)化學(xué)習(xí)來使六足昆蟲機(jī)器人學(xué)會六條腿的協(xié)調(diào)動作。Sebastian Thurn采用神經(jīng)網(wǎng)絡(luò)結(jié)合強(qiáng)化學(xué)習(xí)方式使機(jī)器人通過學(xué)習(xí)能夠到達(dá)室內(nèi)環(huán)境中的目標(biāo);在游戲比賽中的應(yīng)用,在這方面,最早的應(yīng)用例子是Samuel的下棋程序;在控制系統(tǒng)中的應(yīng)用,強(qiáng)化學(xué)習(xí)在控制中的應(yīng)用的典型實(shí)例,就是倒擺控制系統(tǒng).當(dāng)?shù)箶[保持平衡時,得到獎勵,倒擺失敗時,得到懲罰,控

11、制器通過自身的學(xué)習(xí),最終得到最優(yōu)的控制動作。Robocode概述從上面的強(qiáng)化學(xué)習(xí)原理中我們知道,要實(shí)現(xiàn)強(qiáng)化學(xué)習(xí)我們必須知道狀態(tài)、動作以及處理這些狀態(tài)和動作的Q函數(shù),在對狀態(tài)和動作的反復(fù)實(shí)驗當(dāng)中,我們還要給出動作的獎賞、設(shè)定學(xué)習(xí)率、折算率等參數(shù)。最后我們還要利用Q學(xué)習(xí)算法把上面提到的參數(shù)組合進(jìn)行最優(yōu)化,最終得到自己想要的值。下面我們就從robocode來分析上面提到的參數(shù)和強(qiáng)化學(xué)習(xí)的實(shí)現(xiàn)過程。States狀態(tài)描述Robocode是根據(jù)戰(zhàn)斗環(huán)境模擬而來,所以在此環(huán)境中存在很多種狀態(tài),不同的狀態(tài)對機(jī)器人會產(chǎn)生不同的影響。這些狀態(tài)我們都可通過Robocode的函數(shù)調(diào)用得到,如下表列出了Robocode

12、中能得到的局部狀態(tài)值。如此多的狀態(tài)如果全部放到強(qiáng)化學(xué)習(xí)中,會消耗強(qiáng)化學(xué)習(xí)很多時間。而且像getBattleFieldHeight()、getBattleFieldWidth()得到場地高和寬,getGunCoolingRate()炮管冷卻率,這些狀態(tài)值與學(xué)習(xí)無關(guān)聯(lián),而有些狀態(tài)是與不同的動作相結(jié)合的,如果使用不當(dāng),甚至?xí)_(dá)不到應(yīng)有的效果。所以如何確定和選擇狀態(tài)是很關(guān)鍵的問題。根據(jù)戰(zhàn)斗經(jīng)驗與測試數(shù)據(jù),我們把Robocode機(jī)器人的狀態(tài)分為五個屬性,并以類state來封裝所有的這五個屬性。最后我們還給出了在我們的強(qiáng)化學(xué)習(xí)中沒有應(yīng)用到但同樣重要的一些狀態(tài),大家有興趣可補(bǔ)充進(jìn)自己的強(qiáng)化學(xué)習(xí)算法當(dāng)中。狀態(tài)

13、離散化強(qiáng)化學(xué)習(xí)應(yīng)用到Robocode遇到的最大挑戰(zhàn)是:強(qiáng)化學(xué)習(xí)適合離散空間求解,而Robocode的環(huán)境卻是連續(xù)的。如上表中Robocode的狀態(tài)中,機(jī)器人的方向角(二維矢量),兩個機(jī)器人的相對角(二維矢量),兩個機(jī)器人的距離(二維矢量),場地坐標(biāo),機(jī)器人的x,y坐標(biāo)等等,輸出是一組動作序列,這些都是連續(xù)量,假設(shè)對所有變量進(jìn)行離散化必然帶來維數(shù)災(zāi)難。所以,我們必須離散化輸入狀態(tài)。以適合強(qiáng)化學(xué)習(xí)算法的應(yīng)用。注意Robocode中的角度、距離等狀態(tài)都有一些特點(diǎn):角度是分四個方位,而且是0到360度之間的四個區(qū)間值,而兩兩機(jī)器人之間的平安距離一般是維持在30象素左右。根據(jù)Robocode這些特點(diǎn)和強(qiáng)

14、化學(xué)習(xí)原理,我們分別以4,30等區(qū)間值來轉(zhuǎn)換狀態(tài)值為離散點(diǎn)。1.機(jī)器人的絕對方向(Heading)知彼,百戰(zhàn)不怠,在開始戰(zhàn)斗前知道敵人和自己的方向很重要。在Robocode中要想得到敵人的方向,我們首先要知道Robocode的坐標(biāo)系統(tǒng)。Robocode坐標(biāo)系統(tǒng)是一個標(biāo)準(zhǔn)的笛卡爾坐標(biāo),戰(zhàn)場地圖的左下角坐標(biāo)為(0,0),右下角為(地圖寬,0),左上角為(0,地圖高),右上角為(地圖寬,地圖高),如下列圖所示:從圖上我們知道了如果機(jī)器人處于場地中央那么面向場地水平向上為0度方向,按順時針轉(zhuǎn)動,水平向右為90度方向,水平向左為270度方向,水平向下為360度方向。也就是說0=heading 360。此

15、角度值是一個絕對值。在Robocode中我們通過調(diào)用getHeight()函數(shù)能得到想要的機(jī)器人當(dāng)前方向。機(jī)器人處于場地什么位置,就可對照下列圖得到其對應(yīng)的角度。為了保存角度到Q表中,我們把得到的連續(xù)值轉(zhuǎn)換為離散的值。按照角的大小和方位我們把heading分成范圍為0-3的四份,如下列圖:在代碼我們直接用360除以4得到不同的離散方向值。public static final int NumHeading=4;double angle=360/NumHeading;然后直接通過下面的表達(dá)式求得新的方向角double newHeading=heading+angle/2;return(int)(

16、newHeading/angle);2.機(jī)器人的相對角(Bearing)上面我們知道了機(jī)器人的絕對度,但是戰(zhàn)斗都是存在于兩個機(jī)器人之間,所以這里我們要了解Robocode的第二個狀態(tài)值相對角,顧名思義,它就是某一機(jī)器人相對另一機(jī)器人的角度,是針對兩個機(jī)器人而言的。如下列圖所示:圖1顯示了機(jī)器人相對于自己的bearing角度。而圖2顯示了機(jī)器人r2相對于r1的b=60度。由此可知,-180 bearing=180。如圖相對度在機(jī)器人左邊為正,右邊為負(fù)。在Robocode中我們可以通過函數(shù)getBearing()得到相對角。相對角是個很有用的函數(shù),通過確定敵人相對度,我們能得到最正確的移動位置。和

17、上面同樣的道理我們把bearing分成0-3的四份,在代碼我們直接用PI值除以4得到不同的離散相對角值public static final int NumTargetBearing=4;double angle=PIx2/NumTargetBearing;然后直接通過下面的表達(dá)式求得新的相對角double newBearing=bearing+angle/2;return(int)(newBearing/angle);3.目標(biāo)距離(distance)distance即兩個機(jī)器人之間長度,即自己機(jī)器人中心點(diǎn)到敵人機(jī)器人中心點(diǎn)連線長。距離是以像素(Pixels)點(diǎn)為單位,如何確定其離散值的大小以

18、方便保存到Q表中有一定的難度。在此我們根據(jù)機(jī)器人本身的大小(30為平安距離)以及場地大小設(shè)置,我們把距離分為0-19的20個離散值。每個離散值分為30的倍數(shù),如下表:在代碼我們直接用距離值除以30得到不同的離散值public static final int NumTargetDistance=20;int distance=(int)(value/30.0);然后直接通過下面的表達(dá)式求得新的距離if(distance NumTargetDistance-1)distance=NumTargetDistance-1;return distance;4.Hit Wall(撞墻)當(dāng)機(jī)器人撞擊墻時,

19、能量會發(fā)生改變,這時"Hit wall"事件會觸發(fā),我們就此狀態(tài)定義為"Hit wall",而機(jī)器人根據(jù)這個事件能做相應(yīng)的動作。撞墻狀態(tài)比擬簡單,只有撞也沒有撞,所以我們在此用兩個離散值來表示這一狀態(tài),0表示沒有撞墻,狀態(tài)沒有發(fā)生。1表示撞墻狀態(tài)發(fā)生。通過Robocode的ohHitWall事件我們能得到這個狀態(tài)。5.Hit by Bullet(子彈相撞)當(dāng)機(jī)器人被子彈擊中時,能量會發(fā)生改變,這時"Hit by Bullet"事件會觸發(fā),我們就此狀態(tài)定義為"Hit by Bullet",而機(jī)器人根據(jù)這個事件也能做出

20、相應(yīng)的動作。同樣的我們在此用兩個離散值來表示這一狀態(tài),0表示沒有撞墻,狀態(tài)沒有發(fā)生。1表示撞墻狀態(tài)發(fā)生。通過onHitByBullet()事件我們能得到這個狀態(tài)。因為Hit wall和Hit by bullet本身都是Robocode的事件函數(shù),所以在直接把離散值寫入Robocode本身的事件當(dāng)中。根據(jù)上面五個狀態(tài)的組合,我們可得到共1280(4 x20 x4 x2 x2)可能存在的狀態(tài)。在robocode中還有其他一些狀態(tài):比方兩個機(jī)器人相撞的HitRobotEvent事件狀態(tài),團(tuán)隊中的消息接收MessageEvent事件狀態(tài),還有機(jī)器人的x,y坐標(biāo)狀態(tài),機(jī)器人在戰(zhàn)地中間的坐標(biāo)和戰(zhàn)地邊緣的坐

21、標(biāo)都會對狀態(tài)產(chǎn)生影響。如果有興趣大家可以試一試別的狀態(tài)處理。動作集(Action)Robocode的動作相對是比擬復(fù)雜的,而且涉及到炮管、雷達(dá)和機(jī)器人本身的移動。為了簡化操作,在此處我們只定義了機(jī)器人自身的移動動作集:移動和轉(zhuǎn)動。在Robocode中最根本的移動就是前進(jìn)和后退,轉(zhuǎn)動就是向左或向右。同狀態(tài)一樣,我們把Action中的值進(jìn)化離散化以保存到Q表中。如下代碼:public static final int RobotAhead=0;public static final int RobotBack=1;public static final int RobotAheadTurnLeft

22、=2;public static final int RobotAheadTurnRight=3;public static final int RobotBackTurnLeft=4;public static final int RobotBackTurnRight=5;動作選擇我們知道了狀態(tài)、動作,就要面臨如何根據(jù)狀態(tài)來選擇機(jī)器人的動作。選擇的動作不僅影響立即強(qiáng)化值,而且影響環(huán)境下一時刻的狀態(tài)及最終的強(qiáng)化值。所以好的選擇方法很重要。在強(qiáng)化學(xué)習(xí)中通常使用概率來選擇動作,對于狀態(tài)S,做不同Q值的動作時賦予不同的概率,高值得到高概率,低值得到低概率,所有動作的概率都非0。如下方法:P(a|s)

23、=eQ(s,a)/sum(eQ(s,ai)其中P(a|s)為機(jī)器人在狀態(tài)s時選擇的動作a的概率,e為一常量大于0。在代碼中我們通過getQValue得到當(dāng)前Q(s,a)值,并利用上面的公式在所有的Q值中選擇出最優(yōu)的動作。如下代碼,其中ExploitationRate設(shè)定為1.for(int i=0;i value.length;i+)qValue=table.getQValue(state,i);value=Math.exp(ExploitationRate*qValue);sum+=value;數(shù)據(jù)與Q表上面我們定義了狀態(tài)/動作值,而且從強(qiáng)化學(xué)習(xí)概念我們知道狀態(tài)/動作值都是以對的方式存在。我

24、們把這種值叫Q(s,a)值。學(xué)習(xí)都是在前一個Q值的根底上對新的值進(jìn)行判斷和完善。所以在強(qiáng)化學(xué)習(xí)中定義了Q表用以保存所有收集的Q值。由于狀態(tài)和動作是成對存在,二維數(shù)組是保存Q值的最正確工具,如下代碼。private double table;table=new doubleState.NumStatesAction.NumRobotActions;由代碼可知表值大小決定于狀態(tài)和動作的數(shù)量,這兩者數(shù)量越多,表越大。Robocode是以回合制的方式進(jìn)行戰(zhàn)斗,要想在每個回合都能利用到原始Q值,文件是最好的通訊工具,通過java文件流我們定義輸入(input)和輸出(output)函數(shù)來保存數(shù)據(jù)到文本文

25、件。這樣在每個回合中,我們都能對原始數(shù)據(jù)進(jìn)行分析處理,并不斷把新的數(shù)據(jù)寫入表中。Q表中在強(qiáng)化學(xué)習(xí)中是很重要的概念,它不僅保存了所有Q值,同時也定義了對這些Q值進(jìn)行操作的方法。通過調(diào)用這些方法,我們能直接得到最大的狀態(tài)值及最優(yōu)化的動作。public double getMaxQValue(int state)double maxinum=Double.NEGATIVE_INFINITY;for(int i=0;i tablestate.length;i+)if(tablestatemaxinum)maxinum=tablestate;return maxinum;遍歷所有狀態(tài)值,從中找出最大化的

26、狀態(tài)。public int getBestAction(int state)double maxinum=Double.NEGATIVE_INFINITY;int bestAction=0;for(int i=0;i tablestate.length;i+)double qValue=tablestate;if(tablestatemaxinum)maxinum=tablestate;bestAction=i;return bestAction;遍歷所有狀態(tài)值,從中找出最大化的狀態(tài)。根據(jù)狀態(tài)值得到當(dāng)時最正確動作。獎賞確實(shí)定(Reward)經(jīng)過上述狀態(tài)和動作離散化,機(jī)器人的移動的學(xué)習(xí)問題已經(jīng)轉(zhuǎn)

27、化為一個離散的強(qiáng)化學(xué)習(xí)問題,現(xiàn)在我們只要選擇Q學(xué)習(xí)(Q-Learning)算法,直接以Q值作為狀態(tài)-動作對的評價值,進(jìn)行Q(s,a)的強(qiáng)化學(xué)習(xí)。在開始之前,我們還需要設(shè)計一套獎賞規(guī)那么。通過觀察,在上面動作和狀態(tài)發(fā)生改變時,特別是機(jī)器人本身的狀態(tài)發(fā)生改變時,機(jī)器人的能量都會或增或減。robocode中一場戰(zhàn)斗開始,每一個機(jī)器人都能得到100的能量,當(dāng)在不同的狀態(tài)下,如撞墻,撞到機(jī)器人,打中敵人和被敵人打中時,機(jī)器人的能量都會發(fā)生改變,而且不同的狀態(tài)都有不同的能量轉(zhuǎn)換規(guī)那么:1.發(fā)射子彈能量大小:我們的機(jī)器人在開始時能以不同的能量發(fā)射子彈,子彈能量在0.1到3之間。通過getPower()函數(shù)我

28、們能得到我們的子彈能量。2.當(dāng)機(jī)器人撞墻時:能量損傷度=Math.abs(velocity)*0.5-1,此處的velocity即撞墻時機(jī)器人的速度3.當(dāng)機(jī)器人被敵人子彈打中時:能量損傷度=4*power,如果敵人子彈能量大于1,那么能量損傷度+=2*(power-1)4.我們每發(fā)射一顆子彈我們的生命能量就會減1 5.有失必有得,如果我們的子彈打中別的機(jī)器人,我們可以從子彈那獲得3*power的能量在robocode中我們能通過函數(shù)getEnergy()得到自身的能量值。由于能量的這種隨動作和狀態(tài)改變的特殊性,我們就以它來定義獎賞,根據(jù)上面的規(guī)那么,實(shí)現(xiàn)如下:1.當(dāng)機(jī)器人撞墻時,獎賞為負(fù)能量(

29、Math.abs(getVelocity()*0.5-1),如下代碼:public void onHitWall(HitWallEvent e)double change=-(Math.abs(getVelocity()*0.5-1);reinforcement+=change;isHitWall=1;2.當(dāng)機(jī)器人相撞時,獎賞為負(fù)能量6,如下代碼:public void onHitRobot(HitRobotEvent e)double change=-6.0;reinforcement+=change;3.當(dāng)機(jī)器人被子彈打中時,獎賞減少能量(4*power+2*(power-1)public

30、 void onHitByBullet(HitByBulletEvent e)double power=e.getBullet().getPower();double change=-(4*power+2*(power-1);reinforcement+=change;4.當(dāng)機(jī)器人打中敵人時,獎賞增加e.getBullet().getPower()*3;public void onBulletHit(BulletHitEvent e)double change=e.getBullet().getPower()*3;reinforcement+=change;具體學(xué)習(xí)方案現(xiàn)在我們得到了狀態(tài)、動作

31、、Q值、獎賞等Q學(xué)習(xí)算法中所有參數(shù),下面我們就以這些參數(shù)來實(shí)現(xiàn)我們的學(xué)習(xí)方案。1.確定環(huán)境和行動:狀態(tài)集S=Mappings1S1中狀態(tài)分別為機(jī)器人的heading、bearing、distance、hit wall、hit by bullet狀態(tài)2.確定Q值,Q函數(shù)Q(s,a)用于映射state/action對到Q值中3.確定參數(shù):在此根據(jù)經(jīng)驗我們選取如下參數(shù),這些參數(shù)值可在實(shí)驗中調(diào)整(hang原值折現(xiàn)率為0.7,學(xué)習(xí)率為0.05):折現(xiàn)率:=0.9;()為常量學(xué)習(xí)率:a=0.1;Q t+1(s t,a t):根據(jù)行為"a t"和狀態(tài)"S t"得到的新

32、Q Rt(st,at):根據(jù)狀態(tài)和行為而得到的獎賞maxQ(st+1,ai):根據(jù)行為"a t"和狀態(tài)"S t"得到的最大Q值3.計算行動選擇概率4.迭代公式:Q(s,a)-Q(s,a)+s+(maxQ(s',a')-Q(s,a)5.更新Q值Q t+1(st,at)=(1-a)Qt(st,at)+Rt(st,at)+maxQ(st+1,ai)public static final double LearningRate=0.05;public static final double DiscountRate=0.7;double oldQ

33、Value=table.getQValue(lastState,lastAction);double newQValue=(1-LearningRate)*oldQValue+LearningRate*(reinforcement+DiscountRate*table.getMaxQValue(state);table.setQValue(lastState,lastAction,newQValue);Agent在經(jīng)過一定的狀態(tài)和執(zhí)行多個動作后獲得了最終獎賞,這時就會對這個狀態(tài)-動作序列分配獎賞。Q學(xué)習(xí)算法的核心就是每一個狀態(tài)和動作的組合都擁有一個Q值,每次獲得最終回報后通過更新等式更新這個Q

34、值。其實(shí)這是一個典型的馬爾科夫決策過程(Markov decision process,MDP)。馬爾科夫決策過程(Markov decision process,MDP):Agent可感知到其環(huán)境的不同狀態(tài)集合,并且有它可執(zhí)行的動作集合。在每個離散時間步t,Agent感知到當(dāng)前狀態(tài)st,選擇當(dāng)前動作at并執(zhí)行它。環(huán)境響應(yīng)此Agent,給出回報Rt=Q(st,at),并產(chǎn)生一個后繼狀態(tài)S t+1=a(s t,a t)。在MDP中,其中函數(shù)Q(st,at)稱之為動作評估函數(shù)(價值函數(shù)),a(s t,a t)稱之為狀態(tài)轉(zhuǎn)換函數(shù);其中Q(st,at)和a(s t,a t)只依賴于當(dāng)前狀態(tài)和動作,而不

35、依賴于以前的狀態(tài)和動作。實(shí)現(xiàn)步驟1.隨機(jī)初始化Q值,機(jī)器人收集狀態(tài)信息,轉(zhuǎn)換這些狀態(tài)信息為離散值2.根據(jù)行動選擇概率公式選擇一個動作執(zhí)行執(zhí)行選擇動作操作3.由行動結(jié)果中即機(jī)器人的能量改變中得到獎賞4.從環(huán)境中確定新的狀態(tài),迭代修改Q值5把獎賞和最正確的Q值用于新的狀態(tài)中6.轉(zhuǎn)2測試與結(jié)果強(qiáng)化學(xué)習(xí)同遺傳算法一樣,也要對把機(jī)器人同不同對手進(jìn)行訓(xùn)練,讓其不斷的自我學(xué)習(xí)。下面我們以Hang的QLearningBot機(jī)器人與不同的例子機(jī)器人進(jìn)行訓(xùn)練,得到不同的測試結(jié)果比擬。實(shí)驗結(jié)果為了檢驗訓(xùn)練的效果,測試實(shí)驗設(shè)置了多個場景比方:不同的地圖大小,不同的子彈冷卻度等,讓學(xué)習(xí)機(jī)器人完全依靠學(xué)習(xí)Q表進(jìn)行自主決策

36、。觀察學(xué)習(xí)機(jī)器人的決策過程,學(xué)習(xí)結(jié)果令我們很滿意:學(xué)習(xí)機(jī)器人能夠躲避敵人的威脅,并找到戰(zhàn)場的最正確位置,找到敵人并及時與有效的打擊。100個回合與fire機(jī)器人的戰(zhàn)斗結(jié)果500個回合與fire機(jī)器人的戰(zhàn)斗結(jié)果下面是最初的Q值、選擇動作率、新值、新值與原始值的比擬,通過對Q表的數(shù)據(jù)分析,證明了Q表在逐漸收斂,并最終使Q表收斂到一個穩(wěn)態(tài),第498回合和499回合先后兩表中各項差的平方和趨近于零。第一回合Q-value:-2.6121109205097683 Q-value:-0.9225833518300154 Q-value:-1.9101180820403036 Q-value:-1.5324

37、221662755257 Q-value:-1.0267866181848935 Q-value:-1.3407928359453818 P(a|s):0.050441674598822324 P(a|s):0.27323856526964685 P(a|s):0.10177968729898158 P(a|s):0.14848834415120214 P(a|s):0.2461994580991779 P(a|s):0.1798522705821701 Random Number:0.46314301126269086 Action selected:3Reinforcement:-3.0Old Q-V

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論