Нужна помощь в решении проблемы с генетическим алгоритмом - PullRequest
1 голос
/ 21 ноября 2010

У меня есть эта программа, которая имитирует футбольный пенальти между 2 командами.

- Цель - 24 x 8 с координатой (0,0) в левом нижнем углу.

-В каждой команде по 5 кикеров и 1 вратарь (для удобства я назову 2 команды: команду А и команду Б)

- команда А - для кикера есть 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) TEAM A kicker: (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% площади ворот и т. д. ...

Хорошо, это была программа симулятора

Теперь мне нужно создать GA, который придумал бы лучшую командную стратегию для симулятора.

Позвольте упростить задачу, чтобы каждый мог ее осмыслить:

Входные данные: -популяция (случайное создание n команды, например, если n = 5, 5 случайных команд создаются с атрибутом каждой команды, включая 5 страйкеров, 5 страйков вратаря)

Вывод: -лучшая командная стратегия (каждая команда будет играть друг с другом, и лучшая команда выбрана для следующей итерации, помните, что у каждой команды есть 5 страйкеров, 5 страйков вратаря)

Поэтому я ищу 1 решение послеll в поле n населения

Моя проблема заключается в том, как начать кодирование решений.Должен ли я кодировать решение как команда или как пара игрок / вратарь?

например, кодируя его как команду: Хромосома: = [игрок1, игрок2, игрок3, игрок4, игрок5, вратарь1, вратарь2, вратарь3, вратарь4,goalkeeper5]

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 голосов
/ 21 ноября 2010

Правильно ли я предполагаю, что это для академического проекта?В этом случае я бы делал и то и другое, кодируя всю команду в одной хромосоме, а также для каждого игрока / вратаря.Таким образом, вы можете изучить оба подхода и посмотреть, какой из них даст лучшие результаты.А так как кодирование всей команды заканчивается разными (выигрышными) игроками / хранителями, вы также можете сравнить их с теми лицами, которые являются результатом кодирования для каждого игрока.

Что касается представленияиз значений, я люблю кодировать их в двоичном формате, как вы предложили, поскольку мутация немного более прямолинейна в этом смысле.Но, конечно, вы также можете использовать метод случайной мутации, если вы используете реальные числа вместо 0 и 1. Опять же, если это для академического проекта, вы можете использовать оба подхода и сравнивать их в своем анализе.

Надеюсь, это поможет!

0 голосов
/ 08 декабря 2010

Прежде всего, что вы ищете?Хорошие стратегии для кикеров или хранителей?

Если для обоих это звучит как идеальный сценарий для коэволюции.

Да для кодирования всего как двоичных файлов, не усложняйте свою жизнь, если вы не можете найти вескую причину для этого.

0 голосов
/ 21 ноября 2010

У меня нет полного ответа для вас, но это может быть что-то ...

Я бы сказал да, чтобы кодировать все как двоичное.Если вы на самом деле не храните ее как битовую строку, вам следует убедиться, что ее легко конвертировать в одну.Как вы указали, если ваши данные закодированы как битовые строки, кроссовер и мутация тривиальны.

Что касается структуры ваших хромосом, я думаю, что вы можете отправиться в волосатую территорию, если вы идете за игроком / хранителемпар.Фитнес будет иметь смысл, только если вы посмотрите на команды в целом.Даже если вы найдете отличную пару, у вас будет довольно плохая команда, если все ваши игроки будут вести себя одинаково.Ваша фитнес-функция должна учитывать динамику игрока.

Надеюсь, это поможет ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...