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

Отказ от ответственности

Прежде всего, это для домашнего задания, так что не спрашивайте, почему это так надумано, это так и может быть только так. (я получаю много "а как насчет того, чтобы что-то изменить"), извините... я не могу.

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

/Отказ от ответственности

У меня есть n*2 слов длины n. Мне нужно составить матрицу n^2, содержащую все эти слова. Слова могут быть тарабарщиной, но они должны помещаться в эту матрицу (это требование со стороны пользователя).

Таким образом, AGE,AGO,BEG,CAB,CAD,DOG даст мне этот результат (1 из как минимум 2 возможных):

C A B
A G E
D O G

Я должен использовать эволюционный алгоритм. Поэтому мне нужно найти способ закодировать мою информацию в хромосоме.

Что я придумал:

Каждое слово должно появиться, иметь начальную позицию в матрице и ориентацию (слева-направо или вверх-вниз). Таким образом, у меня есть [Word][Orientation][StartPosition], где начальная позиция [0][0]/[0][1]/[1][0] и т. д. (левый столбец и верхняя строка). Но у него есть ограничения, мне нужно проверить, соответствует ли ориентация начальной позиции.

Проблемы:

Хромосома должна быть возможным решением, тогда как это только часть решения.

Поскольку мое решение должно представлять собой матрицу, содержащую все слова таким образом, чтобы «соответствовать», хромосома также должна каким-то образом представлять всю матрицу. Но это затрагивает несколько проблем. У меня может быть только одно слово из одной начальной позиции в одной ориентации (кроме первых двух слов, они имеют одну и ту же начальную позицию с разными ориентациями). Я не вижу, чтобы это работало как действенный способ попытки эволюционного алгоритма. Я просто не вижу, чтобы какая-то из фаз работала, особенно мутация/рекомбинация.

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

ИЗМЕНИТЬ

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

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


person Kalec    schedule 16.05.2013    source источник


Ответы (2)


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

Вы спрашиваете о «массиве символов» и о том, кто ваши родители и потомство, как бы вы сделали скрещивание, мутацию и т. Д. Я думаю, что, возможно, вас смущает этот набор символов. Не думайте об этом как о массиве символов — это массив слов. Это важно, потому что вы не хотите пересекать границы слов или менять буквы внутри слова посредством мутации. Вы хотите перетасовать слова. Итак, вместо того, чтобы иметь дело со словами, давайте воспользуемся несколько иным (но эквивалентным) подходом.

Пронумеруем каждое из ваших 2n слов от 1 до 2n. Чтобы сгенерировать решение-кандидат, мы просто выбираем n случайных чисел от 1 до 2n (без замены). Случайно выбранные слова становятся строками вашей матрицы. Итак, если это слова AGE,AGO,BEG,CAB,CAD,DOG, мы выбираем три случайным образом и получаем, например, 2, 3 и 5 (что дает хромосому 235) или AGO,BEG,CAD.

Это дает матрицу

AGO
BEG
CAD

Теперь подсчитаем, сколько из 2n входных слов встречается в матрице. В данном случае их всего три, так как ни один из столбцов не содержит правильных слов. Ваша пригодность для ввода 235 равна 3. Однако ввод 416 работает — его пригодность равна 6.

Чтобы сгенерировать популяцию, вы просто генерируете N случайных наборов из трех чисел (без повторения) от 1 до 2n. При численности населения 4 вы можете получить

142
354
624
241

Это дает вам четыре различных возможных решения:

142 = AGE
      CAB
      AGO

354 = BEG
      CAD
      CAB

624 = DOG
      AGO
      CAB

241 = AGO
      CAB
      AGE

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

Мутация — это просто замена одного числа другим или перестановка двух чисел местами в кодировке.

Вы говорите, что должны использовать GA, так что вы можете остановиться здесь и попробовать что-то подобное. Это вряд ли будет работать очень хорошо по нескольким причинам. Во-первых, в фитнес-функции будет много плато. Почти каждый возможный ответ одинаково неверен, поэтому для ГА не существует большого градиента. Это иголка в стоге сена. Вы можете попытаться изменить способ оценки значений пригодности, чтобы несколько облегчить это. Например, я знаю, что в вашем наборе примеров только одно слово начинается с D, поэтому любое решение с DOG в первой строке автоматически неверно. Я мог начислять баллы решениям, которые давали более «правдоподобные» неправильные ответы. Однако, в целом, ГА будет сложно решить эту проблему эффективно.

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

person deong    schedule 16.05.2013
comment
Огромное спасибо. Я прекрасно понимаю сейчас. Да, я знаю, что это (безусловно) не лучший способ решить эту проблему, но это ограничение (я должен сделать это таким образом). Таким образом, гораздо более простые способы решения проблемы затмили мое видение. Я думал о нескольких способах расчета пригодности после добавления любой новой строки, но в итоге это оказалось слишком сложным и (с моей ограниченной точки зрения) невозможным для преобразования в какой-либо эволюционный алгоритм. - person Kalec; 16.05.2013
comment
Проблема с этим подходом заключается в том, что функция пригодности плохая (сильно прерывистая), поэтому она не лучше, чем случайная выборка. В этом примере каждый геном, кроме двух решений, будет иметь приспособленность, равную 3. Даже в более крупных матрицах, где у вас могут быть геномы с пригодностью, отличной от n или 2n, они, как правило, никоим образом не связаны с решениями, поэтому их объединение не приблизит решение. - person Chris Dodd; 16.05.2013
comment
Лучшей функцией пригодности было бы: Для каждого слова строки в матрице сколько слов, не входящих в матрицу в виде строк (но все еще в наборе), может соответствовать столбцам с данным словом. Это даст пригодность в диапазоне от 0 до n ^ 2 (решения). Что еще более важно, геномы, близкие к решению, будут иметь высокую приспособленность. - person Chris Dodd; 16.05.2013

Некоторые варианты:

Просто используйте матрицу букв в качестве своего представления. Таким образом, вашим оптимальным решением из примера будет:

CABAGEDOG

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

Или пусть представление состоит из трех слов, по одному на каждую строку.

   CAB
   AGE
   DOG

Затем ваша физическая форма вознаграждает слова, которые указаны правильно в столбцах. Мутации заменяют одно слово другим.

person Winston Ewert    schedule 16.05.2013
comment
Звучит хорошо, но я не уверен на 100%, что понял. Итак, моя последовательность (хромосома) представляет собой массив символов, и я вознаграждаю любое слово в матрице, которое является входным словом. Я понимаю. Но в этом сценарии, кем будут мои родители/дети, как мне перейти от одного поколения к другому, как мне мутировать? Я должен сделать все это, чтобы мой ответ был признан (опять же, домашнее задание). И с вашим методом я просто не вижу никакого способа сделать что-либо из этого. - person Kalec; 16.05.2013
comment
@Kalec, для матрицы, выберите одну букву случайным образом и измените ее на другую букву случайным образом для мутации. - person Winston Ewert; 16.05.2013
comment
@WinstonEwert да, да. Я понимаю. По какой-то причине тот факт, что перестановка слов настолько очевидна для ответа (в моем сознании), это как-то немного ослепляет меня. В любом случае, я благодарю вас. - person Kalec; 16.05.2013