Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры_11.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
2.96 Mб
Скачать
  1. Методы построения сетевого графика. Алгоритмы поиска критического пути и ключевых работ.(Швечков)

Исходные данные= сетевой график разработки АСУ.

Возникает задача определения оптимальной очередности (контроля)результатов проектирования. Формализация задачи выглядит следующим образом:

1)Сеть разработки АСУ представлена графом G(I,Q), в котором вершины изображают события i=1…I, вершина- событие и результат выполнения работ.

Q-совокупность дуг графа (работ по проектированию); Q={qij}

2)Каждая дуга (работа) характеризуется некоторым временем tij и вероятностью Pij ошибочного принятия решения при выполнении работы.

Pij обычно определяется экспертным путем.

3)Будем считать (переномеруем события в графе так, что) i<j (упорядочим работу) и введем переменную xij.

1,если при завершении работы ij проводится анализ

Xij=0,в других случаях

1,если при наступлении события i(завершения работы ij)проводится контроль

Хi=0,в других случаях

4)Можно ввести управление U(x1,x2,…xq), которое состоит:

xq:xij-контроль по работам;xi-контроль по событиям

Контроль надо проводить так, чтобы minmax Tg(U)

U g

g={pij}-множество вероятности pij.

T-max срок окончания всех видов работ.

Алгоритм Дейкстры решает задачу о кратчайших путях из одной вершины для взвешенного орграфа G=(V, E) с исходной вершиной s, в котором веса всех дуг неотрицательны (w(u, v) ≥ 0 для всех (u, v) Є E).    Перед тем, как рассматривать непосредственно алгоритм Дейкстры рассмотрим понятие релаксации. Техника релаксации состоит в следующем. Для каждой вершины v Є V мы храним некоторое число d[v], являющееся верхней оценкой веса кратчайшего пути из s в v. Начальное значение оценки кратчайшего пути и массива p устанавливается следующим образом:

для всех вершин v Є V[G]     d[v] =     p[v] = NULL d[s] = 0

   Релаксация дуги (u, v) Є E состоит в следующем: значение d[v] уменьшается до d[u] + w(u, v), если второе значение меньше первого, при этом d[v] остаётся верхней оценкой. Также мы хотим, чтобы значение p[v] указывало путь, использованный при получении этой верхней оценки, поэтому одновременно мы изменяем значение p[v]. Фактически, если кратчайший путь проходит через какую-то вершину vi Є V отличную от s, то p[vi] будет указывать вершину из которой мы пришли в вершину vi.

Relax(u, v, w)     if d[v] > d[u] + w(u, v)         d[v] = d[u] + w(u, v)         p[v] = u

    На рисунке 1 приведены два примера релаксации: в первом случае оценка кратчайшего пути уменьшается, во втором - нет.

Рисунок 1 - Пример релаксации.

   Теперь рассмотри сам алгоритм нахождения кратчайшего пути. В процессе работы алгоритма Дейкстры поддерживается множество вершин S принадлежащих V, состоящее из вершин v, для которых уже найден кратчайший путь из вершины s - δ(s, v). Алгоритм выбирает вершину u Є V \ S с наименьшим d[u], добавляет u  к множеству S и производит релаксацию всех дуг, выходящих из u, после чего цикл повторяется. Условно алгоритм можно записать следующим псевдокодом:

1.

Инициализация: для всех вершин v Є V[G]: d[v] = и p[v] = NULL; d[s] = 0;

2.

S = NULL, Q = V[G];

3.

Если в Q не осталось вершин, то конец алгоритма;

4.

Выбрать вершину u Є Q для которой d[u] - минимально и удалить её из Q;

5.

Добавить u в S;

6.

Для всех вершин v смежных с u выполнить релаксацию дуг (u, v);

7.

Перейти к шагу 3.

   После выполнения данного алгоритма длина кратчайшего пути из вершины s в v будет находится в d[v], а сам путь можно восстановить с помощью массива p.    На рисунке 2 показаны несколько итераций работы алгоритма Дейкстры.

Рисунок 2 - Работа алгоритма Дейкстры.

   Первоначально кратчайшее растояние до всех вершин равно , а расстояние от начальной вершины s до неё же равно 0. Вершина s имеет минимальную оценку кратчайшего расстояния на первой итерации, поэтому релаксацию проходят дуги (s, u) и (s, x). Красные стрелки на рисунке показывают текущие кратчайшие пути до вершин прошедших релаксацию, а также содержимое массива p (p[x] = s, т.к. предыдущей вершиной в кратчайшем пути проходящим через x была вершина s) . На второй итерации проходим вершину x, так как d[x] - минимально. Таким образом проходим все вершины.

Алгоритм Флойда.

Дано: непyстой взвешенный гpаф G=(V, E) с пpоизвольными весами ребер (дуг). Требуется найти длины кpатчайших пyтей между всеми парами вершин графа, если в графе нет циклов (контуров) отрицательной суммарной длины, либо обнаружить наличие таких контуров.

Инициализация:

1. Построим матрицу D0 размерности |V| x |V|, элементы которой определяются по правилу:

  1. dii0= 0;

  2. dij0= Weight(vi, vj), где i<>j, если в графе существует ребро (дуга) (vi, vj);

  3. dij0= бесконечность , где i<>j, если нет ребра (дуги) (vi, vj).

2. m:=0.

Основная часть:

1. Построим матрицу Dm+1 по Dm, вычисляя ее элементы следующим образом: dijm+1=min{dijm, di(m+1)m + d(m+1)jm}, где i<>j; diim+1=0 (*). Если dimm + dmim < 0 для какого-то i, то в графе существует цикл (контур) отрицательной длины, проходящий через вершину vi; ВЫХОД.

2. m:=m+1; если m<|V|, то повторяем шаг (1), иначе элементы последней построенной матрицы D|V| равны длинам кратчайших путей между соответствующими вершинами; ВЫХОД.

ВНУТРИ

Если требует найти сами пути, то перед началом работы алгоритма построим матрицу P с начальными значениями элементов pij=i. Каждый раз, когда на шаге (1) значение dijm+1 будет уменьшаться в соответствии с (*) (т.е. когда di(m+1)m + d(m+1)jm<dijm), выполним присваивание pij:=p(m+1)j. В конце работы алгоритма матрица P будет определять кратчайшие пути между всеми парами вершин: значение pij будет равно номеру предпоследней вершины в пути между i и j (либо pij=i, если путь не существует).

Примечаниe: если граф - неориентированный, то все матрицы Dm являются симметричными, поэтому достаточно вычислять элементы, находящиеся только выше (либо только ниже) главной диагонали.