Алгоритм Фаулкса

advertisement
Федеральное агентство по образованию
ГОУ ВПО «УГТУ-УПИ»
Курсовая работа
по Теория информационных процессов и систем
(ДИСЦИПЛИНА)
на тему: Алгоритм Фаулкса и его приложения
Семестр № 7
Преподаватель
Александров О.Е.
(ФИО)
Студент гр. № Итз-45011д
Рылов М.Г.
(ФИО)
Номер зачетной книжки 18505708
Екатеринбург
2009
Содержание
Содержание ....................................................................................................................................1
Введение .........................................................................................................................................2
Алгоритм Фаулкса .........................................................................................................................3
Описание реализации алгоритма Фаулкса в Mathcad ................................................................7
Функция МхМ(х) – перемножение матриц и булева сумма .................................................8
Функция ShiftM(x) – перестановка строк и столбцов ............................................................9
Функция ShiftV(x,z) – перестановка элементов в строке вершин ......................................10
Литература ...................................................................................................................................12
1
Введение
В большинстве сложных технологических процессах приходиться
сталкиваться с задачами комбинаторики. Речь может идти о выполнении
некоторого числа операций на различных машинах; при этом на порядок этих
операций могут быть наложены определенные условия. Когда имеется много
машин и много операций, единственность решения встречается редко. В этих
условиях необходимо выбрать, согласно определенному критерию (в
качестве которого могут выступать затраты или длительность процесса),
лучший из возможных порядков. Подобные задачи можно свести к задаче
поиска гамильтоновых путей в графе. Под гамильтоновым путем понимают
путь, проходящий через все вершины графа по одному разу. На практике
часто приходиться иметь дело с соотношениями частичного упорядочивания,
допускающими циклы. Для решения таких задач существует метод под
названием алгоритм Фаулкса.
2
Алгоритм Фаулкса
Рассмотрим шесть операций: A, B, C, D, E, F, между которыми
существуют следующие соотношения:
А<B
B/<C
A<D
B<D
C<D
E<D
F<D
F<E
A><F
B><E
B><F
Цель задачи состоит в том, чтобы найти (если это возможно) пути,
проходящие один и только один раз через каждую из точек и
удовлетворяющие написанным соотношениям – гамильтоновы пути.
B
A
C
D
F
E
Рис. 1. Граф, соответствующий начальным соотношениям
Исследование графа, изображенного на Рис.1, показывает, что точка D это безусловно конечная точка каждого гамильтонова пути (если такой
существует), т.к. никакая дуга не имеет эту точку своим началом, тогда как
дуга, исходящая из любой другой точки, достигает точки D.
Табл. 1
Матрица М
A
B
C
D
E
F
A
B
C
D
E
F
1
0
0
0
0
1
1
1
0
0
1
1
0
1
1
0
0
0
1
1
1
1
1
1
0
1
0
0
1
1
1
1
0
0
0
1
3
Это свойство выражается наличием единиц во всем столбце D и нулей
во всей строке D (очевидно, за исключением их пересечения).
Может наблюдаться и обратная ситуация: если для некоторой точки вся
строка состоит из единиц и весь столбец, за исключением пересечения,
состоит из нулей, эта точка является началом каждого гамильтонова пути
(если таковой существует).
Матрицу графа можно упростить вычеркивая предварительно все пары
строк и столбцов, которым необходимо соответствует либо начало, либо
конец каждого гамильтонова пути.
Так, в настоящем случае строка и столбец D могут быть заранее
опущены; мы получаем матрицу М1. Выполним операцию умножения
матрицы М на себя, заменяя обычную арифметическую сумму булевой
суммой элементов. Например, образуем элементарные произведения
элементов какой-нибудь строки (например, строки А) на элементы какогонибудь столбца (скажем С), как если бы мы хотели вычислить элемент
М1(1,3).
Табл.2
Матрица М1
A
B
C
E
F
A
1
1
0
0
1
B
0
1
1
1
1
C
0
0
1
0
0
E
0
1
0
1
0
F
1
1
0
1
1
Элементарные произведения в порядке их следования таковы:
а) 1•0=0; б) 1•1=1; в) 0•1=0; г) 0•0=0; д) 1•0=0. проследим, что они
означают. Пусть мы хотим отправиться из А в С.
Тогда:
а) не существует прямого пути из А в С;
б) существует прямой путь, идущий из А в B и путь из B в C;
следовательно имеется путь длины 2 из А в С;
в) не существует прямого пути из А в С;
г) нет прямого пути из А в Е и так же нет пути из Е в С;
д) есть прямой путь из А в F, но нет ни какого пути из F в С.
Таким образом, мы получили все пути из А в С длины меньшей или
равной 2.
4
Так как мы ищем пути, связывающие различные точки графа, то вместо
образования арифметической суммы, как в обычном матричном
произведении, мы составили булеву сумму.
Таким образом, мы приходим к матрице М2 , все единицы которой
обозначают существование путей единицы меньшей или равной 2, а нули их отсутствие.
Табл.3
Матрица М2
A
B
C
E
F
A
1
1
1
1
1
B
1
1
1
1
1
C
0
0
1
0
0
E
0
1
1
1
1
F
1
1
1
1
1
Из матрицы М2 мы заключаем, что точка С является крайней точкой
гамильтонова пути, если такой существует. Опять отбрасываем строку и
столбец С, откуда получаем матрицу М3.
Табл.4
Матрица М3
A
B
E
F
A
1
1
1
1
B
1
1
1
1
E
0
1
1
1
F
1
1
1
1
Точно так же найдем пути длины меньшей или равной 3, вычисляя М4.
Табл.5
Матрица М4
A
B
E
F
A
1
1
1
1
B
1
1
1
1
E
1
1
1
1
F
1
1
1
1
Матрица М4 содержит только единицы; это доказывает существование
путей длины меньше или равной 3 между всеми точками A,B,E и F. В
5
частности, можно идти из Е в А через B и F. Вычислять следующую матрицу,
которая, очевидно содержит только единицы, нет смысла. Вообще, когда
вычисляют последовательные символические степени М, можно
остановиться на том n для которого
M[n+1]= М[n]
т.к. это означает, что в М не существует пути, длина которого
превышает n. Матрица М5, полученная возвращением на место строк и
столбцов C и D, может быть перегруппирована таким образом, чтобы все
нули были расположены под главной диагональю, а единицы – над ней.
Квадратные матрицы, состоящие из единиц опирающихся на главную
диагональ, образуют классы эквивалентности относительно закона: точка Х
связана с точкой Y и обратно.
Табл.6
Матрица М5
A
B
C
D
A
1
1
1
1
B
1
1
1
1
C
1
1
1
1
D
1
1
1
1
E
1
1
1
1
F
1
1
1
1
E
0
0
0
0
1
1
F
0
0
0
0
0
1
Например, А связанная с Е через B или же через F и B; Е связанная с А
через В и F. Мы упростим исходный граф, разбив его на классы.
Единственный гамильтонов путь AFEBCD представлен на рис 2.
А
В
C
F
D
Е
Рис.2
На практике часто приходится иметь дело с соотношением частичного
упорядочения, допускающим циклы. В этом случае алгоритм Фаулкса дает
метод, хорошо приспособленный для решения подобных задач.
6
Описание реализации алгоритма Фаулкса в Mathcad
Данная реализация автоматизирует процесс выполнения алгоритма
Фаулкса. От пользователя требуется самостоятельно создать исходную
матрицу М и строку вершин V на основе исходных соотношений,
проанализировать результирующую матрицу и на ее основе построить
гамильтоновы пути (если такие существуют).
Выполнение алгоритма обеспечивают три функции:
MxM(x) - Умножение матрицы на себя с заменой алгебраической суммы
булевой суммой. Алгоритм завершается, когда Mn+1= Mn . Аргумент исходная матрица.
ShiftM(x) - Перестановка столбцов в матрице Mn. Получение
результирующей матрицы. Аргумент - матрица Mn .
ShiftV(x,z) - Перестановка вершин в строке V, в соответствии с
результирующей матрицей. Аргументы: x - матрица Mn, z - строка вершин V.
В отличии от описанного выше алгоритма Фаулкса в реализации нет
удаления строк и столбцов, соответствующих начальным и конечным
вершинам. Что позволило упростить код и автоматизировать процесс
вычисления.
7
Функция МхМ(х) – перемножение матриц и булева сумма
MxM ( x) 
cr  rows ( x)  1
for k  1  cr
Mp  xx
for i  0  cr
for j  0  cr
Mi  j  1 if Mpi  j  0
break if M
x
otherwise
x M
kk 1
M
Переменной cr присваиваем номер последней строки/столбца матрицы.
Перемножение матрицы на саму себя: Mp = x•x.
Для реализации булевой суммы всем значениям элементов Mi,j отличным от
ноля присваивается 1. Организовано в цикле по i, j.
Алгоритм Фаулкса требует остановить перемножение матриц на шаге, когда
M[n+1] матрица равна матрице М[n]. Для этого на каждом шаге цикла по k
проверяется условие М = х, где х - матрица, полученная на предыдущем
шаге (первоначально матрица х – это аргумент функции). При выполнении
указанного условия прерывается выполнение алгоритма функции
стандартной командой break.
8
Функция ShiftM(x) – перестановка строк и столбцов
ShiftM ( x) 
cr  rows ( x)  1
Mx
for k  1  cr
B0
for i  cr  0
sum  0
for j  0  cr
sum  sum  Mi  j
for m  0  cr
if sum  B
Mp  Mi1  m
Mi1  m  Mi  m
Mi  m  Mp
B  sum otherwise
kk1
for n  1  cr
B0
for j  0  cr
sum  0
for i  0  cr
sum  sum  Mi  j
for m  0  cr
if sum  B
Mp  Mm  j1
Mm  j1  Mm  j
Mm  j  Mp
B  sum otherwise
n n 1
M
Перестановка в матрице происходит в два этапа. Сначала сортируются
строки матрицы М в цикле по k, а затем в цикле по n отсортированная
матрица М сортируется по столбцам. Для сортировки строк/столбцов
матрицы используется "пузырьковый" алгоритм сортировки (реализовано
циклом по к).
9
Сортировка по строкам (сортировка по столбцам аналогична):
Для "пузырькового" алгоритма необходим n -1 шаг, где n - число
сортируемых элементов.
На каждом шаге в цикле по i вычисляется сумма элементов i-той строки sum
и сравнивается с суммой (B) i -1 строки (вычисление суммы реализовано
циклом по j).
Если текущая сумма меньше, выполняется перестановка строк (цикл по m).
Если текущая сумма больше, то переменной B присваивается значение
суммы текущей строки.
Функция ShiftV(x,z) – перестановка элементов в строке вершин
ShiftV ( x  z) 
cr  rows ( x)  1
cz  strlen( z)  1
Mx
Vz
for k  1  cr
B0
for j  0  cr
sum  0
for i  0  cr
sum  sum  Mi  j
if sum  B
for m  0  cr
Mp  Mm  j1
Mm  j1  Mm  j
Mm  j  Mp
Vp1  substr ( V  4  j  4)
Vp2  substr [ V  4 ( j  1)  4]
Vp3  substr [ V  0  4 ( j  1) ]
Vp4  substr [ V  4 ( j  1)  cz  4( j) ]
V  concat ( Vp3  Vp1  Vp2  Vp4)
B  sum otherwise
kk 1
V
10
Для перестановки элементов в строке V используется сортировка по
строкам (этого достаточно) из функции ShiftM(x), в которую добавлен
алгоритм сортировки строки V.
В алгоритме используются функция разделения строки на подстроки substr()
и функция соединения нескольких строк в одну concat().
Для того, чтобы визуально соотнести вершины строки V и колонки матрицы
М, каждый элемент строки V занимает 4 позиции (буква с пробелами).
Поэтому в функциях substr() j-й элемент - 4•j, и число позиций,
соответствующих одному элементу равно четырем.
Vp1,Vp2 – элементы, которые необходимо поменять местами.
Vp3 – подстрока от первого элемента строки V до элемента Vp1.
Vp4 – подстрока от элемента Vp2 до последнего элемента строки V.
11
Литература
 Кофман А., Фор Р. Займемся исследованием операций. – Москва:
издательство «Мир»,1966
 Алексеев Е.Р., Чеснокова О.В. Решение задач вычислительной
математики в пакете Mathcad 12. – Москва: НТ Пресс, 2006.
 Mathcad 2001i Professional. Mathcad Help.
12
Download