Нужна помощь в решении проблемы с генетическим алгоритмом
У меня есть эта программа, которая имитирует пенальти между двумя командами.
Цель - 24 х 8 с координатой (0,0) в левом нижнем углу.
- В каждой команде 5 кикеров и 1 вратарь (для удобства я вызову 2 команды: команду А и команду Б)
Команда A - есть 5 стратегий для кикеров (по одной на каждого), и есть 5 стратегий для вратаря (потому что ему нужна стратегия для каждого кикера в команде B)
Команда B - есть 5 стратегий для кикеров (по одной на каждого), и есть 5 стратегий для вратаря (потому что ему нужны стратегии для каждого кикера в команде A)
Стратегия для кикера - это координата (x,y) и значение мощности. Координата - это место удара, а сила - насколько сильный удар. (Я объясню больше об атрибуте Power позже). Например, каждая стратегия ввода кикера будет выглядеть так: (1,2) 100 или (24,7) 25
Стратегия для вратаря - это координата и значения +Width и +Height. Область покрытия вратаря - это прямоугольник, нижний левый угол которого (x,y), а верхний правый угол (x+ ширина, y+ высота). Например, (3,4) 5 5 Его нижний левый угол находится в (3,4), а (3+5,4+5) - его верхний правый угол прямоугольника (зона покрытия).
МАКС. ДИАПАЗОН ПОКРЫТИЯ - 25% ЦЕЛИ (программа проверит это)
Мощность: 0-24; удар не будет иметь ошибки; удар зона удара вратаря 100% спасброска Сила: удар 24-49 будет иметь 10% погрешности (-/+10% ширины коора); Сила сохранения 90%: удар 50-75 будет иметь ошибку 20%; Сила сохранения 80%: при ударе 76-100 будет ошибка 30%; Экономия 50%
ПРИМЕР ВХОДА: мощность должна быть 0-100, все остальные значения должны быть положительными целыми числами с 0-(2^7-1) КОМАНДА Кикер: (14,3) 25 вратарь: (2,3) 4 4 (3,5) 50 вратарь: (1,1) 5,5 и так далее...
КОМАНДА B: Кикер: (9,3) 75 вратарь: (1,2) 5 5 (3,13) 100 вратарь: (2,3) 6 6 (при условии, что это не будет превышать 25% площади ворот и т. Д. на....
Хорошо, это была программа симулятора
Теперь мне нужно создать GA, который придумал бы лучшую командную стратегию для симулятора.
Давайте упростим задачу, чтобы каждый мог осмыслить ее:
Входные данные: -популяция (случайное создание n команды, например, если n=5, 5 случайных команд создаются с атрибутом каждой команды, включая 5 страйкеров, 5 страйков вратаря)
Вывод: - лучшая командная стратегия (каждая команда будет играть друг с другом, и лучшая команда выбрана для следующей итерации, помните, что у каждой команды есть 5 страйкеров, 5 страйков вратаря)
Так что я ищу 1 решение в конце концов в области русского населения
Моя проблема в том, как начать кодирование решений. Должен ли я закодировать решение как команда или как пара игрок / вратарь?
например, кодирование его как команды: хромосома:= [игрок1, игрок2, игрок3, игрок4, игрок5, вратарь1, вратарь2, вратарь3, вратарь4, вратарь5]
class Player {
int
int
int
}
class Goalkeeper {
int
int
int
int
}
Или закодировать его как пару игрок / вратарь:
Chromosome:= [player, goalkeeper] = [x,y,power,x,y,weight,height]
Проблема, с которой я сталкиваюсь при таком кодировании, заключается в том, что в конце я должен получить 5 лучших пар игрок / вратарь, чтобы составить команду.
Другой вопрос - двоичное и кодирование значений. Допустим, я должен был пойти с парой игрок / вратарь, оценил бы кодировку вот так [x,y,power,x,y,weight,height] = [2,3,100,3,3,4,5]
имеет больше смысла, чем двоичное представление [0010, 0011, 1100100, 0011, 0011, 0100, 0101] = [0010 0011 1100100 0011 0011 0100 0101].
Я бы подумал, что проще сделать кроссовер и мутация представить его как двоичный файл, не так ли?
Я просто пытаюсь собрать идеи, поэтому у меня есть с чего начать.
заранее спасибо
3 ответа
Я правильно предполагаю, что это для академического проекта? В этом случае я бы делал и то и другое, кодируя всю команду в одной хромосоме, а также для каждого игрока / хранителя. Таким образом, вы можете изучить оба подхода и посмотреть, какой из них даст лучшие результаты. А так как кодирование всей команды заканчивается разными (выигрышными) игроками / хранителями, вы также можете сравнить их с теми людьми, которые получаются в результате кодирования для каждого игрока.
Что касается представления значений, мне нравится кодировать их в двоичном формате, как вы предложили, поскольку мутация немного более прямолинейна в этом отношении. Но, конечно, вы также можете использовать метод случайной мутации, если вы используете реальные числа вместо 0 и 1. Опять же, если это для академического проекта, вы можете использовать оба подхода и сравнивать их в своем анализе.
Надеюсь, это поможет!
Прежде всего, что вы ищете? Хорошие стратегии для кикеров или хранителей?
Если для обоих, это звучит как идеальный сценарий для коэволюции.
Да, чтобы кодировать все как двоичные файлы, не усложняйте свою жизнь, если вы не можете найти вескую причину для этого.
У меня нет полного ответа для вас, но это может быть что-то...
Я бы сказал да, чтобы кодировать все в двоичном виде. Если вы на самом деле не храните его как битовую строку, вы должны убедиться, что его легко конвертировать в одну. Как вы отметили, если ваши данные закодированы как битовые строки, кроссовер и мутация тривиальны.
Что касается структуры ваших хромосом, я думаю, что вы можете отправиться на волосатую территорию, если выберете пары игрок / хранитель. Фитнес будет иметь смысл, только если вы посмотрите на команды в целом. Даже если вы найдете отличную пару, у вас будет довольно плохая команда, если все ваши игроки будут вести себя одинаково. Ваша фитнес-функция должна учитывать динамику игрока.
Надеюсь, это поможет...