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

Моя идея состоит в том, чтобы случайным образом сгенерировать путь, состоящий из n-1 узлов для каждой хромосомы в двоичной форме, где числа указывают на узлы в пути. Затем я выберу лучшее в зависимости от суммы весов (если я не могу перейти от A к B, я бы назначил ему штраф) и битов кроссовера / мутирования в нем. Это будет работать? Это похоже на уменьшенную версию грубой силы. Есть ли способ лучше?

Спасибо!

0
Veasst 19 Мар 2017 в 04:56

2 ответа

Лучший ответ

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

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

0
lejlot 19 Мар 2017 в 12:19

Ред .

Вы можете использовать перестановку кодирования GA. В кодировании перестановок вы должны указать начальную и конечную точки. GA ищет лучшую хромосому с вашей функцией фитнеса. Кандидатские растворы (хромосомы) будут похожи на 2-5-4-3-1 или 2-3-1-4-5 или 1-2-5-4-3 и т. Д. Таким образом, ваше решение зависит от вашей фитнес-функции. (Посмотрите на пакет GA для R, чтобы легко применить перестановку GA.)

Связи являются ограничением для вашей проблемы. Мой лучший совет - создать такую матрицу ограничений:

FirstPoint SecondPoint Connected
A          B           true
A          C           true
A          E           false
...        ...         ...

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

Example chromosome: A-B-E-D-C
A-B: 1
B-E: 1
E-D: 4
D-C: 3

Fitness value: 9

.

Example chromosome: A-E-B-C-D
A-E: penalty
E-B: 1
B-C: 6
C-D: 3

Fitness value: 10 + penalty value.

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

0
NelsonGon 27 Мар 2019 в 16:01