Решение задач теории графов в системе компьютерной

advertisement
ЛАБОРАТОРНАЯ РАБОТА 5
Решение задач теории графов в системе компьютерной алгебры Maple
Цель занятия. Изучение основных функций компьютерной алгебры Maple для
решения задач теории графов.
1 Основные сведения о Maple
Система Maple пользуется популярностью в университетах — свыше 300
самых крупных университетов мира взяли эту систему на вооружение. А число
только зарегистрированных пользователей системы превысило I млн. Любопытно отметить, что у популярной математической системы MathCAD число зарегистрированных пользователей около 600 тыс., т. е. меньше, чем у Maple. Добавьте
к этому куда большее число незарегистрированных пользователей — ведь система Maple вполне легально выставлена для копирования на Internet-узле фирмы Waterloo Maple и записана на многих CD-ROM. Если учесть все это, то оказывается, что популярность системы Maple ничуть не ниже, а то и выше популярности гораздо более простых систем.
Maple — типичная интегрированная система. Это означает, что она объединяет в себе ориентированный на сложные математические расчеты мощный
язык программирования (и он же входной язык для интерактивного общения с
системой), редактор для подготовки и редактирования документов и программ,
математически ориентированный входной язык общения и язык программирования, современный многооконный пользовательский интерфейс с возможностью
работы в диалоговом режиме, справочную систему, ядро алгоритмов и правил
преобразования математических выражений, программные численный и символьный процессоры с системой диагностики, мощнейшие библиотеки встроенных и дополнительных функций, пакеты расширений и применений системы и
огромную и очень удобную в применении справочную систему. Ко всем этим
средствам имеется полный доступ прямо из системы.
Maple — одна из самых мощных и «разумных» интегрированных систем
символьной математики, созданная фирмой Waterloo Maple Inc. (Канада). Эта
система на сегодня является лучшей математической системой компьютерной
алгебры для персональных компьютеров, имеющей большое число встроенных
функций, обширные библиотеки расширения и богатейшие графические возможности, с блеском решающие задачи наглядной визуализации сложнейших
математических расчетов.
Во многих обзорах систем компьютерной алгебры Maple справедливо
считается одним из первых кандидатов на роль лидера среди таких систем, ориентированных на серьезное применение. Это лидерство она защищает в честной
2
конкурентной борьбе с другой замечательной математической системой —
Mathematica 2 (а сейчас и Mathematica 3). Каждая из этих систем имеет свои особенности, но в целом эти две лидирующие системы поистине «два сапога пара».
Система Maple прошла долгий путь развития и апробации. Она реализована на больших ЭВМ, рабочих станциях Sun, ПК, работающих с операционной
системой Unix, ПК класса IBM PC, Macintosh и др. Все это самым положительным образом повлияло на ее отработанность и надежность (в смысле высокой
вероятности правильности решений и отсутствия сбоев в работе). По этому показателю Maple заметно превзошла своего ближайшего и очень серьезного конкурента — систему Mathematica 2 и 3, несколько превосходящую Maple по специальным видам графики.
Maple основана на трех языках – входном, реализации и программирования.
2 Применение в решении задач теории графов
Система Maple хорошо зарекомендовала себя при изучении учебных дисциплин, позволяя решать задачи, связанные с графами. Но, к сожалению, найти
какую-нибудь литературу, связанную с реализацией решений задач над графами,
очень проблематично.
Приведем некоторые команды, реализуемые в Maple:
 Для задания графа используется функция graph
 Для создания полного графа используется функция complete
 Для соединения графа по контуру используется функция cycle
 Для создания пустого графа используется функция new
 Для создания случайного графа используется функция random
 Для создания графа без ребер используется функция void
 Для добавления ребер в граф используется функция addedge
 Для добавления вершин в граф используется функция addvertex
 Для удаления ребер и вершин из графа используется функция delete
 Для построения графа используется функция draw
 Для объединения двух графов используется функция gunion
 Для нахождения матрицы смежности используется функция adjacency
 Для нахождения матрицы инцидентности используется функция incidence
 Для нахождения минимального числа ребер используется функция аllpairs
 Для нахождения весов ребер используется функция eweight
