Как разрешить отрицательные веса на графике в JGraphT?

У меня есть график, и я хочу найти САМЫЙ ДЛИННЫЙ путь от источника к приемнику. Моя идея заключалась в том, чтобы изменить вес на отрицательные числа и запустить на нем dijkstra, как это реализовано в JGraphT.

ListenableDirectedWeightedGraph<String, MyEdge> g = new ListenableDirectedWeightedGraph<String, MyEdge>(
                MyEdge.class);

...

List<MyEdge> sp = DijkstraShortestPath.findPathBetween(g, "source", "sink");

public static class MyEdge extends DefaultWeightedEdge {

        @Override
        public String toString() {
            return String.valueOf(getWeight());
        }
    }

К сожалению, я получаю сообщение об ошибке «Отрицательные веса не допускаются», когда я хочу установить отрицательный вес.


person Flontis    schedule 02.09.2019    source источник
comment
Рассмотрите возможность масштабирования весов. Сделайте наименьшее отрицательное значение равным 0 и добавьте такое же значение ко всем весам.   -  person c0der    schedule 04.09.2019


Ответы (2)


Причина, по которой мы не допускаем отрицательных весов, заключается в том, что невозможно найти кратчайший путь в графе с отрицательными весовыми циклами. Отрицательный цикл — это цикл, общий вес которого (сумма весов его ребер) отрицателен.

В общем случае поиск самого длинного пути в произвольном графе является NP-трудным, см., например, https://en.wikipedia.org/wiki/Longest_path_problem

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

Таким образом, на самом деле это не проблема JGraphT, а проблема сложности проблемы, которую вы хотите решить.

person Joris Kinable    schedule 02.09.2019

Ответ c0der: рассмотрите возможность «перемасштабирования» весов. Сделайте наименьшее отрицательное значение равным 0 и добавьте такое же значение ко всем весам.

Хорошая идея, дела дела.

person Flontis    schedule 08.09.2019