AIã«ãããè¡åããªãŒãå æ¬çã«è§£èª¬ãåºæ¬çãªæŠå¿µãããã²ãŒã ããããã£ã¯ã¹ãªã©ã§ã®å®çšçãªå¿çšãŸã§ã
人工ç¥èœïŒè¡åããªãŒã®æ·±å ã
人工ç¥èœã®åºå€§ã§é²åãç¶ããé åã«ãããŠãéçºè ã¯åŒ·åã§ãã¹ã±ãŒã©ãã«ã§ãçŽæçãªããŒã«ãåžžã«æ¢æ±ããŠããŸãããæ°ã«å ¥ãã®ãããªã²ãŒã ã«ç»å Žãããã³ãã¬ã€ã€ãŒãã£ã©ã¯ã¿ãŒïŒNPCïŒãããå庫ã§è·ç©ãä»åãããèªåŸãããããŸã§ãä¿¡ææ§ããã广çãªAIã®è¡åãäœæããããšã¯ã倧å€ãªäœæ¥ã§ããå€ãã®æè¡ãååšããŸããããã®æŽç·Žããšæè»æ§ãããè¡åããªãŒïŒBTïŒãäž»èŠãªåãšããŠç»å ŽããŸããã
ããããªãããã€ã³ããªãžã§ã³ãã«ã«ããŒãæ¢ãã仲éãšé£æºããç¶æ³ã«å¿ããŠæŠè¡ãå€ããã²ãŒã å ã®æµã«é©ããããšããããªããããããè¡åããªãŒã®åäœãç®æããããšã§ãããããã®èšäºã§ã¯ãåºæ¬çãªæŠå¿µããé«åºŠãªå¿çšãŸã§ãéçºè ããã¶ã€ããŒããããŠAIæå¥œå®¶ã®äžçäžã®èªè ã«åããŠãè¡åããªãŒãå æ¬çã«æ¢æ±ããŸãã
ããåçŽãªã·ã¹ãã ã®åé¡ç¹ïŒãªãè¡åããªãŒãå¿ èŠãªã®ã
è¡åããªãŒã®é©æ°ãçè§£ããããã«ã¯ããã®åã®ãã®ãçè§£ããããšã圹ç«ã¡ãŸããé·å¹ŽãåçŽãªAIã®å®çªã®è§£æ±ºçã¯æéç¶æ ãã·ã³ïŒFSMïŒã§ããã
FSMã¯ãäžé£ã®ç¶æ ïŒäŸïŒå·¡åãè¿œè·¡ãæ»æïŒãšããããã®éã®é·ç§»ïŒäŸïŒãæµãçºèŠãã®å Žåãå·¡åãã远跡ãžé·ç§»ïŒã§æ§æãããŸããããã€ãã®ç°ãªãè¡åãæã€åçŽãªAIã®å ŽåãFSMã¯ããŸãæ©èœããŸããããããè€éããå¢ãã«ã€ããŠãããã«ç®¡çäžèœã«ãªããŸãã
- ã¹ã±ãŒã©ããªãã£ã®åé¡ïŒãã«ããŒãåããã®ãããªæ°ããç¶æ ã远å ããã«ã¯ãä»ã®ãã¹ãŠã®æ¢åã®ç¶æ ããã®é·ç§»ãäœæããå¿ èŠãããå ŽåããããŸããããã«ãããéçºè ããã¹ãã²ããã£ã³ãŒãããšåŒã¶ãã®ãã€ãŸãããããã°ãšæ¡åŒµãå°é£ãªçµ¡ã¿åã£ãæ¥ç¶ã®ç¶²ãçãŸããŸãã
- ã¢ãžã¥ãŒã«æ§ã®æ¬ åŠïŒè¡åã¯ç¶æ ã«å¯æ¥ã«çµåãããŠããŸããã匟è¬ãèŠã€ãããããžãã¯ãç°ãªãã·ããªãªã§åå©çšããããšã¯ãã³ãŒããšããžãã¯ãè€è£œããããšãªãå°é£ã§ãã
- åæ§ïŒFSMã¯åžžã«ãäžåºŠã«1ã€ã®ç¶æ ã«ã®ã¿ãããŸããããã«ããã埮åŠãªããŸãã¯éå±€çãªè¡åãã¢ãã«åããããšãå°é£ã«ãªããŸãã
è¡åããªãŒã¯ããŸãã«ãããã®åé¡ã解決ããããã«éçºãããè€éãªAIãšãŒãžã§ã³ããèšèšããããã®ãããæ§é åãããã¢ãžã¥ãŒã«åãããã¹ã±ãŒã©ãã«ãªã¢ãããŒããæäŸããŸãã
è¡åããªãŒãšã¯ïŒAIãžã®éå±€çã¢ãããŒã
åºæ¬çã«ã¯ãè¡åããªãŒã¯ãAIãšãŒãžã§ã³ãã®æææ±ºå®ã®æµããå¶åŸ¡ããããŒãã®éå±€çãªããªãŒã§ããäŒç€Ÿã®çµç¹å³ã®ãããªãã®ã§ããæäžäœã®CEOïŒã«ãŒãããŒãïŒã¯ãã¹ãŠã®ã¿ã¹ã¯ãå®è¡ããããã§ã¯ãªãã代ããã«ãããŒãžã£ãŒïŒè€åããŒãïŒã«å§ä»»ãããããŒãžã£ãŒã¯ç¹å®ã®ãžã§ããå®è¡ããåŸæ¥å¡ïŒãªãŒãããŒãïŒã«å§ä»»ããŸãã
ããªãŒã¯äžããäžã«è©äŸ¡ãããã«ãŒãããå§ãŸããéåžžã¯ãã¬ãŒã ããšãŸãã¯æŽæ°ãµã€ã¯ã«ããšã«è¡ãããŸãããã®ããã»ã¹ã¯ããã£ãã¯ããšåŒã°ããŸãããã£ãã¯ä¿¡å·ã¯ããªãŒãäžæ¹åã«äŒæããäžé£ã®ã«ãŒã«ã«åºã¥ããŠç¹å®ã®ãã¹ã«æ²¿ã£ãŠããŒããã¢ã¯ãã£ãåããŸããåããŒãã¯ãå®äºæã«ãã®èŠªã«ã¹ããŒã¿ã¹ãè¿ããŸãã
- SUCCESSïŒããŒãã衚ãã¿ã¹ã¯ãæ£åžžã«å®äºããŸããã
- FAILUREïŒã¿ã¹ã¯ãå®äºã§ããŸããã§ããã
- RUNNINGïŒã¿ã¹ã¯ã¯é²è¡äžã§ãå®äºã«ã¯ããã«æéãããããŸãïŒäŸïŒç®çå°ãŸã§æ©ãïŒã
芪ããŒãã¯ããããã®ã¹ããŒã¿ã¹ã䜿çšããŠã次ã«ã©ã®åäŸããã£ãã¯ããããæ±ºå®ããŸãããã®ç¶ç¶çãªãäžããäžã®åè©äŸ¡ã«ãããBTã¯äžçã®ç¶æ³ã®å€åã«éåžžã«åå¿ãããããªã£ãŠããŸãã
è¡åããªãŒã®ã³ã¢ã³ã³ããŒãã³ã
ãã¹ãŠã®è¡åããªãŒã¯ãããã€ãã®åºæ¬çãªã¿ã€ãã®ããŒãããæ§æãããŠããŸãããããã®æ§æèŠçŽ ãçè§£ããããšããã·ã¹ãã ãç¿åŸããããã®éµã§ãã
1. ãªãŒãããŒãïŒã¢ã¯ã·ã§ã³ãšæ¡ä»¶
ãªãŒãããŒãã¯ãããªãŒã®ãšã³ããã€ã³ãã§ãããå®éã«ã¿ã¹ã¯ãå®è¡ããããæ¡ä»¶ããã§ãã¯ãããããã¯ãŒã«ãŒã§ãããããã«ã¯åäŸãããŸããã
- ã¢ã¯ã·ã§ã³ããŒãïŒãããã®ããŒãã¯ãã²ãŒã ã®äžçã§ã¢ã¯ã·ã§ã³ãå®è¡ããŸããã¢ã¯ã·ã§ã³ãç¬éçïŒäŸïŒæŠåšã®çºå°ïŒã§ããã°ãããã«`SUCCESS`ãè¿ãå¯èœæ§ããããŸããæéããããå ŽåïŒäŸïŒãããã€ã³ãã«ç§»åããïŒãå®äºãããŸã§åãã£ãã¯ã§`RUNNING`ãè¿ããå®äºãããš`SUCCESS`ãè¿ããŸããäŸãšããŠã¯ã`MoveToEnemy()`, `PlayAnimation("Attack")`, `ReloadWeapon()`ãªã©ããããŸãã
- æ¡ä»¶ããŒãïŒãããã¯ãäžçã®ç¶æ ãå€ããã«ãã§ãã¯ããç¹å¥ãªã¿ã€ãã®ãªãŒãããŒãã§ãããããã¯ããªãŒã®ã²ãŒããŠã§ã€ãšããŠæ©èœããæ¡ä»¶ãtrueã®å Žåã¯`SUCCESS`ãè¿ããfalseã®å Žåã¯`FAILURE`ãè¿ããŸããäŸãšããŠã¯ã`IsHealthLow?`, `IsEnemyInLineOfSight?`, `HasAmmunition?`ãªã©ããããŸãã
2. è€åããŒãïŒå¶åŸ¡ãããŒ
è€åããŒãã¯ãããªãŒã®ãããŒãžã£ãŒã§ãã1ã€ä»¥äžã®åäŸãæã¡ãã©ã®åäŸãå®è¡ããããæ±ºå®ããããã«ç¹å®ã®ã«ãŒã«ã䜿çšããŸãããããã¯AIã®ããžãã¯ãšåªå é äœãå®çŸ©ããŸãã
-
ã·ãŒã±ã³ã¹ããŒãïŒå€ãã®å Žåãç¢å°ïŒâïŒã§è¡šããããããANDããšã©ãã«ä»ããããŸããã·ãŒã±ã³ã¹ã¯ããã®åäŸãå·Šããå³ã«é çªã«å®è¡ããŸããåäŸã®1ã€ã倱æãããšããã«åæ¢ãã`FAILURE`ãè¿ããŸãããã¹ãŠã®åäŸãæåããå Žåãã·ãŒã±ã³ã¹èªäœã¯`SUCCESS`ãè¿ããŸããããã¯ãé çªã«å®è¡ããå¿
èŠãããã¿ã¹ã¯ã®ã·ãŒã±ã³ã¹ãäœæããããã«äœ¿çšãããŸãã
äŸïŒ`Reload`ã·ãŒã±ã³ã¹ã¯ãã·ãŒã±ã³ã¹( `HasAmmoInInventory?`, `PlayReloadAnimation()`, `UpdateAmmoCount()` )ãšãªãå¯èœæ§ããããŸãããšãŒãžã§ã³ãã®ã€ã³ãã³ããªã«åŒŸè¬ããªãå Žåãæåã®åäŸã倱æããã·ãŒã±ã³ã¹å šäœãããã«äžæ¢ãããŸãã
-
ã»ã¬ã¯ã¿ãŒããŒãïŒãŸãã¯ãã©ãŒã«ããã¯ããŒãïŒïŒå€ãã®å Žåãçå笊ïŒïŒïŒã§è¡šããããããORããšã©ãã«ä»ããããŸããã»ã¬ã¯ã¿ãŒãããã®åäŸãå·Šããå³ã«é çªã«å®è¡ããŸãããã ããåäŸã®1ã€ãæåãããšããã«åæ¢ãã`SUCCESS`ãè¿ããŸãããã¹ãŠã®åäŸã倱æããå Žåãã»ã¬ã¯ã¿ãŒèªäœã¯`FAILURE`ãè¿ããŸããããã¯ããã©ãŒã«ããã¯åäœãäœæããããå¯èœæ§ã®ãªã¹ããã1ã€ã®ã¢ã¯ã·ã§ã³ãéžæãããããããã«äœ¿çšãããŸãã
äŸïŒ`Combat`ã»ã¬ã¯ã¿ãŒã¯ãã»ã¬ã¯ã¿ãŒ( `PerformMeleeAttack()`, `PerformRangedAttack()`, `Flee()` )ãšãªãå¯èœæ§ããããŸããAIã¯æåã«è¿æ¥æ»æã詊ã¿ãŸãããããäžå¯èœãªå ŽåïŒäŸïŒã¿ãŒã²ãããé ãããïŒã倱æããã»ã¬ã¯ã¿ãŒã¯æ¬¡ã®åäŸïŒé è·é¢æ»æïŒã«ç§»åããŸããããã倱æããå ŽåïŒäŸïŒåŒŸè¬ããªãïŒãæåŸã®ãªãã·ã§ã³ïŒéããïŒã«ç§»åããŸãã
-
ãã©ã¬ã«ããŒãïŒãã®ããŒãã¯ããã¹ãŠã®åäŸãåæã«å®è¡ããŸããç¬èªã®æåãŸãã¯å€±æã¯ãæå®ãããããªã·ãŒã«äŸåããŸããããšãã°ã1人ã®åäŸãæåãããšããã«`SUCCESS`ãè¿ãããšãããã¹ãŠã®åäŸãæåãããŸã§åŸ
ã€ããšãã§ããŸããããã¯ãäž»èŠãªã¿ã¹ã¯ãå®è¡ããªãããåæã«äºæ¬¡çãªç£èŠã¿ã¹ã¯ãå®è¡ããå Žåã«åœ¹ç«ã¡ãŸãã
äŸïŒ`Patrol`ãã©ã¬ã«ã¯ããã©ã¬ã«( `MoveAlongPatrolPath()`, `LookForEnemies()` )ãšãªãå¯èœæ§ããããŸããAIã¯ãåšå²ãåžžã«ã¹ãã£ã³ããªããããã¹ãæ©ããŸãã
3. ãã³ã¬ãŒã¿ããŒãïŒä¿®é£Ÿå
ãã³ã¬ãŒã¿ããŒãã¯ã1人ã®åäŸããæããããã®åäŸã®åäœãŸãã¯çµæã倿Žããããã«äœ¿çšãããŸããããªãŒãä¹±éã«ããããšãªãã匷åãªå¶åŸ¡ãšããžãã¯ã®å±€ã远å ããŸãã
- ã€ã³ããŒã¿ãŒïŒãã®åäŸã®çµæãå転ãããŸãã`SUCCESS`ã¯`FAILURE`ã«ãªãã`FAILURE`ã¯`SUCCESS`ã«ãªããŸãã`RUNNING`ã¯éåžžã倿Žãããã«æž¡ãããŸããããã¯ããif notãããžãã¯ã®äœæã«æé©ã§ãã
äŸïŒ ã€ã³ããŒã¿ãŒ( `IsEnemyVisible?` ) ã¯ãæµãèŠããªãå Žåã«ã®ã¿æåããæ¡ä»¶ãäœæããŸãã
- ãªããŒã¿ãŒïŒåäŸããæå®ãããåæ°ããŸãã¯åäŸã倱æãããŸã§ç¡æéã«å®è¡ããŸãã
- ãµã·ãŒããŒ/ãã§ã€ã©ãŒïŒåäŸãäœãè¿ããŠããããããåžžã«`SUCCESS`ãŸãã¯`FAILURE`ãè¿ããŸããããã¯ãããªãŒã®ãã©ã³ãããªãã·ã§ã³ã«ããå Žåã«åœ¹ç«ã¡ãŸãã
- ãªããã¿ãŒ/ã¯ãŒã«ããŠã³ïŒåäŸã®å®è¡é »åºŠãå¶éããŸããããšãã°ã`GrenadeThrow`ã¢ã¯ã·ã§ã³ã¯ã10ç§ã«1åããå®è¡ã§ããªãããã«ããããã«ããªããã¿ãŒã§ä¿®é£Ÿã§ããŸãã
ãã¹ãŠããŸãšããïŒå®çšçãªäŸ
äžäººç§°ã·ã¥ãŒãã£ã³ã°ã²ãŒã ã§ãã·ã³ãã«ãªæµå µå£«ã®AIã®è¡åããªãŒãèšèšããŠã¿ãŸããããå¿ èŠãªè¡åã¯æ¬¡ã®ãšããã§ããå µå£«ã®æåªå äºé ã¯ããã¬ã€ã€ãŒãèŠããå Žåã¯ãã¬ã€ã€ãŒãæ»æããããšã§ãããã¬ã€ã€ãŒãèŠããªãå Žåãå µå£«ã¯æå®ããããšãªã¢ãããããŒã«ããå¿ èŠããããŸããæŠéäžã«å µå£«ã®äœåãäœäžããå Žåãã«ããŒãæ¢ãå¿ èŠããããŸãã
ãã®ããžãã¯ãè¡åããªãŒã§æ§é åããæ¹æ³ã¯æ¬¡ã®ãšããã§ãïŒäžããäžãžèªã¿ãã€ã³ãã³ãã¯éå±€ã瀺ããŠããŸãïŒã
ã«ãŒãïŒã»ã¬ã¯ã¿ãŒïŒ
|-- äœäœåãšã¹ã±ãŒãïŒã·ãŒã±ã³ã¹ïŒ
| |-- IsHealthLow?ïŒæ¡ä»¶ïŒ
| |-- FindCoverPointïŒã¢ã¯ã·ã§ã³ïŒ-> ç§»åäžã¯RUNNINGãè¿ãããã®åŸSUCCESS
| `-- TakeCoverïŒã¢ã¯ã·ã§ã³ïŒ
|
|-- ãã¬ã€ã€ãŒã«åå ïŒã·ãŒã±ã³ã¹ïŒ
| |-- IsPlayerVisible?ïŒæ¡ä»¶ïŒ
| |-- IsWeaponReady?ïŒæ¡ä»¶ïŒ
| |-- æŠéããžãã¯ïŒã»ã¬ã¯ã¿ãŒïŒ
| | |-- ãã¬ã€ã€ãŒãæã€ïŒã·ãŒã±ã³ã¹ïŒ
| | | |-- IsPlayerInLineOfSight?ïŒæ¡ä»¶ïŒ
| | | `-- ShootïŒã¢ã¯ã·ã§ã³ïŒ
| | `-- æ»æäœçœ®ã«ç§»åïŒã·ãŒã±ã³ã¹ïŒ
| | |-- Inverter(IsPlayerInLineOfSight?)ïŒãã³ã¬ãŒã¿+æ¡ä»¶ïŒ
| | `-- MoveTowardsPlayerïŒã¢ã¯ã·ã§ã³ïŒ
|
`-- ããããŒã«ïŒã·ãŒã±ã³ã¹ïŒ
|-- GetNextPatrolPointïŒã¢ã¯ã·ã§ã³ïŒ
`-- MoveToPointïŒã¢ã¯ã·ã§ã³ïŒ
åããã£ãã¯ãã§ã®ä»çµã¿ïŒ
- ã«ãŒãã»ã¬ã¯ã¿ãŒãéå§ãããŸããæåã®åäŸã`Low Health Escape`ã·ãŒã±ã³ã¹ã詊ããŸãã
- `Low Health Escape`ã·ãŒã±ã³ã¹ã¯æåã«`IsHealthLow?`ããã§ãã¯ããŸããäœåãäœãå Žåããã®æ¡ä»¶ã¯`FAILURE`ãè¿ããŸããã·ãŒã±ã³ã¹å šäœã倱æããå¶åŸ¡ãã«ãŒãã«æ»ããŸãã
- ã«ãŒãã»ã¬ã¯ã¿ãŒã¯ãæåã®åäŸã倱æããããšã確èªãã2çªç®ã®åäŸïŒ`Engage Player`ã«ç§»åããŸãã
- `Engage Player`ã·ãŒã±ã³ã¹ã¯`IsPlayerVisible?`ããã§ãã¯ããŸããããã§ãªãå Žåã倱æããã«ãŒãã¯`Patrol`ã·ãŒã±ã³ã¹ã«ç§»åããå µå£«ã«å¹³åçã«ããããŒã«ãããŸãã
- ãã ãã`IsPlayerVisible?`ãæåããå Žåãã·ãŒã±ã³ã¹ã¯ç¶è¡ãããŸãã`IsWeaponReady?`ããã§ãã¯ããŸããæåããå Žåã`Combat Logic`ã»ã¬ã¯ã¿ãŒã«é²ã¿ãŸãããã®ã»ã¬ã¯ã¿ãŒã¯æåã«`Shoot At Player`ã詊ã¿ãŸãããã¬ã€ã€ãŒãèŠçå ã«ããå Žåã`Shoot`ã¢ã¯ã·ã§ã³ãå®è¡ãããŸãã
- æŠéäžã«å µå£«ã®äœåãäœäžããå Žåãæ¬¡ã®ãã£ãã¯ã§æåã®æ¡ä»¶ïŒ`IsHealthLow?`ïŒãæåããŸããããã«ããã`Low Health Escape`ã·ãŒã±ã³ã¹ãå®è¡ãããå µå£«ãã«ããŒãèŠã€ããŠã«ããŒãåããŸããã«ãŒãã¯ã»ã¬ã¯ã¿ãŒã§ãããæåã®åäŸãçŸåšæåããŠããïŒãŸãã¯å®è¡ãããŠããïŒããã`Engage Player`ãŸãã¯`Patrol`ãã©ã³ããè©äŸ¡ããããšã¯ãããŸãããããããåªå é äœãèªç¶ã«åŠçãããæ¹æ³ã§ãã
ãã®æ§é ã¯ã¯ãªãŒã³ã§ãèªã¿ãããããããŠäœãããæ¡åŒµãç°¡åã§ããã°ã¬ããŒããæããè¡åã远å ãããã§ããïŒ`Combat Logic`ã»ã¬ã¯ã¿ãŒã«ãå°æãããé«ãåªå é äœãæã€å¥ã®ã·ãŒã±ã³ã¹ãæ¿å ¥ããç¬èªã®æ¡ä»¶ïŒäŸïŒ`IsPlayerInCover?`, `HasGrenade?`ïŒãå®äºã§ããŸãã
è¡åããªãŒãšæéç¶æ ãã·ã³ïŒè€éãã®ããã®æç¢ºãªåè
æ¯èŒã圢åŒåããŸãããïŒ
| æ©èœ | è¡åããªãŒïŒBTïŒ | æéç¶æ ãã·ã³ïŒFSMïŒ |
|---|---|---|
| ã¢ãžã¥ãŒã«æ§ | éåžžã«é«ãããµãããªãŒïŒäŸïŒããã«ã¹ããã¯ãèŠã€ãããã·ãŒã±ã³ã¹ïŒã¯äžåºŠäœæããããŸããŸãªAIéããŸãã¯åãããªãŒã®ç°ãªãéšåã§åå©çšã§ããŸãã | äœããããžãã¯ã¯ç¶æ ãšé·ç§»ã«åã蟌ãŸããŠããŸããåäœãåå©çšããã«ã¯ãå€ãã®å Žåãç¶æ ãšãã®æ¥ç¶ãè€è£œããå¿ èŠããããŸãã |
| ã¹ã±ãŒã©ããªã㣠| åªããŠããŸããæ°ããåäœã远å ããããšã¯ãããªãŒã«æ°ãããã©ã³ããæ¿å ¥ããã®ãšåããããç°¡åã§ããæ®ãã®ããžãã¯ãžã®åœ±é¿ã¯å±æçã§ãã | äžè¯ãç¶æ ã远å ããããšãæœåšçãªé·ç§»ã®æ°ã¯ææ°é¢æ°çã«å¢å ãããç¶æ ççºããçºçããå¯èœæ§ããããŸãã |
| åå¿æ§ | æ¬è³ªçã«åå¿çã§ããããªãŒã¯åãã£ãã¯ã§ã«ãŒãããåè©äŸ¡ããããããå®çŸ©ãããåªå é äœã«åºã¥ããŠãäžçã®å€æŽã«å³åº§ã«åå¿ã§ããŸãã | åå¿æ§ã¯äœãããšãŒãžã§ã³ãã¯ãç¹å®ã®ãäºåå®çŸ©ãããé·ç§»ãããªã¬ãŒããããŸã§ãçŸåšã®ç¶æ ã«ãåºå·ãããŸããå šäœçãªç®æšãåžžã«åè©äŸ¡ããŠããããã§ã¯ãããŸããã |
| å¯èªæ§ | é«ããç¹ã«ããžã¥ã¢ã«ãšãã£ã¿ã䜿çšããå Žåãéå±€æ§é ã¯ãåªå é äœãšããžãã¯ãããŒãæç¢ºã«ç€ºããŠãããããã²ãŒã ãã¶ã€ããŒãªã©ã®éããã°ã©ããŒã«ãšã£ãŠãçè§£ãããããªã£ãŠããŸãã | è€éããå¢ããšäœããªããŸããè€éãªFSMã®ããžã¥ã¢ã«ã°ã©ãã¯ãã¹ãã²ããã£ã®å±±ã®ããã«èŠããå ŽåããããŸãã |
ã²ãŒã 以å€ã®ã¢ããªã±ãŒã·ã§ã³ïŒãããã£ã¯ã¹ãšã·ãã¥ã¬ãŒã·ã§ã³
è¡åããªãŒã¯ã²ãŒã æ¥çã§æåã«ãªããŸãããããã®æçšæ§ã¯ãããã¯ããã«è¶ ããŠããŸããèªåŸçã§ã¿ã¹ã¯æåã®æææ±ºå®ãå¿ èŠãšããã·ã¹ãã ã¯ãã¹ãŠãBTã®äž»ãªåè£ã§ãã
- ãããã£ã¯ã¹ïŒå庫ããããã®äœæ¥æ¥å šäœãBTã§ã¢ãã«åã§ããŸããã«ãŒãã¯ã`FulfillOrder`ãŸãã¯`RechargeBattery`ã®ã»ã¬ã¯ã¿ãŒã§ããå¯èœæ§ããããŸãã`FulfillOrder`ã·ãŒã±ã³ã¹ã«ã¯ã`NavigateToShelf`ã`IdentifyItem`ã`PickUpItem`ãããã³`DeliverToShipping`ãªã©ã®åäŸãå«ãŸããŸãã`IsBatteryLow?`ã®ãããªæ¡ä»¶ã¯ãé«ã¬ãã«ã®é·ç§»ãå¶åŸ¡ããŸãã
- èªåŸã·ã¹ãã ïŒç¡äººèªç©ºæ©ïŒUAVïŒãŸãã¯æ¢æ»ããã·ã§ã³äžã®ããŒããŒã¯ãBTã䜿çšããŠè€éãªããã·ã§ã³ãã©ã³ã管çã§ããŸããã·ãŒã±ã³ã¹ã«ã¯ã`TakeOff`ã`FlyToWaypoint`ã`ScanArea`ã`ReturnToBase`ãå«ãŸããå ŽåããããŸããã»ã¬ã¯ã¿ãŒã¯ã`ObstacleDetected`ã`LostGPS`ãªã©ã®ç·æ¥ãã©ãŒã«ããã¯ãåŠçã§ããŸãã
- ã·ãã¥ã¬ãŒã·ã§ã³ãšãã¬ãŒãã³ã°ïŒè»äºãŸãã¯ç£æ¥çšã·ãã¥ã¬ãŒã¿ãŒã§ã¯ãBTã䜿çšããŠãã·ãã¥ã¬ãŒãããããšã³ãã£ãã£ïŒäººãè»äž¡ïŒã®è¡åãä¿é²ããçŸå®çã§ããããã®ãããã¬ãŒãã³ã°ç°å¢ãäœæã§ããŸãã
課é¡ãšãã¹ããã©ã¯ãã£ã¹
ãã®åã«ãããããããè¡åããªãŒã«ã¯èª²é¡ããªãããã§ã¯ãããŸããã
- ãããã°ïŒAIãç¹å®ã®æ±ºå®ãäžããçç±ãã倧ããªããªãŒã§è¿œè·¡ããããšã¯å°é£ãªå ŽåããããŸããããªãŒãå®è¡ããããšãã«åããŒãã®ã©ã€ãã¹ããŒã¿ã¹ïŒ`SUCCESS`ã`FAILURE`ã`RUNNING`ïŒã衚瀺ããããžã¥ã¢ã«ãããã°ããŒã«ã¯ãè€éãªãããžã§ã¯ãã«ã¯ã»ãŒäžå¯æ¬ ã§ãã
- ããŒã¿éä¿¡ïŒããŒãã¯ã©ã®ããã«æ å ±ãå ±æããŸããïŒäžè¬çãªè§£æ±ºçã¯ããã©ãã¯ããŒããšåŒã°ããå ±æããŒã¿ã³ã³ããã¹ãã§ãã`IsEnemyVisible?`æ¡ä»¶ã¯ããã¬ã€ã€ãŒã®å Žæããã©ãã¯ããŒãããèªã¿åãå¯èœæ§ããããŸããã`DetectEnemy`ã¢ã¯ã·ã§ã³ã¯ããã®å Žæã«ãã®å Žæãæžã蟌ã¿ãŸãã
- ããã©ãŒãã³ã¹ïŒéåžžã«å€§ãããæ·±ãããªãŒãæ¯ãã¬ãŒã ãã£ãã¯ãããšãèšç®ã³ã¹ãããããå¯èœæ§ããããŸããã€ãã³ãããªãã³BTïŒé¢é£ããã€ãã³ããçºçããå Žåã«ã®ã¿ããªãŒãå®è¡ãããïŒãªã©ã®æé©åã«ãããããã軜æžã§ããŸãããè€éããå¢ããŸãã
ãã¹ããã©ã¯ãã£ã¹ïŒ
- æµ ãä¿ã€ïŒæ·±ããã®ãããå¹ ã®åºãããªãŒãåªå ããŸããæ·±ããã¹ããããããžãã¯ã¯ã远跡ãé£ããå ŽåããããŸãã
- ã¢ãžã¥ãŒã«æ§ãæ¡çšããïŒããã²ãŒã·ã§ã³ãã€ã³ãã³ããªç®¡çãªã©ã®äžè¬çãªã¿ã¹ã¯ã«å¯ŸããŠãå°ãããåå©çšå¯èœãªãµãããªãŒãæ§ç¯ããŸãã
- ãã©ãã¯ããŒãã䜿çšããïŒãã¹ãŠã®ç¶æ æ å ±ã«ãã©ãã¯ããŒãã䜿çšããããšã§ãããªãŒã®ããžãã¯ããšãŒãžã§ã³ãã®ããŒã¿ããåé¢ããŸãã
- ããžã¥ã¢ã«ãšãã£ã¿ã掻çšããïŒUnreal Engineã«çµã¿èŸŒãŸããŠãããã®ããUnityã®Behavior Designerãªã©ã®ã¢ã»ãããªã©ã®ããŒã«ã¯éåžžã«è²Žéã§ãããããã«ãããè¿ éãªãããã¿ã€ãã³ã°ãç°¡åãªèŠèŠåãããã°ã©ããŒãšãã¶ã€ããŒéã®ããè¯ãã³ã©ãã¬ãŒã·ã§ã³ãå¯èœã«ãªããŸãã
æªæ¥ïŒè¡åããªãŒã𿩿¢°åŠç¿
è¡åããªãŒã¯ãææ°ã®æ©æ¢°åŠç¿ïŒMLïŒæè¡ãšç«¶åãããã®ã§ã¯ãªããè£å®çã§ãããã€ããªããã¢ãããŒããæã匷åãªãœãªã¥ãŒã·ã§ã³ã§ããããšããããããŸãã
- ãªãŒãããŒãã®MLïŒBTã¯ãé«ã¬ãã«ã®æŠç¥ïŒäŸïŒ`DecideToAttack`ãŸãã¯`DecideToDefend`ïŒãåŠçã§ããŸããããã¬ãŒãã³ã°ããããã¥ãŒã©ã«ãããã¯ãŒã¯ã¯ãäœã¬ãã«ã®ã¢ã¯ã·ã§ã³ãå®è¡ã§ããŸãïŒäŸïŒæ£ç¢ºã§äººéã®ãããªç §æºã«MLã䜿çšãã`AimAndShoot`ã¢ã¯ã·ã§ã³ããŒãïŒã
- ãã©ã¡ãŒã¿ãã¥ãŒãã³ã°ã®MLïŒåŒ·ååŠç¿ã䜿çšããŠãç¹æ®èœåã®ã¯ãŒã«ããŠã³æéããåŸéã®ãã«ã¹ãããå€ãªã©ãBTå ã®ãã©ã¡ãŒã¿ãæé©åã§ããŸãã
ãã®ãã€ããªããã¢ãã«ã¯ãè¡åããªãŒã®äºæž¬å¯èœã§å¶åŸ¡å¯èœã§ãã¶ã€ããŒãã¬ã³ããªãŒãªæ§é ãšãæ©æ¢°åŠç¿ã®åŸ®åŠã§é©å¿åã®ããåãçµã¿åããããã®ã§ãã
çµè«ïŒææ°ã®AIã«äžå¯æ¬ ãªããŒã«
è¡åããªãŒã¯ãæéç¶æ ãã·ã³ã®å ãå¶éããã®å€§ããªäžæ©ã衚ããŠããŸããæææ±ºå®ã®ããã®ã¢ãžã¥ãŒã«åãããã¹ã±ãŒã©ãã«ã§ãéåžžã«èªã¿ããããã¬ãŒã ã¯ãŒã¯ãæäŸããããšã«ããããããã¯éçºè ãšãã¶ã€ããŒãææ°ã®ãã¯ãããžãŒã§èŠãããæãè€éã§ä¿¡ææ§ã®ããAIã®åäœãäœæã§ããããã«ããŸããã倧ãããã²ãŒã ã®ç¡çŸãªæµããæªæ¥çãªå·¥å Žã®å¹ççãªãããããŸã§ãè¡åããªãŒã¯åçŽãªã³ãŒããç¥çãªã¢ã¯ã·ã§ã³ã«å€ããè«ççãªããã¯ããŒã³ãæäŸããŸãã
ããªããçµéšè±å¯ãªAIããã°ã©ããŒãã²ãŒã ãã¶ã€ããŒããŸãã¯ããããå·¥åŠãšã³ãžãã¢ã§ãããã©ããã«ããããããè¡åããªãŒããã¹ã¿ãŒããããšã¯ãåºç€çãªã¹ãã«ãžã®æè³ã§ããããã¯ãåçŽãªããžãã¯ãšè€éãªã€ã³ããªãžã§ã³ã¹ã®éã®ã®ã£ãããåããããŒã«ã§ãããèªåŸã·ã¹ãã ã®åéã§ã®ãã®éèŠæ§ã¯ä»åŸãå¢å€§ãç¶ããã§ãããã