Почему мой ИИ в аккуратном Python не учится так, как ожидалось? ⇐ Python
Почему мой ИИ в аккуратном Python не учится так, как ожидалось?
Я создал очень простую игру с игроком, который может двигаться только по оси X и должен уклоняться от случайных врагов, падающих с неба. Это была моя первая попытка создать ИИ в игре с использованием Neat-Python.
Вот игра:
def run_game(геномы, конфигурация): pygame.display.set_caption("Аракада 1") часы = pygame.time.Clock() screen_height = 980 ширина_экрана = 653 screen = pygame.display.set_mode((screen_width, screen_height)) clr_black = (0,0,0) clr_play = (235 212 169) частота = 70 оценка = 0 сети = [] игроки = [] ге = [] счетчик = 0 таймер = 0 grp_ennemis.empty() img_background_score = pygame.image.load("sprites/img_background_score.webp") img_background_area = pygame.image.load("спрайты/img_background_area.webp") img_background_area = pygame.transform.scale(img_background_area, (screen_width, 2)) font_bauhaus_50 = pygame.font.SysFont("Баухаус 93", 50) def draw_text(texte, шрифт, цвет, x, y): img = font.render(текст, True, цвет) screen.blit(img, (x, y)) для _,g в геномах: net = опрятный.nn.FeedForwardNetwork.create(g, config) nets.append(сеть) player = Joueur(screen_width // 2, screen_height - 140) player.append(игрок) г.фитнес = 0 ge.append(г) запустить = Истина во время запуска: для события в pygame.event.get(): если event.type== pygame.QUIT: запустить = Ложь часы.тик(60) счетчик += 1 если счетчик == 60: таймер += 1 счетчик = 0 screen.fill(clr_play) screen.blit(img_background_area, (0, screen_height - 132)) grp_ennemis.update(): grp_ennemis.draw (экран) screen.blit(img_background_score, (0,0)) draw_text(f"Оценка: {score}", font_bauhaus_50, clr_black, screen_width // 2 – 160, 20) draw_text(f"0{timer // 60}:{timer % 60}", font_bauhaus_50, clr_black, 10, 20) для i игрок в перечислении (игроки): вывод = nets.activate(get_data(player)) решение = выход.индекс(макс(выход)) ge.fitness = оценка если pygame.sprite.spritecollide(player, grp_ennemis, True) или player.gaz == 60: игроки.pop(я) если не 50 < player.rect.x < ширина_экрана — 110: player.gaz += 1 player.update(решение) счет = таймер player.draw() если len(игроки) == 0: запустить = Ложь если random.randint(0, частота) == 10: объект = Объект() grp_ennemis.add(объект) pygame.display.update() если __name__ == "__main__": config_path = "config-feedforward.txt" config = опрятный.config.Config(neat.DefaultGenome, опрятный.DefaultReproduction, опрятный.DefaultSpeciesSet, опрятный.DefaultStagnation, config_path) поп = аккуратный.Население(конфигурация) pop.add_reporter(neat.StdOutReporter(True)) статистика = аккуратный.StatisticsReporter() pop.add_reporter(статистика) pop.run(run_game, 1000) а вот данные, которые я передаю ИИ
def get_data(игрок): соз_х = [] cos_y = [] данные = [player.rect.x, player.rect.y] для объекта в grp_ennemis: соз = object.get_data() cos_y.append(cos[0]) cos_x.append(cos[1]) для _ в диапазоне (3): если не len(cos_y) == 0: макс1 = макс (cos_y) max2 = cos_x[cos_y.index(max(cos_y))] еще: макс1 = -1 макс2 = -1 data.append(макс1) data.append(макс2) если не len(cos_y) == 0: cos_y[cos_y.index(max(cos_y))] = 0 cos_x[cos_y.index(max(cos_y))] = 0 возвращать данные эти данные состоят из координат игрока + координаты трех ближайших врагов, падающих с неба.
Я добавил «газ» нужно сделать так, чтобы игрок не мог просто оставаться на краю экрана. Но ИИ продолжает уходить в сторону и продолжает умирать, даже спустя более 100 поколений.
вот конфигурация NEAT, хотя я не думаю, что это проблема
fitness_criterion = макс. фитнес_порог = 400 pop_size = 50 reset_on_extinction = Ложь [По умолчаниюЗастой] виды_фитнес_функ = макс. max_stagnation = 20 видовой_элитизм = 2 [Воспроизведение по умолчанию] элитарность = 2 выживание_порог = 0,2 [Геном по умолчанию] # варианты активации узла активация_default = релу активация_mutate_rate = 1,0 активация_options = релу # варианты агрегации узлов агрегация_по умолчанию = сумма агрегация_mutate_rate = 0,0 Aggregation_options = сумма # варианты смещения узла смещение_инит_среднее = 3,0 смещения_init_stdev = 1,0 смещения_max_value = 30,0 смещение_мин_значение = -30,0 смещения_mutate_power = 0,5 смещения_mutate_rate = 0,7 смещения_replace_rate = 0,1 # варианты совместимости генома совместимость_disjoint_coefficient = 1,0 совместимость_вес_коэффициент = 0,5 # тарифы на добавление/удаление соединения conn_add_prob = 0,5 conn_delete_prob = 0,5 # варианты включения соединения Enabled_default = Истина Enabled_mutate_rate = 0,01 фид_форвард = Истина начальное_соединение = полное_направление # скорости добавления/удаления узла node_add_prob = 0,2 node_delete_prob = 0,2 # параметры сети num_hidden = 3 число_входов = 8 число_выходов = 3 # варианты ответа узла response_init_mean = 1,0 response_init_stdev = 0,0 response_max_value = 30,0 response_min_value = -30,0 response_mutate_power = 0,0 response_mutate_rate = 0,0 response_replace_rate = 0,0 # варианты веса соединения вес_init_mean = 0,0 вес_init_stdev = 1,0 вес_max_value = 30 вес_мин_значение = -30 вес_mutate_power = 0,5 вес_mutate_rate = 0,8 вес_replace_rate = 0,1 [Набор видов по умолчанию] совместимость_порог = 3,0 В чем моя ошибка и как ее исправить?
Я создал очень простую игру с игроком, который может двигаться только по оси X и должен уклоняться от случайных врагов, падающих с неба. Это была моя первая попытка создать ИИ в игре с использованием Neat-Python.
Вот игра:
def run_game(геномы, конфигурация): pygame.display.set_caption("Аракада 1") часы = pygame.time.Clock() screen_height = 980 ширина_экрана = 653 screen = pygame.display.set_mode((screen_width, screen_height)) clr_black = (0,0,0) clr_play = (235 212 169) частота = 70 оценка = 0 сети = [] игроки = [] ге = [] счетчик = 0 таймер = 0 grp_ennemis.empty() img_background_score = pygame.image.load("sprites/img_background_score.webp") img_background_area = pygame.image.load("спрайты/img_background_area.webp") img_background_area = pygame.transform.scale(img_background_area, (screen_width, 2)) font_bauhaus_50 = pygame.font.SysFont("Баухаус 93", 50) def draw_text(texte, шрифт, цвет, x, y): img = font.render(текст, True, цвет) screen.blit(img, (x, y)) для _,g в геномах: net = опрятный.nn.FeedForwardNetwork.create(g, config) nets.append(сеть) player = Joueur(screen_width // 2, screen_height - 140) player.append(игрок) г.фитнес = 0 ge.append(г) запустить = Истина во время запуска: для события в pygame.event.get(): если event.type== pygame.QUIT: запустить = Ложь часы.тик(60) счетчик += 1 если счетчик == 60: таймер += 1 счетчик = 0 screen.fill(clr_play) screen.blit(img_background_area, (0, screen_height - 132)) grp_ennemis.update(): grp_ennemis.draw (экран) screen.blit(img_background_score, (0,0)) draw_text(f"Оценка: {score}", font_bauhaus_50, clr_black, screen_width // 2 – 160, 20) draw_text(f"0{timer // 60}:{timer % 60}", font_bauhaus_50, clr_black, 10, 20) для i игрок в перечислении (игроки): вывод = nets.activate(get_data(player)) решение = выход.индекс(макс(выход)) ge.fitness = оценка если pygame.sprite.spritecollide(player, grp_ennemis, True) или player.gaz == 60: игроки.pop(я) если не 50 < player.rect.x < ширина_экрана — 110: player.gaz += 1 player.update(решение) счет = таймер player.draw() если len(игроки) == 0: запустить = Ложь если random.randint(0, частота) == 10: объект = Объект() grp_ennemis.add(объект) pygame.display.update() если __name__ == "__main__": config_path = "config-feedforward.txt" config = опрятный.config.Config(neat.DefaultGenome, опрятный.DefaultReproduction, опрятный.DefaultSpeciesSet, опрятный.DefaultStagnation, config_path) поп = аккуратный.Население(конфигурация) pop.add_reporter(neat.StdOutReporter(True)) статистика = аккуратный.StatisticsReporter() pop.add_reporter(статистика) pop.run(run_game, 1000) а вот данные, которые я передаю ИИ
def get_data(игрок): соз_х = [] cos_y = [] данные = [player.rect.x, player.rect.y] для объекта в grp_ennemis: соз = object.get_data() cos_y.append(cos[0]) cos_x.append(cos[1]) для _ в диапазоне (3): если не len(cos_y) == 0: макс1 = макс (cos_y) max2 = cos_x[cos_y.index(max(cos_y))] еще: макс1 = -1 макс2 = -1 data.append(макс1) data.append(макс2) если не len(cos_y) == 0: cos_y[cos_y.index(max(cos_y))] = 0 cos_x[cos_y.index(max(cos_y))] = 0 возвращать данные эти данные состоят из координат игрока + координаты трех ближайших врагов, падающих с неба.
Я добавил «газ» нужно сделать так, чтобы игрок не мог просто оставаться на краю экрана. Но ИИ продолжает уходить в сторону и продолжает умирать, даже спустя более 100 поколений.
вот конфигурация NEAT, хотя я не думаю, что это проблема
fitness_criterion = макс. фитнес_порог = 400 pop_size = 50 reset_on_extinction = Ложь [По умолчаниюЗастой] виды_фитнес_функ = макс. max_stagnation = 20 видовой_элитизм = 2 [Воспроизведение по умолчанию] элитарность = 2 выживание_порог = 0,2 [Геном по умолчанию] # варианты активации узла активация_default = релу активация_mutate_rate = 1,0 активация_options = релу # варианты агрегации узлов агрегация_по умолчанию = сумма агрегация_mutate_rate = 0,0 Aggregation_options = сумма # варианты смещения узла смещение_инит_среднее = 3,0 смещения_init_stdev = 1,0 смещения_max_value = 30,0 смещение_мин_значение = -30,0 смещения_mutate_power = 0,5 смещения_mutate_rate = 0,7 смещения_replace_rate = 0,1 # варианты совместимости генома совместимость_disjoint_coefficient = 1,0 совместимость_вес_коэффициент = 0,5 # тарифы на добавление/удаление соединения conn_add_prob = 0,5 conn_delete_prob = 0,5 # варианты включения соединения Enabled_default = Истина Enabled_mutate_rate = 0,01 фид_форвард = Истина начальное_соединение = полное_направление # скорости добавления/удаления узла node_add_prob = 0,2 node_delete_prob = 0,2 # параметры сети num_hidden = 3 число_входов = 8 число_выходов = 3 # варианты ответа узла response_init_mean = 1,0 response_init_stdev = 0,0 response_max_value = 30,0 response_min_value = -30,0 response_mutate_power = 0,0 response_mutate_rate = 0,0 response_replace_rate = 0,0 # варианты веса соединения вес_init_mean = 0,0 вес_init_stdev = 1,0 вес_max_value = 30 вес_мин_значение = -30 вес_mutate_power = 0,5 вес_mutate_rate = 0,8 вес_replace_rate = 0,1 [Набор видов по умолчанию] совместимость_порог = 3,0 В чем моя ошибка и как ее исправить?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Оценка функции фитнеса геномов в аккуратном уровне для больших наборов данных
Anonymous » » в форуме Python - 0 Ответы
- 1 Просмотры
-
Последнее сообщение Anonymous
-