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