- •Предисловие
- •Введение
- •Глава 1. Линейное программирование
- •1.1. Постановка задач линейного программирования
- •1.2. Графический метод решения задач линейного программирования
- •1.3. Графический анализ на чувствительность
- •1.4. Симплекс-метод
- •1.5. Двойственность в задачах линейного программирования
- •Правила построения двойственной задачи
- •Пример 1
- •В матричном виде
- •1.6. Задачи для самостоятельно решения
- •Глава 2. Транспортная задача
- •2.1. Постановка транспортной задачи
- •2.2. Нахождение начального допустимого плана
- •2.3. Метод потенциалов для сбалансированной задачи
- •2.5. Вырожденный план
- •2.4. Задачи для самостоятельного решения
- •Глава 3. Целочисленное программирование
- •Задача о назначении
- •Задача коммивояжера
- •Задачи для самостоятельного решения
- •Глава 4. Нелинейное программирование
- •Основные понятия
- •Постановки задачи нелинейного программирования
- •Задача выпуклого программирования
- •Метод кусочно-линейной аппроксимации
- •Глава 5. Принятие решений в условиях неполной информации
- •5.1. Принятие решений в условиях стохастической неопределенности
- •5.2. Принятие решений в условиях риска
- •5.3. Метод дерева решений
- •Список литературы
- •Оглавление
Задача коммивояжера
Имеется
городов, занумерованных числами от 1 до
.
Коммивояжер, выезжая из города 1, должен
побывать в каждом городе ровно один раз
и вернуться в исходный пункт. Известны
расстояния между городами:
,
где
.
Требуется найти самый короткий (дешевый) маршрут.
Математическая модель имеет вид:
Найти
минимум целевой функции
,
где
— элементы матрицы расстояний (стоимостей
переходов между городами):
,
при заданных ограничениях:
(1)
(2)
где
— искомые переменные, могут принимать
значения только 0 или 1:
|
|
если
в маршрут входит переезд из
в противном случае. |
(3) |
Ограничения
(1)
(3)
отражают требования однократного въезда
и выезда из каждого города, но полностью
не описывают допустимые маршруты.
Диагональные
элементы матрицы
,
что означает запрет на переход
.
При численной реализации их полагают
равными достаточно большому числу.
Заметим,
что в общем случае
,
хотя обычно решают задачи с симметричной
матрицей
.
На практике для решения задачи коммивояжера используется метод ветвей и границ, обладающий эффективным алгоритмом. Этот метод можно использовать для решения вручную задач небольшой размерности.
Реализация метода ветвей и границ в применении к задачи коммивояжера включает два основных момента: использование приведенных матриц и алгоритм разбиения маршрута на подмаршруты.
Для
задачи коммивояжера, так же как для
транспортной задачи и задачи о назначениях,
операция преобразования исходной
матрицы
,
заключающаяся в прибавлении или отнимании
постоянных величин
,
по строкам и
по столбцам не меняет экстремальных
свойств задачи,
.
Такая операция называется приведением матрицы, константы
и
называют приводящими константами, а
полученная в результате матрица —приведенной
матрицей.
Рассмотрим решение задачи на конкретном примере.
Пример 1. Решите задачу о коммивояжере с матрицей стоимости переходов:
.
Метод является итерационным, на каждом шаге производится ветвление маршрута, обеспечивающее оптимальную стратегию.
Итерация 0. Вычисление начальной оценки маршрута.
Операция
приведения.
Для вычисления нижней границы величины
затрат на любой допустимый маршрут для
заданной матрицы
используется операция приведения.
Для
удобства запишем матрицу
в виде таблицы, с указанием номеров
строк и столбцов. Найдем приведенные
константы
по строкам, они равны минимальному
элементу в соответствующей строке.
|
|
1 |
2 |
3 |
4 |
5 |
6 |
|
|
1 |
|
45 |
35 |
41 |
42 |
22 |
22 |
|
2 |
20 |
|
33 |
16 |
20 |
47 |
16 |
|
3 |
40 |
34 |
|
20 |
17 |
24 |
17 |
|
4 |
14 |
31 |
10 |
|
13 |
46 |
10 |
|
5 |
20 |
37 |
11 |
32 |
|
36 |
11 |
|
6 |
13 |
10 |
31 |
18 |
24 |
|
10 |
Вычтем эти константы из элементов соответствующих строк:
|
|
1 |
2 |
3 |
4 |
5 |
6 |
|
1 |
|
23 |
13 |
19 |
20 |
0 |
|
2 |
4 |
|
17 |
0 |
4 |
31 |
|
3 |
23 |
17 |
|
3 |
0 |
7 |
|
4 |
4 |
21 |
0 |
|
3 |
36 |
|
5 |
9 |
26 |
0 |
21 |
|
25 |
|
6 |
3 |
0 |
21 |
8 |
14 |
|
Теперь
найдем приведенные константы
по столбцам:
|
|
1 |
2 |
3 |
4 |
5 |
6 |
|
1 |
|
23 |
13 |
19 |
20 |
0 |
|
2 |
4 |
|
17 |
0 |
4 |
31 |
|
3 |
23 |
17 |
|
3 |
0 |
7 |
|
4 |
4 |
21 |
0 |
|
3 |
36 |
|
5 |
9 |
26 |
0 |
21 |
|
25 |
|
6 |
3 |
0 |
21 |
8 |
14 |
|
|
|
3 |
0 |
0 |
0 |
0 |
0 |
Вычтем
константы из элементов соответствующих
столбцов, получим «приведенную» таблицу
3.1., обозначим ее
:
Таблица
3.1. Приведенная таблица
![]()
|
|
1 |
2 |
3 |
4 |
5 |
6 |
|
1 |
|
23 |
13 |
19 |
20 |
0 |
|
2 |
1 |
|
17 |
0 |
4 |
31 |
|
3 |
20 |
17 |
|
3 |
0 |
7 |
|
4 |
1 |
21 |
0 |
|
3 |
36 |
|
5 |
6 |
26 |
0 |
21 |
|
25 |
|
6 |
0 |
0 |
21 |
8 |
14 |
|
Оценка
маршрута.
Рассчитаем
— нижнюю границу величины затрат на
любой допустимый маршрут:
![]()
![]()
.
Далее решение состоит из последовательности итераций, на каждой из которых выбирается очередной переход из одного города в другой.
Итерация 1. Ветвление маршрута. Выбор первого перехода.
Оценка
переходов.
На входе имеем приведенную матрицу
.
Множество возможных маршрутов
,
соответствующих текущей приведенной
матрице, делится на два подмаршрута
относительно некоторого выбранного
перехода из города
в город
,
обозначим его
.
В маршрут
обязательно входит выбранный переход
,
в маршрут
этот переход не входит.
На
нулевой итерации в качестве перехода
можно взять любой из переходов, для
которого соответствующий элемент
приведенной матрицы
,
то есть «приведенная» стоимость перехода
равна нулю.
Рассмотрим
эти переходы, построенные на основе
приведенной таблицы 3.1. и проведем их
оценку. Для каждого такого перехода
оценка вычисляется
,
где
равен наименьшему из элементов в строке
,
не считая элемента на позиции
,
а
равен наименьшему из элементов в столбце
,
не считая элемента на позиции
.
Например,
,
,
,
и так далее. Результаты расчетов приведены
в таб. 3.2.
|
Таблица
3.2. Оценки переходов для матрицы
| |||||||
|
Переходы |
(1;6) |
(2;4) |
(3;5) |
(4;3) |
(5;3) |
(6;1) |
(6;2) |
|
Оценки |
20 |
4 |
6 |
1 |
6 |
1 |
17 |
Максимальная
из оценок получена для перехода
,
который будет являться точкой ветвления
маршрута. Эта точка делит все множество
маршрутов на два подмножества
,
маршрут
включает переход
,
а
не включает, такой переход назовем
«запрещенным» для маршрута
.
Оценка
маршрутов.
Следующий шаг — необходимо оценить
маршруты
,
и выбрать из них с меньшей оценкой.
Прежде
всего, заметим, что фиксируя некоторый
переход
для маршрута, нужно не допустить
образования цепочек переходов, которые
приводят к зацикливанию, то есть
прохождению некоторых городов несколько
раз. Поэтому нужно обязательно запретить
обратный переход
.
Кроме этого могут возникать и другие
«запрещенные» маршруты.
Оценка
.
Маршрут включает переход
,
значит, переход
должен быть запрещен. Других запрещенных
переходов нет. Такому маршруту будет
соответствовать матрица
,
полученная из
путем :
вычеркивания элемента
,
то есть 1-ой строки и 6-ого столбца;запрета перехода
,
для этого элемент полагают равным
бесконечно большому числу
:
|
|
1 |
2 |
3 |
4 |
5 |
|
2 |
1 |
|
17 |
0 |
4 |
|
3 |
20 |
17 |
|
3 |
0 |
|
4 |
1 |
21 |
0 |
|
3 |
|
5 |
6 |
26 |
0 |
21 |
|
|
6 |
|
0 |
21 |
8 |
14 |
Оценка маршрута, который описывается полученной матрицей, осуществляется по уже известному алгоритму, используя операцию приведения. Эта матрица уже имеет нули во всех строках, значит:
![]()
нули есть и во всех столбцах, кроме первого, в котором минимальный элемент равен 1, следовательно:
![]()
Полная
оценка подмаршрута
:
.
Приведенная
матрица
приведена
в таблице 3.3.
Таблица
3.3. Приведенная матрица
![]()
|
|
1 |
2 |
3 |
4 |
5 |
|
2 |
0 |
|
17 |
0 |
4 |
|
3 |
19 |
17 |
|
3 |
0 |
|
4 |
0 |
21 |
0 |
|
3 |
|
5 |
5 |
26 |
0 |
21 |
|
|
6 |
|
0 |
21 |
8 |
14 |
Оценка
.
Подмаршрут не включает переход
,
значит, его нужно запретить. Такому
подмаршруту будет соответствовать
матрица
,в
которой:
элемент
,
что и означает запрет перехода
.
|
|
1 |
2 |
3 |
4 |
5 |
6 |
|
1 |
|
23 |
13 |
19 |
20 |
|
|
2 |
1 |
|
17 |
0 |
4 |
31 |
|
3 |
20 |
17 |
|
3 |
0 |
7 |
|
4 |
1 |
21 |
0 |
|
3 |
36 |
|
5 |
6 |
26 |
0 |
21 |
|
25 |
|
6 |
0 |
0 |
21 |
8 |
14 |
|
Оценка маршрута, который описывается полученной матрицей, осуществляется по уже известному алгоритму, используя операцию приведения. Эта матрица уже имеет нули во всех строках, кроме первой, минимальный элемент которой равен 13, значит, сумма приведенных констант по строкам равна:
![]()
нули есть и во всех столбцах, кроме последнего, в котором минимальный элемент равен 7, следовательно, сумма приведенных констант по столбцам равна:
![]()
Полная
оценка подмаршрута
:
.
Выбор подмаршрута.
Сравним
оценки. Выбираем маршрут с меньшей
оценкой, это будет
,
так как
<
(
).
Итерация 2. Выбор второго перехода.
Получен
первый переход
,
выберем второй.
Исходная
матрица для расчетов получена на итерации
1, приведенная матрица
:
|
|
1 |
2 |
3 |
4 |
5 |
|
2 |
0 |
|
17 |
0 |
4 |
|
3 |
19 |
17 |
|
3 |
0 |
|
4 |
0 |
21 |
0 |
|
3 |
|
5 |
5 |
26 |
0 |
21 |
|
|
6 |
|
0 |
21 |
8 |
14 |
Повторим все шаги, проделанные на итерации 1.
Оценка переходов.
Не
будем здесь останавливаться на подробных
расчетах, приведем только таблицу оценок
переходов для матрицы
.
|
Таблица
3.4.
Оценки переходов для матрицы
| |||||||
|
Переходы |
(2;1) |
(2;4) |
(3;5) |
(4;1) |
(4;3) |
(53) |
(6;2) |
|
Оценки |
0 |
3 |
6 |
0 |
0 |
5 |
25 |
Максимальная
из оценок получена для перехода
,
который будет являться точкой ветвления
маршрута. Эта точка делит все множество
маршрутов на два подмаршрута
,
маршрут
включает переход
,
а
не включает.
Оценка
.
Подмаршрут включает переход
.
Таким образом, с учетом первой итерации
имеем
.
Укажем переходы, которые нужно запретить
для предотвращения зацикливания.
Во-первых, так как мы включили в маршрут
,
переход
нужно запретить, в данном случае
это уже учтено, так как на первой итерации
6-столбец уже был исключен. Во-вторых,
нужно запретить также переход
.
Таким
образом, подмаршруту будет соответствовать
матрица
,в
которой:
вычеркнут элемент
,
т.е. 6-я строка и 2-ой столбец;элемент
,
что означает запрет перехода
.
|
|
1 |
3 |
4 |
5 |
|
2 |
|
17 |
0 |
4 |
|
3 |
19 |
|
3 |
0 |
|
4 |
0 |
0 |
|
3 |
|
5 |
5 |
0 |
21 |
|
После
этого полученная матрица, обозначим ее
,содержит
нуль в каждой строке и каждом столбце,
следовательно, оценка в целом подмаршрута
совпадает с оценкой маршрута на предыдущей
итерации.
![]()
Оценка
.
Подмаршрут не включает переход
.
Таким
образом, подмаршруту
будет соответствовать матрица
,
в которой:
элемент
,
что означает запрет перехода
.
|
|
1 |
2 |
3 |
4 |
5 |
|
2 |
0 |
|
17 |
0 |
4 |
|
3 |
19 |
17 |
|
3 |
0 |
|
4 |
0 |
21 |
0 |
|
3 |
|
5 |
5 |
26 |
0 |
21 |
|
|
6 |
|
|
21 |
8 |
14 |
Эта матрица уже имеет нули во всех строках, кроме 6-ой, минимальный элемент которой равен 8. Значит, сумма приведенных констант по строкам равна:
![]()
нули есть и во всех столбцах, кроме 2-го, в котором минимальный элемент равен 17, следовательно, сумма приведенных констант по столбцам равна:
![]()
Полная
оценка подмаршрута
:
.
Выбор подмаршрута.
Сравним
оценки. Выбираем маршрут с меньшей
оценкой, это будет
,
так как
<
(
).
Итерация 3. Выбор третьего перехода.
Получен
маршрут
,
,
в котором исключены переходы
,
,
.
Найдем
третий переход. Исходная матрица для
расчетов получена на итерации 2, это —
приведенная матрица
.
Повторим все шаги, проделанные на итерации 1.
|
|
1 |
3 |
4 |
5 |
|
2 |
|
17 |
0 |
4 |
|
3 |
19 |
|
3 |
0 |
|
4 |
0 |
0 |
|
3 |
|
5 |
5 |
0 |
21 |
|
Оценка переходов.
Приведем
таблицу оценок переходов для матрицы
.
Таблица
3.5. Оценки переходов для матрицы
![]()
|
Переходы |
(2;4) |
(3;5) |
(4;1) |
(4;3) |
(53) |
|
Оценки |
7 |
6 |
5 |
0 |
5 |
Максимальная
из оценок получена для перехода
,
который будет являться точкой ветвления
маршрута. Эта точка делит все множество
маршрутов на два подмаршрута
,
маршрут
включает переход
а
не включает.
Оценка
.
Подмаршрут включает переход
.
Таким образом, с учетом первой итерации
имеем
.
Укажем переходы, которые нужно запретить
для предотвращения зацикливания.
Во-первых, так как мы включили в маршрут
,
переход
нужно запретить, в данном случае это
уже учтено, так как на первой итерации
4-столбец уже был исключен. Во-вторых,
нужно запретить также переход
.
Таким
образом, подмаршруту будет соответствовать
матрица
,
в которой:
1) вычеркнут
элемент
,
то есть 2-я строка и 4-ой столбец;
2) элемент
,
что и означает запрет перехода
.
Обозначим
эту матрицу
:
|
|
1 |
3 |
5 |
|
3 |
19 |
|
0 |
|
4 |
|
0 |
3 |
|
5 |
5 |
0 |
|
Найдем
приведенную матрицу,
содержит
нуль в каждой строке, следовательно,
сумма приведенных констант по строкам
равна:
,
нули
есть и во всех столбцах, кроме 1-го, в
котором минимальный элемент равен 5,
следовательно, сумма приведенных
констант по столбцам равна:
.
Полная
оценка подмаршрута
:
![]()
.
Приведенная
матрица
:
|
|
1 |
3 |
5 |
|
3 |
14 |
|
0 |
|
4 |
|
0 |
3 |
|
5 |
0 |
0 |
|
Приведенная
матрица
,оценка
в целом подмаршрута
совпадает с оценкой маршрута на предыдущей
итерации.
![]()
Оценка
.
Подмаршрут не включает переход
.
Таким
образом, подмаршруту
будет соответствовать матрица
,в
которой элемент
,
что и означает запрет перехода
:
|
|
1 |
2 |
3 |
4 |
5 |
|
2 |
0 |
|
17 |
0 |
4 |
|
3 |
19 |
17 |
|
3 |
0 |
|
4 |
0 |
21 |
0 |
|
3 |
|
5 |
5 |
26 |
0 |
21 |
|
|
6 |
|
|
21 |
8 |
14 |
Эта матрица уже имеет нули во всех строках, кроме 6-ой, минимальный элемент которой равен 8, значит, сумма приведенных констант по строкам равна:
![]()
нули есть и во всех столбцах, кроме2-го, в котором минимальный элемент равен 17, следовательно, сумма приведенных констант по столбцам равна:
![]()
Полная
оценка подмаршрута
:
.
Выбор подмаршрута.
Сравним
оценки. Выбираем маршрут с меньшей
оценкой, это будет
,
так как
<
(
).

