Как выбрать хорошие входные данные и фитнес-функцию для достижения хороших результатов с NEAT для бота Icy Tower.

Вопрос или проблема

Я пытаюсь создать бота для известной игры “Icy Tower“. Я перестроил игру с использованием pygame и пытаюсь создать бота с помощью Python-NEAT.

Каждое поколение популяции из 70 персонажей пытается прыгнуть на следующую платформу и увеличить свою приспособленность. В данный момент приспособленность определяется количеством платформ, на которые они прыгнули, каждая платформа дает +10.

пример

Проблема, с которой я сталкиваюсь, заключается в том, что бот не учится достаточно хорошо, после 1000 поколений лучший результат составил около 200 (он может достичь 200 даже в первых нескольких поколениях по ошибке. 200 означает 20 платформ, что не так много).

Когда я смотрю на персонажей, прыгающих, кажется, что они просто всегда прыгают и двигаются влево или вправо, а не целенаправленно стремятся к следующей платформе.

Я пробовал несколько конфигураций входных данных, чтобы улучшить результаты бота, но ничего действительно не помогло.

Это входные данные, с которыми я пытался поэкспериментировать:

  • pos.x, pos.y
  • velocity.x, velocity.y
  • isOnPlatform (bool)
  • [plat.x, plat.y, plat.width] (список координат 3-7 следующих платформ)
  • [prev.x, prev.y] (позиции 2-6 предыдущих персонажей)

Я не очень хорошо разбираюсь в нейроэволюции и, вероятно, делаю что-то неправильно. Буду рад, если вы сможете объяснить, что заставляет бота работать так плохо или что не помогает ему правильно учиться.

Хотя я думаю, что функция приспособленности и входные данные должны быть единственной проблемой, я прикрепляю конфигурационный файл python-NEAT.

[NEAT]
fitness_criterion     = max
fitness_threshold     = 10000
pop_size              = 70
reset_on_extinction   = False

[DefaultGenome]
# Опции активации узлов
activation_default      = tanh
activation_mutate_rate  = 0.0
activation_options      = tanh

# Опции агрегации узлов
aggregation_default     = sum
aggregation_mutate_rate = 0.0
aggregation_options     = sum

# Опции смещения узлов
bias_init_mean          = 0.0
bias_init_stdev         = 1.0
bias_max_value          = 30.0
bias_min_value          = -30.0
bias_mutate_power       = 0.5
bias_mutate_rate        = 0.7
bias_replace_rate       = 0.1

# Опции совместимости генома
compatibility_disjoint_coefficient = 1.0
compatibility_weight_coefficient   = 0.5

# Вероятности добавления/удаления соединений
conn_add_prob           = 0.5
conn_delete_prob        = 0.5

# Опции включения соединений
enabled_default         = True
enabled_mutate_rate     = 0.01

feed_forward            = True
initial_connection      = full

# Вероятности добавления/удаления узлов
node_add_prob           = 0.2
node_delete_prob        = 0.2

# Параметры сети
num_hidden              = 6
num_inputs              = 11
num_outputs             = 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

# Опции веса соединений
weight_init_mean        = 0.0
weight_init_stdev       = 1.0
weight_max_value        = 30
weight_min_value        = -30
weight_mutate_power     = 0.5
weight_mutate_rate      = 0.8
weight_replace_rate     = 0.1

[DefaultSpeciesSet]
compatibility_threshold = 3.0

[DefaultStagnation]
species_fitness_func = max
max_stagnation       = 3
species_elitism      = 2

[DefaultReproduction]
elitism            = 3
survival_threshold = 0.2
  • Примечание 1: предыдущие позиции персонажей — это позиция в предыдущем кадре, и если игра идет при 60 fps, предыдущая позиция не так уж отличается от текущей…

  • ..Примечание 2: игровой счёт немного сложнее, чем просто прыжки по платформам, бота также следует вознаграждать за комбо, которые могут заставить его прыгать выше. Система комбо уже реализована, но сначала я хочу увидеть, как бот целится на следующую платформу, прежде чем он научится выполнять комбо.

