Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






называется гамильтоновым циклом или просто циклом, маршрутом коммивояжёра и обозначается через






t = {(i1, i2), (i2, i3), …, (in-1, in), (in, i1)}.

Через Т обозначим множество всех гамильтоновых циклов, а через z(t) – издержки цикла t (длина t)

z(t) = S cij.

(i, j)Î t

Необходимо отыскать такой маршрут t* , что

z(t*) = min z(t).

tÎ T

Эту задачу можно сформулировать как задачу целочисленного линейного программирования.

Пусть

1, если коммивояжёр едет из города i в город j;

xij =

0, если коммивояжёр не едет из города i в город j.

 

Найти такой вектор `X = (x11, x12, …, xnn) Î En*n, который


минимизирует

(2)

(3)

ui – uj + (n-1) xij £ n-2, i¹ j, i, j = 1, 2, …, n-1 (4)

xij ³ 0, i, j = 1, 2, …, n (5)

xij, ui - целые. (6)

 

Условия (2) говорят о том, что коммивояжёр выезжает из каждого города ровно один раз. Условия (3) означают въезд в каждый город ровно один раз, а условия (4) служат для устранения подциклов (пример, когда маршрут распадается на два не связанных между собой подцикла, приведён ниже).

 
 
 
 
 
 
 


 

 

Описанная модель имеет большое прикладное значение: различные её варианты могут возникать, например, в задачах, связанных с развозкой почты, готовой продукции и т.д.

Обозначим через z0 верхнюю границу оптимального значения функции цели z(t) на множестве Т, т.е.

z(t*) £ z0,

где t* - оптимальный гамильтонов цикл (маршрут).

Определить z0 можно, отыскав какой-либо маршрут коммивояжёра и подсчитав его издержки. Для примера 1 допустимым является следующий гамильтонов цикл

t0 = {(1, 2); (2, 3); (3, 4); ((4, 5); (5, 1)}.

Его издержки

z(t0) = 10 + 10 + 20 + 15 + 10 = 65.

Следовательно, z0 = 65, а сам цикл t0 следует запомнить. Если указать конкретный маршрут трудно, то полагают z0 = ¥

Пусть m(Т) – нижняя граница функции цели на множестве Т, для любого tÎ T

z(t) £ m(Т).

Для вычисления m(Т) введём операцию приведения матрицы С(Т).

Процесс вычитания наименьшего элемента строки (столбца) матрицы из всех её (его) элементов называется приведением строки (столбца) матрицы, а сам наименьший элемент - константой приведения строки (столбца) матрицы.

Очевидно, что изменение длин (издержек) всех путей, приводящих в данный город, или всех путей, выводящих из данного города, на одну и ту же величину приводит к новой задаче, оптимальный маршрут которой совпадает с оптимальным маршрутом исходной задачи.

Если матрицу привести последовательно по строкам и столбцам, то в результате получим новую матрицу с неотрицательными элементами и по крайней мере одним нулевым элементом в каждой строке и каждом столбце. Такая матрица называется приведённой (редуцированной).

Пусть H(T) - cуммарная константа приведения матрицы С(Т) по строкам и столбцам, а С¢ (Т) – приведённая матрица С(Т). Имеем

z(t) = z1(t) + H(T), (7)

где z(t) – издержки любого цикла tÎ T по матрице С(Т), а z1(t) – издержки того же цикла по приведённой матрице С¢ (Т). Т.к. в соотношении (7)

z1(t) ³ 0,

то

z(t) ³ H(T)

для любого tÎ T.

Следовательно, в качестве нижней оценки m(Т) издержек любого цикла t на множестве Т можно взять суммарную константу приведения H(T) матрицы С(Т).

m(Т) = H(T).

Приведём матрицу примера 1.

 

 

H(T) =10+1+8+10+8+9+12 = 58 = m(T).

На каждой итерации s какое-то множество маршрутов коммивояжёра, обозначим его через X, будет подлежать разбиению на два непересекающихся подмножества ys и `ys по следующему принципу: подмножество ys содержит все гамильтоновы циклы из Х, включающие переезд из города k в город l (дугу (k, l)), а подмножество `ys содержит все остальные маршруты из разбиваемого множества X.

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

Ясно, что для разбиения лучше выбирать множество с минимальной нижней оценкой m(X), так как вероятнее всего именно в нём содержится оптимальный цикл t*.

X
ys
` ys

 

