
519_8_E92_2015_Efromeeva_E_V__Efromeev_N_M_Metody_issledovania_operatsiy_v_mashinostroenii_primery_zadachi_2-e_izdanie
.pdfНаходим целые части оптимального решения:
•227 = 0,
•6122 = 2.
Находим дробные части оптимального решения: |
|||
! 7 " = |
7 |
− 0 = |
7 , |
22 |
22 |
|
22 |
61 |
61 |
− 2 = |
17 |
!22" = |
22 |
22. |
Выбираем (произвольно) переменную %&. |
|
|
|
|
|
|
|
|
|||||||
Вводим дополнительное ограничение целочисленности: |
|
|
|||||||||||||
|
|
|
1 |
5 |
|
|
|
17 |
|
|
|
|
|
|
|
|
|
|
0%& + 22 %' + 22 %( |
≥ 22 |
|
|
|
|
|
||||||
|
|
|
1 |
|
5 |
|
|
|
17 |
|
|
|
|
|
|
|
|
|
22 %' + |
22 %( − *- = |
22 |
|
|
|
|
|
|
||||
Добавляем это ограничение к симплекс-таблице и получаем. |
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Базис |
/3 |
|
/4 |
|
/8 |
|
|
|
/9 |
|
:3 |
|
|
Св.чл. |
|
/3 |
1 |
|
0 |
|
3/22 |
|
|
|
-7/22 |
|
0 |
|
|
7/22 |
|
|
|
|
|
|
|
|
|
|
|
||||||
/4 |
0 |
|
1 |
|
1/22 |
|
|
|
5/22 |
|
0 |
|
|
61/22 |
|
|
|
|
|
|
|
|
|
|
|
||||||
:3 |
0 |
|
0 |
|
-1/22 |
|
|
|
-5/22 |
|
1 |
|
|
- 17/22 |
|
z |
0 |
|
0 |
|
5/22 |
|
|
|
3/22 |
|
0 |
|
|
129/22 |
|
Таблица представляет оптимальное, но недопустимое решение. Для восстановления допустимости необходимо применить двойственный симплекс- метод (п. 6.4.1).
Базис |
• |
•! |
•" |
•# |
$ |
Св.чл. |
• |
1 |
0 |
1/5 |
0 |
-7/5 |
7/5 |
|
|
|
|
|
|
|
•! |
0 |
1 |
0 |
0 |
1 |
2 |
•# |
0 |
0 |
1/5 |
1 |
-22/5 |
17/5 |
z |
0 |
0 |
1/5 |
0 |
3/5 |
27/5 |
Получили нецелочисленное решение: &' = () ; &* = 2; + = *() ;
Находим целые части оптимального решения:
,75- = 1,
•275 = 5.
161
Находим дробные части оптимального7 решения:
•5 = 75 − 1 = 25,
•275 = 275 − 5 = 25.
Выбираем (произвольно) переменную.
Вводим дополнительное ограничение целочисленности:
0#$ + 15 #% + 35 &$ ≥ 25, 15 #% + 35 &$ − &( = 25.
Далее, добавляем данное ограничение к симплекс-таблице:
Базис |
• |
•! |
•" |
•# |
$ |
$! |
Св.чл. |
• |
1 |
0 |
1/5 |
0 |
-7/5 |
0 |
1 2/5 |
•! |
0 |
1 |
0 |
0 |
1 |
0 |
2 |
•# |
0 |
0 |
1/5 |
1 |
-22/5 |
0 |
3 2/5 |
$! |
0 |
0 |
- 1/5 |
0 |
3/5 |
1 |
-2/5 |
z |
0 |
0 |
1/5 |
0 |
3/5 |
0 |
5 2/5 |
Таблица представляет оптимальное, но недопустимое решение. Для восстановления допустимости необходимо применить двойственный симплекс- метод.
|
Базис |
|
• |
•! |
|
•" |
•# |
$ |
|
|
$! |
Св.чл. |
|
|
• |
|
|
1 |
0 |
|
0 |
0 |
-2 |
|
|
1 |
1 |
|
|
|
|
|
|
|
|||||||
|
•! |
|
|
0 |
1 |
|
0 |
0 |
1 |
|
|
0 |
2 |
|
|
|
|
|
|
|
|||||||
|
•# |
|
|
0 |
0 |
|
0 |
1 |
-5 |
|
|
1 |
3 |
|
|
|
|
|
|
|
|||||||
|
$! |
|
|
0 |
0 |
|
1 |
0 |
3 |
|
|
-5 |
2 |
|
z |
|
|
0 |
0 |
|
0 |
0 |
0 |
|
|
1 |
5 |
Оптимальное решение целочисленно: &' = 1; &( = 2; ) = |
5; |
|
|
||||||||||
Ответ: &' |
= 1; |
&( = 2; ) = |
5. |
|
|
|
|
|
|
|
162
9.4.Задача коммивояжера
В1859 г. У. Гамильтон придумал игру «Кругосветное путешествие», состоящую в отыскании такого пути, проходящего через все вершины (города, пункты назначения) графа, чтобы посетить каждую вершину однократно и возвратиться в исходную.
Для решения этой задачи необходимо ввести ряд определений: Эйлеров цикл – цикл в графе, содержащий каждое ребро один раз.
Гамильтонов цикл – цикл в графе, содержащий каждую вершину один
раз.
Граф может быть и эйлеровым, и гамильтоновым, или одним из них, или ни тем ни другим.
Теорема Эйлера: граф является эйлеровым тогда и только тогда, когда он связан и все его локальные степени четны.
Существует теорема о процедуре построения эйлеровой цепи. Пусть G -
эйлеров граф. Тогда следующая процедура всегда возможна и приводит к построению эйлеровой цепи графа G:
выходя из произвольной вершины, идем по ребрам графа произвольным образом, соблюдая следующие правила:
•стираем ребра по мере их прохождения (вместе с изолированными вершинами, которые при этом образуются);
•на каждом этапе идем по ребру, удаление которого нарушает связность, только в том случае, когда нет других возможностей.
Теорема Дирака: если в простом графе с n вершинами локальная степень каждой вершины не менее n/2, то граф является гамильтоновым.
С понятием гамильтоновых циклов тесно связана так называемая задача коммивояжера: коммивояжер (бродячий торговец) должен2, 3, .выйти. . , из первого города, посетить по разу в неизвестном порядке города и вернуться в первый город. Расстояния между городами известны. В каком порядке следует обходить города, чтобы замкнутый путь (тур) коммивояжера был кратчайшим?
Задача коммивояжера является одной из знаменитых задач теории комбинаторики. Она была поставлена в 1934 году, и об неё, как об Великую теорему Ферма обламывали зубы лучшие математики. В своей области (оптимизации дискретных задач) задача коммивояжера служит своеобразным полигоном, на котором испытываются всё новые методы.
Существуют различные методы решения и вариации данной задачи. Помимо сложных математических методов (метод ветвей и границ, метод отсекающих плоскостей) есть более простой способ решения – алгоритм Дейкстры.
На практике применяются различные модификации самых эффективных методов: метод ветвей и границ и метод генетических алгоритмов, а также алгоритм муравьиной колонии.
163

9.4.1. Применение метода ветвей и границ для решения задачи коммивояжера
Вначале алгоритм метода ветвей и границ применяется к задаче о назначениях, соответствующей данной задаче коммивояжера. Если полученное оптимальное решение образует полный цикл, то на этом вычисления заканчиваются. В противном случае в задачу необходимо ввести ограничения, удаляющие частичные циклы (достаточно исключить только один частный цикл). Это создает ряд подзадач, которых в общем случае столько же, сколько переменных образуют один частичный цикл.
Пример.
В следующей матрице записаны расстояния между 5 городами задачи
коммивояжера. |
∞ |
7 |
2 |
9 |
7 |
|
|
|
|||||
|
5 |
∞ |
3 |
9 |
1 |
|
• = |
4 |
8 |
∞ |
5 |
3 |
|
5 |
6 |
4 |
∞ |
7 |
|
|
|
7 |
6 |
3 |
7 |
∞ |
|
|
|
|
|
|
|
Решение начальной задачи о назначениях следующее:
1
1
1
1
' = 19, ()*+ = 1, )+- = 1, )-* = 1 ), (1)0: = 1, ):0 = 1).
Это решение порождает два частичных цикла (1-3-4-1) и (2-5-2). Применяя метод ветвей и границ, получим следующее дерево решений (рис. 47).
Чтобы исключить частичные циклы в задаче узла 1, надо разбить )эти частичные циклы путем принудительного приравнивания переменных <>,
задающих эти циклы, нулю. Частичный цикл 1-3-4-1 можно разбить, если |
|||||
положить |
)*+ = 0, |
)+- = 0 |
или |
)-* = 0 |
(одновременно только одну |
переменную).)Аналогично= 0 ) частичный= 0 цикл 2-5-2 можно разбить, если ввести ограничения 0: или :0 . Каждое из подобных ограничений порождает отдельную ветвь дерева подзадач.
Оптимальным циклом будет цикл 1-3-4-2-5-1 с длинной 21.
164

