
å®è£ ã倢èŠãŠãããããžã§ã¯ãã®1ã€ã¯ãã¡ã¢ãªãåããã¢ãžã¥ãŒã«åŒã¿ã¹ã¯ãããã§ããã ãã®ãããžã§ã¯ãã®æçµçãªç®æšã¯ãç¬ç«ããŠéå£ãšããŠè¡ââåã§ããçç©ãããäžçãäœãããšã§ããã
以åã¯ã¯ãŒã«ããžã§ãã¬ãŒã¿ãŒãããã°ã©ã ããŠããã®ã§ãAIã䜿çšããŠåäœãšçžäºäœçšãå€æããåçŽãªããããäžçã«æå ¥ãããã£ãã®ã§ãã ãããã£ãŠãäžçã«å¯Ÿãã俳åªã®åœ±é¿ã®ãããã§ããã®è©³çŽ°ãå¢ããããšãã§ããŸããã
ç§ã¯ãã§ã«åºæ¬çãªJavascriptã¿ã¹ã¯ãã€ãã©ã€ã³ã·ã¹ãã ãå®è£ ããŸããïŒäººçãç°¡çŽ åãããããïŒããããä¿¡é Œæ§ãé«ãã¹ã±ãŒã©ãã«ãªãã®ã欲ããã®ã§ããã®ãããžã§ã¯ããC ++ã§äœæããŸããã subreddit / r / proceduralgenerationã§æç¶ãååºãå®è£ ããããã®ç«¶äºã¯ãç§ãããã«å°ããŸããïŒãããã£ãŠã察å¿ãããããã¯ïŒã
ç§ã®ã·ã¹ãã ã§ã¯ãã·ãã¥ã¬ãŒã·ã§ã³ã¯ãäžçã人å£ãããã³ããããæ¥ç¶ããäžé£ã®ã¢ã¯ã·ã§ã³ã®3ã€ã®ã³ã³ããŒãã³ãã§æ§æãããŠããŸãã ãã®ããããã®èšäºã§èª¬æãã3ã€ã®ã¢ãã«ãäœæããå¿ èŠããããŸããã
è€éããå¢ãããã«ãã¢ã¯ã¿ãŒã«äžçã§ã®ä»¥åã®çµéšã«é¢ããæ å ±ãä¿æããå°æ¥ã®ã¢ã¯ã·ã§ã³ã§ãããã®çžäºäœçšã«é¢ããç¥èã䜿çšããŠããããããšæããŸããã
äžçã®ã¢ãã«ãäœæãããšãã«ãåçŽãªãã¹ãéžæããPerlinãã€ãºã䜿çšããŠæ°Žé¢ã«é 眮ããŸããã äžçã®ä»ã®ãã¹ãŠã®ãªããžã§ã¯ãã¯ãå®å šã«ã©ã³ãã ã«é 眮ãããŠããŸããã
æ¯éå£ã¢ãã«ïŒããã³ãã®ãèšæ¶ãïŒã«ã€ããŠã¯ãããã€ãã®ç¹æ§ãšåº§æšãæã€ã¯ã©ã¹ãäœæããŸããã ããã¯äœè§£å床ã®ã·ãã¥ã¬ãŒã·ã§ã³ã§ãããšæ³å®ãããŠããŸããã ã¡ã¢ãªã¯ãã¥ãŒã§ããããããã¯èŠåãããç°å¢ã«é¢ããæ å ±ãä¿åãããã¥ãŒã«æžã蟌ã¿ãã¡ã¢ãªã®è§£éãšããŠãã®ãã¥ãŒã管çããŸãã
ããã2ã€ã®ã¢ã¯ã·ã§ã³ã·ã¹ãã ãæ¥ç¶ããããã«ãåã ã®ãšã³ãã£ãã£ãäžçã§è€éãªåäœãå®è£ ã§ããããã«ãã¿ã¹ã¯ãã¥ãŒã®éå±€ã·ã¹ãã å ã«ããªããã£ãã¿ã¹ã¯ã®ãã¬ãŒã ã¯ãŒã¯ãäœæãããã£ãã®ã§ãã

