Программирование задач на графах Гамильтоновы и эйлеровы циклыРефераты >> Программирование и компьютеры >> Программирование задач на графах Гамильтоновы и эйлеровы циклы
- |
1 |
2 |
3 |
4 |
5 |
6 | ||||||||
1 |
- |
2 |
0 |
4 |
3 |
10 |
4 | |||||||
2 |
0 |
- |
1 |
5 |
1 |
4 |
6 | |||||||
3 |
1 |
4 |
- |
1 |
0 |
7 |
3 | |||||||
4 |
4 |
7 |
0 |
- |
1 |
7 |
4 | |||||||
5 |
4 |
4 |
0 |
2 |
- |
4 |
3 | |||||||
6 |
7 |
3 |
3 |
4 |
0 |
- |
7 | |||||||
табл. 3 | ||||||||||||||
- |
1 |
2 |
3 |
4 |
5 |
6 | ||||||||
1 |
- |
6 |
4 |
8 |
7 |
14 | ||||||||
2 |
6 |
- |
7 |
11 |
7 |
10 | ||||||||
3 |
4 |
7 |
- |
4 |
3 |
10 | ||||||||
4 |
8 |
11 |
4 |
- |
5 |
11 | ||||||||
5 |
7 |
7 |
3 |
5 |
- |
7 | ||||||||
6 |
14 |
10 |
10 |
11 |
7 |
- | ||||||||
табл. 2 | ||||||||||||||
Изложим алгоритм Литтла на примере 1 предыдущего раздела…
Повторно запишем матрицу:
Вычитание константы из элементов любой строки или столбца матрицы С, не изменяет минимальный тур.
Для алгоритма нам будет удобно получить побольше нулей в матрице С, не получая там, однако, отрицательных чисел. Для этого мы вычтем из каждой строки ее минимальный элемент (это называется приведением по строкам, см. табл. 3), а затем вычтем из каждого столбца матрицы, приведенной по строкам, его минимальный элемент, получив матрицу, приведенную по столбцам (см. табл.4).
Прочерки по диагонали означают, что из города i в город i ходить нельзя. Заметим, что сумма констант приведения по строкам равна 27, сумма по столбцам 7, сумма сумм равна 34.
Тур можно задать системой из шести подчеркнутых (выделенных другим цветом) элементов матрицы С, например, такой, как показано на табл. 2. Подчеркивание элемента означает, что в туре из i-го элемента идут именно в j-ый. Для тура из шести городов подчеркнутых элементов должно быть шесть, так как в туре из шести городов есть шесть ребер. Каждый столбец должен содержать ровно один подчеркнутый элемент (в каждый город коммивояжер въехал один раз), в каждой строке должен быть ровно один подчеркнутый элемент (из каждого города коммивояжер выехал один раз); кроме того, подчеркнутые элементы должны описывать один тур, а не несколько меньших циклов. Сумма чисел подчеркнутых элементов есть стоимость тура. В таблице 2 стоимость равна 36, это тот минимальный тур, который получен лексикографическим перебором.
Теперь будем рассуждать от приведенной матрицы в табл. 2. Если в ней удастся построить правильную систему подчеркнутых элементов, т.е. систему, удовлетворяющую трем вышеописанным требованиям, и этими подчеркнутыми элементами будут только нули, то ясно, что для этой матрицы мы получим минимальный тур. Но он же будет минимальным и для исходной матрицы С, только для того, чтобы получить правильную стоимость тура, нужно будет обратно прибавить все константы приведения, и стоимость тура изменится с 0 до 34. Таким образом, минимальный тур не может быть меньше 34. Мы получили оценку снизу для всех туров.
Теперь приступим к ветвлению. Для этого проделаем шаг оценки нулей. Рассмотрим нуль в клетке (1,2) приведенной матрицы. Он означает, что цена перехода из города 1 в город 2 равна 0. А если мы не пойдем из города 1 в город 2? Тогда все равно нужно въехать в город 2 за цены, указанные во втором столбце; дешевле всего за 1 (из города 6). Далее, все равно надо будет выехать из города 1 за цену, указанную в первой строке; дешевле всего в город 3 за 0. Суммируя эти два минимума, имеем 1+0=1: если не ехать «по нулю» из города 1 в город 2, то надо заплатить не меньше 1. Это и есть оценка нуля. Оценки всех нулей поставлены на табл. 5 правее и выше