Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CLIO_фокин24.doc
Скачиваний:
9
Добавлен:
18.11.2019
Размер:
3.11 Mб
Скачать

Задача коммивояжера.

Есть матрица расстояний между городами. Нужно объехать все города, побывав в каждом ровно один раз, и вернуться в исходный пункт.

Пусть X = {xij}, где xij =1, если из i-го города едем в j-й, иначе xij =0. Цель: при условии, что матрица X удовлетворяет ограничениям:

(1) т.е. из каждого города можно выехать только в один город, (2) т.е. в каждый город можно въехать только из одного города.

Мы получили задачу о назначениях, но ограничения не определяют однозначно маршрут и могут появиться несколько циклов. Чтобы цикл был единственным, используем подход Таккера, введя дополнительно (n-1) переменную u2,u3,…,un и (n-1)×(n-2) ограничения (3): ui– uj+ xij·(n-1) ≤ n–2, где 2 ≤ i≠ j≤ n. Тогда

  1. если  допустимое решение (X,u) задачи (1)-(3), то матрица X имеет единственный цикл (т.е. маршрут коммивояжера);

  2. если  маршрут коммивояжера (допустимая матрица Х с одним циклом), то  и вектор u=(u2,u3,…,un), удовлетворяющий ограничениям (3).

Доказательство: Докажем a): предположим противное, т.е. что цикл не единственный  существует цикл, не проходящий через точку 1. Пусть вершины этого цикла имеют номера , т.е. все . Имеем:

, …

, ,

.

Складывая все эти неравенства, получим  n–1 ≤ n–2, т.е. - противоречие.

Докажем b). Пусть ui - номер шага, на котором мы попадем в точку i, начиная движение с точки 1. Такие ui удовлетворяют ограничениям (3):

  1. Пусть пара (i,j) – звено маршрута (i1)  ui– uj= –1 по определению u. Кроме того, xij= 1,  получим: -1+1·(n-1) ≤ n-2, т.е. верно.

  2. Пара (i,j)  маршруту  xij= 0, и ui– uj≤ n–2 по определению u.

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

Метод динамического программирования для ЗК.

Принцип оптимальности Беллмана: любая часть оптимального решения оптимальна.

Пусть S {2,3,…, n}, kS, а C (S, k) – длина кратчайшего пути из 1 в k, проходящего по всем пунктам множества S. Тогда C ({k}, k) = d1k , а при | S | > 1 C (S, k) = min [C (S \ {k}, m) + dmk], где минимум берется по всем mS \ {k}. Нужно хранить argmin, чтобы восстанавливать оптимальный путь. Придется вычислять и сохранять C (S, k) для всех множеств S  и всех mS . Для этого требуется память объемом Vn и Tn операций сравнения и сложения.

Метод ветвей и границ для ЦЛП.

Пусть Z есть задача ЦЛП (xцелое). Рассмотрим функционалы F ЛП и F ЦЛП

DЛП - область определения ЛП, DЦЛП - область определения ЦЛП

DЛП DЦЛП F ЛПFЦЛП , Это соотношение задает границу для FЦЛП

Описание МВиГ: Вход: описание задачи Z.

Оценка (Z) /* решение вспомогательной ЛП, т.е. нахождение xЛП и FЛП*/

If xЛП – целое Then Return(xЛП) Else { r =; OPEN ={Z};

/* OPEN - упорядоченное по значениям FЛП AVLдерево.*/ }

While (OPEN) do /* основной цикл */

s= pop(OPEN); OPEN={s}; /*выбор вершины списка OPEN как */

/* текущей задачи s и удаление ее из списка*/

СПИСОК1= список_дочерей_s; /* СПИСОК1очередь на оценку*/

выбор для ветвления нецелочисленной координаты xi0;

s1=s{ xi0[ xi0опт]}; s2=s{ xi0[ xi0опт]+1};

While (СПИСОК1) do

s1=pop(СПИСОК1); СПИСОК1=s1;

оценка(s1) /* для ЦЛП: решение ЛП для s1 */

Анализ: If оценка(s1)> r Then /* оценка лучше рекорда */

If xлпs1целое

Then {r = оценка(s1); xr= xлпs1;

установка флага очистки списка OPEN }

Else OPEN+=s1; /* с учетом оценки s1*/

End_While_ СПИСОК1

If флаг очистки установлен

Then удаляем из списка OPEN все вершины, оценка которых  r

End_While_OPEN;

Return(r,xr);

End.

9. Пример: 2x1+5x2max

x1+3x2  9

3x1+2x2  12 x1,x2  0

для ЛП z=(18/7, 15/7) fоптлп=156/7

fоптзлп =? Z (18/7,15/7)

Z1=Z  {x2  2} Z2=Z  {x2  3}

(8/3,2), fопт=151/3 (0,3), fоптзлп=15

получили целочисленное решение стоимостью 15. Это уже точно одно из решений целочисленной задачи => (0,3) записываем в рекорд (R).

На следующих шагах (если fоптлп > fоптцлп или нужно найти все решения):

Z1,1 = Z1  {x1  2} Z1,2=Z1  {x1  3}

(2,2), fоптлп=14 <R (3,3/2), fоптлп=13,5 <R

=> улучшения или повторения рекорда не может быть.

В России всякая полезная деятельность вредна.

Сергей Юрский