Я построил алгоритм GA для решения TSP.
Это упражнение в книге Норвига (AIAMA). Он предложил, чтобы мы прочитали взгляд Ларраньяги на проблему для представлений и тому подобное. Я изучил некоторые перекрестные операторы и мутации там и опробовал несколько из них, чтобы увидеть, что подходит мне лучше. Я также разработал фитнес-функцию, основанную на стоимости каждого пути.
Что ж, несмотря на все мои вопросы о разработке алгоритма, я никогда раньше не работал с ИИ, поэтому я не знаю, является ли мой подход правильным для ГА.
Вот что я сделал:
Я взял вектор путей (моя начальная популяция)
и затем в каждом цикле я организовал этот вектор, увеличив порядок затрат, выбрал лучшие пути X в этом векторе и удалил другие пути.
Затем я применяю XOver и Mutation (с определенной скоростью) и помещаю их в положение старых удаленных значений вектора.
Затем я делаю то же самое (вектор заказа - лучше всего извлекаем и т. Д.)
и продолжайте делать это, пока оно не стабилизируется.
Это хороший подход? Если это не даст мне немного севера. Потому что, когда я выбрал лучших и не сохранил их (просто создал из них совершенно новый поп, через Xover и мутации), я не получил хороших результатов. Таким образом (сохраняя лучшие из них - в некоторых экспериментах я оставлял только лучший), я получаю лучшие результаты, и результат всегда сходится и очень быстро
Представление состояния: Для представления состояния я решил использовать представление пути (я уже использовал его с самого начала и решил придерживаться его после прочтения Larrañaga и др.),
это так: если мы имеем, скажем, 5 городов и посетим первый город, то второй, затем третий ... наше представление пути будет (1, 2, 3, 4, 5)
Первоначальное поколение населения: На самом деле, я генерирую случайные точки для представления городов (это то, о чем меня просила книга, генерировать случайные точки на замкнутом квадрате) - но для сравнения я создал население и придерживаюсь это при сравнении результатов - я думаю, что если бы я не придерживался одной конкретной группы, мне было бы нечего знать о моих улучшениях
Индивидуумы, которые лучше всего подходят: Лучше всего подходят те, у кого лучшая стоимость проезда. (Я не знаю, должен ли я - в этой задаче - использовать что-то еще в качестве параметра
кроссовер: я попробовал несколько операторов кроссовера, сравнил свои результаты с представленной в книге и в итоге использовал один из кроссоверов Order (Larrañaga et al (1999)):
этот кроссовер принимает два случайных отрезка (образуя подпуть) из обоих родительских путей, а затем копирует оставшуюся часть пути (города, еще не посещенные в этом подпути) из другого родителя (начиная со второго среза, а не с позиция '0') - добавление городов, которые они появляются в другом родителе.
пример: пути (1 2 3 4 5) (3 4 2 1 5) выбора подпутей (234) и (421)
у нас будет потомство (5 | 2 3 4 | 1) (5 | 4 2 1 | 3) <- часть внутри | | пришел от одного родителя, а другая часть от другого родителя </p>
мутация: Для мутации я выбрал подход IVM (Inversion Mutation). он берет подпуть из исходного пути и вставляет его обратно (инвертированный) в произвольной точке.
пример: путь (1 2 3 4 5), вспомогательный путь (2 3 4) и случайная вставка после 5
генерировать: (1 5 | 4 3 2)