
- •1.2 Лабораторная работа «Решение задачи линейного
- •1.3 Лабораторная работа «Решение транспортной задачи
- •2 Нахождение условного экстремума функции
- •2.1 Лабораторная работа «Нахождение условного экстремума
- •3.2 Лабораторная работа «Нахождение кратчайшего пути»
- •3.3 Лабораторная работа «Определение максимального потока
- •Библиографический список
3.2 Лабораторная работа «Нахождение кратчайшего пути»
Цель работы. Выработать у студентов практические навыки использования функций пакета networks для решения задач на нахождение кратчайшего пути.
Задание. В
приведенной таблице заданы веса дуг,
соединяющих узлы V1,
V2, V3,
V4, V5,
V6, V7,
V8 некоторой
сети. Прочерк в клетке таблицы означает,
что два узла не являются смежными.
Определите кратчайшие пути, соединяющие
узел V1 с остальными
узлами сети и их длины.
− номер варианта.
|
V1 |
V2 |
V3 |
V4 |
V5 |
V6 |
V7 |
V8 |
V1 |
- |
10 |
20 |
15 |
- |
- |
- |
- |
V2 |
- |
- |
|
- |
|
8 |
10 |
- |
V3 |
- |
- |
- |
4 |
- |
5 |
- |
- |
V4 |
- |
- |
- |
- |
- |
|
- |
- |
V5 |
- |
- |
- |
- |
- |
1 |
12 |
- |
V6 |
- |
- |
- |
- |
- |
- |
15 |
5 |
V7 |
- |
- |
- |
- |
- |
- |
- |
1 |
V8 |
- |
- |
- |
- |
- |
- |
- |
- |
Пример выполнения работы
Задача. Дана сеть (рис. 1), дуги которой помечены числами, равными их длинам. Требуется найти кратчайшие пути, ведущие от узла 1 к каждому из остальных узлов сети.
Рисунок 1
Решение.
Задача нахождения
кратчайшего пути в графе в Maple
решается с помощью алгоритма Дейкстры
(см. [6], стр. 219). Опишем сеть, изображенную
на рисунке 1. Загрузим пакет и зададим
граф, содержащий семь изолированных
узлов (не соединенных ребрами). Обозначим
его идентификатором
.
> with(networks):
> G:=void(7):
Зададим списки
дуг
и соответствующих им весов
.
В качестве
замечания отметим, что в ориентированном
графе дуга окаймляется квадратными
скобками – [1,2], а в неориентированном
графе ребро окаймляется фигурными –
{1,2}.
>E:=[[1,2],[1,3],[1,4],[2,3],[2,5],[2,7],[3,4],[3,6],[4,6],[5,6],[5,7]];
Результат на экране:
> W:=[20,25,15,10,20,40,8,30,20,6,9,12];
Результат на экране:
Получим сеть, добавив в граф списки дуг и соответствующих им весов:
> addedge(E,weights=W,G);
Получим на экране
В виде замечания отметим, что здесь использован один из нескольких способов задания графов в среде Maple (см., например, [2]).
Определим
дерево
кратчайших путей сети
с помощью функции shortpathtree.
Обозначим его
идентификатором
.
> T:=shortpathtree(G,1):
Нарисуем дерево :
> draw(T);
Из выведенного на экран графического объекта мы можем определить, через какие узлы сети пролегают кратчайшие пути, ведущие от узла 1 к каждому из остальных узлов сети. То же самое можно сделать с помощью функции path. Определим пути, ведущие от узла 1 к остальным узлам дерева . Чтобы не повторять однотипную операцию несколько раз, организуем цикл с помощью функции seq:
> seq(path([1,i],T),i=2..7);
На экране получим результат
Найдем расстояния от узла 1 до каждого из узлов 2, 3, 4, 5, 6, 7 дерева с помощью функции vweight.
> vweight(T);
Результат выполнения – таблица, из которой видно, что вершине 1 присвоена метка (вес) 0, вершине 2 – метка 20, следовательно, длина кратчайшего маршрута от узла 1 к узлу 2 равна 20. Аналогично имеем: длина кратчайшего маршрута от узла 1 к узлу 3 равна 25, от узла 1 к узлу 4 – 15, от узла 1 к узлу 5 – 40, от узла 1 к узлу 6 – 35, от узла 1 к узлу 7 – 49: