Мне нужно найти кратчайший путь через неориентированный граф, чьи узлы имеют реальный (положительный и отрицательный) вес.Эти веса похожи на ресурсы, которые вы можете получить или потерять, войдя в узел.
Общая стоимость (сумма ресурсов) пути не очень важна, но она должна быть больше 0, а длина должнабыть кратчайшим из возможных.
Например, рассмотрим такой граф:
A-start node; D-end node
A(+10)--B( 0 )--C(-5 )
\ | /
\ | /
D(-5 )--E(-5 )--F(+10)
Кратчайшим путем будет AEFED
Один алгоритм Дейкстры не справляется с задачей,потому что он не может обрабатывать отрицательные значения.Итак, я подумал о нескольких решениях:
Сначала используется алгоритм Дейкстры для вычисления длины кратчайшего пути от каждого узла до узла выхода, без учета весов.Это можно использовать как какое-то значение эвристики, как в A *.Я не уверен, что это решение может работать, а также оно очень дорого.Я также думал о реализации алгоритма Флойда-Варшалла, но я не уверен, как это сделать.
Другим решением было вычисление кратчайшего пути с помощью алгоритма Дейкстры без учета весовых коэффициентов, и если после расчета суммы ресурсов пути оно меньше нуля, просмотрите каждый узел, чтобы найти соседний узел, который мог бы быстро увеличить ресурссумма, и добавьте его к пути (несколько раз, если необходимо).Это решение не будет работать, если есть узел, которого может быть достаточно для увеличения суммы ресурса, но дальше от рассчитанного кратчайшего пути.
Например:
A- start node; E- end node
A(+10)--B(-5 )--C(+40)
\
D(-5 )--E(-5 )
Could Youпомочь мне решить эту проблему?
РЕДАКТИРОВАТЬ: Если при вычислении кратчайшего пути вы достигнете точки, в которой сумма ресурсов равна нулю, этот путь недопустим, так как выне может продолжаться, если нет больше бензина.