国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

世界robocode機(jī)器人的四大運(yùn)動(dòng)方式分析

2019-11-18 13:12:10
字體:
供稿:網(wǎng)友


  前言
  Robocode在短短的時(shí)間內(nèi)風(fēng)靡全球,全世界的robocode愛好者設(shè)計(jì)出了大量的優(yōu)秀智能機(jī)器人,他們都擁有各自的運(yùn)動(dòng)方式,有的很輕易被擊中,有的卻很難射擊。設(shè)計(jì)一個(gè)好的運(yùn)動(dòng)方式是優(yōu)秀robocode機(jī)器人取勝的要害。上屆世界中級(jí)組冠軍Fermat就是靠他讓敵人難以琢磨的運(yùn)動(dòng)躲過敵人一發(fā)發(fā)的子彈而取得勝利。(當(dāng)然,他的優(yōu)秀的瞄準(zhǔn)射擊也是取勝的要害)怎樣的運(yùn)動(dòng)才能不被敵人擊中,讓敵人琢磨不透呢?這里我把常見的機(jī)器人運(yùn)動(dòng)方式分為4類來詳解。
  
  明顯有規(guī)律的主動(dòng)運(yùn)動(dòng)
  剛開始玩robocode的很多都會(huì)有這種感覺,Samples里面Walls最強(qiáng),誰(shuí)都打不到他。Wall就是一種很典型的明顯有規(guī)律的主動(dòng)運(yùn)動(dòng),他總是直線繞墻走,如圖1:
  
 世界robocode機(jī)器人的四大運(yùn)動(dòng)方式分析(圖一)

  
圖1

  
  因?yàn)樗鼛缀蹩偸窃趧?dòng),而Sample里面的機(jī)器人的射擊方法幾乎都是直接射擊敵人的當(dāng)前位置,由于子彈到達(dá)目標(biāo)需要一定的時(shí)間,當(dāng)子彈飛過去的時(shí)候,Wall已經(jīng)不在原來那個(gè)位置了,所以它們總是打不到它,因此在剛開始時(shí)它看起來是那么的強(qiáng)大。但是,Walls并不能算一個(gè)優(yōu)秀的機(jī)器人,它僅是作為一個(gè)例子來介紹robocode機(jī)器人的制作方法,稍厲害一點(diǎn)的機(jī)器人都能很得心應(yīng)手的射擊它,有的機(jī)器人甚至能槍槍必中的打它。他們大多運(yùn)用了提前量的算法計(jì)算出子彈到達(dá)Walls的時(shí)候Walls大概走的距離,然后攻擊Walls下一步將要行走的地方。至于怎樣編碼實(shí)現(xiàn),已經(jīng)超出了這篇文章的范圍,你可以參考PRedictive targeting。
  
  采取這一類運(yùn)動(dòng)方式的機(jī)器人很多,它們規(guī)律很明顯,很輕易被把握,像SpinBot總是做圓周運(yùn)動(dòng)(圓周運(yùn)動(dòng)的射擊方法可以參見圓周瞄準(zhǔn)),Corners總是躲在角落不動(dòng)……你會(huì)發(fā)現(xiàn)它們都是很輕易對(duì)付的角色,是不是要寫出優(yōu)秀的機(jī)器人就不能用這樣的策略呢?當(dāng)然不是,在人眼看起來有規(guī)律的運(yùn)動(dòng),機(jī)器人未必會(huì)認(rèn)為有規(guī)律(這要取決于你的機(jī)器人的分析方法)。非凡是在群戰(zhàn)的時(shí)候,你要顧及大量的敵人,你不可能只關(guān)注一個(gè)敵人的運(yùn)動(dòng),你要同時(shí)關(guān)注A或關(guān)注B的運(yùn)動(dòng),因此即使A作了規(guī)律很明顯的運(yùn)動(dòng),你也很難察覺。
  
  典型的例子就是David McCoy的PrairieWolf,你看它群戰(zhàn)的時(shí)候經(jīng)常待在角落做一種繞角落往返運(yùn)動(dòng),但是你卻未必能很輕易的射擊他,還有就是Paul Evans的SandboxLump,它不僅是在角落往返,而且還夾雜著很多的弧線運(yùn)動(dòng),如圖2:
  
 世界robocode機(jī)器人的四大運(yùn)動(dòng)方式分析(圖二)

  
