В настоящее время существует множество задач, для решения которых требуется построить сложные системы с помощью упорядочения их элементов

Вид материалаДокументы

Содержание


Рис. 1. Пример графа с указанием весов ребер
Подобный материал:
В настоящее время существует множество задач, для решения которых требуется построить сложные системы с помощью упорядочения их элементов. Сюда относятся задачи теории сетевого планирования, тактические и логические задачи, проблемы построения систем связи и исследования процессов передачи информации, выбор оптимальных маршрутов и потоков в сетях, а также большой круг экономических задач и т. д. Для решения всех этих задач используется теория графов.

Целью работы была реализация алгоритма нахождения кратчайшего пути между вершинами графа.

Под графом понимается непустое множество точек Vi, называемых вершинами, и множество отрезков их соединяющих, называемых ребрами e={Vi , Vj}. Чаще используют взвешенные графы, ребрам которых поставлены в соответствие действительные числа или величины, то есть ребра имеют свой вес (рис. 1).

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





Рис. 1. Пример графа с указанием весов ребер


На практике часто встречаются задачи нахождения дерева минимальной стоимости, называемое остовным, то есть набор ребер, соединяющий все вершины графа и имеющий минимальную длину, и нахождение кратчайшего пути между вершинами графа. Для решения данной задачи существует немало алгоритмов: алгоритм Флойда, Алгоритм Беллмана − Форда, Йена, переборные алгоритмы и др.

В данной программе, написанной на алгоритмическом языке С++, был реализован алгоритм Дейкстры, суть которого заключается в следующем. Каждой вершине графа сопоставляют метку − минимальное известное расстояние от этой вершины до А. Алгоритм работает пошагово − на каждом шаге он «посещает» одну вершину и пытается уменьшать метки. Работа алгоритма завершается, когда все вершины посещены.

Метка самой вершины А полагается равной 0, метки остальных вершин − бесконечности. Это отражает то, что расстояния от А до других вершин пока неизвестны. Все вершины графа помечаются как непосещенные.

Шаг алгоритма. Если все вершины посещены, алгоритм завершается. В противном случае, из еще не посещенных вершин выбирается вершина u, имеющая минимальную метку. Рассматриваются всевозможные маршруты, в которых u является предпоследним пунктом. Вершины, в которые ведут ребра из u, назовем соседями этой вершины. Для каждого соседа вершины u, кроме отмеченных как посещенные, рассмотрим новую длину пути, равную сумме значений текущей метки u и длины ребра, соединяющего u с этим соседом. Если полученное значение длины меньше значения метки соседа, заменим значение метки полученным значением длины. Рассмотрев всех соседей, пометим вершину u как посещенную и повторим шаг алгоритма.

Программа обработки графа выполнена на языке Borland С++. В программной реализации использованы следующие структуры данных:

− матрицы для хранения элементов весовых матриц;

− стек для хранения вершин, через которые проходит путь;

− структура для хранения списка ребер.

Для обработки графа построен класс.

Графический интерфейс реализован с помощью стандартной графической библиотеки С++ BGI.

В меню программы включены следующие пункты:

− построение матриц и редактирование графа, описанного в файле в виде списка ребер;

− построение дерева минимальной стоимости;

− нахождение кратчайшего пути с помощью алгоритма Дейкстры;

− непосредственный вывод графа на экран в графическом виде.

Программа предусматривает чтение данных из файла или с клавиатуры. Пользователь может добавить в построенный граф новые ребра, указав их вес. Программа занимает порядка 15 Кб.

>