У меня есть эта программа, которая имитирует футбольный пенальти между двумя командами.
-Цель 24 х 8 с координатой (0,0) в левом нижнем углу.
- В каждой команде есть 5 кикеров и 1 вратарь (для удобства я буду называть 2 команды командой A и командой B)
-Команда А - есть 5 стратегий для кикеров (по одной на каждого), и 5 стратегий для вратаря (потому что ему нужна стратегия для каждого кикера в команде Б)
-Команда B - есть 5 стратегий для кикеров (по одной на каждого), и 5 стратегий для вратаря (потому что ему нужны стратегии для каждого кикера в команде A)
Стратегия для кикера - это координата (x, y) и значение силы. Координата — это место удара, а мощность — сила удара. (Я объясню больше об атрибуте Power позже). Например, каждая стратегия ввода кикера будет выглядеть так: (1,2) 100 или (24,7) 25.
Стратегия вратаря — это координата и значения +Ширина и +Высота. Область покрытия вратаря представляет собой прямоугольник, левый нижний угол которого соответствует положению (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 и так далее...
КОМАНДА Б: Кикер: (9,3) 75 вратарь: (1,2) 5 5 (3,13) 100 вратарь: (2,3) 6 6 (при условии, что это не превысит 25% площади ворот и т.д. на ....
Хорошо, это была программа-симулятор
Теперь мне нужно создать ГА, который предложит лучшую командную стратегию для симулятора.
Давайте упростим задачу, чтобы каждый мог осмыслить ее:
Входные данные: -популяция (случайное создание n команд, например, если n=5, создается 5 случайных команд с атрибутом каждой команды, включающим 5 стратегий кикеров, 5 стратегий вратарей)
Результат: лучшая командная стратегия (каждая команда будет играть друг с другом, и лучшая будет выбрана для следующей итерации, помните, что у каждой команды есть 5 стратегий кикеров, 5 стратегий вратарей)
Итак, я ищу 1 решение в конце концов в области n населения
Моя проблема в том, как начать кодировать решения. Должен ли я кодировать решение как команду или как пару игрок/вратарь?
например, закодировав его как команду: Хромосома:= [игрок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].
Я бы подумал, что проще сделать кроссовер, а мутация представляет его как двоичное, нет?
Я просто пытаюсь собрать идеи, поэтому мне есть с чего начать.
заранее спасибо