Я очень стараюсь сделать лабораторию для школы.Я пытаюсь разгадать кроссворд, используя генетические алгоритмы.Проблема в том, что это не очень хорошо (это все еще слишком случайно). Я постараюсь дать краткое объяснение того, как моя программа реализована сейчас:
Если у меня есть загадка (# - блок, 0 - пустое место)
#000
00#0
#000
и набор слов, которые являются кандидатами на решение этой головоломки.Моя ДНК - это просто матрица в виде одномерного массива.
Мой первый набор людей имеет случайно сгенерированные ДНК из пула букв, которые содержат мои слова.
Я делаю отбор с помощью выбора рулетки.Есть некоторые параметры относительно вероятности сочетания и мутаций, но если мутация произойдет, то я всегда буду менять 25% ДНК.Я изменяю его случайными буквами из своего пула букв (это может иметь негативные последствия, поскольку мутации могут разрушать уже сформированные слова)
Теперь функция пригодности: я пересекаю матрицу как по горизонтали, так и по вертикали: если ятогда найдите слово FITNESS + = word.lengh + 1
Если я найду строку, являющуюся частью некоторого слова, тогда FITNESS + = word.length / (puzzle_size * 4).В любом случае он должен давать значение от 0 до 1. Таким образом, он может найти «to» из «tool» и объявить X в FITNESS, а затем сразу после того, как найдет «too» из «tool» и добавить еще один Y в FITNESS.
Мои поколения на самом деле не улучшаются со временем.Они кажутся случайными.Поэтому даже после 400 поколений с пулом 1000-2000 (эти числа не имеют большого значения) я получаю решение с 1-2 словами (из 2 или 3 букв), когда в решении должно быть 6 слов.