圖2

  
  即使是單挑的時(shí)候,你的機(jī)器人也很難分析出SandboxLump的具體規(guī)律,所以要擊中它并不輕易,確切地說那實(shí)在是太難了。這里我要重要介紹一種被廣泛采用的往返運(yùn)動(dòng)方式,如圖3:
  
 世界robocode機(jī)器人的四大運(yùn)動(dòng)方式分析(圖三)

  
圖3

  
  假如機(jī)器人R1在A,B之間作直線往返運(yùn)動(dòng),某一時(shí)刻機(jī)器人R1和機(jī)器人R2在如圖所示位置,R1目前是直線運(yùn)動(dòng)。假如R1的擺幅小于R1到R2的距離,R2用直線提前量的射擊方法,射擊點(diǎn)在B點(diǎn)右邊的C點(diǎn),它發(fā)射了子彈,但是R1運(yùn)動(dòng)到B點(diǎn)的時(shí)候忽然反向向A行駛,到達(dá)A后又返回向B行駛,如此反復(fù),R2的子彈就總是打在A點(diǎn)偏左或者B點(diǎn)偏右的地方。這就是往返運(yùn)動(dòng)的迷惑性,哈哈,R1能迷惑敵人了,它很強(qiáng)了吧?不,假如R1的擺幅大于R1與R2的距離。如圖所顯假設(shè)R2在R2’的位置,它計(jì)算的射擊點(diǎn)C’在AB之間,這樣的話則可以擊中敵人,所以往返運(yùn)動(dòng)也不一定總能使敵人打偏,靠你比較近的敵人就顯得非常危險(xiǎn)。還有優(yōu)秀的機(jī)器人一般能識(shí)別往返運(yùn)動(dòng)的敵人,它能計(jì)算出你往返的距離,這樣你可能就被別人百發(fā)百中了。所以假如你要采用這樣的方法的話,可以添加一些其他因數(shù),比如說弧線往返運(yùn)動(dòng),往返運(yùn)動(dòng)隨機(jī)距離等等。
  
  隨機(jī)性很強(qiáng)的主動(dòng)運(yùn)動(dòng)
  當(dāng)你把握了對(duì)付Wall和SpinBot的射擊方法后,你是否又覺得Sample里面的Crazy也是個(gè)令人頭疼的家伙?你用分別用對(duì)付Corner,Walls和SpinBot的射擊方法跟他對(duì)戰(zhàn),你會(huì)發(fā)現(xiàn)這三種方法都能打中他,但是命中率都沒有打Corner,Walls和SpinBot他們高,這里我做了個(gè)測(cè)試:分別用三種方法來對(duì)付Crazy,測(cè)試結(jié)果如下表1:
  
  子彈參數(shù)
  射擊方法             命中 未中 命中率
  對(duì)付Corner的當(dāng)前位置射擊方法   5  40  %11.11
  對(duì)付Walls的直線提前量射擊方法   8  24  %25
  對(duì)付SpinBot的圓周提前量射擊方法  7  17  %29.16
  
  他雖然總是做弧線運(yùn)動(dòng),但是這次弧線運(yùn)動(dòng)停止后又會(huì)開始另一個(gè)方向的弧線運(yùn)動(dòng)。可能你看了Crazy的源代碼后你會(huì)懷疑,代碼里面一個(gè)類似Math.random()的語(yǔ)句都沒有,怎么稱這種運(yùn)動(dòng)是隨機(jī)性很強(qiáng)的運(yùn)動(dòng)呢?這里的隨機(jī)性是相對(duì)于你的機(jī)器人的運(yùn)動(dòng)分析程序的:由于他總是時(shí)而轉(zhuǎn)動(dòng),時(shí)而停止換一個(gè)方向,時(shí)而向前,時(shí)而向后,撞到墻又會(huì)改變方向。一般的機(jī)器人都難以分辨這種改變,所以通常也稱它為隨機(jī)的運(yùn)動(dòng)。
  
  雖然他的隨機(jī)性很強(qiáng),但是用對(duì)付SpinBot的圓周提前量射擊方法也達(dá)到%29.16的好成績(jī),顯然這樣的運(yùn)動(dòng)也不是很理想。更明顯的隨機(jī)運(yùn)動(dòng)是在代碼里加入了類似ahead(Math.random()*200),turnLeft(Math.random()*360)這樣的代碼,這樣隨機(jī)性就更強(qiáng),連此機(jī)器人的作者也不知道它的下一步會(huì)采取怎樣的運(yùn)動(dòng),你又如何提前預(yù)知呢?那么……這樣運(yùn)動(dòng)的機(jī)器人是否就打不中呢?你從對(duì)付Crazy的射擊命中率表可以看出,雖然我采取對(duì)付另一種有規(guī)律運(yùn)動(dòng)方式的的射擊策略來對(duì)付一種我不知道的運(yùn)動(dòng)方式是不合理的,但是我卻往往也能打中它,而且命中率并不低。為什么呢?我舉個(gè)例子吧,假設(shè)我采取對(duì)付Wall的直線提前量射擊方法射擊Crazy,如圖4:
  
 世界robocode機(jī)器人的四大運(yùn)動(dòng)方式分析(圖四)

  