1
w=19 (1-3-4-1)(2-5-2)
2 |
5 |
|
|
|
|
w=20 |
|
w=23 |
(1-3-1)(2-5-4-2) |
|
(1-3-5-4-2-1) |
|
|
|
3 |
4 |
|
|
|
|
w=23 |
|
w=21 |
(1-4-2-5-3-1) |
|
(1-3-4-2-5-1) |
|
|
|
Рис. 47
9.4.2. Алгоритм Дейкстры
Алгоритм Дейкстры (Dijkstra’s algorithm) — алгоритм на графах, изобретённый нидерландским ученым Дейкстрой в 1959 году. Находит кратчайшее расстояние от одной из вершин графа до всех остальных. Алгоритм работает только для графов без рёбер отрицательного веса. Алгоритм широко применяется в программировании и технологиях, например, его использует протокол OSPF для устранения кольцевых маршрутов.
Постановка задачи может различаться, например, нахождение пути между пунктами по наименьшему расстоянию до каждого, или, например, по
минимальным затратам на проезд до каждого пункта. |
|
|
|
|
|
|
|
|||||||||
Алгоритм использует три массива из |
|
|
(= числу вершин сети) чисел |
|||||||||||||
каждый. Первый массив |
содержит метки с |
двумя значениями: 0 (вершина ещё |
||||||||||||||
|
• |
|
|
|
|
|
|
|
|
|||||||
не рассмотрена) и 1 (вершина уже рассмотрена); второй массив ! содержит |
||||||||||||||||
расстояния |
– текущие |
кратчайшие расстояния от " |
до |
соответствующей |
||||||||||||
вершины; третий массив c содержит номера вершин #– |
|
-й элемент %& |
есть |
|||||||||||||
номер предпоследней вершины на текущем |
|
кратчайшем |
|
пути из |
" |
в |
"& |
. |
||||||||
|
|
$ |
|
|
|
|
||||||||||
Матрица расстояний ' |
задаёт длины дуг |
|
|
••; если такой дуги нет,# |
то |
|
|
|||||||||
присваивается большое#&число , равное |
«машинной бесконечности». Такое |
|||||||||||||||
|
|
( |
|
|
|
|
|
|
|
•• |
||||||
описание |
алгоритма |
используется при решении этой задачи, если ее |
||||||||||||||
|
! |
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
165 |
|
|
|
|
|
|
|
|
|
|
|
|

программируют на компьютере, на каждом этапе определенные элементы массивов меняются.
Для выполнения алгоритма нужно раз просмотреть массив из |
|
элементов, |
||
т.е. алгоритм Дейкстры имеет |
квадратичную сложность. Но некоторые города |
|||
• |
|
• |
|
|
могут и не соединяться между собой. |
|
|
|
|
Каждой вершине из ! |
сопоставим метку — |
минимальное |
известное |
расстояние от этой вершины до ". Алгоритм работает пошагово — на каждом шаге он «посещает» одну вершину и пытается уменьшать метки. Работа алгоритма завершается, когда все вершины посещены.
Метка самой вершины |
|
полагается равной |
|
, метки |
остальных |
||
вершин — бесконечности. Это |
отражает то, что расстояния от |
|
до других |
||||
• |
|
0 |
|
непосещённые. |
|||
вершин пока неизвестны. Все вершины графа помечаются как |
|
• |
|
||||
Если все вершины посещены, алгоритм завершается. В противном случае, |
из ещё не посещённых вершин выбирается вершина , имеющая минимальную
метку. Мы рассматриваем всевозможные маршруты, в |
которых |
является |
предпоследним пунктом. Вершины, в которые ведут |
рёбра из |
, назовем |
соседями этой вершины. Для каждого соседа вершины |
, кроме отмеченных |
как посещённые, рассмотрим новую длину пути, равную сумме значений текущей метки и длины ребра, соединяющего с этим соседом. Если полученное значение длины меньше значения метки соседа, заменим значение метки полученным значением длины. Рассмотрев всех соседей, пометим вершину как посещенную и повторим шаг алгоритма.
Пример.
Требуется найти кратчайшие расстояния от 1-й вершины до всех остальных.
Кружками обозначены вершины, линиями — пути между ними (ребра графа). В кружках обозначены номера вершин, над ребрами обозначена их «цена» — длина пути. Рядом с каждой вершиной обозначена метка — длина кратчайшего пути в эту вершину из вершины 1.
166

Первый шаг. Минимальную метку имеет вершина 1. Её соседями являются вершины 2, 3 и 6.
Первый по очереди сосед вершины 1 — вершина 2, потому что длина пути до неё минимальна. Длина пути в неё через вершину 1 равна сумме кратчайшего расстояния до вершины 1, значению её метки, и длины ребра, идущего из 1-й в 2-ю, то есть 0 + 7 = 7. Это меньше текущей метки вершины 2, бесконечности, поэтому новая метка 2-й вершины равна 7.
Аналогичную операцию проделываем с двумя другими соседями 1-й вершины — 3-й и 6-й.
167

Все соседи вершины 1 проверены. Текущее минимальное расстояние до вершины 1 считается окончательным и пересмотру не подлежит (то, что это действительно так, впервые доказал Дейкстра). Вычеркнем её из графа, чтобы отметить, что эта вершина посещена.
Второй шаг. Шаг алгоритма повторяется. Снова находим «ближайшую» из непосещенных вершин. Это вершина 2 с меткой 7.
Соседями вершины 2 являются вершины 1, 3 и 4. Первый (по порядку) сосед вершины 2 — вершина 1. Но она уже посещена, поэтому с 1-й вершиной ничего не делаем.
168

Следующий сосед вершины 2 — вершина 3, так как имеет минимальную метку из вершин, отмеченных как не посещённые. Если идти в неё через 2, то длина такого пути будет равна 17 (7 + 10 = 17). Но текущая метка третьей вершины равна 9<17, поэтому метка не меняется.
Ещё один сосед вершины 2 — вершина 4. Если идти в неё через 2-ю, то длина такого пути будет равна сумме кратчайшего расстояния до 2-й вершины и22расстояния между вершинами 2 и 4, то есть 22 (7 + 15 = 22). Поскольку
< ∞, устанавливаем метку вершины 4 равной 22.
Все соседи вершины 2 просмотрены, замораживаем расстояние до неё и помечаем её как посещенную.
169

Третий шаг. Повторяем шаг алгоритма, выбрав вершину 3. После её «обработки» получим такие результаты:
Дальнейшие шаги. Повторяем шаг алгоритма для оставшихся вершин. Это будут вершины 6, 4 и 5, соответственно порядку.
Завершение выполнения алгоритма. Алгоритм заканчивает работу, когда вычеркнуты все вершины. Результат его работы виден на последнем рисунке: кратчайший путь от вершины 1 до 2-й составляет 7, до 3-й — 9, до 4-й — 20, до 5-й — 20, до 6-й — 11.
170