Нужна помощь в решении проблемы с генетическим алгоритмом

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

-Цель 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]. Я бы подумал, что проще сделать кроссовер, а мутация представляет его как двоичное, нет?

Я просто пытаюсь собрать идеи, поэтому мне есть с чего начать.

заранее спасибо


person s2000coder    schedule 20.11.2010    source источник
comment
Вы нашли проблему. Я реализую проблему назначения в PHP с Drupal 6, чтобы назначать студентов на базу стажировки в зависимости от местоположения студента и предпочтения стажировки студента. Я бы часть вашей программы мог проанализировать, очень бы приветствовал. После этого я тоже делюсь своим кодом...   -  person user001    schedule 01.04.2011


Ответы (3)


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

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

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

person Matthias    schedule 21.11.2010
comment
Могу я спросить, почему представление значений в виде целых чисел не является прямым в мутации. Разве вы не можете просто переключить целочисленное значение на случайное целочисленное значение (как и в случае с битовой строкой, вы просто пропускаете бит)? У меня сложилось впечатление, что представление данных в виде целого числа проще, хромосома не будет такой длинной, плюс вам не нужно декодировать и кодировать. Например, [x,y,power, x,y,power, x,y,power, x,y,power, x,x,power, x,y,w,h, x,y,w,h, x,y,w,h, x,y,w,h, x,y,w,h] Я не понимаю? Пожалуйста, помогите мне с более подробной информацией. - person s2000coder; 21.11.2010
comment
Двоичное кодирование имеет свои плюсы и минусы. Одним из преимуществ является то, что вам не нужна случайная функция, вы можете просто переключаться с 0 на 1 и наоборот. С другой стороны, вы можете получить недопустимые значения при использовании двоичного кодирования. Часто это просто вопрос личного выбора. Возможно, это поможет: anziamj.austms.org. au/ojs/index.php/ANZIAMJ/article/viewFile/ - person Matthias; 21.11.2010

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

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

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

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

person ajwood    schedule 21.11.2010
comment
Чтобы было ясно, я не думаю, что ваша кодировка как команды совершенно правильная - она ​​должна быть {player1, player2, player3, player4, player5, keeper1}, а не иметь 5 игроков и 5 вратарей. - person ajwood; 21.11.2010
comment
Технически вы правы, должно быть только 5 игроков и 1 вратарь. Но помните, что решение требует стратегий 5 вратарей, так что в некотором смысле это то же самое, что иметь 5 вратарей. - person s2000coder; 21.11.2010
comment
Из-за большого количества данных в решении кодирование их в виде больших строк довольно длинное, не так ли? Например, [2,3,100, игрок2 ... игрок5, 1,2,3,3, вратарь2 ... игрок5] = [0000010, 0000011, 1100100, игрок2 ... игрок5, 0000001, 0000010, 0000011, 0000011 вратарь2 ... хранитель5]. Битовая строка для каждой хромосомы будет очень длинной. Если только вы не предложите другой подход к этому. - person s2000coder; 21.11.2010
comment
Вы совершенно правы. Я должен был подумать об этом больше, прежде чем я ответил. Что касается хромосом... подход пары вратарь/игрок мне кажется неправильным. Разнообразие команд важно... Что, если у вас есть 5 лучших игроков, но все они чрезвычайно похожи. Вы застряли бы с вратарем, который научился одному и тому же трюку пять раз. Я подумаю об этом и вернусь завтра. - person ajwood; 21.11.2010

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

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

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

person JohnIdol    schedule 08.12.2010