Мы получили задачу о назначениях, но ограничения не определяют однозначно маршрут и могут появиться несколько циклов. Чтобы цикл был единственным, используем подход Таккера, введя дополнительно (n-1) переменную u2,u3,…,un и (n-1)×(n-2) ограничения (3): ui – uj + xij·(n-1) ≤ n–2, где 2 ≤ i≠ j≤ n. Тогда
a) если $ допустимое решение (X,u) задачи (1)-(3), то матрица X имеет единственный цикл (т.е. маршрут коммивояжера);
b) если $ маршрут коммивояжера (допустимая матрица Х с одним циклом), то $ и вектор 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}, kÎS, а C (S, k) – длина кратчайшего пути из 1 в k, проходящего по всем пунктам множества S. Тогда C ({k}, k) = d1k , а при | S | > 1 C (S, k) = min [C (S \ {k}, m) + dmk ], где минимум берется по всем mÎS \ {k}. Нужно хранить argmin, чтобы восстанавливать оптимальный путь. Придется вычислять и сохранять C (S, k) для всех множеств S и всех mÎS . Для этого требуется память объемом 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оптцлп или нужно найти все решения):
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.