
логистика / 0807155_B5569_tihomirova_a_n_sidorenko_e_v_matematicheskie_modeli_i_metody
.pdfНЕОБХОДИМАЯ ТЕОРЕТИЧЕСКАЯ ИНФОРМАЦИЯ
Дан граф G=<V,U>. Пусть D[i,j] – матрица кратчайших расстояний от i-й до j-й вершины. Тогда можно определить следующие понятия:
число внешнего разделения so (vi ) = max v j V [w j d (vi ,v j )];
число внутреннего разделения st (vi ) = max v j V [w j d (v j ,vi )] ;
внешний центр графа – вершина vo, для которой
so (vo ) = minvi V [so (vi )];
внутренний центр графа – вершина vt, для которой
st (vt ) = minvi V [st (vi )].
Число внешнего разделения вершины vo, являющейся внешним центром, называется внешним радиусом графа
ρо=so(vo).
Число внутреннего разделения вершины vt, являющейся внутренним центром, называется внутренним радиусом графа
ρt=st(vt).
У графа может быть несколько (больше чем один) внешних и внутренних центров. Очевидно, что в случае неориентированного графа внешний и внутренний центры совпадают, а внешний и внутренние радиусы равны.
Понятно, что если имеются всего два охраняемых объекта, то участок надо ставить между ними. Другое дело, что по ряду причин (например, доступности людских ресурсов, установленного оборудования и т.д.) для такой задачи особым условием может являться необходимость размещения пункта экстренного обслуживания именно в населенном пункте. В этом случае решение задачи особой проблемы не представляет.
Если речь идет о размещении отделения милиции или пожарного депо, то решение вполне очевидно находится из матрицы кратчайших путей после умножения ее на вектор весов вершин. Для этого в каждой строке полученной матрицы находят максимальный элемент и затем выбирают ту строку, которая
241
содержит минимальный из найденных максимальных элементов. Вектор весов вершин в общем случае отражает вероятность потребности данного объекта (города) в соответствующем обслуживании (например, в скорой медицинской помощи). Такая вероятность чаще всего берется пропорционально численности населения каждого района.
Необходимо понимать, что если речь идет о размещении больницы, то оптимизируется время, необходимое для проезда машины скорой помощи в самый отдаленный район и обратно в больницу. По аналогии с рассмотренными определениями можно ввести понятие числа внешне-внутреннего разделения
sot (vi ) = max v j V [w j (d (v j ,vi ) + d (vi ,v j )] |
и соответственно |
внешне-внутреннего центра, т.е. вершины vot, на которой достигается минимум этого выражения.
НЕОБХОДИМЫЕ УТОЧНЕНИЯ
Однако в общем случае пункт обслуживания может размещаться на произвольном ребре графа, а не обязательно в вершине. В том случае, если поиск внутреннего и внешнего центров ведется без учета требования о совпадении точки с одной из вершин, то говорят о нахождении абсолютных центров (аналогично, внутренних, внешних или внешне-внутренних). Такую задачу можно решить при помощи алгоритма Хакими. Для простоты изложения рассмотрим случай, который моделируется при помощи неориентированного графа.
ОПИСАНИЕ АЛГОРИТМА
Основная идея Построив матрицу кратчайших путей между всеми парами
вершин, оценить радиус «сверху», предполагая, что абсолютный центр (пункт экстренного обслуживания) находится в одной из вершин. Далее пробовать размещать пункт обслуживания на ребрах графа. Для каждого ребра применить графический метод Хакими поиска оптимальной точки. Сравнить полученные значения и выбрать минимальное.
242

Возможные сложности Ребер много, и применять алгоритм ко всем – вряд ли
целесообразно. Как различить «перспективные» и «неперспективные» ребра? Возможно ли оценить, в каких пределах могут вообще получиться значения радиуса, если центр расположить на выбранном ребре. Если это возможно, то тогда можно будет сравнивать этот диапазон с оптимальным решением, найденным путем перебора вершин, или с уже найденными числами разделения для прочих ребер.
Способы преодоления
Пусть существуют три несовпадающие вершины i, j, k
(рис. 2.43.).
d[i, j] - ξ j
ξ
u*
i |
k |
Рис. 2.43. Выбор перспективных ребер
Если выбрать точку u* на ребре (i, j) на расстоянии ξ от вершины i (т.е. на расстоянии d[i, j] - ξ от вершины j), то расстояние от точки u* до k через вершину i равно d[u*, i, k]= ξ + d[i, k], а расстояние от u* до k через j равно d[u*, i, k]= d[i, j]- ξ+d[j, k]. Поскольку из этого пункта пожарные (милиция и т.д.) поедут по кратчайшей из двух дорог, то d[u*, k] = Min (ξ + d[i, k], d[i, j]- ξ + d[j, k]).
Поскольку ξ может изменяться в пределах от 0 до d[i, j], то первый член в операторе минимизации в самом лучшем случае будет равен d[i, k] (если ξ=0), а второй в самом лучшем случае будет равен d[j, k] (если ξ= d[i, j]). Отсюда получается "нижняя оценка" для d[u*,k], которая легко считается по матрице кратчайших путей v[u*,k] = maxk (min (d[i, k], d[j, k])).
243

Схема работы алгоритма показана на рис.2.44. |
|
|
|
Ввод матрицы S |
|
|
Заполнить матрицу |
|
|
кратчайших расстояний D |
|
|
В каждой строке матрицы D |
|
|
найти максимальный элемент |
|
|
Среди всех максимальных |
Верхняя граница |
|
элементов найти |
|
|
|
|
|
минимальный |
|
|
Берем ребро (i,j), для |
|
|
которого S≠∞ |
|
|
Берем вершину (k), не |
|
|
входящую в это ребро |
|
да |
нет |
|
|
d(i,k)>d(j,k) |
|
d(j,k) |
|
d(i,k) |
Массив tmp
Массив v(i,j): для каждого ребра в массиве tmp найти максимальный элемент
Рис. 2.44. Схема работы алгоритма размещения экстренных пунктов обслуживания (начало)
244

|
v*: минимум в массиве v(i,j) |
Нижняя граница |
|
«перспектив |
Запомнить ребро, |
|
|
ное» ребро |
которому принадлежит |
|
|
|
На этом ребре установить искомый |
|
|
|
экстренный пункт обслуживания |
|
|
Расстояние от этого пункта |
Расстояние от этого пункта |
||
до «свободной» вершины |
до «свободной» вершины |
||
через одну из вершин |
через другую вершину |
||
«перспективного» ребра (d1) |
«перспективного» ребра (d2) |
||
|
да |
нет |
|
|
d1<d2 |
|
|
|
d1 |
d2 |
|
|
Графически |
|
|
|
изобразить все d |
|
Найти максимальную огибающую, и на ней – минимум
Выбрать наилучший вариант
Рис. 2.44. Схема работы алгоритма размещения экстренных пунктов обслуживания (окончание)
245
Формальное описание алгоритма
Ввод:
S[i,j] – массив, содержащий значения из матрицы
смежности |
или |
иным |
способом |
рассчитанные |
расстояния между двумя объектами |
|
P[k] – массив с весами (или иными относительными характеристиками) объектов
Инициализация:
D[i,j] – массив содержащий найденные кратчайшие пути от i-ой вершины к j-ой, изначально совпадает с массивом S[i,j]
v[i,j] - массив содержащий оценки «снизу» для абсолютного центра графа в том случае, если центр располагается на ребре (i,j). Конечно, несколько неэкономно хранить оценки для ребер в двумерном массиве, но это наиболее простой способ запомнить помимо самой оценки еще и номера вершин, образующих это ребро. Заполнить чем-нибудь очень большим.
Dist_up[k] – массив |
содержащий расстояния от |
пункта обслуживания |
(расположенного в k-ом) |
объекте до самого удаленного объекта, заполнить
нулями. |
|
переменная |
для |
хранения |
minmax_old |
– |
|||
предпоследнего |
из |
лучших значений |
радиуса, в |
начале сделать равным чему-нибудь большому.
Общий шаг:
1.При помощи алгоритма Флойда-Уоршелла заполнить матрицу D[i,j]
2.Цикл по i от 1 до N
Цикл по j от 1 до N: если p[j]*D[i,j] >
dist_up[i] тогда dist_up[i]:= p[j]* d[i,j]
3. Ищем минимум в массиве dist_up[i] – это верхняя граница в общем случае или оптимум если пункт обслуживания ставится только в вершине сети.
value_up:= dist_up[1] result:=1
Цикл по j от 1 до N: если dist_up[i]<value_up тогда
246
value_up:= dist_up[i] result:=i
4.Цикл по i от 1 до N Цикл по j от 1 до N
Если s[i,j]< Б(аналог ∞ использованный при заполнении массива s) то
Цикл по k от 1 до N v_tmp[k]:= p[k]*min(d[i,k], d[j,k])
v[i,j]:=maxk(v_tmp[k])
5. Теперь в массиве v[i,j] содержатся нижние оценки для всех ребер графа. Рассматривать ребра, будем начиная с самого «перспективного ребра», причем ребра для которых v[i,j]>=value_up (т.е. для которых самое лучшее решение будет не меньше найденного вначале, при расположении пункта обслуживания в вершине) рассматривать не будем вообще. Итак, берем v*[i,j]=Mini,j(v[i,j]).
6. Чтобы потом не рассматривать это ребро снова, делаем значение радиуса заведомо большим v[i,j]:=Т
В цикле по k от 1 до N
d[v*,k]:= Min (ξ + d[i,k], d[i,j]- ξ +
d[j,k])
Если графически изобразить функцию зависимости
d[v*,k](по оси y) от ξ (по оси x), то для поиска максимальной функции надо взять верхнюю огибающую. Поскольку нужен минимум максимума этой функции, берем min на огибающей. По оси y получается некоторый minmax_new, при этом по оси x как раз
будет расстояние от точки i, т.е. ξ_New.
Запоминаем ребро: obj_new[1]:=i; obj_new[2]:=j; если minmax_new < minmax_old то minmax_old:= minmax_new;
ξ_old:= ξ_new; obj_old[1]:= obj_new[1]; obj_old[2]:= obj_new[2];
7.Теперь возвращаемся к нижним оценкам и
проверяем, есть ли надежда на лучшее значение, т.е.
v*[i,j]= mini,j(v[i,j]);
247

если v*[i,j]< minMax_old то повторяем шаг 6;
Вывод:
minmax_old - значение абсолютного радиуса (расстояние от места расположения пункта экстренного обслуживания до самого удаленного объекта);
obj_old[1], obj_old[2] – ребро, на котором будет располагаться абсолютный центр графа (пункт экстренного обслуживания);
ξ_old – расстояние от объекта obj_old[1] до места расположения абсолютного центра графа (пункта экстренного обслуживания).
ПРИМЕР
Имеются шесть населенных пунктов (рис.2.45.). Найти оптимальное расположение отделения милиции, если оно может находиться в любом произвольном месте сети (на дороге или в населенном пункте). Рассчитать время приезда наряда в самый отдаленный населенный пункт.
2 |
3 |
5 |
2 |
5 |
6 |
3 |
4 |
4 |
|
|
5 |
|||
|
|
|
|
|
|
|
|
7 |
6 |
1 |
|
|
|
|
|
|
|
|
Рис. 2.45. Схема расположения населенных пунктов
РЕШЕНИЕ ПРИМЕРА Ввод:
S[i,j] –матрица смежности
248
Таблица 2.31. Матрица S[i,j]
|
1 |
2 |
3 |
4 |
5 |
6 |
1 |
0 |
6 |
∞ |
∞ |
∞ |
7 |
2 |
6 |
0 |
2 |
∞ |
3 |
∞ |
3 |
∞ |
2 |
0 |
4 |
∞ |
∞ |
4 |
∞ |
∞ |
4 |
0 |
∞ |
5 |
5 |
∞ |
3 |
∞ |
∞ |
0 |
5 |
6 |
7 |
∞ |
∞ |
5 |
5 |
0 |
Инициализация:
D[i,j] – массив, содержащий кратчайшие пути от i-й вершины к j-й, изначально совпадает с массивом S[i,j] и заполнен с помощью алгоритма Флойда-Уоршелла (табл.2.32.)
v[i,j] – массив, содержащий оценки «снизу» для абсолютного центра графа в том случае, если центр располагается на ребре (i,j). Конечно, несколько неэкономно хранить оценки для ребер в двумерном массиве, но это наиболее простой способ запомнить помимо самой оценки еще и номера вершин, образующих это ребро. Заполнить чем-нибудь очень большим.
Таблица 2.32. Матрица D[i,j]
|
1 |
2 |
3 |
4 |
5 |
6 |
1 |
0 |
6 |
8 |
12 |
9 |
7 |
2 |
6 |
0 |
2 |
6 |
3 |
8 |
3 |
8 |
2 |
0 |
4 |
5 |
9 |
4 |
12 |
6 |
4 |
0 |
9 |
5 |
5 |
9 |
3 |
5 |
9 |
0 |
5 |
6 |
7 |
8 |
9 |
5 |
5 |
0 |
Dist_up[k] – массив, содержащий расстояния от пункта обслуживания (расположенного в k-м объекте) до самого удаленного объекта, заполнить нулями.
minmax_old – переменная для хранения предпоследнего из лучших значений радиуса.
Общий шаг:
1. При помощи алгоритма Флойда-Уоршелла заполнить матрицу
D[i,j].
249

2. Цикл по i от 1 до N
Цикл по j от 1 до N: если D[i,j] > dist_up[i] тогда dist_up[i]:=
D[i,j]
Таблица 2.33. Матрица Dist_up[i]
1 2 3 4 5 6 Dist_up[i] 12 8 9 12 9 9
3.Ищем минимум в массиве dist_up[i]: value_up:=8, result:=2.
4.Цикл по i от 1 до N
Цикл по j от 1 до N:
Если s[i,j]< ∞ то в цикле по k от 1 до N v_tmp[k]:= min(d[i,k], d[j,k]). i=1, j=2:
v_tmp[k]
Таблица 2.34. Матрица v_tmp[k]
v_tmp[k] |
1 |
2 |
3 |
4 |
5 |
6 |
0 |
0 |
2 |
6 |
3 |
7 |
v[1,2]:=Maxk(v_tmp[k])=7
аналогично по всем i и j
Таблица 2.35. Матрица v[i,j]
Ребро (i,j) |
(1,2) |
(1,6) |
(2,3) |
(2,5) |
(3,4) |
(4,6) |
(5,6) |
v[i,j] |
7 |
8 |
8 |
6 |
8 |
7 |
7 |
5.v*[i,j]:=Mini,j(v[i,j])=6 (для ребра 2,5 оно самое «перспективное»).
6.v[2,5]:=∞;
Вцикле по k от 1 до N
d[u,1]:= min (ξ+d[2,1], d[2,5]- ξ+d[5,1])= min (ξ+6, 12-ξ)= ξ+6.
Рассмотрим выражения, как функции от варьируемой переменной x. Первое выражение показано графически на рис. 2.46; второе значение на всем интервале изменения x больше первого, поэтому оно отбрасывается при выборе минимума. Аналогично получаем:
d[u,2]:= min (ξ, 6-ξ)=ξ; d[u,3]:= min (ξ+2, 8-ξ)= ξ+2; d[u,4]:= min (ξ+6, 12-ξ)= ξ+6; d[u,5]:= min (ξ+3, 3-ξ)= 3-ξ; d[u,6]:= min (ξ+8, 8-ξ)= 8-ξ.
250