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