ãååž°åŒã³åºãããããã«ããšããçšèªã䜿çšããã«1æ¥ããããŠãå®éã«2009幎ã«ã³ãŒãã®èª°ããã€ã¥ããééããããã«äŒèšã·ã¹ãã ã®åçŽãªå€æŽãã»ãŒ1é±éé
ããçç±ã䞻任äŒèšå£«ã«èª¬æããããšããããŸãã ãã®ãããªæ¥ã«ã¯ããã®äžçãåµé ããè³¢ã人ã«æãåŒãããã¹ãŠããŒãããæžãçŽããããšæããŸãã

TL; DR
ã«ããã®äžã§ãPythonãåŠç¿ããããã®ç·Žç¿ãšããŠãæ©æ¢°åŠç¿ãšç¥ã䜿ã£ã
ãšãŒãžã§ã³ãããŒã¹ã®ã¢ããªã³ã°çšã®ã©ã€ãã©ãªãéçºããæ¹æ³ã«ã€ããŠã®ã¹ããŒãªãŒã
githubãžã®
ãªã³ã¯ ã ç®±ããåºããŠäœæ¥ããã«ã¯ã
pygameãå¿
èŠã§ãã è©ŠçšäŸã§
㯠ã
sklearnãå¿
èŠã§ãã
ã¢ã€ãã¢ã®èµ·æº
ç§ã話ãããèªè»¢è»ãäœããšããã¢ã€ãã¢ã¯åŸã
ã«çŸããŸããã ãŸããæ©æ¢°åŠç¿ã®ãããã¯ã®äººæ°ã¯ç§ãè¿œãè¶ããŸããã§ããã ãã¬ãŒããŒã«é¢ãã
ããã€ãã®ã³ãŒã¹ã¯ãé¢äžã®èåœã®æèŠãäžããŸããã ããã€ãã®å
¬éã³ã³ãã¹ããškaggleã§ã®ç»é²ã¯ããããã«èªå°å¿ãä¿®æ£ããŸããããç±æã匱ããããšã¯ãããŸããã§ããã
第äºã«ãåœå
ã®ITã³ãã¥ããã£ã®
æã«è² ããªãã«ãŒã¹ãã®ä»£è¡šãšããŠãç§ã®å€§å¥œããªPythonãç·Žç¿ããæ©äŒã¯ãã£ãã«ãããŸããã ãããŠãè³¢ã人ãã¡ããããã®ç¹ã§ããªãã®ãããžã§ã¯ãã¯ãŸãã«ç§ãã¡ãå¿
èŠãšãããã®ã ãšèããã
ããããæšé²åã¯ããŒãã³ãºã¹ã«ã€ã®å€±æã§ããã æè¡çã«ã¯çŽ æŽãããã¢ã€ãã¢ã§ãããæç¶ãçã«çæãããäžçã¯ç©ºã§ããããšãå€æããŸããã ãããŠã倱æãããã¡ã³ã®ããã«ã圌ããç§ã«å°ãããã©ããããèãå§ããŸããã ãããŠåœŒã¯ãäžçã¯ç©ºã§ãããšããèããæãã€ããŸããããªããªããããã«ã¯æ¬åœã«ç¥ççåœãã»ãšãã©ãªãããã§ãã ç¡éã®ãªãŒãã³ã¹ããŒã¹ãèªåã ãã«é Œãç¿æ
£ãçºèŠè
ã®åã³-ãã¡ãããããã¯ãã¹ãŠè¯ãããšã§ãã ããããåºå°ã«æ»ã£ãŠåžå Žãæ£çãããã飲é£åºã§ææ°ã®ãŽã·ãããèŠã€ãããããæ©äŒã¯ååã§ã¯ãããŸããã å°å
ãé
éããæçµçã«100ãŽãŒã«ããååŸããŸãã ã²ãŒã ã«ãããéœåžã察話ãæ¢æ±ã¯ãçããŠãã人ã®ä»äºã®ææã§ããããã®ãããªå·šå€§ãªäžçã«äººéã®åã«ããçåœãæå
¥ããããšã¯äžå¯èœã§ããããšã¯æããã§ãã ããããå¿
èŠæ§ãå°ããªç©èªãã¯ãšã¹ããåããNPCãæç¶ãçã«çæã§ãããšãããã©ãã§ããããïŒ
æŠç¥èšç»
ã ãããããã€ãã®ã©ã€ãã©ãªã®ã¢ã€ãã¢ããããã¯ããªããç§ãèš±ããªãã次ã®äœ¿çšã·ããªãªãæã€ãã¬ãŒã ã¯ãŒã¯ãçŸããŸããïŒ
- å€å
žçãªãšãŒãžã§ã³ãã¢ããªã³ã° ïŒãã®ååšã¯ããã®èšäºãæžãããã«åº§ã£ããšãã«ããèŠã€ãããŸããã§ããïŒã ã¯ãŒã«ããäœæãããã®ã¯ãŒã«ãå
ã®ãšãŒãžã§ã³ãã®ã¢ã¯ã·ã§ã³ãèšè¿°ããäœãèµ·ãã£ãã®ãã確èªããããã€ãã®ãã©ã¡ãŒã¿ãŒãå€æŽããŠãã·ãã¥ã¬ãŒã·ã§ã³ãå床å®è¡ããŸãã ãããŠãåã
ã®ãšãŒãžã§ã³ãã®è¡åã®å€åãå
šäœåã«ã©ã®ããã«åœ±é¿ããããããããŸã§ãåã§å²ã¿ãŸãã éåžžã«äŸ¿å©ãªãã®ã
- 匷åãã¬ãŒãã³ã° ïŒ åŒ·ååŠç¿ã§ããããŸãïŒã ç¹å®ã®ç°å¢ãšå¯Ÿè©±ããããã«é©å¿ããåŠç¿ã¢ãã«ãæ§ç¯ããŸãã ç°¡åãªäŸã¯ãã«ãŒã«ãããããªãã²ãŒã ãæããããšã§ããããã€ã§ãã²ãŒã ã®ç¶æ
ã«é¢ããæ
å ±ãååŸããç¹å®ã®ã¢ã¯ã·ã§ã³ã»ããã®1ã€ãéžæããŠãç²åŸãããã€ã³ãæ°ã«ã©ã®ããã«åœ±é¿ãããã確èªã§ããŸãïŒãã ãã ãã®ãããã¯ã®ç«¶äºã¯æ¢ã«çµäºããŠããŸãïŒ ïŒ åé¡åãŸãã¯ååž°ã®éåžžã®ã¢ãã«ãšã¯å€ãã®éãããããŸãã ããã¯ãçµæã®é
延ãèšç»ã®å¿
èŠæ§ãããã³ãã®ä»ã®å€ãã®æ©èœã§ãã
- ãããŠæåŸã«ãç§ãã¡ãäžçãäœæããåççã§ããŸãè¯ããªãçãç©ãå
¥ããåŸãå人çã«ããã«è¡ããå¿ å®ãªãã©ã¹ã¿ãŒãææã®å£ãå€ç®çã€ãã¯ããŸãã¯èµ€ãçªåããã€ããããšãã§ããã°ããããã§ãã
ããã€ãã®æè¡çãªè©³çŽ°
ãããã£ãŠããŸããäžçã®äœã¬ãã«ã®ç©çåŠã決å®ããå¿
èŠããããŸãã ã·ã³ãã«ã§ãããªãããããŸããŸãªç¶æ³ãã·ãã¥ã¬ãŒãããã®ã«ååãªæè»æ§ãå¿
èŠã§ãã
- åºæ¬ãšããŠãéåžžã®ã»ã«ã©ãŒãªãŒãããã³ãã€ãŸãåãªããžã§ã¯ãã2ä¹ã®ãã©ã³ã¯é·ãå ãã2次å
ã®é·æ¹åœ¢ã®é¢æ£äžçãèããŠã¿ãŸãããã Planckã®é·ãããçãè·é¢ã¯æå³ããããŸããã2ã€ã®ã»ã«ã®éã«ãªããžã§ã¯ããé
眮ããããšã¯ã§ããŸããããªããžã§ã¯ããå®å
šã«ã§ã¯ãªããè€æ°ã®ã»ã«ãå ããããã«é
眮ããããšã¯ã§ããŸããã
- è·é¢ã¯4æ¹åã®ã¹ãããã§ã®ã¿æž¬å®ãããŸããã€ãŸããã»ã«ã¯8ã§ã¯ãªã4ã«é£æ¥ããŸãã察è§ç·äžã®ã»ã«ã«ã¯2ã€ã®ã¹ãããããããŸãã
- çµæã®ãã¶ã€ã³ã®å
ç¢æ§ããããã«åžéããã«ã¯ãå°ãæ·±ããè¿œå ããŸããåãªããžã§ã¯ãã«ã¯ééæ§ã®å
åããããŸãã äžçã®åã空é座æšã«ãããšãå°ãªããšã1ã€ããã ã2ã€ä»¥äžã®ãªããžã§ã¯ããååšããå¯èœæ§ããããŸãïŒééå¯èœããã³/ãŸãã¯ééäžå¯èœãªãªããžã§ã¯ãã ããã¯ããªããžã§ã¯ããç«ã¡äžãã£ãŠåãè¡šé¢ãšããŠæ³åã§ããŸãã è¡šé¢ã®ã¿ã€ããç°ãªãããªããžã§ã¯ãã®ã¿ã€ããç°ãªããŸãã ã«ãŒãããïŒééã§ããªããªããžã§ã¯ãïŒã«çžç³ïŒééã§ããªããªããžã§ã¯ãïŒã眮ãããšãã§ããŸãã ãããããªããªãŠã ãç©å±€æ¿ã«çœ®ãããšã¯ã§ããŸããïŒèª°ããããè¡ãã®ã§ããïŒïŒãããŠãå°åº§ã«æ€
åã眮ãããšã¯ã§ããŸããã
- ãã ããçžç³ã«ã¯ããŸããŸãªãªããžã§ã¯ããæ ŒçŽã§ããŸãã ãããŠãã«ãŒãããã®äžããã¢ã¯ãã£ããªãªããžã§ã¯ãã®ãã±ããã®äžã«ããããŸãã ã€ãŸããä»»æã®ãªããžã§ã¯ãããªããžã§ã¯ãã®ã³ã³ããã«ããããšãã§ããŸãã ããããä»ã®ãªããžã§ã¯ãã«ã€ããŠã¯ããã§ã¯ãããŸãããããã§ãªãå Žåãç§ãã¡ã¯ç¬¬äžæ³ã«éåããŸãã
- æéãé¢æ£çã§ãã åã¹ããããåãªããžã§ã¯ãã¯1ã€ã®ãã©ã³ã¯æéã«ååšãããã®éã圌ã¯ãã®æ代ã®åœŒã®åšãã®äžçã«é¢ããæ
å ±ãå€éšããååŸã§ããŸãã ãããæã匱ãç¹ã§ãããªããžã§ã¯ãã¯é çªã«åäœããå¿
èŠããããŸãããã®ãããç¹å®ã®éåæãçºçããŸãã ã移åãã®å¯Ÿè±¡ãšãªããªããžã§ã¯ãã¯ããã®æ代ã«ãã§ã«ã䌌ãŠããããªããžã§ã¯ãã®ç¶æ
ãèæ
®ããå¿
èŠããããŸãã ãªããžã§ã¯ããæ代ã®åãã«ã®ã¿éäžã§ããããã«ãããšãããšãã°ã2ã€ã®ééã§ããªããªããžã§ã¯ããæ代ã®åãã«åãèªç±ãªã»ã«ã®äžã«ç«ã€ãšããäºå®ã«ã€ãªããå¯èœæ§ããããŸãã ãŸãã¯ããã¬ããµãŒããåãéŽäžãåãé€ããŸãã ããã¯ãåæ代ã®ãªããžã§ã¯ããã©ã³ãã ãªé åºã§åç
§ããããšã§ãããã«å¹³æºåã§ããŸããããã®ã¢ãããŒãã§ã¯åé¡ãå®å
šã«è§£æ±ºããããšã¯ã§ããŸããã
ããã«ãããäžçèªäœïŒãã£ãŒã«ãïŒããã®äžçã®ãªããžã§ã¯ãïŒãšã³ãã£ãã£ïŒãããã³ãªããžã§ã¯ãïŒç©è³ªïŒãšãããããã€ãã®å¿
èŠãªåºæ¬ãªããžã§ã¯ããåŸãããŸãã 以äžãèšäºã®ã³ãŒãã¯åãªã説æã§ãã github
ã®ã©ã€ãã©ãªã§ãã¹ãŠèŠãããšãã§ããŸãã
ãšã³ãã£ãã£ã¯ã©ã¹ãšäŸclass Entity(object): def __init__(self):
ãã£ãŒã«ãã¯ã©ã¹ class Field(object): def __init__(self, length, height): self.__length = length self.__height = height self.__field = [] self.__epoch = 0 self.pause = False for y in range(self.__height): row = [] self.__field.append(row) for x in range(self.__length): if y == 0 or x == 0 or y == (height - 1) or x == (length - 1): init_object = Block() else: init_object = Blank() init_object.x = x init_object.y = y init_object.z = 0 row.append([init_object])
ãµãã¹ã¿ã³ã¹ã¯ã©ã¹ã¯æå³ããªããããã®äžã«ã¯äœããããŸããã
æéãçµã€ã«ã€ããŠãäžçèªäœã責任ãè² ããŸãã æ代ããšã«ã圌ã¯ãã®äžã®ãã¹ãŠã®ãªããžã§ã¯ãã調ã¹ããããã«åŒ·å¶çã«ç§»åãããŸãã 圌ãããã®åããã©ã®ããã«è¡ããã¯åœŒã次第ã§ãã
ã©ããïŒ class Field(object): ... def make_time(self): if self.pause: return for y in range(self.height): for x in range(self.length): for element in self.__field[y][x]: if element.z == self.epoch: element.live() self.__epoch += 1 ...
ãããããªãç§ãã¡ã¯äžçãå¿
èŠãšãããããèŠãããšãã§ããªããã°ã䞻人å
¬ãããã«é
眮ããèšç»ãããæ©äŒã§ãããïŒ äžæ¹ãã°ã©ãã£ãã¯ã¹ãæ±ãããã«ãªããšãæ°ãæ£ã£ãŠããŸããäžçã®æ¯é
ãç¡æéã«å»¶æãããŸãã ãããã£ãŠãæéãç¡é§ã«ããããšãªãã
pygameã䜿çšãããã©ãããã©ãŒããŒã®äœæã«é¢ãã
ãã®çŽ æŽãããèšäºããã¹ã¿ãŒãïŒå®éãèšäºã®æåã®3åã®1ã ããå¿
èŠã§ãïŒãåãªããžã§ã¯ãã«è²å±æ§ãäžããŸãã
å¯èŠåã³ãŒã class Field(object): ... def list_obj_representation(self): representation = [] for y in range(self.height): row_list = [] for cell in self.__field[y]: row_list.append(cell[-1]) representation.append(row_list) return representation .... def visualize(field): pygame.init() screen = pygame.display.set_mode(DISPLAY) pygame.display.set_caption("Field game") bg = Surface((WIN_WIDTH, WIN_HEIGHT)) bg.fill(Color(BACKGROUND_COLOR)) myfont = pygame.font.SysFont("monospace", 15) f = field tick = 10 timer = pygame.time.Clock() go_on = True while go_on: timer.tick(tick) for e in pygame.event.get(): if e.type == QUIT: raise SystemExit, "QUIT" if e.type == pygame.KEYDOWN: if e.key == pygame.K_SPACE: f.pause = not f.pause elif e.key == pygame.K_UP: tick += 10 elif e.key == pygame.K_DOWN and tick >= 11: tick -= 10 elif e.key == pygame.K_ESCAPE: go_on = False screen.blit(bg, (0, 0)) f.integrity_check() f.make_time() level = f.list_obj_representation() label = myfont.render("Epoch: {0}".format(f.epoch), 1, (255, 255, 0)) screen.blit(label, (630, 10)) stats = f.get_stats() for i, element in enumerate(stats): label = myfont.render("{0}: {1}".format(element, stats[element]), 1, (255, 255, 0)) screen.blit(label, (630, 25 + (i * 15))) x = y = 0 for row in level: for element in row: pf = Surface((PLATFORM_WIDTH, PLATFORM_HEIGHT)) pf.fill(Color(element.color)) screen.blit(pf, (x, y)) x += PLATFORM_WIDTH y += PLATFORM_HEIGHT x = 0 pygame.display.update()
ãã¡ãããåŸã§ããããããèŠèŠåã¢ãžã¥ãŒã«ãäœæããããšã¯ã§ããŸãããã¢ãžã¥ãŒã«ãäœæããããšã¯ã§ããŸããã ãããããã«ãã«ã©ãŒã®ã©ã³ãã³ã°ã¹ã¯ãšã¢ã¯ãæ°çã®é°å²æ°ã«æµžãã®ã«ååã§ãã ããã«ããã¡ã³ã¿ãžãŒãå±éããŸãã