ãµã³ãã«ãããã æ°Žã¯æå³ããã«å®å šã«å·ã®åœ¢ãåããŸããã ä»ã®ãã¹ãŠã®èŠçŽ ã¯ãè»å¡ãå«ããŠã©ã³ãã ã«é 眮ãããŠããŸããè»å¡ã¯ããã®çš®ã§ã¯ç«¯ããé ãã«ãããŠããŸãïŒãã ããå·ã¯ãããã«èŠããŸãïŒã
èãéããèã®äžã®ã¢ãªã®æã¯ãåºæ¬çãªæ©èœïŒããã³ã¿ã¹ã¯ãã¥ãŒã·ã¹ãã å šäœïŒã®å®è£ ã®ä¿¡é Œæ§ãä¿èšŒããã¡ã¢ãªãªãŒã¯ïŒãããã®å€ãããããŸããïŒãé²ãåªãããã¹ãã¢ãã«ã«ãªããšæ±ºããŸããã
ã¿ã¹ã¯ã·ã¹ãã ãšã¡ã¢ãªã®æ§é ãããã«è©³ãã説æããïŒã»ãšãã©ïŒããªããã£ããªåºæ¬æ©èœããè€éããã©ã®ããã«äœæããããã瀺ããŸãã ãŸããã¢ãªãèãæ±ããŠåãæãããã«çã£ãããã«èµ°ãåºãããããã£ãšç«ã£ãŠããã°ã©ã ãé ãããããããšãã«ééããå¯èœæ§ã®ããé¢çœããã¢ãªã®ã¡ã¢ãªãªãŒã¯ãã瀺ããããšæããŸãã
äžè¬çãªæ§é
ãã®ã·ãã¥ã¬ãŒã·ã§ã³ãC ++ã§èšè¿°ããã¬ã³ããªã³ã°ã«SDL2ã䜿çšããŸããïŒä»¥åã«SLD2ã®å°ããªãã¬ãŒã³ããŒã·ã§ã³ã¯ã©ã¹ãæ¢ã«äœæããŸããïŒã ãŸããGitHubã§èŠã€ããA *å®è£ ïŒå°ãå€æŽïŒã䜿çšããŸããã å®è£ ã絶æçã«ââé ããçç±ãç解ã§ããªãã£ãããã§ãã
ãããã¯ã2ã€ã®ã¬ã€ã€ãŒïŒãã¹ã®æ€çŽ¢ã«äœ¿çšãããåå£ã¬ã€ã€ãŒïŒãšïŒçžäºäœçšãšæ€çŽ¢ãã¹ãå®äºããããã®ïŒå¡ãã€ã¶ãã¬ã€ã€ãŒã®2ã€ã®ã¬ã€ã€ãŒãæã€100Ã100ã°ãªããã§ãã ã¯ãŒã«ãã¯ã©ã¹ã¯ãèãæ€ç©ã®æé·ãªã©ãããŸããŸãªå粧æ©èœãåŠçããŸãã ãã®èšäºã§ã¯èª¬æãããŠããªãéšåã®ã¿ããããã§ãããããä»ç§ã¯ããã«ã€ããŠè©±ããŠããã
人å£
ãããã¯ãåäžã®ã¯ãªãŒãã£ãŒãèšè¿°ããããããã£ãæã€ã¯ã©ã¹ã«å±ããŠããŸããã ãããã®ããã€ãã¯å粧åã§ãããä»ã®ãã®ã¯ã¢ã¯ã·ã§ã³ã®å®è¡ã«åœ±é¿ãäžããŸããïŒããšãã°ãé£ã¶èœåãèŠçã®ç¯å²ãé£ã¹ããã®ãã¯ãªãŒãã£ãŒãçãããšã®ã§ãããã®ïŒã
ããã§æãéèŠãªã®ã¯ãåäœã決å®ããè£å©å€ã§ãã ããªãã¡ãåã¯ããã¯ãµã€ã¯ã«ã§ã«ãŠã³ãããå¿ èŠããªãããã«çŸåšã®ãã¹A *ãå«ããã¯ãã«ïŒããã«ããèšç®æéãç¯çŽãããããå€ãã®ããããã·ãã¥ã¬ãŒãã§ããŸãïŒãããã³ç°å¢ã解éããã¯ãªãŒãã£ãŒãå®çŸ©ããã¡ã¢ãªãã¥ãŒã
ã¡ã¢ãªãã¥ãŒ
ã¡ã¢ãªãã¥ãŒã¯ããããããããã£ã®ãµã€ãºã«ãã£ãŠå¶éãããã¡ã¢ãªãªããžã§ã¯ãã®ã»ãããå«ãåçŽãªãã¥ãŒã§ãã æ°ããèšæ¶ãè¿œå ããããã³ã«ããããã¯åã«æŒãåºãããèåŸã«ããå¢çãè¶ãããã¹ãŠã®ãã®ãåæãããŸããã ããã«ãããäžéšã®æãåºã¯ä»ã®æãåºããããæ°é®®ãã«ãªããŸãã
ããããã¡ã¢ãªããæ å ±ãåŒã³åºãããå Žåãã¡ã¢ãªãªããžã§ã¯ãïŒèŠæ±ïŒãäœæãããããã¡ã¢ãªå ã®ãã®ãšæ¯èŒããŸããã 次ã«ããªã³ãŒã«é¢æ°ã¯ãã¯ãšãªã§æå®ãããæ¡ä»¶ã®ãããããŸãã¯ãã¹ãŠã«äžèŽããã¡ã¢ãªã®ãã¯ãã«ãè¿ããŸããã
class Memory{ public: //Recall Score int recallScore = 1; //Memory Queryable? Array bool queryable[4] = {false, false, false, false}; //Memory Attributes std::string object; std::string task; Point location; bool reachable;
ã¡ã¢ãªã¯ãããã€ãã®ããããã£ãå«ãåçŽãªãªããžã§ã¯ãã§æ§æãããŸãã ãããã®ã¡ã¢ãªããããã£ã¯ãäºãã«ãé¢é£ä»ããããŠããããšèŠãªãããŸãã åã¡ã¢ãªã«ã¯ãrecallScoreãå€ãäžããããŸãããã®å€ã¯ããªã³ãŒã«æ©èœã«ãã£ãŠã¡ã¢ãªãèšæ¶ããããã³ã«ç¹°ãè¿ãããŸãã ãããã¯ã¡ã¢ãªãèšæ¶ãããã³ã«ãå€ãã¡ã¢ãªã®recallScoreãæ°ããã¡ã¢ãªã®recallScoreãããé«ãå Žåãé çªã«1ãã¹ã®ãœãŒããå®è¡ããŸãã ãã®ãããäžéšã®ã¡ã¢ãªã¯ãéèŠãã§ïŒã¡ã¢ãªãµã€ãºã倧ããå ŽåïŒããã¥ãŒã«é·ãä¿åãããå ŽåããããŸãã æéãçµã€ã«ã€ããŠããããã¯æ°ãããã®ã«çœ®ãæããããŸãã
ã¡ã¢ãªãã¥ãŒ
ãŸãããã®ã¯ã©ã¹ã«ããã€ãã®ãªãŒããŒããŒããããæŒç®åãè¿œå ããŠãã¡ã¢ãªãã¥ãŒãšã¯ãšãªã®éã§çŽæ¥æ¯èŒãè¡ãããanyããŸãã¯ãallãããããã£ãæ¯èŒããŠãã¡ã¢ãªãäžæžãããããšãã«æå®ãããããããã£ã®ã¿ãäžæžããããããã«ããŸããã ãã®ãããããå Žæã«é¢é£ä»ãããããªããžã§ã¯ãã¡ã¢ãªãæã€ããšãã§ããŸããããã®å ŽæãããäžåºŠèŠãŠããªããžã§ã¯ãããªãå Žåããã®å Žæã«å¯Ÿå¿ããã¯ãšãªã䜿çšããŠãæ°ããå¡ãã€ã¶ãã¿ã€ã«ãå«ãã¡ã¢ãªã§äžæžãããããšã§ã¡ã¢ãªãæŽæ°ã§ããŸãã
void Bot::updateMemory(Memory &query, bool all, Memory &memory){ //Loop through all existing Memories //"memories" queue is a member of Bot for(unsigned int i = 0; i < memories.size(); i++){ //If all matches are required and we have all matches if(all && (memories[i] == query)){ //We have a memory that needs to be updated memories[i] = memory; continue; } //If not all matches are required and any query elements are contained else if(!all && (memories[i] || query)){ //When overwriting, only overwrite specified quantities memories[i] = memory; continue; } } }
ãã®ã·ã¹ãã ã®ã³ãŒããäœæããéçšã§ãå€ãã®ããšãåŠã³ãŸããã
ã¿ã¹ã¯ã·ã¹ãã
ã²ãŒã ã®ã«ãŒããŸãã¯ã¬ã³ããªã³ã°ã®æ§è³ªã¯ããã¹ãŠã®ã¡ãžã£ãŒã§åãæ©èœãç¹°ãè¿ãããããšã§ããããããã«éåšæçãªåäœãå®è£ ãããã£ãã®ã§ãã
ãã®ã»ã¯ã·ã§ã³ã§ã¯ããã®åœ±é¿ã«å¯ŸåŠããããã«èšèšãããã¿ã¹ã¯ã·ã¹ãã ã®æ§é ã«é¢ãã2ã€ã®ãã¥ãŒã«ã€ããŠèª¬æããŸãã
ããã ã¢ããæ§é
ç§ã¯äžããäžã«ç§»åããŠãããããå®è¡ãããããªããã£ãã¢ã¯ã·ã§ã³ãã®ã»ãããäœæããããšã«ããŸããã ãããã®åã¢ã¯ã·ã§ã³ã¯ã1ããŒãã®ã¿ç¶ããŸãã ããªããã£ãé¢æ°ã®åªããã©ã€ãã©ãªã䜿çšããŠãããããããã€ãã®ããªããã£ãé¢æ°ã§æ§æãããè€éãªã¢ã¯ã·ã§ã³ã«çµåã§ããŸãã
ãã®ãããªããªããã£ãã¢ã¯ã·ã§ã³ã®äŸïŒ
//Primitives bool wait(Garden &garden, Population &population, int (&arguments)[10]); bool look(Garden &garden, Population &population, int (&arguments)[10]); bool step(Garden &garden, Population &population, int (&arguments)[10]); bool swap(Garden &garden, Population &population, int (&arguments)[10]); bool store(Garden &garden, Population &population, int (&arguments)[10]); bool consume(Garden &garden, Population &population, int (&arguments)[10]); bool move(Garden &garden, Population &population, int (&arguments)[10]); //Continue with secondaries here...
ãããã®ã¢ã¯ã·ã§ã³ã«ã¯ãäžçãšäººå£ã®äž¡æ¹ãžã®åç §ãå«ãŸããŠãããããããå€æŽã§ããããšã«æ³šæããŠãã ããã
- åŸ æ©ãããšãã¯ãªãŒãã£ãŒã¯ãã®ã«ãŒãã§äœãããŸããã
- Lookã¯ç°å¢ã解æããæ°ããã¡ã¢ãªããã¥ãŒã«å ¥ããŸãã
- ã¹ã¯ããã¯ãã¯ãªãŒãã£ãŒã®æã«ãããªããžã§ã¯ããåããå°é¢ã«æšªããã£ãŠãããªããžã§ã¯ãã«çœ®ãæããŸãã
- æ¶è²»ãããšãã¯ãªãŒãã£ãŒã®æã«ããã¢ã€ãã ãç Žå£ãããŸãã
- Stepã¯ãçŸåšã®èšç®ãããå®å ãžã®ãã¹ãåãã1ã€ã®ã¹ããããå®è¡ããŸãïŒå€æ°ã®ãšã©ãŒãã§ãã¯ã䜿çšïŒã
- ...ãªã©ã
ãã¹ãŠã®ã¿ã¹ã¯é¢æ°ã¯ãã¿ã¹ã¯ã¯ã©ã¹ã®ã¡ã³ããŒã§ãã å³ãããã¹ãã®åŸã圌ãã¯ä¿¡é Œæ§ãšããè€éãªã¿ã¹ã¯ã«çµåããèœåã蚌æããŸããã
//Secondaries bool walk(Garden &garden, Population &population, int (&arguments)[10]); bool idle(Garden &garden, Population &population, int (&arguments)[10]); bool search(Garden &garden, Population &population, int (&arguments)[10]); bool forage(Garden &garden, Population &population, int (&arguments)[10]); bool take(Garden &garden, Population &population, int (&arguments)[10]); //Species Masters bool Ant(Garden &garden, Population &population, int (&arguments)[10]); bool Bee(Garden &garden, Population &population, int (&arguments)[10]); };
ãããã®äºæ¬¡æ©èœã§ã¯ãä»ã®ã¿ã¹ã¯ãåçŽã«é£éãããããšã§æ©èœãæ§ç¯ããŸãã
- walkã¿ã¹ã¯ã¯ã»ãã®æ°ã¹ãããã§ãïŒãšã©ãŒåŠçããïŒ
- takeã¿ã¹ã¯ã¯ãã«ãã¯ã¢ã³ãã¹ã¯ããã¿ã¹ã¯ã§ãïŒantã¡ã¢ãªåŠçã®ããã«å¿ èŠã§ããããã«ã€ããŠã¯åŸã§èª¬æããŸãïŒ
- ã¢ã€ãã«ã¿ã¹ã¯ã¯ãã©ã³ãã ãªå ŽæãéžæããŠããã«ç§»åãïŒãŠã©ãŒã¯ã䜿çšïŒãæ°ãµã€ã¯ã«åŸ æ©ãïŒãŠã§ã€ãã䜿çšïŒããã®ãµã€ã¯ã«ãæå®ãããåæ°ç¹°ãè¿ã
- ...ãªã©
ä»ã®ã¿ã¹ã¯ã¯ããè€éã§ãã æ€çŽ¢ã¿ã¹ã¯ã¯ãã¡ã¢ãªã¯ãšãªãå®è¡ããŠããfoodããªããžã§ã¯ãïŒãã®ã¿ã€ãã®ãããã§äœ¿çšå¯èœïŒãå«ãå Žæã®ã¡ã¢ãªãæ€çŽ¢ããŸãã 圌女ã¯ãããã®æãåºãããŠã³ããŒããããããããã¹ãŠåã£ãŠãé£ã¹ç©ããæ¢ããŠãããŸãïŒã¢ãªã®å Žåãããã¯èã§ãïŒã é£ç©ã®èšæ¶ããªãå Žåãã¿ã¹ã¯ã¯ã¯ãªãŒãã£ãŒãã©ã³ãã ã«äžçãæ©ãåãããèŠåããŸãã ïŒviewRadius = 1ã§ãèŠããããšã«ãããã€ãŸããäžã®ã¿ã€ã«ã®ã¿ãèŠãïŒèŠ³å¯ããç 究ããããšã«ãããã¯ãªãŒãã£ãŒã¯åšå²ã®æ å ±ã§èšæ¶ãæŽæ°ããé£ç©ãç¥çãã€æå³çã«æ€çŽ¢ããããšãã§ããŸãã
ããäžè¬åããã飌æã¿ã¹ã¯ã¯ãé£ç©ãèŠã€ããããšãé£ç©ãæŸãããšãæ€æ»ããããšïŒè¿é£ã®èšæ¶ãæŽæ°ããé£ç©ãèŠã€ããããšïŒã家ã«æ»ã£ãŠé£ç©ãä¿åããããšããæããŸãã

è»ãè»å¡ããåºãŠãæå³çã«é€ãæ¢ãããšã«æ°ã¥ããããããŸããã åæåã«ãããt = 0ã§ã®ã¢ãªã®ã¡ã¢ãªã空ã§ãããããã¢ãªã®åæãã¹ã¯ã©ã³ãã ãã€ã³ãã«åããããŸãã ããããã圌ãã¯é£Œæã¿ã¹ã¯ã§é£ç©ãæŸãåœä»€ãäžããããŸãããããŠã圌ãã¯ãŸããããé£ç©ããªãããšã確èªããŠãèŠåããŸãã 圌ãã¯é£ã¹ç©ãèŠãå Žæã䜿ãæããã®ã§ãæã ããŸããå§ããŸãïŒäžåãªè¿èŠïŒã
ãããŠæåŸã«ããããã«ã¯å²ãåœãŠãããAIã®çš®é¡ã決å®ããããã¥ãŒãããããŸãã åãã¥ãŒã¯ããã®ãã¹ãŠã®åäœãå®çŸ©ãã1ã€ã®å¶åŸ¡ã¿ã¹ã¯ã«é¢é£ä»ããããŠããŸããããã¯ãäžé£ã®ã¡ã¢ãªãã¥ãŒãšããªããã£ãã¿ã¹ã¯ã«ãã£ãŠç°¡åã«æ±ºå®ãããããŸããŸãå°ãããªãã¿ã¹ã¯ã®ã«ã¹ã±ãŒãã§æ§æãããŠããŸãã ãããã¯ãAntãBeeã®ãããªã¿ã¹ã¯ã§ãã
ãããããŠã³æ§é
äžããäžã«åãã£ãŠèŠããšãã·ã¹ãã ã¯ããããäžã®åã ã®ãããã®å¶åŸ¡ã¿ã¹ã¯ãšãã®å®è¡ã調æŽããã¿ã¹ã¯ãã¹ã¿ãŒã¯ã©ã¹ã§æ§æãããŠããŸãã
Taskmasterã«ã¯å¶åŸ¡ã¿ã¹ã¯ã®ãã¯ã¿ãŒããããåã¿ã¹ã¯ã¯ãããã«é¢é£ä»ããããŠããŸãã åå¶åŸ¡ã¿ã¹ã¯ã«ã¯ããµãã¿ã¹ã¯ã®ãã¥ãŒããããé¢é£ä»ããããã¿ã¹ã¯é¢æ°ã§ã¿ã¹ã¯ãªããžã§ã¯ããæåã«åæåãããšãã«èªã¿èŸŒãŸããŸãã
class Task{ public: //Members std::stack<Task> queue; bool initFlag = true; int args[10]; bool (Task::*handle)(Garden&, Population&, int (&)[10]); int botID; std::string name; //Constructor Task(std::string taskName, int taskBotID, bool (Task::*taskHandle)(Garden&, Population&, int (&)[10])){ name = taskName; botID = taskBotID; handle = taskHandle; } //Launch a Task bool perform(Garden &garden, Population &population); //Continue with primitives here...
ãã¥ãŒå ã®åã¿ã¹ã¯ãªããžã§ã¯ãã¯åŒæ°ã®é åãæ ŒçŽããé¢é£ããé¢æ°ãã³ãã©ãŒã«æž¡ããŸãã ãããã®åŒæ°ã¯ãå¯èœãªéãäžè¬çã«äœæããããããã®ããªããã£ãã¿ã¹ã¯ã®åäœã決å®ããŸãã åŒæ°ã¯åç §ã«ãã£ãŠæž¡ãããããããã¥ãŒå ã®ã¿ã¹ã¯ãªããžã§ã¯ãã¯åŒæ°ãæ ŒçŽãããã®ãµãé¢æ°ãå€æŽã§ããããã«ãããããç¹å®ã®ã¯ããã¯ãµã€ã¯ã«ãåŸ æ©ããå埩ãç¹å®ã®æ°ã®ã¢ã€ãã ãåéããèŠæ±ãªã©ãå®è£ ã§ããŸãã ãµãé¢æ°ã¯ãåç §ã«ãã£ãŠèŠªé¢æ°ã®å埩åïŒåŒæ°[n]ïŒã®å€ãå€æŽãããã®æåæ¡ä»¶ããã®å€ã«äŸåãããŸãã
åã¡ãžã£ãŒã§ãã¿ã¹ã¯ãã¹ã¿ãŒã¯å¶åŸ¡ã¿ã¹ã¯ã®ãªã¹ãã調ã¹ãŠãperformã¡ãœãããåŒã³åºããŠå®è¡ããŸãã 次ã«ãperformã¡ãœããã¯ãã¿ã¹ã¯å ã®ãã¥ãŒã®äžçªäžã®èŠçŽ ã調ã¹ãã¿ã¹ã¯ããã®åŒæ°ã䜿çšããŠãããå®è¡ããŸãã ããã«ãããã¿ã¹ã¯ãã¥ãŒãã«ã¹ã±ãŒãããŠãåžžã«æé«ã®ã¿ã¹ã¯ãå®äºããããšãã§ããŸãã 次ã«ãã¿ã¹ã¯ã®æ»ãå€ã«ãã£ãŠã¿ã¹ã¯ã®å®äºã決ãŸããŸãã
//Execute Task Function bool Task::perform(Garden &garden, Population &population){ //Debug Message if(debug){std::cout<<"Bot with ID: "<<botID<<" performing task: "<<name<<std::endl;} //Change the Name and Execute the Task population.bots[botID].task = name; return (*this.*handle)(garden, population, args); }
ããªããã£ãã¿ã¹ã¯ãtrueãè¿ããšãããã®å®å®ç¹ã«éããŠããããå°ãªããšãç¹°ãè¿ãããã¹ãã§ã¯ãããŸããïŒããšãã°ãã¯ãªãŒãã£ãŒãçµäºç¹ã«éãããšãã«stepãtrueãè¿ããŸãïŒã ã€ãŸãããã®æ»ãæ¡ä»¶ãæºãããããã¥ãŒããåé€ãããããã次ã®ã¡ãžã£ãŒã§æ¬¡ã®ã¿ã¹ã¯ãå®äºã§ããŸãã
ã¿ã¹ã¯ãã¥ãŒãå«ãã¿ã¹ã¯ã¯ããã¥ãŒã空ã«ãªã£ãåŸã«trueãè¿ããŸãã ããã«ãããåãé¢æ°ãåžžã«åŒã³åºããããã¥ãŒãšãµããã¥ãŒã®æ§é ãæã€è€éãªã¿ã¹ã¯ãäœæã§ããŸãããåŒã³åºãããšã«ã²ãŒã ã®ç¶æ ãšã¿ã¹ã¯ã®ç¶æ ã1ã¹ããããã€ç¹°ãè¿ãããŸãã
æåŸã«ãå¶åŸ¡ã¿ã¹ã¯ã¯åçŽãªæ§é ã䜿çšããŸããåãµã€ã¯ã«ã§åŒã³åºããã空ã®å Žåã«ã®ã¿ã¿ã¹ã¯ãããŒããããã以å€ã®å Žåã¯ãã¥ãŒã«ããŒããããã¿ã¹ã¯ãå®è¡ããŸãã
//Species Functions bool Task::Ant(Garden &garden, Population &population, int (&arguments)[10]){ //Initial Condition if(initFlag){ Task forage("Search for Food", botID, &Task::forage); forage.args[0] = population.bots[botID].forage; //What are we looking for? queue.push(forage); initFlag = false; } //Queue Loop if(!queue.empty()){ //Get the Top Task Task newtask = queue.top(); queue.pop(); //If our new Task is not performed successfully if(!newtask.perform(garden, population)){ queue.push(newtask); return false; } //If it was successful, we leave it off return false; } //Return Case for Mastertask initFlag = true; return false; }
ãã¥ãŒã«ãŒãïŒã³ãŒããåç §ïŒã®å©ããåããŠã1ã€ã®é¢æ°ãç¹°ãè¿ãå®è¡ãããã®ãã¥ãŒã®äžçªäžã®èŠçŽ ãå®è¡ãããã³ã«ãperformã¡ãœãããåŒã³åºããštrueãè¿ããããšèŠçŽ ãããã·ã¥ã§ããŸãã
çµæ
ããã¯ãã¹ãŠlibconfigã«ã©ãããããŠãããããã·ãã¥ã¬ãŒã·ã§ã³ãã©ã¡ãŒã¿ã®å€æŽã¯éåžžã«ç°¡åã§ãã å€ãã®å¶åŸ¡ã¿ã¹ã¯ãåé¡ãªãã³ãŒãã£ã³ã°ã§ãïŒã¢ãªãšãããããäœæããŸããïŒãlibconfigã䜿çšããŠæ°ããçš®ãå®çŸ©ããã³ããŒãããã®ã¯é©ãã»ã©ç°¡åã§ãã
//Anthill General Configuration File debug = true; //World Generation Parameters seed = 15; water = true; //Species that the simulation recognizes Species: { //Ant Species Ant: { masterTask = "Ant"; color = (0, 0, 0); viewDistance = 2; memorySize = 5; forage = 2; trail = true; fly = false; } Bee: { masterTask = "Bee"; color = (240, 210, 30); viewDistance = 4; memorySize = 30; forage = 4; trail = false; fly = true; } Worm: { masterTask = "Bee"; color = (255, 154, 171); viewDistance = 1; memorySize = 5; forage = 3; trail = true; fly = false; } } Population: ( {species = "Ant"; number = 40;}//, //{species = "Bee"; number = 12;}, //{species = "Worm"; number = 5;} )
ãããã¯ã·ãã¥ã¬ãŒã·ã§ã³ã«ãšã¬ã¬ã³ãã«ããŒããããŸããã æ°ããæ¹åããããã¹ã®æ€çŽ¢ã®ãããã§ã2次å ã®å¹³é¢ã§é£ç©ãåéããŠããå€æ°ã®ã¢ã¯ãã£ããªããããã·ãã¥ã¬ãŒãã§ããŸãã

åæã«èãéãã40å¹ã®ã¢ãªã®ã·ãã¥ã¬ãŒã·ã§ã³ã ããããç ã®äžã«äœæããçµè·¯ã¯ããæã€ããã®ãåå°ã«å²ãåœãŠãããééã®å¢å ã«ãããã®ã§ãã ããã¯ãç¹åŸŽçãªãã¢ãªé«ééè·¯ãã®äœæã«ã€ãªãããŸãã ãããã¯ãã§ãã¢ã³ãšããŠè§£éããããšãã§ããŸãããã¢ãªãå®éã«èšæ¶ã亀æããå Žåãããã¯çå®ã®ããã«ãªããŸãã
ãã®ã·ã¹ãã ã®ã¢ãžã¥ãŒã«æ§ã«ãããåçŽãªå¶åŸ¡ã¿ã¹ã¯ã«ãã£ãŠåäœã決å®ãããæ°ããçš®ã®è¿ éãªäœæãä¿èšŒãããŸãã äžèšã®ã³ãŒãã§ã¯ãã¯ãŒã ãšAIããããã®è²ããã¹æ€çŽ¢ã®å¶éïŒé£è¡ã§ããªãïŒãå¯èŠç¯å²ãã¡ã¢ãªãµã€ãºãå€æŽããã ãã§äœæãããŠããããšãããããŸãã åæã«ããããã®ãã©ã¡ãŒã¿ãŒã¯ãã¹ãŠããªããã£ãã¿ã¹ã¯ã®æ©èœã«ãã£ãŠäœ¿çšããããããäžè¬çãªåäœãå€æŽããŸããã
Antã¡ã¢ãªã®ãããã°
è€éãªã¿ã¹ã¯ãšã¡ã¢ãªã®æ§é ã«ãããäºæãã¬å°é£ãšäŸå€ã®åŠçãå¿ èŠã«ãªããŸããã
ãµãã·ã¹ãã ãããçŽãã3ã€ã®ç¹ã«è€éãªã¡ã¢ãªãã°ã次ã«ç€ºããŸãã
åã§èµ°ã£ãŠããã¢ãª
ç§ãçŽé¢ããªããã°ãªããªãã£ãæåã®ãã°ã®1ã€ïŒã¢ãªã¯è£žå°ã§èãæ¢ããŠåºå Žã«å²ãŸãããã¿ãŒã³ã«æ²¿ã£ãŠçã£ãããã«èµ°ããŸããã ãã®åé¡ã¯ããã®æç¹ã§ã¯ãŸã ã¡ã¢ãªã®æŽæ°ãå®è£ ããŠããªãããã«çºçããŸããã ã¢ãªã«ã¯é£ã¹ç©ã®å Žæã®èšæ¶ããããèãæŸã£ãŠåã³èŠåããšããã«ãæ°ããèšæ¶ã圢æãããŸããã
åé¡ã¯ãæ°ããã¡ã¢ãªã¯åããã€ã³ãã«ãã£ãããå€ãã¡ã¢ãªã¯ä¿åãããŠããããšã§ããã ã€ãŸããé£ã¹ç©ãæ¢ãéçšã§ãã¢ãªã¯ãã¯ãæå¹ã§ã¯ãªããªã£ãé£ã¹ç©ã®å Žæãèšæ¶ããä¿æããŠããŸãããããããã®å€ãèšæ¶ã¯ä¿åãããæ°ãããã®ã«åã£ãŠä»£ãããŸããïŒåœŒãã¯ãã®ããããããŒããèŠããŠããŸããïŒã
ç§ã¯ããã次ã®ããã«ä¿®æ£ããŸããïŒãªããžã§ã¯ãã®ããŒã¿ã¯ãåãå ŽæãèŠãŠãªããžã§ã¯ããå€æŽãããå Žåãå€ãã¡ã¢ãªã«åçŽã«äžæžããããŸãïŒããšãã°ãã¯ãªãŒãã£ãŒã¯èããããªãããšãèŠãããèããã£ãããšãèŠããŠããªãïŒã ããããå°æ¥çã«ã¯ãç¡å¹ãªããããã£ãæãåºã«è¿œå ããŠãéèŠãªå€ãæ å ±ãããããæãåºããããã«ããŸãããæå¹ã§ã¯ãªããªã£ãæ å ±ã¯ã衚瀺ããããŸãïŒãããã§ã¯ããèŠãŸããããä»ã¯ãããŸãããïŒã
ã¢ãªã¯ä»ã®ã¢ãªã®äžã«ãããªããžã§ã¯ããæŸããŸã
æã ïŒç¹ã«å€æ°ã®ã¢ãªãšé«å¯åºŠã®èãããå ŽåïŒã2ã€ã®ã¢ãªã1ã€ã®ã¡ãžã£ãŒã§1ã€ã®ã¿ã€ã«ã®ã¿ã€ã«ã«ä¹ã£ãŠããããæŸãããšããããšãã§ããŸãã ããã¯ãæåã®ã¢ãªãã¿ã€ã«ã«å ¥ããåšããèŠåãã3ã€ã®ã¹ãããã§ã¢ã€ãã ãåãåã£ãããšãæå³ããŸããã 次ã«ã2çªç®ã®ã¢ãªãåãããšãè¡ãããªããžã§ã¯ããæã¡äžããçŽåã«ã®ã¿ãå¥ã®ã¢ãªã錻ã®äžãããããã²ã£ããããŸããã 圌ã¯éãã«ä»äºãç¶ããåã®æž¬å®ã§ä»ã®ã¢ãªãšåãç°å¢ã調ã¹ãåæ§ã®æ¹æ³ã§èšæ¶è¡ãåŠçããŸããïŒãã®æ®µéã§èšæ¶ã¯åäžã§ããããïŒã ããã«ããã2çªç®ã®ã¢ãªãæåã®ã¢ãªãã³ããŒãããªããžã§ã¯ããããã¯ã¢ãããããæåã®ã¢ãªã«ç¶ããŠãå®éã«ãã¹ãŠã®äœæ¥ãè¡ããŸããã 5å¹ã®ã¢ãªã®ã·ãã¥ã¬ãŒã·ã§ã³ã§ã¯ã3å¹ããèŠããªãã£ããããããã«æ°ä»ããŸããã åå ãèŠã€ããã®ã«é·ãæéãããããŸããã
ãã®åé¡ã解決ããã«ã¯ãã¹ã¯ããã¿ã¹ã¯ããªããã£ããäœæãããã€ã¯ã¿ã¹ã¯ãäœæããŸãããã®ã¿ã¹ã¯ã¯ããŸãå°é¢ãèŠãŠãªããžã§ã¯ãããããã©ããã確èªããŸãã ããã§ããå Žåãããã¯ãã¹ã¯ãããããããã§ãªãå Žåã2ã€ã®åãããåŸ æ©ãããŠãä»ã®ã¢ãªã確å®ã«å»ãããã«ããŸãã 1ã€ã®ã±ãŒã¹ã§ã¯ããã®ã¢ã¯ã·ã§ã³ã¯2ã€ã®ã¡ãžã£ãŒã«å¯Ÿãããã®ã§ããããã1ã€ã¯1ã€ã®ã¡ãžã£ãŒã«å¯Ÿãããã®ã§ãã
å°éäžèœãªå Žæ
ã¡ã¢ãªã®åŠçãããçŽãããšãäœåãªããããå¥ã®äžæå¿«ãªãã°ã¯ãã¢ãªãèŠãããšãã§ããããã€ãã®å Žæã圌ã«ãšã£ãŠå°éäžå¯èœã ã£ããšããããšã§ããã ç§ã®æ zyãªãã°ã©ã¹ã¯ãã¹ãã®åå°ãžã®é 眮ãåå ã§çºçããŸããã ããã«ãããã¹ãããã¿ã¹ã¯ãäžè¬åã§ããŸããã
é£ç©æ¢çŽ¢ã®ãªã¯ãšã¹ããéä¿¡ãããšããã¢ãªã¯ãã°ãã°åœŒããæ¬åœã«å°éããããšãã§ããªãå Žæã®èšæ¶ãæã£ãŠããŸããïŒåœŒãã¯æ°Žã®äžã«èãèŠãã®ã§ã ãã¡ããã¡ããããéãããã£ãã§ãïŒã ã¡ã¢ãªå ã§ããŒã¯ãããŠããªãå ŽåïŒããšãã°ãããŒã«å€æ°ãå°éå¯èœãïŒããã®ã¢ã¯ã·ã§ã³ãå¯äžã«ãªããŸã§ããããèšæ¶ãããã¥ãŒã«æžã蟌ã¿ç¶ããŸããã ããã¯ãåã¡ãžã£ãŒã§ãã¹æ€çŽ¢æäœãåžžã«å®è¡ããããã«å°éããããšããŠå€±æãããããæ·±å»ãªæå¶ãåŒãèµ·ãããŸãã ã
解決çã¯ãå Žæãžã®ãã¹ãèŠã€ãããªãå Žåã«ã¹ãããã¿ã¹ã¯ã§ã¡ã¢ãªãæŽæ°ããã¡ã¢ãªå ã§å°éäžèœãšããŠããŒã¯ããããšã§ããã ããã«ãæ€çŽ¢ã¿ã¹ã¯ã¯ãå°éå¯èœãªèšæ¶ã®ããã«é£ç©ã®ããå Žæã®ã¿ãç §äŒããŸãã
ã·ã¹ãã å šè¬
äžè¬çã«èšãããããšã§ããã¯ããç§ã¯èªåã®äººçã®1é±éãããã°ã©ãã³ã°ãã©ãœã³ã«è²»ãããããšãåŸæããŠããŸãã ç§ã¯ããã€ãã®ããªãã¯ãããªããã°ãªãããå€ããåŠã³ãŸããã
ç§ãäœæããã·ã¹ãã ã¯100ïŒ ä¿¡é Œã§ãããã®ã§ã¯ãªãããŸã ããã€ãã®ã¢ãŒãã£ãã¡ã¯ãããããŸãã ããšãã°ãå€èŠ³ã解æããæ¹åãšããŠãã¢ã¯ã·ã§ã³ã¯äžäžå·Šå³ã«äœ¿çšãããŸããã€ãŸããæåŸã®ã¡ã¢ãªã¯å³äžé ã«ãããŸãã æ å ±ãåŒã³åºããŠã¢ã€ãã ãæ€çŽ¢ãããšããããã¯ã¯ãªãŒãã£ãŒãåæ±ã«ç§»åããåŸåãããããšãæå³ããŸãã ããã¯ãçš®ã«é¢ä¿ãªããèãæ¥éã«æé·ããåæ±ã«åãã£ãŠãããã«æ²ãã倧èŠæš¡ãªã·ãã¥ã¬ãŒã·ã§ã³ã§ç¹ã«é¡èã§ãã
æ©èœåŒ·å
ããè€éãªçç©ã®ããè€éãªèšæ¶ãã·ãã¥ã¬ãŒãããã«ã¯ãå€§å¹ ãªæ¹åãå¿ èŠã ãšæããŸãã
ããã«ã¯ãã¡ã¢ãªåŠçæ©èœã®ä¿¡é Œæ§ã®åäžããæèããªã©ã®æ°ããããªããã£ããããã³ã決å®ããã倢ããªã©ã®é«ã¬ãã«ã¿ã¹ã¯ã®æŽŸçç©ã®è¿œå ãå«ãŸããŸãã ãèãããã¯ãã¡ã¢ãªãªã¯ãšã¹ãã®åå§çãªåäœã§ãã ã倢ãã¯ãããã€ãã®ãæèãåŒã³åºãã§æ§æã§ããŸããã©ã³ãã ãªã¡ã¢ãªãéžæããã©ã³ãã ãªããããã£ãååŸãããããç¹°ãè¿ããŠãå ±éã®ããŒããéèŠãªé¢é£æ§ã匷åããŸãã
å°æ¥çã«ã¯ã3ã€ã®ç¹å®ã®è¿œå ãèšç»ããŠããŸãã
- å²ã蟌ã¿åŠçãšã¿ã¹ã¯ã®åªå é äœä»ããè¿œå ããŸã
- ãšã³ãã£ãã£éã®éä¿¡ãè¿œå ãã
- ãšã³ãã£ãã£ãäºãã«æ£åŒã«èå¥ã§ããããã«ãã°ã«ãŒãæ§é ãè¿œå ããŸã
ãšã³ãã£ãã£éã®ããåãã«ã¯ãã¿ã¹ã¯ã®åŠçã®äžæãšåªå é äœä»ããå¿ èŠã«ãªãå ŽåããããŸãããªããªããããããéä¿¡ããïŒäœããã®æ¹æ³ã§ãèããå¿ èŠãããïŒããæ»æãããïŒãéããããŸãã¯ãæŠããïŒ ïŒ
ãšã³ãã£ãã£éã®éä¿¡ã¯ããããããã¡ã¢ãªã亀æããããä»ã®ãããã®ã¡ã¢ãªã«ãªã¯ãšã¹ããéä¿¡ãããããããã®1ã€ãŸãã¯2ã€ã®åºæ¬çãªã¿ã¹ã¯ã§æ§æãããŸãïŒãsayãããaskããªã©ïŒã ãã®ããã«ããŠãé£æããã®ä»ã®ãªãœãŒã¹ã®å Žæãªã©ã®æ å ±ãéä¿¡ã§ããŸãã
ãããã®ã¿ã¹ã¯ãå®è£ ããã³ãã¥ãã±ãŒã·ã§ã³ã®æç¡ã«ããããã倧èŠæš¡ãªã°ã«ãŒãã«ãããªãœãŒã¹èç©çã®ã°ã©ããäœæããããšèããŠããŸãã 人å£ã¯ãã§ã«å枬å®ã§åéãããé£ç©ã®éã远跡ããŠããŸãã æãåºã®å ±æãå¹çã«åœ±é¿ãäžããå¯èœæ§ãããããšã瀺ãã®ã¯èå³æ·±ãã§ãããã
æªæ¥
ã³ãã¥ããã£ã·ãã¥ã¬ãŒã·ã§ã³ã®æãéèŠãªæ©èœã¯ãã°ã«ãŒãæ§é ãè¿œå ãããããã®ã°ã«ãŒãã«ãã¯ãã¬ãã«ã®ããããã£ãããšãã°å ±éã®ãç®æšãšè²¬ä»»ããäžããããšã§ãã ããã«ãããäžçš®ã®ãã·ãŒãããåŸãããããããã°ã«ãŒãæ§é ã®éå±€ãäžã£ãŠå§ä»»ãããé«ã¬ãã«ã®ã¿ã¹ã¯ãååŸããŠãäžçã«çŽæ¥åœ±é¿ãããäœãã®é«ã¬ãã«ã®ã¿ã¹ã¯ãååŸã§ããŸãã ãŸããæ¿æ²»æ§é ã®ãã©ãŒã ãäœæããããšãã§ããŸãã
ãã®ãããªã·ã¹ãã ã¯éåžžã«èªçµŠèªè¶³ã§ãããèŠèŠåã¯ãã®äžã«åçŽã«éããããŸãã æè«ã人åçç©ã«çœ®ãæããããšã¯éåžžã«ç°¡åã§ãè³æºãéããŠã©ããã«ä¿ç®¡ãããµã€ãºã倧ããããŸããããšãã°ã圌ãã®å®¶ã®æé·ã®æ§è³ªã¯ããããã®è¡åã«å€§ããäŸåããããå®å šã«ç¬ç«ããŠããŸããç°ãªãçš®ã¯ãç°ãªãç¹æ§ãšåŸåãæã€ç°ãªãéšæãæã£ãŠãããããããŸããã
ããã«ããã®ã·ã¹ãã ã以åã«äœæããããããžã§ãã¬ãŒã¿ãŒïŒäžçã¯ã©ã¹ãæ¡åŒµïŒãšçµã¿åãããŠãäžçããããªã¢ã«ã«ããããšãã§ããŸãã
çµè«ãšããŠ
è¿ãå°æ¥ãã¯ãªãŒãã£ãŒã人ã«çœ®ãæããææ°ã®æ©èœãå®è£ ããäºå®ã§ãããããããã·ã¹ãã ã®å質ãæ¹åãããšãã«ãå®å šãªãœãŒã¹ã³ãŒããå ¬ââéããŸãïŒã³ãŒãã¯ããªãæ··codeãšããŠããå ŽåããããŸãïŒã
次ã®èšäºãåŸ ã¡ãŸãããããŸã§ã¯ãè±ã®äžã§è±ç²ãæ¢ããŠããããããã®ãããªããããŸãããããã¯åããã¬ãŒã ã¯ãŒã¯ã䜿çšããŠãšã³ã³ãŒããããŸãã

åºçºç¹ãå°ããªå³¶ã«ããããããã®çš®ãéžã³ãŸãããããããããããã¯å·£ç®±ã«æ»ãããã«ããã°ã©ã ãããŠããããåã«è±ç²ã絶ããåéããŸããããªãã¯åœŒãã®èŠçãããé«ããæã 圌ããã¡ããã©èŠãã°ããã®è±ã«éåžžã«æå³çã«ç§»åããããšã«æ°ä»ããããããŸããã
...ãããŠããããBee Taskã¡ã³ããŒé¢æ°ã§ãïŒ
bool Task::Bee(Garden &garden, Population &population, int (&arguments)[10]){ //Just Search for Flowers if(initFlag){ //Define our Tasks Task take("Take Food", botID, &Task::take); Task eat("Eat Food", botID, &Task::consume); Task search("Locate Food", botID, &Task::search); search.args[0] = population.bots[botID].forage; queue.push(eat); queue.push(take); queue.push(search); initFlag = false; } //Work off our allocated queue. if(!queue.empty()){ //Get the Top Task Task newtask = queue.top(); queue.pop(); //If our new Task is not performed successfully if(!newtask.perform(garden, population)){ //Put the Task back on queue.push(newtask); } //If it was successful, we leave it off return false; } initFlag = true; return true; }