Когда вы предпочитаете практическое решение академическому, вот оно.
Я решил эту проблему, установив штраф к краям кратчайшего пути и снова выполнив поиск.
Например, кратчайший путь имеет длину 1000, штраф составляет 10%, поэтому я ищу второй кратчайший путь с 1000 <= length <= 1100.</p>
В худшем случае я нахожу предыдущий кратчайший путь.
В лучшем случае я нахожу несвязанный путь такой же длины.
В большинстве случаев я нахожу путь, разделяющий некоторые локально оптимальные подпути.
Увеличение штрафа вынуждает алгоритм находить альтернативные маршруты, а уменьшение делает его совместным с допустимым.
Когда я нахожу 2-й кратчайший путь, я должен вычесть сумму штрафов по общим ребрам из вычисленной длины, чтобы получить реальную длину.
Для k-го кратчайшего пути я устанавливаю штраф для всех ребер, использованных в предыдущих k-1 кратчайших путях.