Алгоритм Дейкстры - алгоритм находит кратчайшее расстояние от одной из вершин графа до всех остальных. Алгоритм работает только для графов без рёбер отрицательного веса. Назван в честь изобретателя Эдсгера Дейкстры.
Поискал в гугле. Нашел вот этот вариант реализации алгоритма на Action Script. Казалось бы задача решена, но, при попытке скомпилировать пример, посыпались ошибки. Разбираться было некогда, пришлось писать самому :)
На сайте http://www.allbest.ru/ нашел курсовую работу "Программная реализация алгоритма Дейкстры (построение цепей минимальной длины)". Прочитав работу, немного поразмыслив, получилось следующее:
В итоге 4 класса:
- Vertex.as - класс для описания вершин.
- Edge.as - класс для описания связей.
- Graph.as - класс для описания графа.
- GraphMethods.as - статический класс с методами работы с графами. Пока только один метод getDijkstraPath(). Позже буду добавлять новые методы :)
graph.zip (3 Кб) |
Как этим пользоваться?
Создаем вершины.
var vertex1:Vertex = new Vertex("v1"); var vertex2:Vertex = new Vertex("v2"); var vertex3:Vertex = new Vertex("v3"); var vertex4:Vertex = new Vertex("v4"); var vertex5:Vertex = new Vertex("v5"); ...
Свяжем некоторые вершины, с указанием расстояния между ними.
var edge1:Edge = new Edge(vertex1, vertex3, 50); var edge2:Edge = new Edge(vertex3, vertex4, 75); var edge3:Edge = new Edge(vertex3, vertex5, 25) ...
Создаем граф.
var graph:Graph = new Graph();
Вершины и связи добавим на граф.
graph.addVertex(vertex1); graph.addVertex(vertex2); graph.addVertex(vertex3); graph.addVertex(vertex4); graph.addVertex(vertex5); ... // graph.addEdge(edge1); graph.addEdge(edge2); graph.addEdge(edge3);
Вычислим кратчайший путь от первой вершины до четвертой, используя алгоритм Дейкстры.
var path:/*Vertex*/Array = GraphMethods.getDijkstraPath(graph, vertex1, vertex4);
Вот и всё :)
Ссылки по теме:
Немного поправить описание можно, мелочь: в описании getDijkstraPath, а в коде getDijkstra.
ОтветитьУдалитьИ ещё то, что он учитываются направления графов. То бишь их в обе стороны надо задавать.
Спасибо, за сообщение о недочетах :) Поправлю
ОтветитьУдалитьЕсть вопрос по поводу производительности твоей реализации :) поискал на блоге, никаких способов для связи с тобой не нашел.
ОтветитьУдалитьЕсли есть интерес пообщаться по поводу этого алгоритма и его производительности, skype : nicolas.prof
Над производительностью алгоритма я не работал :) Не стояло такой задачи. Просто написал по-быстрому смотря в блок схему курсовой работы. А для связи: as3coder@gmail.com
ОтветитьУдалитьОгромное спасибо, весьма доходчиво когда на деле и на 100% то, что нужно для текущей задачи, восторг!
ОтветитьУдалитьFarid, мог бы выложить полный код программы.
ОтветитьУдалитьИнтересно как написан UI, только начинаю изучать это технологию и нет ни малейшего представления как это можно сделать (
Был бы очень благодарен!
Этот комментарий был удален автором.
ОтветитьУдалить"Казалось бы задача решена, но, при попытке скомпилировать пример..." ©
ОтветитьУдалитьВ коде упущено function Vertex (name:String) { edges = []; this.name = name; }
И в GraphMethods как в тексте расхождение: метод "getDijkstra" вместо "getDijkstraPath".
Хороший пример.
ОтветитьУдалитьsoniko , с вашими правками работает,
но метод "getDijkstra" с теми входными данными, что показаны в примере возвращает вершины v4 и v3,
а v1 не возвращает. Одна вершина
где-то теряется.
И по идее хорошо бы возвращать ребра по которым прошел кратчайший путь. Тогда его легче будет перекрасить в другой цвет например и
показать в программе вот он путь.
Спасибо за классы, полезная штука.
ОтветитьУдалитьСпасибо за классы. Полезная штука.
ОтветитьУдалить