圖4

  
 世界robocode機(jī)器人的四大運(yùn)動(dòng)方式分析(圖五)

  
圖5

  
  我認(rèn)為它走的是直線,這顯然是錯(cuò)誤的,但是在我離它比較近的時(shí)候,雖然射擊的是如圖的B’點(diǎn)而R1運(yùn)動(dòng)到了C點(diǎn),考慮到機(jī)器人有一定的高寬度,R2也仍然能打到它。
  
  對(duì)于另外一種直線隨機(jī)距離往返運(yùn)動(dòng)的機(jī)器人(前面提到過的一個(gè)建議Random),你可以看圖5。你計(jì)算到假如你射擊B的話,子彈到達(dá)B點(diǎn)的時(shí)候敵人R1也恰好到達(dá)B點(diǎn)處,但是R1隨時(shí)都有可能改變方向返回,這取決于random()方法。假如剛開始ahead(Math.random()*200)中Math.random()返回一個(gè)很大的值,大到足以使R1運(yùn)動(dòng)到B點(diǎn)甚至超過B點(diǎn),那么你將擊中敵人;假如這個(gè)返回值很小,使R1還沒到達(dá)B處就返回了,這樣你這發(fā)子彈就浪費(fèi)了。所以說你仍然有機(jī)會(huì)擊中它,它并不是難以把握的,只是什么時(shí)候能擊中什么時(shí)候不能擊中,誰(shuí)都說不清楚。
  
  對(duì)瞄準(zhǔn)有干擾性的主動(dòng)運(yùn)動(dòng)
  看了上面兩種運(yùn)動(dòng)方式的分析,也許在你心頭有這樣的想法,我先以一種很明顯的規(guī)律運(yùn)動(dòng),等敵人誤認(rèn)為我是那種方式運(yùn)動(dòng)后馬上改變?yōu)榱硪环N規(guī)律,然后等敵人意識(shí)到現(xiàn)在的運(yùn)動(dòng)規(guī)律后我又改變?yōu)樵瓉砟欠N,這樣敵人是否就被我迷惑了呢?呵呵,的確,這樣是一種很不錯(cuò)的方法,許多優(yōu)秀的機(jī)器人的運(yùn)動(dòng)有不同程度的干擾迷惑性。我還是先舉個(gè)例子來說說吧。假如一個(gè)機(jī)器人一開始不動(dòng),你會(huì)采取怎樣的射擊方法呢?一般都會(huì)用對(duì)付Corner的當(dāng)前位置射擊方法吧?但是當(dāng)你發(fā)射子彈后,它又開始直線運(yùn)動(dòng)了,這時(shí)假如你的炮管冷卻度為0的話,你采取第二次射擊,你怎么辦?用對(duì)付Corner的當(dāng)前位置射擊方法?你顯然打不中它,因?yàn)樗趧?dòng),但是假如用對(duì)付Walls的直線提前量射擊方法的話,你能肯定它不會(huì)在下一個(gè)周期(滴答)停下?這是一種典型的對(duì)瞄準(zhǔn)有干擾性的主動(dòng)運(yùn)動(dòng),優(yōu)秀的機(jī)器人Wolverine就是采用了這種方法,它能探測(cè)敵人什么時(shí)候發(fā)彈,在敵人發(fā)彈的一瞬間改變運(yùn)動(dòng)方式如圖6:(具體請(qǐng)見躲避子彈)
  
世界robocode機(jī)器人的四大運(yùn)動(dòng)方式分析(圖六)

  
圖6

  
  這樣的運(yùn)動(dòng)方式通過代碼已經(jīng)很難把握它的具體變化規(guī)律,因此在Wolverine剛出來的時(shí)候沒有幾個(gè)機(jī)器人能打敗Wolverine。后來優(yōu)秀的機(jī)器人不斷進(jìn)展,有的能計(jì)算敵人停留了多久就會(huì)動(dòng),動(dòng)了多遠(yuǎn)又會(huì)停止,雖然不能很精確,但是總能時(shí)而擊中它了。
  
  更先進(jìn)的干擾運(yùn)動(dòng)有先小距離往返運(yùn)動(dòng),然后走一段比較長(zhǎng)的距離(比如xieming的CX1.33,文件名為cx.MinixHT_1.33);還有先往一個(gè)方向直線運(yùn)動(dòng),估算敵人子彈快要擊中自己的時(shí)候改變運(yùn)動(dòng)方向,下一個(gè)子彈快擊中時(shí)又改變方向(如Glyn Davies的Mooserwirt2)等等。很多優(yōu)秀的機(jī)器人都采用了類似的運(yùn)動(dòng)方式,怎樣才能不被干擾?怎樣才能識(shí)別干擾?沒有一種識(shí)別所有干擾的萬(wàn)能方法,因此只能針對(duì)特定一種或某一類干擾進(jìn)行處理,比如CX1.33的干擾,你可以記下它的較長(zhǎng)運(yùn)動(dòng)距離平均(這里用L表示)是多少?當(dāng)他運(yùn)動(dòng)距離超過了小距離往返運(yùn)動(dòng)的那個(gè)距離的時(shí)候,你就不要以為他還會(huì)掉頭回去或者就一直走下去,它應(yīng)該大概在走了L距離后返回。對(duì)于眾多的運(yùn)動(dòng)方式,怎樣識(shí)別一個(gè)干擾又是一個(gè)難題,所以在射擊優(yōu)秀的機(jī)器人時(shí),命中率一般不會(huì)太高。
  
  怎樣讓別人不斷的被干擾成為設(shè)計(jì)一個(gè)優(yōu)秀運(yùn)動(dòng)的重點(diǎn),也是樂趣所在。當(dāng)你設(shè)計(jì)的運(yùn)動(dòng)方式不斷的迷惑敵人的時(shí)候,你是否有種嬉笑歡快的感覺呢!:)
  
  依據(jù)對(duì)方發(fā)彈或者運(yùn)動(dòng)而采取的被動(dòng)運(yùn)動(dòng)
  
  前面我們講到的Wolverine在敵人發(fā)彈后才開始運(yùn)動(dòng),是否他也屬于這一類呢?的確,它的運(yùn)動(dòng)方式也應(yīng)該同時(shí)屬于依據(jù)對(duì)方發(fā)彈或者運(yùn)動(dòng)而采取的被動(dòng)運(yùn)動(dòng)。
  
  還有一些優(yōu)秀的機(jī)器人很類似Wolverine,它們也是在敵人發(fā)彈后才開始運(yùn)動(dòng),但是他們又有很多不同,假如

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 黄龙县| 武冈市| 长泰县| 舞钢市| 石楼县| 朔州市| 象山县| 长沙市| 新邵县| 甘肃省| 基隆市| 临颍县| 云林县| 宁远县| 改则县| 香河县| 梁山县| 田阳县| 曲水县| 永宁县| 元朗区| 麻栗坡县| 安平县| 周至县| 沾益县| 滨海县| 中西区| 咸丰县| 富源县| 平顺县| 江陵县| 杂多县| 含山县| 扶余县| 安阳县| 横峰县| 丹阳市| 佛学| 玉树县| 东明县| 阜新市|