(k, l) (k, l)

 

Дугу (k, l) будем выбирать из следующих соображений. С одной стороны, издержка сkl должна быть как можно меньше, чтобы в конце концов из всех фиксированных дуг получить гамильтонов цикл, близкий к оптимальному. С другой стороны, будем максимально увеличивать нижнюю оценку m(`ys) множества ` ys, тогда возрастает вероятность того, что для разбиения всякий раз будет выбираться множество ys, и появится возможность быстрее получить гамильтонов цикл. Если при этом окажется, что его издержки меньше z0, то z0 будет скорректирована (уменьшена), а это сократит число просматриваемых циклов.

Кроме того, такой подход к выбору дуги (k, l) позволяет сократить объём хранимой в памяти информации, а именно, необходимо иметь исходную матрицу издержек С(Т), рабочую матрицу C¢ (ys) и информацию о каждом множестве: его нижнюю оценку издержек и все фиксированные и запрещённые для него дуги. Если в процессе решения задачи нужно будет разбивать множество, отличное от ys, то соответствующую ему матрицу издержек можно восстановить их исходной матрицы С(Т) на основании этой информации.

Выбор фиксированного переезда.

Чтобы выбрать переезд (k, l), необходимо:

1) в приведенной матрице издержек С¢ (X) просмотреть все элементы ij =0;

2) для каждого из них определить величину qij, равного сумме минимального элемента i -той строки и j -го столбца (за исключением самого элемента ij);

3) выбрать фиксированный переезд (k, l) из условия

qkl = max qij

(i, j), с¢ ij =0

 

Процесс разбиения множества Х на два подмножества уs и s можно осуществить, если есть матрица издержек С¢ (X). Поэтому прежде всего рассмотрим, как на произвольной итерации получить матрицы С¢ (уs) и С¢ (`уs), если известны матрица С¢ (X) и дуга (k, l).

Схема построения матрицы С ¢ (уs)

1. Так как дуга (k, l) уже входит в любой гамильтонов цикл, принадлежащий множеству ys, то согласно постановке задачи необходимо запретить выезд из города k и въезд в город l, поэтому в матрице С¢ (X) вычеркиваем строку k и столбец l.

2. Для устранения подциклов необходимо составить из всех дуг, фиксированных для множества уs, связный путь, обязательно содержащий последнюю фиксированную дугу (k, l) (связный путь может состоять всего лишь из одной дуги (k, l)).Полагаем mp =¥ в матрице С¢ (X), где m и p – соответственно конец и начало связного пути, в результате получим матрицу С (уs).

3. Приводим матрицу С(уs), получим искомую матрицу С¢ (уs). Обозначим через h(ys) константу приведения матрицы С(уs).

4. Нижняя граница издержек m(уs) для множества ys определится по формуле

m(уs) = m(X) + h(ys). (8)

Схема построения матрицы С ¢ (`уs).

