Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
сетевое планированрнрнрние.docx
Скачиваний:
113
Добавлен:
17.02.2016
Размер:
449.26 Кб
Скачать

3.2 Построение математической модели

Построение математической модели – это этап формализации проблемы, выражение ее в виде конкретных математических зависимостей и отношений (формулы, функции, уравнения, неравенства и т.д.). На этом этапе сначала определяется основная конструкция математической модели, затем уточняются детали этой конструкции.

Пусть вершины пронумерованы так, что дуга (xi, хj) всегда ориентирована от вершины xt к вершине хj, имеющей больший номер. Для ациклического графа такая нумерация всегда воз­можна и производится очень легко. При этом начальная вершина получает номер 1, а конечная — номер n.

Присвоим вершине xj пометку l(xj),— равную длине самого длинного пути от 1 до xj, используя для этого соотношения

l(xj) = max [l(xi) + cij]; (*)

Затем присвоим пометку вершине (xj+ 1), применив снова формулу (8.7), и так далее до тех пор, пока последняя вершина п не получит пометку l(п). В соотношении (*) l(1) полагается равным нулю. Если вершина хj помечена, то пометки I(xt) извест­ны для всех вершин xt Г-1 (xj), так как в соответствии со спо­собом нумерации это означает, что xi < xj и, следовательно, вер­шины xi уже помечены в процессе применения алгоритма.

Пометка l(n) равна длине самого длинного пути от 1 до n. Сами дуги, образующие путь, могут быть найдены обычным спо­собом последовательного возвращения. А именно дуга (xi, xj) принадлежит пути тогда и только тогда, когда l(xj) = I (xi) + cij. Начиная с вершины xj равной n, полагаем на каждом шаге xj равной такой вершине xt (скажем, хi*), для которой выполняется это последнее равенство, и так продолжаем до тех пор, пока не бу­дет достигнута начальная вершина (т. е. пока не будет хi* = 1).

Совершенно очевидно, что пометка l (xj) вершины xj дает длиннейший путь от 1 до хj, т. е. самое раннее возможное начало выполнения этапа, изображаемого вершиной xj. Таким образом, если (хi, xj) — дуга в графе, то I(xi ) — I(xj) — cij (неотрицатель­ная величина, как это видно из (*)) дает самое большое возмож­ное время задержки начала этапа i, не оказывающее влияния на время начала этапа j. Из вышесказанного видно, что если i и j — два последовательные этапа в самом длинном пути, то I (хi) - I (xj) - cij = 0.

3.3 Алгоритм решения задачи

Программа написана на языке Turbo Pascal версии 7.0 Отладка производилась в операционной системе MS Windows ХР на компьютере совместимом с IBM PC с процессором Pentium.

Программа состоит из следующих программных файлов:

kurs.exe – главный файл проекта;

alg.tpu – вычислительный модуль;

graf.txt – текстовый файл, содержащий входные данные (количество вершин графа и матрицу смежности).

Модуль Alg.Tpu

Модуль состоит из шести процедур, четыре из которых доступны пользователю: Smejnost, Svyaznost, Siln_Komponent, BAZ_AND_ABAZ;

Константы:

n0 = 30 – максимальное число вершин обрабатываемого графа.

Типы:

TM – одномерный целочисленный массив максимальной размерностью N0 с элементами от 1 до n0.

TTM – двумерный целочисленный массив максимальной размерностью n0*n0.

Переменные:

n – количество вершин в заданном графе;

A – матрица смежности заданного графа;

R - матрица достижимости;

Q - матрица контрдостижимости;

S – матрица сильной связности;

SK – матрица сильносвязных компонент;

KG – конденсация графа;

BAZ – базы графа;

ABAZ – антибазы графа;

ws – вспомогательная переменная, двумерный массив TTM;

str – вспомогательная переменная, одномерный массив TM:

k – количество сильных компонент;

i, j, l, g – счетчики.

Процедуры:

Procedure Smejnost – Заполнение матрицы смежности из указанного пользователем файла.

Procedure Svyaznost – Построение матрицы достижимости по матрице смежности, а также контрдостижимости и связности графа.

Procedure Siln_Komponent – Поиск сильных компонент.

Procedure BAZ_AND_ABAZ – Построение конденсации графа, поиск баз и антибаз заданного графа.

Procedure Poisk(var m: TTM) – Выполняет посик следующего элемента базы или интибазы. Вызывается процедурой BAZ_AND_ABAZ.

Procedure Vivod(x:integer) – Процедура рекурсия. Завершает поиск следующего элемента базы или антибазы. Вызывается процедурой Poisk.