2015-06-30 4 views
3

Я строю простой «Привет, мир!». генетический алгоритм для обучения. Мое население - группа случайных строк. Через мутацию и кроссовер строки превращаются в «Hello, World!». По какой-то причине мое население будет сидеть за фитнес-счетом и, по-видимому, никогда не развиваться. В других случаях мое население достигнет целевых генов «Привет, мир». Я использую случайный выбор и одноточечный кроссовер. Хотя, это также происходит, когда я использую выбор турнира и рулетки.Население становится устаревшим - Генетический алгоритм

Вопрос:
Почему мое население становится устаревшим и не достигая генов-мишеней, даже если я деверсификация население через мутации? Это из-за случайной природы генетического алгоритма или ошибки в моем коде?

E.g.
Каждая хромосома в популяции будет иметь гены «HellV, Wor`dL». Даже после 10 000 поколений гены одинаковы. В других случаях гены достигают целевых генов «Привет, мир!». после ~ 33 поколений.

  • Примечание: Приведенный ниже код работает, как ожидалось при использовании Java. При использовании Java население всегда достигает целевых генов. Кроме того, я только начал изучать C++ сегодня, поэтому очень возможно, что в моем коде есть недостаток, который я просто не вижу.

Население Размер: 333
Элитизм: истинный
Элитизм Процент: 25%
Мутация Вероятность: 20%
Кроссовер Вероятность: 95% Тип
Выбор: Random
Кроссовер Тип: One Point

EDIT: Я удалил код из этого сообщения и вместо этого добавил ссылку на мой github из-за того, что это несколько сотен строк кода.

Genetic Algorithm - C++

+0

Являются ли эти свободные функции глобальными или являются членами класса? Одна из самых распространенных проблем при переходе с Java на C++ - это то, как C++ копирует объекты в местах, где Java передает ссылку. – molbdnilo

+0

Это не должно компилироваться на любом языке - wtf вы спрашиваете? (хотел бы проголосовать вверх-избирателей) –

+0

Можете ли вы предоставить [минимальный, полный и проверяемый пример] (http://www.stackoverflow.com/help/mcve)? Что такое «GAChromosome»? Где определяется материал? – Barry

ответ

1

Благодаря @ molbdnilo-х комментарий Я был в состоянии решить мою проблему.

Оказывается, это связано с тем, что C++ копирует объекты, что объясняет, почему этот код работал на Java, а не на C++.

Как заявил @molbdnilo:

Одним из наиболее распространенных проблем при переходе от Java на C++ как объекты C++ экземпляры в местах, где Java проходит вокруг ссылки.

Чтобы исправить мой вопрос, который я изменить следующие объявления метода:

1.int calculateFitness(GAChromosome chromosome);--->int calculateFitness(GAChromosome const &chromosome);
В этом методе декларации я сказать компилятору, что я хочу передать хромосому по ссылке, а не по значению, используя &, и сделать его постоянным, используя Уст. Это предотвращает копирование и изменение хромосомы.

2.void mutate(GAChromosome chromosome);--->void mutate(GAChromosome &chromosome);
В этом методе декларации я сказать компилятору, что я хочу передать хромосому по ссылке, а не по значению, используя &. Это предотвращает копирование хромосомы. Поскольку в предыдущем объявлении метода не указывалось, что хромосома передавалась по ссылке, копия делалась, изменялась, а затем выбрасывалась после того, как метод достиг конца области. В конечном счете, изменения не были сделаны.

3.std::pair<GAChromosome, GAChromosome> onePointCrossover(GAChromosome chromosomeA, GAChromosome chromosomeB);--->std::pair<GAChromosome, GAChromosome> onePointCrossover(GAChromosome const &chromosomeA, GAChromosome const &chromosomeB);
В этом методе декларации я сказать компилятору, что я хочу передать хромосому по ссылке, а не по значению, используя &, и сделать его постоянным, используя Уст. Это предотвращает копирование и изменение хромосомы.

В заключение проблема возникла из-за способа передачи хромосомы методу мутанта. Хромосома передавалась по значению, а не по ссылке, заставляя хромосому копироваться, а изменения выкидывались, когда метод мутанта доходил до конца области.

Смежные вопросы