å€ãã®äººãæ¢ã«ç¥ã£ãŠããããã«ã
Google AIãã£ã¬ã³ãžã¯æè¿éå§ãããŸãããããã¯ããŠã©ãŒã¿ãŒã«ãŒå€§åŠãéå¬ããGoogleãæ¯æŽããã²ãŒã Planet Warsã®ããããäœæããããã®ç«¶äºã§ãã æšæ¥ã¯å
¬åŒçºè¡šãã2é±ç®ïŒ9é±ç®ïŒãçµãããŸããã 競äºã¯ãŸããŸãè»æ¡ç«¶äºã«äŒŒãŠããŠãããæåã«ããããããã50ã«å
¥ãã®ã«ååã ã£ãå Žåãã»ãšãã©ã®å Žåãã¹ã¿ãŒã¿ãŒãããã®äŸãæã¡è² ãããä»ããè©ŠããŠã¿ãå¿
èŠããããŸãã ãããã©ã®ããã«è¡ãããšãã§ãããã«ã€ããŠããŸããçŸåšè¡ãããŠããããŒãã¡ã³ãã®ãã¥ãŒã¹ã«ã€ããŠã
ã³ãã¥ããã£
æåã®æ°é±éã¯ããªãŒã¬ãã€ã¶ãŒã®åé¡ã«ãã£ãŠç¹åŸŽä»ããããŸãããããã¯ãµãŒããŒã®ããã©ãŒãã³ã¹ããããŒãã£ãã²ãŒã ã®ã±ãŒã¹ãéå§ã»ãããšãŠãŒã¶ãŒã®äœæ¥ç°å¢ã®éã®ããŸããŸãªç«¶åã12ã13æ¥ã«ã³ãŒããéä¿¡ããåé¡ã§ãã ãããã圌ãã®åèªã®ããã«ããã¹ãŠã¯ååã«è¿
éã«æ±ºå®ãããŸããã ãŸãããŸãã¯ã»ãšãã©ãã¹ãŠ...ãããŸã§ããã¹ãŠã®ãããã¯å¹³åã§1æéã«1ååçãããŸããã€ãŸããã³ãŒãã®å€æŽãè©äŸ¡ã«ã©ã®ããã«åœ±é¿ããããç解ããã«ã¯ã1ã2æ¥åŸ
ã€å¿
èŠããããŸãïŒæ¥é±ã¯ããããå¥ã®ãµãŒããŒãè¿œå ãããã§ãããïŒã ãã®åé¡ã®äžéšã¯ãã³ã³ãã¥ãŒã¿ãŒããçŽæ¥ãããã«æ¥ç¶ã§ããéå
¬åŒã®
TCPãµãŒããŒã«ãã£ãŠè§£æ±ºãããŸãã ã²ãŒã ã®é »åºŠã倧å¹
ã«å¢å ãããã©ã¹ãšããŠããããã°ããŒã¿ãä¿åããããšãå¯èœã«ãªããŸãã äž»ãªæ¬ ç¹ã¯ããµãŒããŒã«ã»ãšãã©ã®ããããããããªããããçµæã¯ã³ãŒãã®ãã¹ããŸãã¯åŠçã®æéã«ã®ã¿æå³ãããããšã§ãã ãããŠææ°ã®ãã¥ãŒã¹ïŒãã®é
ãåŸ
æã®LispãHaskellãOCamlãCoffeeScriptãããã³ããŸãç¥ãããŠããªããšããŸããã¯ãªãã®ïŒPHPãPerlãJavascriptãRubyïŒãŸãã¯ãããšã¯éã§ããïŒïŒ
ã ããµããŒã
ãããŠããC ++ãCïŒãJavaãPythonã®ãªã¹ãã«
è¿œå ãããŸããã
åå è
ã«ãã£ãŠäœæããããŠãŒãã£ãªãã£ã«ã€ããŠå°ã説æããŸãã ããã¯LinuxãŠãŒã¶ãŒã®åŽããã®èŠæ¹ã§ãããããã§ã¯Windowsã«åºæã®ããšã¯äœããªãããšãäºçŽããŸãã ã ããïŒ
- JBotManager -TCPãµãŒããŒã®ã¯ã©ã€ã¢ã³ãã§ããã²ãŒã ã®èšé²ãšè¡šç€ºã«ãããã³ãã³ãã©ã€ã³ã䜿çšãããæåãã䟿å©ã§ã
- GUIããã³ããšã³ãã«ãŒããžã§ãã¬ãŒã¿ãŒ
- ã«ãŠã³ãã§ããªãããžã¥ã¢ã©ã€ã¶ãŒïŒ
- PlanetWars pastebinã䜿çšãããšãPlayGame.jarã®åºåãããŠã³ããŒãããŠãªã³ã©ã€ã³ã§è¡šç€ºã§ããŸã
- C ++ã§æžãçŽãããããžã¥ã¢ã©ã€ã¶ãŒãåãããšã³ãžã³ -åäœãéã
- Qtã§äœæãããå¥ã®ãã® -ææçªå·ãšãã®å¢åã衚瀺ããŸã
- HTML5ã«åºã¥ãæåŸã®ãã®-ãšã³ãžã³ã®åºåãå
¬åŒã®Javascriptãã¬ãŒã€ãŒã®åœ¢åŒã«å€æããŸããã³ãã³ãã©ã€ã³ããåäœããŸã
- ãããã°ã«äŸ¿å©ãªæŸèæ -ãšã³ãžã³ã®åºåããã²ãŒã äžã«ããããåä¿¡ããäžé£ã®ããŒã¿ã«å€æããŸãã ãã®ããŒã¿ããããå
¥åã«éä¿¡ããããšã«ããããããã°ã¢ãŒãã§ãšã³ãžã³ãªãã§éå§ã§ããŸãã ãã¡ãããåäœãæ確ãªãããã«å¯ŸããŠã®ã¿æ©èœããŸã
- ãããããã¹ãããããã®ãã«ãã¹ã¬ããPython ã¹ã¯ãªãã
ãããéçºã«ã€ããŠ
次ã«ãåå äžã«åŸãçµéšãå
±æããããšæããŸãã 圌ã¯çµ¶å¯Ÿçãªççã®åœ¹å²ãè£
ãã®ã§ã¯ãªãããããæèã®ç³§ã§ãã ã§ã¯ããããã¯äœãã§ããã¯ãã§ããïŒ
ã·ãã¥ã¬ãŒã·ã§ã³
æé·ãšé£è¡è¹ãèæ
®ã«å
¥ããŠãããã€ãã®åãã§ææã«äœãèµ·ããããç¥ãå¿
èŠããããŸãã ããããªããã°ãé²åŸ¡ãŸãã¯æ»æã®ã³ã¹ããæ£ããè©äŸ¡ããããšã¯äžå¯èœã§ãã åçŽåããã圢åŒïŒäžç«ææ
ãžã®åææ»æã®
èŠåãé€ãïŒã§ã¯ã次ã®ããã«ãªããŸãã
public void Simulate ïŒïŒ{
// <Fleet>èŠéã®ãªã¹ã-ã¿ãŒã²ããææã«é£ãã§ããèŠé
if ïŒããªãŒããµã€ãº ïŒïŒ == 0 ïŒ
åž°ã
sortFleets ïŒ ïŒ ;
//çŸåšã®èšç®ç¶æ
ã®å€æ°
int owner =ã¿ãŒã²ããã ææè
;
int shipCount =ã¿ãŒã²ããã shipCount ;
//çŸåšåŠçãããåããä¿åããŠçµæãèç©ããŸã
int lastGrowth = 0 ;
for ïŒ int i = 0 ; i <ããªãŒããµã€ãº ïŒ ïŒ ; i ++ ïŒ {
//移åã®çµæãèšç®ãããå Žåãç¶æ
ãä¿åããŸã
if ïŒ lastGrowth < fleetsãget ïŒ i ïŒ ãturnsRemaining ïŒ {
if ïŒ i > 0 ïŒ
ç¶æ
ã add ïŒ new PlanetState ïŒ shipCountãownerãlastGrowth ïŒ ïŒ ;
//ãã¬ã€ã€ãŒææã§ã®ã¿æé·
if ïŒ targetãowner > 0 ïŒ
shipCount + =ã¿ãŒã²ããã growthRate *
ïŒèŠéãget ïŒ i ïŒ .turnsRemaining -lastGrowth ïŒ ;
//ãã®åãã¯ããã«èšç®ãããŸã
lastGrowth =ããªãŒãã get ïŒ i ïŒ ã turnsRemaining ;
}
if ïŒ owner ïŒ = fleetsãget ïŒ i ïŒ ãowner ïŒ
shipCount-=ããªãŒãã get ïŒ i ïŒ ã numShips ;
ä»ã«
shipCount + =ããªãŒãã get ïŒ i ïŒ ã numShips ;
//æææš©ã®å€æŽ
if ïŒ shipCount < 0 ïŒ {
shipCount * = -1 ;
ææè
=ããªãŒãã get ïŒ i ïŒ ã ææè
;
}
if ïŒ i ==ããªãŒããµã€ãº ïŒ ïŒ -1 ïŒ
ç¶æ
ã add ïŒ new PlanetState ïŒ shipCountãownerãlastGrowth ïŒ ïŒ ;
}
}
ã¡ãªã¿ã«ãããªã«æåã®ã³ã¡ã³ããå«ãã³ãŒãã¯ãµãŒããŒäžã§ã³ã³ãã€ã«ãããªããããéä¿¡ããåã«æ³šæããŠãã ããã ç¶æ
ã®å€åãèšç®ãããåŸã移åã®äºæž¬ãååŸããã®ã¯éåžžã«ç°¡åã§ãã
public PlanetState getInfoForTurn ïŒ int turn ïŒ {
int growth = targetã growthRate ;
//å
¥ã£ãŠããèŠéããªãã£ãå Žåãš
//æåã®ããªãŒããå°çããåã«ãªã¯ãšã¹ãã移åããå Žå
if ïŒ statesãsize ïŒ ïŒ == 0 || statesãget ïŒ 0 ïŒ ãturn > turn ïŒ {
//äžç«ææã«ã¯ã²ã€ã³ããããŸãã
if ïŒ targetãowner == 0 ïŒ
æé·= 0 ;
æ°ãã PlanetStateãè¿ããŸãïŒã¿ãŒã²ãããshipCount + turn * growthã
ã¿ãŒã²ããã ææè
ãã¿ãŒã³ïŒ ;
}
int last =ç¶æ
ã ãµã€ãº ïŒ ïŒ -1 ;
//æåŸã®èŠéã®å°çåŸã«ç§»åãã
if ïŒ turn > = statesãget ïŒ last ïŒ ãturn ïŒ {
if ïŒ statesãget ïŒ last ïŒ ãowner == 0 ïŒ
æé·= 0 ;
æ°ãã PlanetStateãè¿ãïŒ states.get ïŒ last ïŒ .shipCount +
ïŒã¿ãŒã³ã¹ããŒããget ïŒ last ïŒ ãturn ïŒ *æé·ã
ç¶æ
ã get ïŒæåŸïŒ ã ææè
ãã¿ãŒã³ïŒ ;
}
//æåãšæåŸã®èŠéã®å°çéã移åããŸã
for ïŒ int i = 1 ; i < = last ; i ++ ïŒ
if ïŒ statesãget ïŒ i ïŒ ãturn > turn ïŒ {
if ïŒ statesãget ïŒ i- 1 ïŒ ãowner == 0 ïŒ
æé·= 0 ;
æ°ãã PlanetStateãè¿ãïŒ statesãget ïŒ i- 1 ïŒ ãshipCount +
ïŒã¿ãŒã³ã¹ããŒããget ïŒ i- 1 ïŒ ã ã¿ãŒã³ ïŒ *æé·ã
ç¶æ
ã get ïŒ i- 1 ïŒ ã ææè
ãã¿ãŒã³ïŒ ;
}
nullã è¿ã ãŸã ã
}
ãã®ã³ã°
ãŸããããã¯ãããã°æ
å ±ãååŸããæ¹æ³ã®1ã€ã§ããããæ£ããããã°ã¯ãã¬ãŒã€ãŒã§ã®èŠèŠåãããåæã«äŸ¿å©ã§ãïŒãã ããçžäºã«æä»çã§ã¯ãããŸããïŒå
¬åŒãã©ãŒã©ã ã§ã¹ãããããããã¬ãŒã€ãŒã§ãããã°æ
å ±ã衚瀺ã§ããããããžã®ãªã³ã¯ïŒã ãŸãããã°ã䜿çšãããšãã²ãŒã ã®çµæããããã§ç¢ºèªã§ããŸãã äžè¬ã«ããã¹ãã®èªååã«ãããæéãšåŽåã倧å¹
ã«ç¯çŽãããŸãã
ã²ãŒã ã¹ã¿ã€ã«ã®åãæ¿ã
ãã§ã«ç°è°ãèããŠããŸãã å®éãããªãã¯æ£ãããããªãã¯ãããè¡ãããšãã§ããŸã...ããããã«ãŒã«ã¯ã²ãŒã ã®ç¶ç¶æéïŒ200ã®åãïŒãèŠå¶ãããšããäºå®ããªãŒããã³ã°ã§ãã«ãŒããã©ãŒã¹ã容æã§ãããšããäºå®ããããŠã«ãŒãã®ãµã€ãºã®éããã¹ã¿ã€ã«ã®å€æŽã匷å¶ããŸãã äŸïŒ
if ïŒ myPlanetsã ãµã€ãº ïŒ ïŒ < 4 ïŒ
ã¢ãŒã= BotModeã bmStart ;
else if ïŒ myPower > enemyPower * 3 && turn > 50 ïŒ
ã¢ãŒã= BotModeã bmFinishHim ;
else if ïŒã¿ãŒã³> 180 || myPower * 5 < enemyPower * 4 ïŒ
ã¢ãŒã= BotModeã bmRegenerate ;
ä»ã«
ã¢ãŒã= BotModeã bmNormal ;
è©äŸ¡é¢æ°
åé¡ã解決ããããã®ã¢ãããŒããäœã§ãããèŠã€ãã£ããã®ã®äžãããã奜ãŸããã¢ã¯ã·ã§ã³ã®ãªãã·ã§ã³ãéžæããå¿
èŠããããŸãã ããã¯ãæ»æã®ã¿ãŒã²ããã®éžæããããå®è¡ãããææãèŠéã移åããããã®ç®æšïŒããã«ã€ããŠã¯ä»¥äžã§è©³ãã説æããŸãïŒãªã©ã«é¢ä¿ããŸãã ãã®ããã«ãä»ã®ã³ãŒãããåé¢ã§ããè©äŸ¡é¢æ°ãå¿
èŠã§ãã ããããããŒãã³ãŒãã£ã³ã°ããããã©ã¡ãŒã¿ãŒãããããã¹ãäžã«ãããèµ·åã³ãã³ãã©ã€ã³ãä»ããŠéä¿¡ã§ãããããå€ãã®çµã¿åãããèªåçã«å®è¡ããæé©ãªçµã¿åãããéžæã§ããŸãã
æšæºçãªããªãã¯
æããã«æ»æã«å ããŠã次ã®ãããªæšæºçãªææ³ãå®è£
ããããšããå§ãããŸãã
- äžç«ææãžã®æ»æã®ååã ã¢ã€ãã¢ã¯ãæµãææãå é ããåŸã次ã®ã¿ãŒã³ã«é£è¡ããããã«ããã®ãããªç¬éã«èŠéãéãããšã§ãã ãã®å Žåãå¯èœãªéãäœãäŸ¡æ Œã§å
¥æã§ããŸãã
- èªåã®ææãå®ãã ããã¯ãã·ãã¥ã¬ãŒã·ã§ã³ã圹ç«ã€å Žæã§ãã ããªãã®ææãã©ã®åããæãããè¹ã®ç·æ°ããããã«ãªãããèšç®ããããä¿è·ã®ããã«æãè¿ãææããéè€éãéãã ãã§ååã§ãã
- çŽäºã®ææãæ¥ãã§ã äž¡æ¹ã®ãããã圌ãã®ææãå®ããæçãªèŠç¥ãã¬äººãæ»æããã®ã«ååè³¢ããšããéäºããããã€ã³ããçŸããæµããéãããèŠéã¯ãã©ã³ã¹ãåããŠããŸãã ãã®ãããªå Žåã®ããã«ãçžæãåæ ã§ãããæ³¢ãã®éçãèšç®ã§ããããã«ããå¿
èŠãããããã¡ãããããå°ãå€ããæäŸããå¿
èŠããããŸãã
- é æ¹ã®ææããã®èŠéã®ç§»åã ããã«ãããã¢ã¯ã·ã§ã³ã®åé¢ãèŠéã®éä¿¡å
ãéžæããååŸãè¶
ãããã®åŸãã«æ®ã£ãŠããææãåã«ãã¯ãŒãå¢åŒ·ãããããããã©ãã«ãåããªãå Žåã倧ããªãããã®åé¡ã解決ããŸãã æãç°¡åãªæ¹æ³ã¯ãåææããéä¿¡ãããèŠéã®æ°ãã«ãŠã³ãããè·é¢ãèæ
®ããŠããã®æ°ããŒãã®ææãããã倧ããææã«éä¿¡ããããšã§ãã
ã¹ã¿ãŒã¿ãŒãããã®å€æŽ
ã²ãŒã ãªããžã§ã¯ãã䜿çšããç°¡åãªæäœã解æããã³å®è¡ããããã«ãäž»å¬è
ãæäŸããã³ãŒããæžãæããããšããå§ãããŸãã Javaããå€æãããšãã¹ã¿ãŒã¿ãŒãããã¯éåžžã«æ²ãã£ãŠæžãããŠããŸãã èšèªãæéã§ã¯ãªãããšãèãããšããããçµäºããããšããå§ãããŸãã ãšããã§ãå€ãã®èšèªã§ã¯ããããã®åé¡ã解決ãããã¹ã¿ãŒã¿ãŒããããæ¢ã«ä¿®æ£ãããŠããŸã
次ã¯ïŒ
äžèšã®ãªã¹ãã¯ãïŒä»ã®ãšããïŒäžäœ50ã«å
¥ãã«ã¯ååã§ããããã«ãç¬èªã®ã¢ãããŒããšæ°åŠçãªè£
眮ã®äœ¿çšã¯æçšã§ãã ããããéçºã§ããäž»ãªåéã®ãã¡ã次ã®ç¹ã«æ³šæããŠãã ããã
- ç©èªã éå»ã®åãã®çµæãèæ
®ããããšã§ããããŒãç£èŠããååã«åŸã£ãŠãã©ãã£ãã¯ã®éäžãšå®éã®æé·ã®å Žæãç¹å®ã§ããŸã
realGrowth = growthRate +ïŒfleetsInMy-fleetsInEnemy-fleetsOutïŒ/ historySize - ãããåæã æãåçŽãªã±ãŒã¹ã§ã¯ããã®åé¡ã¯ãèªèº«ãšç°æã®ææãŸã§ã®å¹³åè·é¢ãšæå°è·é¢ãæé·ããããã®è¹ã®æ°ãèæ
®ããè©äŸ¡é¢æ°ãå°å
¥ããããšã§è§£æ±ºãããŸãã ããè€éãªã±ãŒã¹ã§ã¯ãã°ã©ãå
ã®æé©ãªãã¹ãšæ倧ãããŒãèŠã€ããåé¡ãçºçããŸãã
- å¯èœãªåãã®åæã ã¿ãŒã²ãããéžæããåŸãããããã«å¯ŸããŠæ»æãå®è¡ã§ããæãæåããææã®ã»ãããããã€ãçæã§ããŸãã åæã«ãåã»ããã«ã€ããŠãæå¹æ§ãšãæç²ãŸãã¯ä¿è·ã®ããã«éãããå¿
èŠãããè¹ã®æ°ã®è©äŸ¡ããããŸãïŒããã«ããã®æ°ã¯ææéã§ååé
ã§ããŸãïŒã ãã®ãããªäžé£ã®ç§»åãéžæããéã«ãå©çšå¯èœãªæ°ã®è¹ãéä¿¡ãããšæ倧ã®å©çãåŸããããšããåé¡ããããŸãã ããã¯ãããã«å€æŽãããããã±ãŒãžã³ã°ã¿ã¹ã¯ã§ãã
- åŸ
ã£ãŠããŸãã æ¯ã¿ãŒã³ããã¹ãŠã®ææããã®ãã¹ãŠã®æé·ãæãåªå
床ã®é«ããšãªã¢ã«éããããããããŸãã 圌ãã¯ãã¹ãŠãåãããšããæèŠããããŸãããããã§ããïŒ éä¿¡ãããèŠéã¯ãçžæã«ãšã£ãŠèšç®ãã¯ããã«ç°¡åã§ããåŸ
æ©äžã®èŠéãšã¯ç°ãªãããã§ã«ç®æšãæã£ãŠããŸãã åæã«ãããªãã確å®ã«ïŒãŸãããŸãã¯ã»ãŒç¢ºå®ã«ïŒæãŸããããéã«å®åã«çãŸãããšãã§ãããããªç®æšãåŸ
ã€ããšãå¯èœã«ãªããŸãã ãããã£ãŠãç·è³ªéãç¹å®ã®ããŒã¯ãè¶
ãããŸã§çµæãéæã§ããªããããå°ããªéšåã§ã®æ»æã¯æªæãããå¯èœæ§ãé«ãããšãç解ããããšãéèŠã§ãã ãã®è³ªéãããªãã®äžã«èç©ãããç¬éãŸã§åŸ
ã£ãŠã¿ãŸãããã ãããŠãã1ã€ã®äºå®ïŒæŽŸé£ãããèŠéã¯ç®æšã«å°éãããŸã§ã²ãŒã ããé€å€ããããããäžæããããŸã§ã«åªããéšéã«ããæ»æãç®æšã«å°éããç¶æ³ãçºçããªãããã«è·é¢ãèæ
®ããããšãéèŠã§ãã
- 移åéã®èšç®ã ã«ãŒã«ã«ãããšã移åã®ã¿ã€ã ã¢ãŠãã¯1000ããªç§ã§ããããããã¯ã¹ã¬ããã䜿çšã§ããŸããã ããããã³ãŒã¹ã®å®äºåŸããšã³ãžã³ãããããåŠçããç¬éã«èæ
®ããããšãã§ããŸãã ãããã®ç¬éã«ãå±¥æŽãæäœããã»ãšãã©å€åããªãå€ïŒããšãã°ãææéã®è·é¢ãæµããäžç«ææã®åªå
é äœãªã©ïŒãèšç®ããŠãã£ãã·ã¥ã§ããŸãã
ãããã«
ãããŠã¿ã€ãã«ã®ãAIãã«ã€ããŠã ãã¥ãŒã©ã«ãããã¯ãŒã¯ãŸãã¯
éºäŒçã¢ã«ãŽãªãºã ã䜿çšããŠå
±éã®äœæ¥ããžãã¯ãå®è£
ããããšã¯ã»ãšãã©æå³ããããŸããïŒãã®ãããæç¶ã䞻矩ãŸãã¯ãã«ããšãŒãžã§ã³ãã·ã¹ãã ã®æ¹ãã¯ããã«åªããŠããŸãïŒãããã¹/ãããŒã®çºèŠãç®æšã®èªèãšè©äŸ¡ãããã³ããã±ãŒãžã³ã°åé¡ã®é¡èãªã¿ã¹ã¯ã解決ããããã«äœ¿çšã§ããŸãã çŸæç¹ã§ã¯èª°ãAIã¢ãããŒãã䜿çšããŠããªããã倧ããªå©ç¹ããããããŠããªããããããŸã§ã®ãã«ãŒããã©ãŒã¹ã®ãã¥ãŒãªã¹ãã£ãã¯æ€çŽ¢ãã¿ã€ã ã¢ãŠãã«åãŸããåã€ããšãã§ããŸãã ãããã«ãããããã«èå³æ·±ããã®ã«ãªããŸãã ååã1ãæã2ãæã§æ£åœåããããã©ãããèŠãŠã¿ãŸãããã åºçåŸããã·ã¢èªã話ãåå è
ã®æ°ãå¢ããããšãé¡ã£ãŠããŸãã