 
                                 
					
Дискретная оптимизация и моделирование в условиях неопределенности данных
Перепелица В. А., Тебуева Ф. Б.,
В основе метода динамического программирования лежит простая идея осуществления сравнения различных вариантов допустимых решений задачи (по значению целевой функции) не в конце построения множества всех возможных вариантов, а на каждом шаге построения возможных вариантов [16], [35]. Применительно к задаче коммивояжера содержание работы алгоритма на  -ом шаге,
-ом шаге,  состоит в том, что имеющиеся пути коммивояжера “длины
 состоит в том, что имеющиеся пути коммивояжера “длины  ” (т.е. проходящие через
” (т.е. проходящие через  вершин) удлиняем на единицу, т.е. получаем пути, проходящие через
 вершин) удлиняем на единицу, т.е. получаем пути, проходящие через  вершин.
 вершин.
Пусть нам задан  -вершинный граф
-вершинный граф  , в котором вершины перенумерованы индексом
, в котором вершины перенумерованы индексом  ;
;  ,
,  ,
,  – матрица длин, т.е. весов
 – матрица длин, т.е. весов  дуг
 дуг  . Так как искомый гамильтонов контур есть замкнутый путь, то, не умаляя общности, можно считать, что начальной является вершина 0.
. Так как искомый гамильтонов контур есть замкнутый путь, то, не умаляя общности, можно считать, что начальной является вершина 0.
Пусть дан оптимальный путь коммивояжера  . Рассмотрим в
. Рассмотрим в  отрезок пути, начинающийся в 0 и заканчивающийся вершиной
 отрезок пути, начинающийся в 0 и заканчивающийся вершиной  :
:  ; этот путь содержит
; этот путь содержит  промежуточных вершин. Очевидно, что так как
 промежуточных вершин. Очевидно, что так как  – минимальный гамильтонов контур, то его часть
 – минимальный гамильтонов контур, то его часть  , соединяющая вершины 0 и
, соединяющая вершины 0 и  и проходящая в некотором порядке через вершины
 и проходящая в некотором порядке через вершины  должна иметь минимальную длину. Введем обозначение
 должна иметь минимальную длину. Введем обозначение
  (3.29)
(3.29)
– длина пути минимальной длины, соединяющего вершины 0 и  и проходящего один и только один раз через каждую из
 и проходящего один и только один раз через каждую из  вершин
 вершин  .
.
В обозначениях (3.29) общий принцип оптимальности в теории динамического программирования [16] применительно к задаче коммивояжера имеет следующий вид:
  (3.30)
(3.30)
Здесь уместно напомнить, что функция (3.29) симметрична по аргументам  , т.е. не изменяется при любой их перестановке.
, т.е. не изменяется при любой их перестановке.
Перейдем непосредственно к изложению алгоритма.
Шаг 0. Вычисляем функцию
  ,
,  , если дуга
, если дуга  ,(3.31)
,(3.31)
Æ – пустое множество. Запоминаем все  значений этой функции.
 значений этой функции.
Шаг 1. Вычисляем функцию
  (3.32)
(3.32)
 ,
,  .
.
Запоминаем все  значений функции (3.32), после чего вычеркиваем из памяти таблицу значений функции (3.31).
 значений функции (3.32), после чего вычеркиваем из памяти таблицу значений функции (3.31).
Шаг  (
 ( ). Для всех
). Для всех  и всех
 и всех  наборов
 наборов  вычисляем функцию
 вычисляем функцию  по формуле (3.30). При этом всякий раз функция (3.30) вычисляется только для таких наборов, что
 по формуле (3.30). При этом всякий раз функция (3.30) вычисляется только для таких наборов, что  . Для каждого значения функции (3.30) наряду с ним запоминаем оптимальную перестановку элементов
. Для каждого значения функции (3.30) наряду с ним запоминаем оптимальную перестановку элементов  , на которой реализуется фигурирующий в определении (3.29) путь
, на которой реализуется фигурирующий в определении (3.29) путь  . По окончанию вычислений вычеркиваем из памяти полученную на предыдущем шаге
. По окончанию вычислений вычеркиваем из памяти полученную на предыдущем шаге  таблицу значений
 таблицу значений  , а также соответствующие каждой функции оптимальные пути.
, а также соответствующие каждой функции оптимальные пути.
Подсчитаем трудоемкость алгоритма динамического программирования на  - ом шаге. Количество значений
- ом шаге. Количество значений  функции
 функции  , подлежащих вычислению и запоминанию, равно
, подлежащих вычислению и запоминанию, равно
  (3.33)
(3.33)
На одно значение функции требуется  действий (
 действий ( выборов из таблицы,
 выборов из таблицы,  сложений,
 сложений,  сравнений). Необходимый объем памяти
 сравнений). Необходимый объем памяти  (до вычеркивания из памяти таблиц
 (до вычеркивания из памяти таблиц  и соответствующих оптимальных перестановок из элементов
 и соответствующих оптимальных перестановок из элементов  )) составляет
)) составляет
  (3.34)
(3.34)
Шаг  . Имея таблицу значений функций
. Имея таблицу значений функций  и список соответствующих им оптимальных перестановок из элементов
 и список соответствующих им оптимальных перестановок из элементов  , вычисляем функцию
, вычисляем функцию

Перестановка, на которой достигается этот минимум, однозначно определит искомый оптимум задачи коммивояжера.
Просуммировав величины (3.33) по шагам  , получим выражение для суммарного объема
, получим выражение для суммарного объема  необходимых вычислений:
 необходимых вычислений:  операций. Аналогично согласно (3.34) получим, что для решения задачи коммивояжера с помощью алгоритма динамического программирования требуется память
 операций. Аналогично согласно (3.34) получим, что для решения задачи коммивояжера с помощью алгоритма динамического программирования требуется память  ячеек.
 ячеек.
Нетрудно убедиться, что реализация этого алгоритма на современных ПЭВМ ограничивается как по оперативной памяти, так и по быстродействию (продолжительности процесса счета) значениями  порядка 50.
 порядка 50.