Вопрос или проблема
Я пытаюсь создать бота для известной игры “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]: позиции предыдущих кадров, которые могут быть полезны для анализа движения.
Рекомендации по улучшению входных данных:
-
Дополнительные данные о платформе:
- Количество платформ в пределах видимости: Добавьте информацию о всех платформах, которые находятся на горизонте, чтобы бот мог лучше планировать свои прыжки.
- Расстояние до ближайшей платформы: Это поможет нейронной сети оценить, насколько близка следующая цель.
-
Статистика о предыдущих прыжках:
- Включите данные о том, насколько успешным был прошлый прыжок (то есть, приземлился ли бот на платформу или упал).
-
Состояние игрока:
- Учтите время, проведенное в прыжке, и его максимальную высоту, чтобы бот мог оптимизировать время и силу прыжка.
3. Оптимизация функции приспособленности
Текущая функция приспособленности, основанная только на количестве платформ, на которые прыгнул бот, может быть неэффективной. Попробуем детализировать и улучшить эту функцию:
-
Многофакторность:
- Расширьте функцию приспособленности, учитывая не только количество платформ, но и другие параметры, такие как:
- Время в воздухе.
- Успешные приземления на платформы.
- Совершенные комбо (перескоки через несколько платформ).
- Расширьте функцию приспособленности, учитывая не только количество платформ, но и другие параметры, такие как:
-
Нормирование оценок:
- Рассмотрите возможность нормирования оценок на основе успешных и неудачных попыток, чтобы избежать ситуации, когда случайные высокие оценки будут влиять на наследование.
-
Учёт шага:
- Применение штрафов за чрезмерные или нецелевые прыжки, что позволит ботам избегать неэффективного поведения.
4. Применение обучающего подхода
Помимо рекомендаций по входным данным и функции приспособленности, обучающий процесс может быть улучшен с помощью методологии, известной как:
- Курсовое обучение (Curriculum Learning): начните с упрощенных версий игры, где платформы размещаются ближе друг к другу. Это даст возможность ботам учиться на более простом уровне, постепенно вводя более сложные условия.
5. Итог
Необходимо тщательно подойти к выбору входных данных и стратегии функционирования бота с учетом физики игры Icy Tower. Оптимизация как входных данных, так и функции приспособленности может значительно улучшить производительность вашего нейроэволюционного агента. Экспериментируйте с различными конфигурациями и всегда помните о важности адаптивности к условиям игры. Ваш путь к созданию успешного бота только начинается, и при должном подходе результаты не заставят себя ждать!