ããã§ã掻æ§å€ãã©ã®ããã«äœçšããããèããå¿
èŠããããŸãã ãŸãããã¹ãŠã®éèŠãªã¢ã¯ã·ã§ã³ã¯ãªããžã§ã¯ãã«ãªããŸãïŒã¯ãŒã«ããªããžã§ã¯ãã§ã¯ãªãPythonãªããžã§ã¯ãã§ãããããŸããããaã³ããŸãïŒã ãã®ãããããšãåãã¿ã€ãã§ãã£ãŠããã¹ããŒãªãŒãç¶æãããã®ç¶æ
ãæäœããããã¢ã¯ã·ã§ã³ãšå¥ã®ã¢ã¯ã·ã§ã³ãåºå¥ã§ããŸãã ãã®ãããã¢ã¯ã·ã§ã³ã¯æ¬¡ã®ããã«ãªããŸãã
- åã¢ã¯ã·ã§ã³ã«ã¯ä»¶åãå¿
èŠã§ãã ã¢ã¯ã·ã§ã³ã®å¯Ÿè±¡ã¯ãç§ãã¡ã®äžçã®ãªããžã§ã¯ãïŒãšã³ãã£ãã£ïŒã®ã¿ã§ãã
- ãã¹ãŠã®ã¢ã¯ã·ã§ã³ã«ã¯çµæãå¿
èŠã§ãã å°ãªããšããå®äº/æªå®äºãããã³ãç®æšéæ/ç®æšæªéæãã ãã ããã¢ã¯ã·ã§ã³ã®ã¿ã€ãã«å¿ããŠè¿œå ã®ã¢ã¯ã·ã§ã³ãååšããå ŽåããããŸããããšãã°ãã¢ã¯ã·ã§ã³ãFind the Nearest Pizzeriaãã¯ãå¿
èŠãªçµæã«å ããŠããããã§ãªã¢èªäœã®åº§æšãŸãã¯ãªããžã§ã¯ããæã€ããšãã§ããŸãã
- åã¢ã¯ã·ã§ã³ã«ã¯ããã©ã¡ãŒã¿ãŒã®ã»ãããããå Žåãšãªãå ŽåããããŸãã ããšãã°ããPour Cup Coffeeãã¢ã¯ã·ã§ã³ã«ã¯ãæ確ã«ããå¿
èŠããªãããããã©ã¡ãŒã¿ãŒããªãå ŽåããããŸããããPourãã¢ã¯ã·ã§ã³ã«ã¯ãäœãã©ãã«æ³šãããæ確ã«ããæ©èœãå¿
èŠã§ãã
- ã¢ã¯ã·ã§ã³ã¯ç¬éçãŸãã¯éç¬éçã§ãã 1ã€ã®æ代ã§ã¯ã1ã€ã®ãªããžã§ã¯ããå®è¡ã§ããéç¬æã¢ã¯ã·ã§ã³ã¯1ã€ã ãã§ãç¬æã¢ã¯ã·ã§ã³ã¯ããã€ã§ãå®è¡ã§ããŸãã ããã¯è°è«ã®äœå°ã®ããç¹ã§ããé¢æ£çãªã¹ããŒã¹ããããã»ã«ã®ååã移åã§ããªãå Žåã1ã€ã®æ代ã«ç¡å¶éã®ã¢ã¯ã·ã§ã³ãå®è¡ããæ©èœã¯å¥åŠã«èŠããæ確ãªé¢æ£çãªæéã®æµããå€å°æãªããŸãã ãŸããåã¿ã€ãã®ã¢ã¯ã·ã§ã³ã«è²»ããæéã0ã1ã®ç¯å²ã§å°ãããšããèãããããŸããã1ã®ã¢ã¯ã·ã§ã³ã¯æ代å
šäœãå ããŸãã é¢æ£æéãæ確ã«ããããã«ãç¬æã§ã¯ãªãã·ãã¥ã¬ãŒã·ã§ã³ã«å¿
èŠãªãã¹ãŠã®ã¢ã¯ã·ã§ã³ããã€ã§ãå®è¡ã§ããããããªãã·ã§ã³ãã€ã³ã¹ã¿ã³ãæ§ã®å
åã§è§£æ±ºããŸããããæéã®ãªãã·ã§ã³ã¯éåžžã«è€éã§ãã
ãããã£ãŠãæè¡çãªèŠ³ç¹ããèŠããšãã¢ã¯ã·ã§ã³ã®ãªããžã§ã¯ãïŒActionïŒã¯äžçš®ã®é¢æ°ã§ããããã©ã¡ãŒã¿ãŒãèšå®ããå®è¡ããçµæãååŸããåæã«ãæž¡ããããã©ã¡ãŒã¿ãŒãšçµæãããã³ãã®ä»ã®ããšãä¿åããããšãã§ããŸãåŒã³åºãå
ã®å®è£
ããå§ãŸããå®è¡äžã®äžçã®ç¶æ
ã§çµããå®è£
ã«é¢é£ä»ããããŠããŸãã ãããã£ãŠãäžåºŠã«äœæããå¥ã®ãã©ã¡ãŒã¿ãŒãèšå®ãã3çªç®ã«å®è¡ããæ»ãå€ãååŸããŠãããã«åæããããã«ã·ã§ã«ãã«é
眮ã§ããŸãã
ã¢ã¯ã·ã§ã³ãªããžã§ã¯ã class Action(object): def __init__(self, subject): self.subject = subject self.accomplished = False self._done = False self.instant = False def get_objective(self): return {} def set_objective(self, control=False, **kwargs): valid_objectives = self.get_objective().keys() for key in kwargs.keys(): if key not in valid_objectives: if control: raise ValueError("{0} is not a valid objective".format(key)) else: pass
ç§ä»¥å€ã®èª°ãããã®ã©ã€ãã©ãªã®å©ããåããŠå±
å¿å°ã®è¯ãå°ããªäžçãçªç¶äœæãããå Žåãç®±ããåºããŠããã«å¿
èŠãªäœã¬ãã«ã®ã¢ã¯ã·ã§ã³ã®ã»ãããå«ãŸããŠãããšæ³å®ãããŸã-座æšã«ãã移åããªããžã§ã¯ãã®è¿œè·¡ãç¹å®ã®ãªããžã§ã¯ããŸãã¯ãªããžã§ã¯ãã®æ€çŽ¢ããªããžã§ã¯ãã®ããã¯ã¢ãããªã©ã dã ãããã®ã¢ã¯ã·ã§ã³ã¯ãåç¬ã§äœ¿çšããããšããçµã¿åãããŠäœããã®è€éãªæäœãçæããããšãã§ããŸãã ãã®ãããªè€éãªã¢ã¯ã·ã§ã³ã®äŸã«ã€ããŠã¯ãæåã®å®éšã®èª¬æã§ããã«èª¬æããŸãã
第äºã«ããã¹ãŠã®èªå°å¿ã®ããã¢ã¯ãã£ããªãšãŒãžã§ã³ãã¯ãè¡åãèšç»ã§ããªããã°ãªããŸããã ãããã£ãŠããã®æ代ã®æŽ»åã®ãã§ãŒãºãèšç»ãšè¡åã®2ã€ã®æ®µéã«åããŸãã èšç»ããŒã«ãšããŠãäžè²«ããŠå®è¡ããã¢ã¯ã·ã§ã³ã®åçŽãªãã¥ãŒããããŸãã ãããããã§ã«èšç»ãç«ãŠãŠããå ŽåãããäžåºŠèããããšã¯ãããŸãããè¿
éã«ãæåºãšããŠè¡åããªããã°ãªããŸããã ã¿ãŒã³ã®éå§æã«ãã¢ã¯ãã£ããªããžã§ã¯ãããã®ç§»åãèšç»ããå¿
èŠããããã©ãããå€æãïŒéå§ã®ããã«ãã¢ã¯ã·ã§ã³ã®ãã¥ãŒã空ã®å Žåã«å¿
èŠãªãã®ãæ€èšããŸãïŒãå¿
èŠã§ãããšå€æããå Žåã«èšç»ããæçµçã«ã¢ã¯ã·ã§ã³ãå®è¡ããŸãã èšç»ããæ¥ãã«èããªãæ·±å»ãªããã»ã¹ãšããŠãã³ãŒã¹å
šäœããšãã¹ããã©ããã¯è°è«ã®äœå°ã®ããåé¡ã§ãã ç§ã®ç®çã®ããã«ãç§ã¯ãããŸã§ã®ãšããããã§ã¯ãªããã®ã«èœã¡çããŸãã-ç§ã®ãšãŒãžã§ã³ãã¯é·ãéèãããåãåãã§èšç»ãå®è¡ãå§ããŸãã
èšç»ãšè¡å class Agent(Entity): ... def live(self): ... if self.need_to_update_plan(): self.plan() if len(self.action_queue) > 0: current_action = self.action_queue[0] self.perform_action(current_action) while len(self.action_queue) > 0 and self.action_queue[0].instant: current_action = self.action_queue[0] self.perform_action(current_action) def need_to_update_plan(self): return len(self.action_queue) == 0 def perform_action(self, action): results = action.do_results() if results["done"] or not action.action_possible(): self.action_log.append(self.action_queue.pop(0)) return results ... ...
ããã«å ããŠããªããžã§ã¯ãã®ç¶æ
ãªã©ã®ãšã³ãã£ãã£ãå°å
¥ãããšäŸ¿å©ã§ããããã«æãããŸãã 確ãã«ããšãŒãžã§ã³ãã¯æ°åã§ã¯ãªããç²ããŠããããæ¿¡ããããæ¯ã«ãªã£ããããããã¯ãã®éã§ãã£ãããéœæ°ã§ãšãã«ã®ãŒã«æºã¡ãŠãããããããŸããã æã«ã¯åæã«ãã ãããã£ãŠããªããžã§ã¯ãã«ç¶æ
ã®é
åãè¿œå ããŸããåç¶æ
ã¯ãæ代ã®åãã«ãªããžã§ã¯ãã«åœ±é¿ããŸãã
ç¶æ
ã³ãŒã class State(object): def __init__(self, subject): self.subject = subject self.duration = 0 def affect(self): self.duration += 1 class Entity(object): def __init__(self): ... self._states_list = [] ... ... def get_affected(self): for state in self._states_list: state.affect() def live(self): self.get_affected() self.z += 1 self.age += 1 ...
ã¢ããªã³ã°ãšãã¬ãŒãã³ã°ãè¡ãã«ã¯ãã¢ã¯ã·ã§ã³ã®ã¢ã«ãŽãªãºã ãã©ãã ãããŸãèšè¿°ãããããã¬ãŒãã³ã°ã¢ãã«ãéžæããããè©äŸ¡ã§ããå¿
èŠããããŸãã ãããè¡ãã«ã¯ãã·ãã¥ã¬ãŒã·ã§ã³ã®çµäºãå€æããçµæãåéããæ¹æ³ãèšè¿°ããæ©èœãåããåçŽãªã·ãã¥ã¬ãŒã·ã§ã³ããã³è©äŸ¡ã¢ãžã¥ãŒã«ãè¿œå ããŸãã
ãã®ãããªãã® import copy def run_simulation(initial_field, check_stop_function, score_function, times=5, verbose=False): list_results = [] for iteration in range(times): field = copy.deepcopy(initial_field) while not check_stop_function(field): field.make_time() current_score = score_function(field) list_results.append(current_score) if verbose: print "Iteration: {0} Score: {1})".format(iteration+1, current_score) return list_results
ãã®æ®µéã§ã¯ãååãšããŠããã¹ãŠããã©ã€ãã©ãªã䜿çšããæåã®ã·ããªãªã§ãããšãŒãžã§ã³ãããã¬ãŒãã³ã°ããããªãããã¢ã¯ã·ã§ã³ã®ããžãã¯ãç¬ç«ããŠåŠæ¹ãããå Žåã®ã¢ããªã³ã°ãéããæºåãã§ããŠããŸãã ãã®å Žåã®æé ã¯æ¬¡ã®ãšããã§ãã
- å£ãå±±ã家å
·ãè¡šé¢ã®çš®é¡ãªã©ãäžçã§èŠããéçãªããžã§ã¯ãã決å®ããŸãã ããããèšè¿°ããEntityã¯ã©ã¹ãç¶æ¿ããŸãã ãªããžã§ã¯ããšSubstanceã¯ã©ã¹ã§ãåãããšãè¡ããŸãã
- é©åãªãµã€ãºã®äžçãäœæãããããã®ãªããžã§ã¯ããšãªããžã§ã¯ãã®é¢šæ¯ã§åããŸãã
- Actionã¯ã©ã¹ãç¶æ¿ããå¿
èŠãªãã¹ãŠã®ã¢ã¯ã·ã§ã³ãèšè¿°ããŸãã Stateã¯ã©ã¹ã«ã€ããŠãåãããšãè¡ããã·ãã¥ã¬ãŒã·ã§ã³ã«å¿
èŠãªå Žåã¯ãããã瀺ããŸãã
- ãšãŒãžã§ã³ããç¶æ¿ããŠããšãŒãžã§ã³ãã®ã¯ã©ã¹ãäœæããŸãã ãµãŒãã¹æ©èœãè¿œå ããèšç»ããã»ã¹ã説æããŸãã
- ç§ãã¡ã¯ãã¢ã¯ãã£ããªãšãŒãžã§ã³ãã§ç§ãã¡ã®äžçã«äœãã§ããŸãã
- ã¢ã¯ã·ã§ã³ããããã°ããäœæã®çèã楜ããããã«ãèŠèŠåãæšé²ã§ããŸãã
- æåŸã«ãèŠèŠåãååã«è¡ã£ãåŸãã·ãã¥ã¬ãŒã·ã§ã³ãå®è¡ããäœæããäžçã§äœæããã«ãŒã«ã«åŸã£ãŠãäœæãããšãŒãžã§ã³ããã©ãã ãããŸãåäœããããè©äŸ¡ããŸãã
æŠå¿µå®èšŒi
ããã§ãæåã®å®éšã®æ¡ä»¶ãçºè¡šããŸãã
- äžçã¯å£ãå°çã§æ§æãããŠããŸãã å£ã¯ãçªãéããªãå£ã§ããããã以äžã®ãã®ã§ã¯ãããŸããã å°çã§ã¯ããã«èå³æ·±ããã®ã§ãããã¹ãŠã®æ代ã«ã¯ããªãœãŒã¹ãŠããããå°çã®ä»»æã®ã»ã«ãŸãã¯ããã€ãã®ã»ã«ã«çŸãã確çããŒãã§ã¯ãããŸããã
- 人å£ïŒç·å¥³ã®çãç©ã ç°¡åã«ããããã«ãæ§å¥ãããŒã«å€ã§ä¿åãããããæ§å¥ã¯falseãŸãã¯trueã«ãªããŸãã
- åœãã®æ§ã®çãç©ã¯è²ªæ¬²ã§ãããå¯èœãªéãå€ãã®è³æºãéãããšãã人çã®ç®æšãæã£ãŠããŸãã 衚瀺ããããšããã«ããªãœãŒã¹ãæã€æãè¿ãã»ã«ãèŠã€ããããã«è¡ãããªãœãŒã¹ãåéãããªã©ãåã§å²ã¿ãŸãã ãããã圌ãã¯åäŸãç£ãèœåã«æµãŸããŠããŸãã
- çã®ã»ãã¯ã¹ã¯ãªãŒãã£ãŒã¯ããå€æ§ã§ãã 圌ãã«ã¯2ã€ã®éžæè¢ããããŸãïŒãªãœãŒã¹ãåéãããã亀é
çžæãæ¢ããŸãïŒãã¡ãããç°æ§ãããŸãããªãœãŒã¹ãå°ãªãå Žæã§å¶ç¶ã«èªåãèŠã€ããªãããã«ããããã§ãã亀é
çžæã®å¯èœæ§ã«ã€ããŠèããªãæ¹ãè¯ãã§ãïŒã
- 亀尟ããããšã決å®ããæ¬åœã®æ§ã®çãç©ãéžã°ããããŒãããŒã«è¿œãã€ããåŒéããããã«èªããšãåœã®æ§ã®çãç©ã¯ãäž¡æ¹ã®åå è
ã®ãªãœãŒã¹ã®éã«åºã¥ããç¹å®ã®ã«ãŒã«ã«åŸã£ãŠãããã亀尟ãããã©ããã決å®ããŸãã å
¥æè
ãããå€ãã®ãªãœãŒã¹ãæã£ãŠããå Žåã圌ã¯åæãåãåããŸãã å°ãªããåãå Žåããã¢ãªã³ã°ã®ç¢ºçã¯ãªãœãŒã¹ã®éã®éãã«äŸåããŸãã
- åèåŸ10ãšããã¯ãã©ã³ãã ãªæ§å¥ã®çãç©ãçãŸããŸãã ããã¯ããã«å€§äººã«ãã£ãŠçãŸããæ§å¥ã®èŠåã«åŸã£ãŠè¡åããŸãã
- ãã¹ãŠã®çãç©ã¯æ»ãªãªããã°ãªããŸããã åã¯ãªãŒãã£ãŒã¯ããã®èªçãã10çªç®ããå§ãŸããã¢ã¯ãã£ããªååšãåæ¢ãããŒã以å€ã®äžå®ã®ç¢ºçãæã£ãŠããŸãã
ç§ãã¡ã®ä»äºã¯ãçãç©ã®éå£ãã§ããã ãæ©ãå¢æ®ããããã«ãçã®æ§ççãç©ã®èšç»æé ãæžãããšã§ãã
ãã®å Žæãèªãã§ãæè¬ã®æ°æã¡ã蟌ããŠé·ãã€ã©ã¹ãã§éå±ããããšã¯ãããŸããã
ãã¢ãªã³ã°ã®äŸã«é¢ããè€éãªã¢ã¯ã·ã§ã³ã®å®è£
ã®å€åœ¢ class GoMating(Action): def __init__(self, subject): super(GoMating, self).__init__(subject) self.search_action = SearchMatingPartner(subject) self.move_action = MovementToEntity(subject) self.mate_action = Mate(subject) self.current_action = self.search_action def action_possible(self): if not self.current_action: return False return self.current_action.action_possible() def do(self): if self.subject.has_state(states.NotTheRightMood): self._done = True return if self.results["done"]: return if not self.action_possible(): self._done = True return first = True while first or (self.current_action and self.current_action.instant) and not self.results["done"]: first = False current_results = self.current_action.do_results() if current_results["done"]: if current_results["accomplished"]: if isinstance(self.current_action, SearchMatingPartner): if current_results["accomplished"]: self.current_action = self.move_action self.current_action.set_objective(**{"target_entity": current_results["partner"]}) elif isinstance(self.current_action, MovementXY): self.current_action = self.mate_action self.current_action.set_objective(**{"target_entity": self.search_action.results["partner"]}) elif isinstance(self.current_action, Mate): self.current_action = None self.accomplished = True self._done = True else: self.current_action = None self._done = True else: break def check_set_results(self): self.accomplished = self._done
ãããŠãã¢ãã«ãæ©èœãããšå€æããèšç»ãªãã·ã§ã³ class Creature(Agent): ... def plan(self): nearest_partner = actions.SearchMatingPartner(self).do_results()["partner"] if nearest_partner is None: chosen_action = actions.HarvestSubstance(self) chosen_action.set_objective(** {"target_substance_type": type(substances.Substance())}) self.queue_action(chosen_action) else: self_has_substance = self.count_substance_of_type(substances.Substance) partner_has_substance = nearest_partner.count_substance_of_type(substances.Substance) if partner_has_substance - self_has_substance > 2: self.queue_action(actions.GoMating(self)) else: chosen_action = actions.HarvestSubstance(self) chosen_action.set_objective(**{"target_substance_type": type(substances.Substance())}) self.queue_action(chosen_action) ...
æ©æ¢°åŠç¿ãšç¥ã
ã«ã€ããŠ
åçŽãªã¢ããªã³ã°ãæ©èœããããšã確èªãããã楜ãã¿ã®åºŠåããå¢ãããæ©æ¢°åŠç¿ã®å¯èœæ§ãè¿œå ãå§ããŸãã ãã®èšäºã®å·çæç¹ã§ã¯ãèšç»ãããŠãããã¹ãŠã®æ©èœãå®è£
ãããŠããããã§ã¯ãããŸããããç¥ã«ã€ããŠè©±ãããšãçŽæããŸããã
ããããæåã«ãã¯ãªãŒãã£ãŒãã©ã®ããã«èšç·Žããããã決ããå¿
èŠããããŸãã ãªãœãŒã¹ã®æ€çŽ¢ãšãã¢ãªã³ã°ã§åãã¿ã¹ã¯ãå®è¡ããŸãã åŸæ¥ã®æ¹æ³ã§è§£æ±ºããå Žåã¯ãæåã«äžé£ã®æ©èœã決å®ããããã«åºã¥ããŠæ±ºå®ãäžãå¿
èŠããããŸãã 次ã«ãã©ã³ãã ã«ãŸãã¯äœããã®åœ¢ã§è¡åãããã¬ãŒãã³ã°ãšãã¹ãããŒã¿ã»ãããåéããŠä¿åããŸãã 次ã«ããããã®ããŒã¿ã»ããã§ããã€ãã®ã¢ãã«ããã¬ãŒãã³ã°ããããããæ¯èŒããŠæé©ãªã¢ãã«ãéžæããŸãã æåŸã«ããã®ã¢ãã«ã䜿çšããŠèšç»ããã»ã¹ãæžãçŽããã·ãã¥ã¬ãŒã·ã§ã³ãå®è¡ããŠãäœãèµ·ãããã確èªããŸãã ãããŠãããŒã¿ãåã³ã³ãã€ã«ããã¢ãã«ãåãã¬ãŒãã³ã°ããã¢ãã«ãçžäºã«åæ¯èŒããäœãèµ·ããããå確èªããããã«åèµ·åããããšãæå³ããæ°ããæ©èœã䜿çšããããšã«ãªããŸããã
ãããŠãçæ³çã«ã¯äœã欲ããã§ããããïŒ çæ³çã«ã¯ãæ©èœã»ãããå®çŸ©ãããã¬ãŒãã³ã°ã¢ãã«ãæ§æããæ¢ã«ããŒã¿ã»ãããåéããã¢ãã«ããã¬ãŒãã³ã°ãããããèšç»ããã»ã¹ã«æ¥ç¶ããä»ã®ã¢ãã«ãŸãã¯ä»ã®ã»ããã®çµæãšæ¯èŒã§ããè€æ°ã®å®è¡ã®æçµçµæãæäŸããã·ãã¥ã¬ãŒã·ã§ã³ãå®è¡ããããšæããŸããµã€ã³ã
ãããŠãããã«ç§ããããæ³åããæ¹æ³ããããŸãïŒ
- ããŒã¿ã»ãããåéããŠææ決å®ãè¡ãã«ã¯ããã¬ãŒãã³ã°ã®å¯Ÿè±¡ã§ãããèšç»ããã»ã¹ã§ã¢ãã«ãäºæž¬ããããã«äœ¿çšããæšèã®åé ã宣èšçã«èšè¿°ããå¿
èŠããããŸãã ããã§ãé¢æ°ã®é
åãšããŠå®è£
ããŸãããåé¢æ°ã¯ç¹å®ã®å±æ§ã®å€ãè¿ããŸãã ãã¹ãã¿ã¹ã¯ã®å Žåãããã¯ãããšãã°ãå¯èœæ§ã®ããããŒãããŒã®ååšãè¿ãé¢æ°ã決å®ãè¡ãã¯ãªãŒãã£ãŒã®ãªãœãŒã¹ã®éãæãè¿ããªãœãŒã¹ãŸã§ã®è·é¢ãªã©ãèæ
®ããå¥ã®é¢æ°ã§ãã ãããããå±æ§ã®é
åãè¿ãé¢æ°ã®æ¹ãæåããã§ããããããã®èšäºãæžããŠããæç¹ã§ã¯ãé¢æ°ã®é
åã®ã»ããç§ã«ãšã£ãŠã¯äŸ¿å©ã ãšæãããŸããã ãããã£ãŠãç§ãã¡ã¯ãã€ã§ãèå³ã®ããäžçã®èª¬æãåŸãæ©äŒãåŸãŸãã
- ãŸããé¢å¿ã®ããçµæãååŸããæ¹æ³ã宣èšçã«èª¬æããŸãã ç§ãã¡ã®äŸã®å Žåãããã¯ãæåããã倱æããããèšããŸãã
- 䜿çšãããã¬ãŒãã³ã°ã¢ãã«ãšãã®ãã©ã¡ãŒã¿ãŒã瀺ããŸãã ããšãã°ã確ççåŸé
éäžãã©ã³ãã ãã©ã¬ã¹ããããçš®ã®ãã¥ãŒã©ã«ãããã¯ãŒã¯ããŸãã¯ç¬èªã®ãã®ã§ãã
- ã·ãã¥ã¬ãŒã·ã§ã³ãéå§ããŸãã ãŸãã決å®ãäžãå¿
èŠããããã³ã«ãç§ãã¡ã説æããã«ãŒã«ã«åŸã£ãŠã¯ãªãŒãã£ãŒã¯å±æ§ã®é
åãååŸããã¢ãã«ïŒãŸã 空ã§ãïŒã䜿çšããã«ã¢ã¯ã·ã§ã³ãéžæããŸãã ãã®ã¢ã¯ã·ã§ã³ãå®è¡ãããšã圌ãã¯åã³ãç§ãã¡ã«ãã£ãŠèšè¿°ãããã«ãŒã«ã«åŸã£ãŠçµæã決å®ãã決å®ãè¡ãããç¶æ³ã®èª¬æãšçµã¿åãããŸãïŒã¢ã¯ã·ã§ã³ã®åã«ååŸãããäžé£ã®å
åïŒããããŠåºæ¥äºããã¬ãŒãã³ã°ããŒã¿ã»ããã®æºåãã§ãããµã³ãã«ããããŸãã ãããäžå®åæ°è¡ããååãªããŒã¿ãèç©ãããšãã¯ãªãŒãã£ãŒã¯æçµçã«ãã¬ãŒãã³ã°ããŒã¿ã»ãããã¢ãã«ã«ãã£ãŒãããŸãã ã¢ãã«ããã¬ãŒãã³ã°ãããåŸã圌ãã¯ãã§ã«èšç»ããã»ã¹ã§ããã䜿çšãå§ããŸãã
- ããã«ãªãã·ã§ã³ãå¯èœã§ãã åæ¢ã§ããŸãã ã¢ãã«ã§åŠç¿ãçµäºã§ããå Žåã¯ãåŒãç¶ãäžé£ã®å
åãšã¢ã¯ã·ã§ã³ã®çµæãèšæ¶ããã¢ãã«ãæççã«ãã£ãŒãã§ããŸãã ãŸãã¯ãããšãã°ãç®çã®çµæã®å²åãäœäžãå§ããå Žåã«ããããªãŒããŒãã¬ãŒãã³ã°ããŸãã
ããã§ã¯ãããã€ãã®æ°ãããªããžã§ã¯ããå¿
èŠã§ãã ãŸããã¯ãªãŒãã£ãŒã«ã¯ãããŒã¿ã»ãããæ ŒçŽããäœããã®çš®é¡ã®ã¡ã¢ãªãå¿
èŠã§ãã 圌女ã¯ãæšèã®ã»ãããå¥ã
ã«èŠããããã¹ãã§ãã å¥éããã®æ©èœã»ããã§è¡ããã決å®ã®çµæãè¿œå ããŸãã 䟿å©ãªåœ¢åŒã§ããŒã¿ã»ãããè¿ããŸãã ããŠã倧åŠã§æãããããã¹ãŠãå¿ããŠãã ããã
èšæ¶ã®ç§å¯ class LearningMemory(object): def __init__(self, host): self.host = host self.memories = {} def save_state(self, state, action): self.memories[action] = {"state": state} def save_results(self, results, action): if action in self.memories: self.memories[action]["results"] = results else: pass def make_table(self, action_type): table_list = [] for memory in self.memories: if isinstance(memory, action_type): if "state" not in self.memories[memory] or "results" not in self.memories[memory]: continue row = self.memories[memory]["state"][:] row.append(self.memories[memory]["results"]) table_list.append(row) return table_list def obliviate(self): self.memories = {}
次ã«ããšãŒãžã§ã³ãã«ã¿ã¹ã¯ãååŸãããã®ã¢ã¯ã·ã§ã³ã®ç¶æ³ãšçµæãèšæ¶ããæ¹æ³ãæããå¿
èŠããããŸãã
å²ãåœãŠãåãåã class Agent(Entity): def __init__(self): ... self.memorize_tasks = {} .... ... def set_memorize_task(self, action_types, features_list, target): if isinstance(action_types, list): for action_type in action_types: self.memorize_tasks[action_type] = {"features": features_list, "target": target} else: self.memorize_tasks[action_types] = {"features": features_list, "target": target} def get_features(self, action_type): if action_type not in self.memorize_tasks: return None features_list_raw = self.memorize_tasks[action_type]["features"] features_list = [] for feature_raw in features_list_raw: if isinstance(feature_raw, dict): if "kwargs" in feature_raw: features_list.append(feature_raw["func"](**feature_raw["kwargs"])) else: features_list.append(feature_raw["func"]()) elif callable(feature_raw): features_list.append(feature_raw()) else: features_list.append(feature_raw) return features_list def get_target(self, action_type): if action_type not in self.memorize_tasks: return None target_raw = self.memorize_tasks[action_type]["target"] if callable(target_raw): return target_raw() elif isinstance(target_raw, dict): if "kwargs" in target_raw: return target_raw["func"](**target_raw["kwargs"]) else: return target_raw["func"]() else: return target_raw def queue_action(self, action): if type(action) in self.memorize_tasks: self.private_learning_memory.save_state(self.get_features(type(action)), action) self.public_memory.save_state(self.get_features(type(action)), action) self.action_queue.append(action) def perform_action_save_memory(self, action): self.chosen_action = action if type(action) in self.memorize_tasks: results = self.perform_action(action) if results["done"]: self.private_learning_memory.save_results(self.get_target(type(action)), action) self.public_memory.save_results(self.get_target(type(action)), action) else: results = self.perform_action(action) ...
, , , - , , , , , , . , , - -, , , .
Demiurge, . , , insert_object. , :
class Demiurge(object): def handle_creation(self, creation, refuse): pass class Field(object): def __init__(self, length, height): ... self.demiurge = None ... def insert_object(self, x, y, entity_object, epoch_shift=0): if self.demiurge is not None: refuse = False self.demiurge.handle_creation(entity_object, refuse) if refuse: return assert x < self.length assert y < self.height self.__field[y][x][-1] = entity_object entity_object.z = self.epoch + epoch_shift entity_object.board = self entity_object.x = x entity_object.y = y ...
:
- ( ) . , .
- â , , , . , , ,
.
- ( ) , ( , , ). , , .
. â - . . â , , . , â . â , , .
Proof of concept II
ã ããããªãœãŒã¹ãšåœãã®æ§ã®çãç©ãéããããšã§åãåé¡ã解決ããŠã¿ãŸããããã¿ã¹ã¯ã¯éåžžã«åçŽãªã®ã§ãå³å¯ã«å®çŸ©ãããã¢ã«ãŽãªãºã ã®å©ããåããŠå¯èœã«ãªãããããæ©æ¢°åŠç¿ã®å©ããåããŠããã解決ã§ããå¯èœæ§ã¯äœãã§ããããããäœæ¥ã³ã³ã»ãããèªèããããã«ãç§ãã¡ã®ã³ã¬ã¯ã¿ãŒãçš®ãšããŠäžæ¬æãŸãã¯ç¹æ®äžèœãã絶æ»
ããªãããã«ããã°ååã§ãã以äžã¯ããã®ãããªåé¡ã解決ããäŸã®å
šæã§ãã- ç§ãã¡ã¯ãããŠã«ãžã¥ãåãç¶ããç§ãã¡èªèº«ã®ç¥ïŒããªã¢ãã¹ïŒãåµé ããŸãã
- å
±éã®èšæ¶ãšåŠç¿ã¢ãã«ã䜿çšãããããåºåã§ããããå®çŸ©ããŸããsklearnã©ã€ãã©ãªãŒããSGDClassifierãªã©ã®ã¢ãã«ãéžæããŸãã
- handle_creationããªãŒããŒã©ã€ãããŸãã
- , : , . , , , .
- : , (, , sklearn , ?). ( 20 , ), , . , . , .
- 30 500 500 . , , .
- .
ãããã«
, , - . ( ) . :
- . .
- (/ , , / ..). â , - -.
- .
- .
- , , .
- æé©å
- ...
- å©ç
, , , -, , -, . , , - , -, , . , , . , .
github.
pygame sklearn , .