Оригинальная проблема может быть слишком сложной для того, чтобы нейроэволюция могла научиться. Вы можете тренироваться в более простой версии, а затем постепенно усложнять примеры. Это обычно называется обучением по курсу.

Ответ или решение

Выбор подходящих входных данных и функции приспособленности для реализации бота в игре Icy Tower с использованием NEAT — это ключевой аспект успешной нейроэволюции. В данной статье мы подробно рассмотрим, как оптимизировать эти параметры, чтобы добиться наилучших результатов.

1. Анализ проблемы

На текущий момент ваш бот в Icy Tower не обучается должным образом, что выражается в низкой максимальной оценке — около 200. Это может быть связано с недостаточной информативностью входных данных и не оптимальной функцией приспособленности.

2. Оптимизация входных данных

Подбор правильных входных данных играет решающую роль в способности нейронной сети учиться. Давайте рассмотрим ваши текущие параметры:

  • pos.x, pos.y: координаты персонажа. Это важно для понимания позиции в пространстве.
  • velocity.x, velocity.y: скорость персонажа, которая поможет нейросети предвосхищать, как далеко он может прыгнуть.
  • isOnPlatform: булево значение, указывающее, находится ли персонаж на платформе.
  • [plat.x, plat.y, plat.width]: массив координат и ширины ближайших платформ. Это критично для оценки возможностей Джампа.
  • [prev.x, prev.y]: позиции предыдущих кадров, которые могут быть полезны для анализа движения.

Рекомендации по улучшению входных данных:

  1. Дополнительные данные о платформе:

    • Количество платформ в пределах видимости: Добавьте информацию о всех платформах, которые находятся на горизонте, чтобы бот мог лучше планировать свои прыжки.
    • Расстояние до ближайшей платформы: Это поможет нейронной сети оценить, насколько близка следующая цель.
  2. Статистика о предыдущих прыжках:

    • Включите данные о том, насколько успешным был прошлый прыжок (то есть, приземлился ли бот на платформу или упал).
  3. Состояние игрока:

    • Учтите время, проведенное в прыжке, и его максимальную высоту, чтобы бот мог оптимизировать время и силу прыжка.

3. Оптимизация функции приспособленности

Текущая функция приспособленности, основанная только на количестве платформ, на которые прыгнул бот, может быть неэффективной. Попробуем детализировать и улучшить эту функцию:

  1. Многофакторность:

    • Расширьте функцию приспособленности, учитывая не только количество платформ, но и другие параметры, такие как:
      • Время в воздухе.
      • Успешные приземления на платформы.
      • Совершенные комбо (перескоки через несколько платформ).
  2. Нормирование оценок:

    • Рассмотрите возможность нормирования оценок на основе успешных и неудачных попыток, чтобы избежать ситуации, когда случайные высокие оценки будут влиять на наследование.
  3. Учёт шага:

    • Применение штрафов за чрезмерные или нецелевые прыжки, что позволит ботам избегать неэффективного поведения.

4. Применение обучающего подхода

Помимо рекомендаций по входным данным и функции приспособленности, обучающий процесс может быть улучшен с помощью методологии, известной как:

  • Курсовое обучение (Curriculum Learning): начните с упрощенных версий игры, где платформы размещаются ближе друг к другу. Это даст возможность ботам учиться на более простом уровне, постепенно вводя более сложные условия.

5. Итог

Необходимо тщательно подойти к выбору входных данных и стратегии функционирования бота с учетом физики игры Icy Tower. Оптимизация как входных данных, так и функции приспособленности может значительно улучшить производительность вашего нейроэволюционного агента. Экспериментируйте с различными конфигурациями и всегда помните о важности адаптивности к условиям игры. Ваш путь к созданию успешного бота только начинается, и при должном подходе результаты не заставят себя ждать!

Оцените материал
Добавить комментарий

Капча загружается...