1. Так как дуга (k, l) не должна входить ни в один гамильтонов цикл, принадлежащий множеству s, то в матрице С¢ (X) полагаем с¢ kl =¥. Получим С (`уs).

2. Приводим матрицу С(`уs), получим С¢ (`уs).

Обозначим через h(`ys) константу приведения матрицы С(`уs).

3. Нижняя граница издержек m(`уs) для множества `ys определится по формуле

m(`уs) = m(X) + h(`ys). (9)

 

Схема восстановления матрицы С ¢ (X) из исходной матрицы C(T) для любого множества Х

Пусть Х –любая вершина дерева, соответствующего процессу решения задачи о коммивояжере методом ветвей и границ, c набором фиксированных дуг

D = {(i1, j1), (i2, j2), …, (iq, jq) }.

1. Вычёркиваем в матрице С(Т) все фиксированные строки

i1, i2, …, iq, и фиксированные столбцы j1, j2, …, jq.

2. Для каждой фиксированной дуги (ir, jr)составляем связный путь из ранее фиксированных дуг, включающий в себя и данную дугу (ir, jr), и полагаем сmp = ¥ в матрице С(Т), где m и p соответственно конец и начало связного пути.

3. Для каждой запрещённой для множества Х дуги (i, j) полагаем cij = ¥ в матрице С(Т), в результате получаем матрицу С(Х).

4. Приводим матрицу С(Х), получаем искомую матрицу С¢ (Х). Обозначим суммарную константу приведения С(Х) через H(X).

5. Нижняя граница издержек для множества Х определится по формуле

m(X) = (10)

Обоснование формул (8), (9), (10).

Пусть Х – любая вершина с набором фиксированных дуг D, матрица которой С¢ (Х) восстановлена из исходной матрицы С(Т) с суммарной константой приведения H(X). Покажем, что нижняя граница издержек m(X) определится по формуле (10).

Действительно, если tÎ X, то

z(t) = ,

причём вторая сумма берётся по всем (i, j)Î t, но не фиксированным для множества Х.

Так как матрица С¢ (Х) восстановлена из исходной матрицы С(Т) по рассмотренной выше схеме, то

 

z(t) = ,

где ij элемент приведённой матрицы С¢ (Х).

Поскольку

³ 0, то

 

z(t) ³ = m(X) -

 

формула (10) доказана.

Рассмотрим теперь формулу (9). Так как матрица С¢ (`уs) может быть восстановлена из из исходной матрицы С(Т) и для множеств s и Х фиксирован один и тот же набор дуг D, то согласно (10)

m(`ys) = .

Но

H(`ys) = H(X) + h(`ys),

где h(`ys) - константа приведения C(`ys), поскольку C¢ (X) и C(`ys) отличаются лишь тем, что k, l = ¥, следовательно, h(`ys) =θ k, l.

Имеем

m(`ys) =

C учётом (10)

m(`ys) = m(X) + h(`ys) -

 

т.е. получена формула (9). Следует отметить что h(`ys) = θ k, l.

 

Рассмотрим теперь m(ys). Согласно (10)

 

m(ys) = , (11)

так как для множества ys по сравнению с множеством Х фиксирована ещё одна дуга (k, l).

Рассмотрим H(ys). Матрицы C¢ (X) и С(ys) отличаются, во первых, тем, что в матрице С(ys) нет k -ой строки и l -ого столбца. Следовательно, в константу приведения H(X) входит в качестве слагаемого ckl, которой нет в H(ys).

Во-вторых, в матрице С(ys) по сравнению с C¢ (X) могут быть новые элементы, равные ¥, т.е. может оказаться, что матрицу С(ys) нужно будет приводить. Следовательно, в константу приведения H(ys) войдёт константа приведения h(ys) матрицы С(ys). Таким образом,

H(ys) = H(X) - ckl + h(ys).

 

Подставив последнее равенство в (11), получим

 

m(ys) = , или

m(уs) = m(X) + h(ys),

 

т.е. получена формула (8).

 

Решение примера 1.

I итерация.

Выше для множества всех маршрутов Т были определены z0 =65 и m(Т) = 58. Определим теперь переезд (k, l), по которому множество всех маршрутов Т будет разбиваеться на два подмножества: y1 и `y1.

q12 =6; q15 =1; q21 =0; q23 =5; q31 =0; q34 =2; q42 =4; q52 =2;

Следовательно, (k, l) = (2, 3).

Нижняя граница издержек для множества `y1 будет согласно формуле (9) равна

m(`y1) = m(Т) + h(`y1) = m(Т) + q23 = 58 + 5 = 63.

Теперь построим матрицу издержек C(y1). Для этого вычеркнем в матрице C¢ (Т) вторую строку и третий столбец и положим c32 = ¥.

 

 

Т.к. h(y1) = 0, то, согласно формуле (8),

m(y1) = 58 + 0 =58.

 

Т
y1
` y1
(2, 3)
(2, 3)
 
 
 


Рис. 1

II итерация.

Из двух множеств: y1 и ` y1 выбираем для разбиения то, которому соответствует минимальная нижняя граница издержек, т.е. Х = y1. Приведённая матрица издержек C¢ (y1) построена на I итерации.

Определим дугу (k, l).

q12 = 0; q15 = 2; q31 = 2; q34 = 3; q42 = 4; q52 = 2; (k, l) = (4, 2).

В результате разбиения y1 получим два новых множества: y2 и ` y2.

Для множества ` y2 нижняя граница издержек m(`y2) определится как m(`y2) = 58 + 4 = 62.

Построим матрицу C¢ (y2) и определим m(`у2). Для этого в матрице C¢ (y1) вычеркнем четвёртую строку и второй столбец. Соберём все дуги, фиксированные для множества y2. Это (4, 2) и (2, 3). Они образуют связный путь. Положим с34 = ¥. Получим матрицу С(y2) и приведём её.


h(y2) = 5; m(у2) = 58 + 5 = 63.

 

Т
y1
` y1  
(2, 3)
(2, 3)
 
 
 
 
y2
` y2
(4, 2)
(4, 2)
 
 

 

 


 

 

Рис.2

III итерация.

Из множеств y2, ` y2, ` y1 (рис.2) минимальная нижняя граница издержек соответствует множеству `y2, поэтому это множество будет подлежать разбиению. Матрица издержек для этого множества отсутствует, её необходимо восстановить из исходной матрицы С(Т). Для множества ` y2 фиксирован переезд (2, 3) и запрещён (4, 2), поэтому в матрице С(Т) вычёркиваем строку 2 и столбец 3, полагаем с32 = ¥ (предотвращаем подцикл), с42 = ¥ (запрещаем переезд (4, 2)), после чего матрицу приводим.

 

H(`y2) = 10 + 8 + 14 + 8 + +12 = 52.

m(`y2) = с23 + H(`y2) = 10 + 52 = 62.

Выберем дугу, по которой будет производиться разбиение `y2 на два подмножества: y3 и `y3.

q12 = 0; q15 = 1; q32 = 0; q34 = 3; q41 = 1; q52 = 2;

 

m(`y3) = 62 + 3 = 65.

Для y3 фиксированы (2, 3), (3, 4). Эти переезды составляют связный путь, следовательно, с42 = ¥.

Построим матрицу С(y3) и приведём её.

 

 

h(y3) = 0;

Т
y1
`y1
(2, 3)
(2, 3)
 
 
 
 
y2
`y2
(4, 2)
(4, 2)
 
 
(3, 4)
(3, 4)
y3
y3
 
 
m(y3) = m(`y2) + h(y3) = 62 + 0 = 62.

 

 

Рис. 3

IV итерация.

Для разбиения (рис. 3) выбираем множество с наименьшей нижней границей издержек - y3, которое будет разбиваться на y4 и ` y4.

q12 = 0; q15 = 1; q41 = 3; q52 = 2;

m(`y4) = 62 + 3 = 65.

Построим матрицу для y4 и приведём её. Фиксированные дуги (4, 1), (3, 4), (2, 3) или (2, 3), (3, 4), (4, 1) – связный путь, с12 = ¥.

 

(4, 1)
Т
y1
` y1
(2, 3)
(2, 3)
 
 
 
 
y2
` y2
(4, 2)
(4, 2)
 
 
(3, 4)
(3, 4)
y3
y3
 
 
y4
` y4
(4, 1)
 
 

 


Рис.4

 

Матрица С¢ (y4) - матрица второго порядка, следовательно, множество y4 содержит только один маршрут коммивояжёра, который состоит из всех фиксированных для множества y4 дуг

(2, 3), (3, 4), (4, 1)

и двух дуг

(1, 5) и (5, 2),

которым в матрице С¢ (y4) соответствуют нулевые элементы, т.е. y4 содержит единственный маршрут

t1 = {(1, 5), (5, 2), (2, 3), (3, 4), (4, 1)}.

z(t1) = 10 + 8 + 10 + 20 + 14 = 62 < z0 = 65.

Меняем значение верхней границы оптимального значения издержек.

z0 = 62

V итерация.

Минимальная нижняя граница издержек (рис. 4) - m(`y1) = m(y2) = 63 > z0 = 62, следовательно, задача решена.

z* = 62, t* = t1 = {(1, 5), (5, 2), (2, 3), (3, 4), (4, 1)}.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.