3
 Для нахождения начальных вершин используется функция head
 Для нахождения конечных вершин используется функция tail
 Для нахождения кратчайшего расстояния используется функция
shortpathtree
 Для получения полной информации о графе используется функция show
3 Методика применения Maple при изучении теории графов
Для работы с графами в Maple предназначена библиотека networks. Команда подключения этой библиотеки – стандартная, т.е. достаточно воспользоваться оператором with.
Приведем основные моменты работы с графами в системе Maple.
Для начала подключим библиотеку networks для того, что бы ядро системы знало, что работа будет идти с графами.
> with(networks):
Создадим граф с четырьмя вершинами и четырьмя дугами.
> G:=graph({1,2,3,4},{{1,2}, {2,3}, {2,4}, {1,3}}):
Построим заданный граф.
> draw(G);
Теперь удалим четвертую вершину.
> delete(4, G):
Построим то, что получилось.
4
> draw(G);
Теперь добавим четвертую, пятую, шестую и седьмую вершины.
> addvertex({4,5,6,7},G);
4, 5, 6, 7
Внизу функции мы видим цифры 4, 5, 6, 7. Это означает, что данные
вершины вступили в свою силу.
Далее построим граф с добавленными вершинами.
> draw(G);
5
Добавим новые ребра 1-7, 5-6, 2-5, 3-5, 4-7.
> addedge([{1,7},{5,6},{2,5},{3,5},{4,7}], G);
Построим полученный граф.
> draw(G);
Теперь посмотрим сколько вершин в графе и какие они имеют номера.
> vertices(G);
{ 1 , 2, 3 , 4, 5 , 6, 7 }
Внизу функции через запятую перечислены вершины.
Таким образом создаются и удаляются вершины и ребра в графе. Если
необходимо переопределить граф, то необходимо сначала удалить ненужные
вершины и ребра, а затем добавить новые.
Пришло время разобраться с весами ребер.
По умолчанию в графе веса равны нулю. Проверим это.
> vweight(G);
0
Внизу функции появился ожидаемый ноль.
Теперь зададим веса.
> addvertex([1,2,3,4,5,6,7,8],weights=[4,2,3,5,3,8,9,5],G):
Проверим вес четвертой вершины.
> vweight(4,G);
5
6
Вес равен пяти.
Теперь объединим два графа в один. Для этого создадим графы G1 и G2.
> G1:=graph({1,2,3,4},{{1,2}, {2,3}, {2,4}, {1,3}}):
> G2:=graph({1,2,3,4,5},{{2,5}, {2,4}, {1,3}, {4,5}}):
Нарисуем эти графы.
> draw(G1);
> draw(G2);
7
Объединим эти графы в граф G3 и нарисуем полученный граф.
> G3:=gunion(G1, G2):
> draw(G3);
Приведем основные функции работы с графами:
Функция complete(n) – строит полный граф (все вершины соединены друг с другом). n – число вершин.
> G := complete(10):
> draw(G);
8
Функция cycle(n) – строит граф, где вершины соединяются по кругу . n – число
вершин.
> G:=cycle(6):
> draw(G);
Функция void(n) – строит пустой граф (вершины не соединены). n – число вершин.
> G := void(10):
> draw(G);
9
Функция incidence(G) – строит матрицу инцидентности. G – исследуемый граф.
> G:=cycle(4):
addedge([1,3],G):
T:=incidence(G);
1

1
T := 
0

0
0
1
1
0
0
0
1
1
1
0
0
1
-1

0

