Генетические алгоритмы

Я пытаюсь реализовать генетический алгоритм, который вычислит минимум Rastrigin функции, и у меня есть некоторые проблемы.
Я должен представить хромосому как двоичную строку и поскольку функция Rastrigin берет список чисел в качестве параметра, как может декодировать хромосому к списку чисел?
Также Rastrigin хочет, чтобы элементы в списке были-5.12 <=x (i) <=5.12, что происходит, если, когда я генерирую хромосому, она произведет число не в том интервале?

6
задан josliber 7 May 2014 в 20:17
поделиться

4 ответа

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

... но я считаю, что деструкторы для классов контейнерного типа, подобно вектору, не должны маскировать исключения из классов, которые они содержат. В этом случае я фактически использую метод «free/close», который вызывает себя рекурсивно. Да, я сказал рекурсивно. Есть метод этого безумия. Распространение исключений зависит от наличия стека: Если возникает одно исключение, то оба оставшихся деструктора все равно будут выполняться, а ожидающее исключение будет распространяться после возврата подпрограммы, что является большим. Если возникает несколько исключений, то (в зависимости от компилятора) либо это первое исключение распространится, либо программа завершится, что нормально. Если происходит так много исключений, что рекурсия переполняет стек, то что-то серьезно не так, и кто-то собирается узнать об этом, что тоже нормально. Лично я ошибаюсь на стороне ошибок, которые взрываются, а не скрываются, тайны и коварны.

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

-121--578057-

Нельзя просто использовать метод Component # isValid . Если метод возвращает значение true, то это означает, что компонент правильно настроен и расположен в его родительском контейнере, и все его нижестоящие элементы также являются допустимыми.

-121--4077015-

Вы хотите реализовать генетический алгоритм. Реализация должна быть такой, чтобы она работала для любой общей задачи минимизации (или максимизации), а не только для функции Rastrigin . Вы можете принять решение о реализации двоичного закодированного GA или реального закодированного GA. Оба имеют своё применение и нишевые применения. Но для вас я бы предложил реализовать настоящую закодированную GA. В соответствии с вашим вопросом относительно того, что делать, если сгенерированные значения переменных находятся за пределами [-5.12: 5,12], Вещественный закодированный GA и двоичный закодированный GA будут обрабатывать их по-разному.

Наличие ссылочного кода всегда хорошо, прежде чем приступить к реализации собственной версии. Если вы ищете реализацию C, в исходном разделе лаборатории имеется реализация Real Coded GA, которая широко используется нами и другими для нашей исследовательской работы. Я бы предложил вам сыграть с ним и попробовать некоторые из простых задач оптимизации, приведенных там.

Pyevolve - библиотека Python для генетических алгоритмов и генетического программирования.

Теперь, когда мы говорили о внедрении, ваше понимание GA ясно? В противном случае обратитесь к учебнику , в котором описывается GA с точки зрения оптимизации. Обратите внимание, что объяснение кроссовера и мутации для Binary Coded GA не переносятся автоматически на Real Coded GA.У настоящей закодированной ГА есть свои тонкости, на которые понадобится время, чтобы прочитать какие-то бумаги и понять их. Не спешите, но с полным рабочим днем вы должны быть в состоянии легко идти.

6
ответ дан 10 December 2019 в 00:38
поделиться

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

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

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

3
ответ дан 10 December 2019 в 00:38
поделиться

Я предполагаю, что вы программируете на языке Си. Целые числа (int для языка Си) могут быть упакованы в массив из 4 байт/char (32 бита). Так что если ваш массив имеет значение

char* chrom_as_bytes=(...)

вы можете получить i-е значение путем приведения к int*

int ith=3;
value=((int*)chrom_as_bytes)[ith];

если значение не находится в диапазоне -5.12

См. также статью в Википедии.

0
ответ дан 10 December 2019 в 00:38
поделиться

Если вам интересно, я выполнил реализацию используя Pyevolve: http://pyevolve.sourceforge.net/examples.html#example-7-the-rastringin-function Извините за опечатку в названии.

0
ответ дан 10 December 2019 в 00:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: