Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Logistika_ALL_lectures_and_tasks.doc
Скачиваний:
5
Добавлен:
22.02.2016
Размер:
647.68 Кб
Скачать

Последнее изменение: суббота 31 Январь 2004, 12:19

ЗАДАЧА 3. ПОИСК КРАТЧАЙШИХ ПУТЕЙ В ДОРОЖНОЙ СЕТИ

 

В рассмотренных ранее задачах речь шла о прокладке коммуникаций или сети дорог что называется «в чистом поле». В реальной жизни зачастую сеть дорог уже существует, причем сеть разветвленная и явно неоптимальная и как правило избыточная, т.е. построенная не по Штейнеру и наверняка с множественными путями между некоторыми парами городов, что обусловлено постепенной и как правило длительной застройкой, во время которой неоднократно менялось значение и размер связываемых городов, требования к самим дорогам, власть и прочие условия.

 

Если сеть дорог уже существует, то возникает прикладная и очень актуальная задача поиска кратчайшего расстояния между некоторыми объектами в этой сети.

 

Необходимые уточнения

Для более точной постановки вопроса отождествим развилки и города: они будут вершинами сети, а дороги будут ребрами. Однако для решения прикладных логистических задач, в частности ряда задач о минимальной стоимости доставки грузов из пункта А в пункт В, сеть не всегда будет неориентированной. В реальности часто бывает, что возможность проезда из города А в город Б вовсе не означает наличия прямой дороги из Б в А, или стоимость проезда на поезде из Москвы в Киев не имеет никакого отношения к стоимости проезда из Киева в Москву. В этом случае воспользуемся ориентированными графами, заменив ребра парой разнонаправленных дуг, имеющих различные веса (равные бесконечности, если прямое сообщение между связываемыми объектами отсутствует).

 

Существуют как общие алгоритмы решения подобных задач, так и частные алгоритмы для случаев, когда все веса ребер неотрицательны. Если вес ребра графа соответствует расстоянию между объектами, времени в пути или стоимости доставки, то не возникает необходимости в рассмотрении случая с отрицательными весами. Именно таких задач больше всего встречается в логистике, так что рассмотрение этих специальных (и более простых) алгоритмов вполне оправдано.

 

Если же некоторые ребра имеют отрицательный вес, то единственное ограничение состоит в том, чтобы в G не было циклов с суммарным отрицательным весом. Если такой цикл Ф все же существует и vt —некоторая его вершина, то, двигаясь от s к vt, обходя затем Ф достаточно большое число раз и попадая наконец в t, мы получим путь со сколь угодно малым (- ¥) весом. Таким образом, в этом случае кратчайшего пути не существует.

 

Если, с другой стороны, такие циклы существуют, но исключаются из рассмотрения, то нахождение кратчайшего пути (простой цепи) между s и t эквивалентно нахождению в этом графе кратчайшего гамильтонова пути с концевыми вершинами s и t. Задача нахождения кратчайшего Гамильтонова пути намного сложнее, чем задача о кратчайшем пути - поэтому в рамках данного пособия рассматривать ее не будем и предположим, что все циклы в G имеют неотрицательный суммарный вес. Отсюда также вытекает, что неориентированные дуги (ребра) графа G не могут иметь отрицательные веса.

 

Возможные постановки задачи

Пусть дан граф G = (V, U), дугам которого приписаны веса (стоимости), задаваемые матрицей С = [сij]. Элементы {сij} матрицы весов С могут быть в общем случае положительными, отрицательными или нулями.

I. Найти кратчайший путь от заданной начальной вершины s до заданной конечной вершины t.

II. Найти кратчайшие пути от заданной начальной вершины s до всех других вершин графа.

III. Найти кратчайшие пути между всеми парами вершин.

 

Во всех трех случаях поиск кратчайшего пути между s и t имеет смысл, если такой путь вообще говоря существует. В случае неориентированного связного графа такой путь существует между любой парой вершин (по определению связности). На самом деле, почти все методы, позволяющие решить задачу I о кратчайшем (s-t)-пути, дают также (в процессе решения) и все кратчайшие пути от s к другим вершинам. Таким образом, они позволяют решить задачу II с небольшими дополнительными вычислительными затратами. С другой стороны, задача III может быть решена либо N-кратным применением алгоритма задачи III, причем на каждом шаге в качестве начальной вершины s берутся различные вершины, либо однократным применением специального алгоритма.

 

Как и для большинства задач, для решения задачи о кратчайших путях можно предложить много процедур решения. Например, физическое моделирование такого рода: на плоской доске рисуется карта местности, в города и развилки вбиваются гвозди, на каждый гвоздь надевается кольцо, дороги укладываются веревками, которые привязываются к соответствующим кольцам. Чтобы найти кратчайшее расстояние между кольцом i и кольцом k, нужно взять i в одну руку, взять k в другую и растянуть. Те веревки, которые натянутся и не дадут разводить руки шире, и образуют кратчайший путь между i и k. Однако, математическая процедура, которая промоделирует эту физическую, выглядит очень сложно.

 

Известны алгоритмы попроще, из которых мы опишем алгоритм, предложенный Дейкстрой еще в 1959 г для систем с неотрицательными значениями весов и алгоритм Флойда для произвольных матриц весов.

 

Алгоритм Дейкстры в чистом виде решает задачу II (а значит автоматически и задачу I за то же время, и задачу III в случае N-кратного применения). Алгоритм Флойда сразу же дает решение задачи III.

 

Постановка задачи

В ориентированной, неориентированной или смешанной (т. е. где часть дорог имеет одностороннее движение) сети найти кратчайший путь из заданной вершины во все остальные.

 

Дополнительная информация

1. Предполагаем, что матрица не удовлетворяет, вообще говоря, условию треугольника, согласно которому с[i,j] <= с[i,k]+с[k,j] для всех i, j, k. В противном случае кратчайший путь между хi и хj состоит из одной единственной дуги (vi, vj) и задача становится тривиальной (если конечно такая дуга существует).

2. Если в графе G дуга (vi,vj) отсутствует, то ее вес полагается равным бесконечности.

 

АЛГОРИТМ НАХОЖДЕНИЯ КРАТЧАЙШИХ ПУТЕЙ ДЕЙКСТРЫ

 

Суть алгоритма

Алгоритм применим только при условии что с[i,j]>=0 и основан на приписывании вершинам временных пометок, причем пометка вершины дает верхнюю границу длины пути от s к этой вершине. Эти пометки (их величины) постепенно уменьшаются с помощью некоторой итерационной процедуры, и на каждом шаге итерации точно одна из временных пометок становится постоянной. Последнее указывает на то, что пометка уже не является верхней границей, а дает точную длину кратчайшего пути от s к рассматриваемой вершине.

 

Формальное описание алгоритма Дейкстры

 

Пояснения:

Алгоритм использует три массива из N (число вершин сети) чисел каждый. Первый массив Metka содержит метки с двумя значения: 0 (вершина еще не рассмотрена) и 1 (вершина уже рассмотрена); второй массив Curr_dist содержит расстояния - текущие кратчайшие расстояния от s до соответствующей вершины; третий массив Pred_num содержит номера вершин (элемент pred_num [k] есть номер предпоследней вершины на текущем кратчайшем пути из s в k). Матрица расстояний D задает длину (вес) дуги d[i,j]; если такой дуги нет, то d[i,j]=бесконечноости (числу заведомо большему всех имеющихся).

 

Ввод:

Матрица расстояний D={d[i,j]}

 

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

(i - номер стартовой вершины)

В цикле от 1 до N заполнить нулями массив Metka;

Заполнить числом i массив Pred_num;

Перенести i-ю строку матрицы D в массив Curr_dist;

metka[i]:=1;

pred_num[i]:=0

 

Общий шаг:

В цикле от 1 до N

1.Найти минимум среди неотмеченных вершин (т. е. тех k для которых metka[k] = 0); пусть минимум достигается на индексе j).

Затем выполняются следующие операции:

2.metka[j]:=1; (пометить выбранную вершину)

3.В цикле по k от 1 до N: если curr_dist[j]+d[j,k]< curr_dist[k], то curr_dist[k]:=curr_dist[j]+d[j,k]; pred_num[k]:=j

Т.о. если наименее короткий известный путь из i в k длиннее чем сумма наиболее короткого пути из i в j и прямого пути (j..k), значение элемента curr_dist[k] заменяется на сумму значений элементов curr_dist[j]и d[j,k]. По выходу из цикла все metka [i] = 1 (все вершины отмечены), и длина минимального пути от i до k равна curr_dist[k].

 

Вывод:

Теперь надо перечислить вершины, входящие в кратчайший путь. Путь от i до k выдается в обратном порядке следующей процедурой

z:= pred_num[k] ;

Выдать z;

z:=pred_num[z]. Если z = 0, то конец, иначе опять выдать z.

</i>

 

Анализ сложности

Для решения задачи II (а значит и задачи I) нужно N раз просмотреть массив Curr_dist из N элементов, т. е. алгоритм Дейкстры имеет квадратичную сложность: O(N2).

Для решения задачи III (если надо узнать кратчайшие пути между всеми вершинами) нужно N раз повторить алгоритм Дейкстры, принимая по очереди каждую вершину за стартовую. В случае полного графа с неотрицательной матрицей весов С время, необходимое для вычислений, пропорционально O(N3), а для произвольной матрицы весов оно пропорционально O(N4).

 

Пример решения задачи размещен в виде отдельного ресурса в формате *.doc.

 

ЗАДАЧА 3. ДРУГОЙ СПОСОБ РЕШЕНИЯ.

Существует совершенно иной подход к задаче нахождения кратчайших путей между всеми парами вершин. Этот метод применим как к неотрицательным, так и к произвольным матрицам весов. Метод был предложен первоначально Флойдом и затем развит Мерчлэндом.

 

АЛГОРИТМ НАХОЖДЕНИЯ КРАТЧАЙШИХ ПУТЕЙ ФЛОЙДА

 

Суть алгоритма

Алгоритм Флойда базируется на использовании последовательности из п преобразований (итераций) начальной матрицы весов С. При этом на k-й итерации матрица представляет длины кратчайших путей между каждой парой вершин с тем ограничением, что путь между xt и хs (для любых xt и хs) содержит в качестве промежуточных только вершины из множества {x1, ..., xk}.

 

Формальное описание алгоритма Флойда

 

Ввод:

Матрица расстояний D={d[i,j]}

 

Общий шаг:

for k:=1 to N do

for i:=1 to N do

for j:=1 to N do

d[i,j]:=Min(d[i,j], d[i,k]+d[k,j]);

 

Вывод:

Матрица кратчайших путей D={d[i,j]}

 

Анализ сложности

Время, необходимое для решения задачи III при помощи алгоритма Флойда (независимо от наличия или отсутствия отрицательных весов в матрице С), пропорционально O(N3). Отсюда следует его эффективность для произвольных матриц весов. Но даже если этот метод применить к графам с неотрицательной матрицей весов, то он сэкономит почти 50% времени по сравнению с N-кратным применением алгоритма Дейкстры.

 

Варианты применения алгоритма

Алгоритм Флойда фактически без всяких изменений применяется также в задачах поиска наиболее надежных путей из одного объекта в другой. В этом случае вес дуги равен надежности данного пути, т.е. вероятности его существования (или работоспособности). Очевидно, что надежность пути от вершины s к вершине k, составленного из дуг, взятых из множества U, вычисляется как произведение значений надежности соответствующих отрезков.

Такого рода задачу нахождения наиболее надежного пути можно свести к задаче о кратчайшем пути из s в k, взяв в качестве веса cij дуги (xi, xj) величину cij = -log(hij). Прологарифмировав обе части соотношения, получим со знаком минус сумму величин cij. Отсюда видно, что кратчайший путь от s к k с матрицей весов {c[i,j]}, будет в то же время и наиболее надежным путем с матрицей {h[i,j]}, а надежность этого пути равна антилогарифму его длины.

 

Обзор более сложных задач

К задачам этого типа относят не слишком сложную задачу нахождения кратчайшего пути между двумя вершинами в ориентированном ациклическом графе, обычно возникающую в методах сетевого планирования и управления (СПУ). Применяют СПУ при составлении проектов выполнения работ, состоящих из большого количества этапов, каждый этап изображают вершиной, а дуга uij означает, что j–я работа выполняется после окончания i-й. Каждой дуге приписывается вес, соответствующий минимальной задержке между началом работы i и началом работы j. Собственно в этих задачах обычно ищут критический, т.е. самый длинный путь между вершиной, изображающей начало работ, и вершиной, символизирующей завершение всех необходимых для реализации проекта работ. Безусловно, такая задача может быть решена при помощи того же алгоритма Дейкстры, но это не слишком экономно, потому что не учитывается специальная структура графа. Для таких графов существуют специальные методы расстановки пометок, которые обычно изучаются в курсе менеджемента.

 

К более сложным задачам можно отнести задачи нахождения замкнутого обслуживаемого маршрута в графах с двойными весами, когда дуге графа помимо обычного веса cij приписана еще одна характеристика bij, и нужно найти цикл, для которого целевая функция минимальна (или максимальна). Например, обслуживание самолетом некоторой сети маршрутов может характеризоваться упрощенно двумя параметрами: cij - доход от полета, bij - затрачиваемое на полет время. Эта задачу можно решить, используя алгоритм нахождения циклов отрицательного веса.

 

Во многих практических приложениях помимо нахождения кратчайшего пути требуется, чтобы он обладал дополнительными свойствами. Конечно, ее можно рассматривать как задачу с двойными весами или дополнительными ограничениями, но такие усложнения могут сильно замедлить работу в общем то эффективного алгоритма. Оказывается, что зачастую с практической точки зрения выгоднее найти К кратчайших путей и выбрать среди них тот, который обладает нужным свойством. Алгоритм нахождения К простых кратчайших цепей предложен Йеном.

 

Здесь же стоит упомянуть задачу о нахождении пути от вершины s к вершине t, характеризуемого наибольшей пропускной способностью. Пропускная способность пути Р определяется дугой из Р с наименьшей пропускной способностью. Решение таких задач опирается на нахождение разрезов в графе.

 

Если попробовать еще больше приблизить математическую модель к возможным реальным условиям, можно помимо пропускной способности можно ввести еще одну характеристику дуг, например надежность. Так формулируется задача о приведенной пропускной способности, а ее решение является комбинацией предыдущей задачи и задачи о нахождении наиболее надежного пути.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]