1
0
Функция show(G) – показывает информацию о графе. G – исследуемый граф.
> G:=complete(3):
T:=show(G);
T := table([_Vweighttable( sparse, []), _Tail table([]), _Vertices{ 1, 2, 3 },
_Emaxname3, _Bicomponents_Bicomponents,
_Endstable([e3{ 2, 3 }, e2{ 1, 3 }, e1{ 1, 2 }]),
_EdgeIndextable( symmetric, [( 1, 2 ){ e1 }, ( 1, 3 ){ e2 }, ( 2, 3 ){ e3 }]),
_Econnectivity_Econnectivity, _Status{ COMPLETE, SIMPLE },
_Neighborstable([1{ 2, 3 }, 2{ 1, 3 }, 3{ 1, 2 }]), _Countcuts_Countcuts,
_Edges{ e1, e2, e3 }, _Eweighttable([e31, e21, e11]), _Head table([]),
_Counttrees_Counttrees
])
Найдем максимальный поток в графе, используя функцию flow().
> G:=petersen():
flow(G,1,2,eset,comp);
3
> draw(G);
10
> eset;
{ { 2, 3 }, { 3, 4 }, { 6, 7 }, { 8, 9 }, { 1, 2 }, { 1, 5 }, { 4, 7 }, { 1, 6 }, { 2, 8 }, { 5, 9 } }
> comp;
{ 1, 2, 4, 5, 6 , 7, 8, 9 }
> eset := 'eset': comp := 'comp':
flow(G,1,5,eset,comp,maxflow=1);
1
> eset;
{ { 1, 5 } }
Кротчайший путь дерева. Функция shotrpathtree().
> G1 := petersen():
T := shortpathtree(G1,1):
> ancestor(T);
table([2{ 1 }, 3{ 2 }, 4{ 5 }, 5{ 1 }, 6{ 1 }, 7{ 6 }, 8{ 2 }, 9{ 5 },
10{ 6 }
])
11
> ancestor(8,T);
{2}
> ancestor(1,T);
{ }
> ancestor(4,T);
{5}
Рассмотрим решение задачи о кратчайшем пути и максимальном потоке в
графе с нагруженными ребрами.
Построение графа.
Для начала подключим библиотеку networks для того, чтобы ядро
системы знало, что работа будет идти с графами.
>
with ( networks) :
Создадим граф G с восьмью вершинами и пятнадцатью дугами.
>
G := graph ( { 1, 2, 3, 4, 5, 6, 7, 8 }
, { { 1, 2 }, { 1, 3 }, { 1, 4 }, { 2, 4 }, { 2, 5 }
, { 2, 6 }, { 3, 4 }, { 3, 5 },
{ 3, 7 }, { 4, 5 }, { 5, 6 }, { 5, 7 },
{ 5, 8 }, { 6, 8 }, { 7, 8 } } ) :
Построим заданный граф.
>
draw ( G );
12
Веса ребер.
Теперь зададим веса ребер.
>
addvertex ( [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15], weights =
[ 5, 3, 8, 4, 9, 4, 2, 7, 4, 2, 6, 5, 6, 3, 9 ], G ) :
Проверим вес одиннадцатого ребра
>
vweight ( 11, G );
6
Вес равен шести
13
Кратчайший путь дерева.
Функция shotrpathtree().
>
T := shortpathtree( G, 1 ) :
>
draw ( GG );
>
ancestor( T );
14
table ( [ 2 = { 1 }, 3 = { 1 }, 5 = { 2 }, 4 = { 1 },
7 = { 3 }, 6 = { 2 }, 8 = { 5 } ] )
>
ancestor( 1, T );
{}
>
ancestor( 5, T );
{2}
>
ancestor( 8, T );
{5}
Нахождение максимального потока.
Функция flow().
>
flow ( G, 1, 8, eset, comp );
3
>
eset;
{ { 1, 2 }, { 1, 4 }, { 2, 5 }, { 2, 6 }, { 3, 7 }, { 5, 8 }
, { 1, 3 }, { 2, 4 }, { 6, 8 }, { 7, 8 } }
>
comp;
{ 1, 2, 3, 4, 5, 6, 7, 8 }
15
>
eset :='eset': comp :='comp ':
>
flow ( G, 1, 4, eset, comp, maxflow = 2 );
2
>
eset;
{ { 1, 2 } , { 1, 4 }, { 2, 4 } }
Варианты заданий для самостоятельного решения.
16
17
18
19
Список использованной литературы
1. Сборник задач и упражнений по высшей математике: Математическое
программирование:
Учеб.
пособие/
А.В.Кузнецов,
В.А.Сакович, Н.И.Холод и др.; Под общ. ред. А.В.Кузнецова. –
Мн.: Выш. шк., 2003. – 382с.: ил.
Download