2.3 Венгерский метод
Венгерский метод состоит из четырех этапов:
Этап 1. Приведение матрицы.
Этап 2. Подсчет – числа независимых нулей.
Этап 3. Преобразование матрицы С с целью получения новых нулей.
Этап 4. Поиск независимых нулей и получение оптимального решения.
Блок-схема последовательности выполнения этапов Венгерского метода приведена на рис.2
Рис. 2. Блок-схема выполнения этапов Венгерского метода
Рассмотрим каждый этап подробно.
Этап 1. Приведение матрицы.
Определение 2. Матрица С называется приведенной, если она имеет в каждой строке и в каждом столбце по крайней мере один ноль.
Матрица С легко приводится с помощью первого свойства, то есть вычитанием из строк и столбцов минимального элемента.
Алгоритм выполнения первого этапа
Шаг 0. ,
Шаг 1. В каждой строке определяется .
Шаг 2. Для всех полагают .
Шаг 3. .
Шаг 4. Для каждого j полагают .
Шаг 5. Для всех полагают .
Шаг 6. .
Шаг 7. Переход ко второму этапу.
Этап 2. Подсчет k – числа независимых нулей.
Пусть мы хотим вычеркнуть независимые нули горизонтальными или вертикальными линиями. Заметим, что никакие два независимых нуля нельзя вычеркнуть одной горизонтальной или вертикальной линией, так как они стоят в разных столбцах и строках. То есть если мы хотим вычеркнуть все независимые нули горизонтальными и (или) вертикальными линиями, то число этих линий будет совпадать с числом независимых нулей. Отсюда следует, что для того чтобы определить сколько независимых нулей имеет матрица С достаточно все нули матрицы С вычеркнуть минимально возможным числом горизонтальных и (или) вертикальных линий.
Рассмотрим следующую матрицу
Рис. 3.
Эта матрица является приведенной, так как в каждой строке и в каждом столбце имеется, по крайней мере, один ноль. При этом все нули могут быть вычеркнутыми двумя линиями: вертикальной и горизонтальной, - то есть эта матрица имеет всего два независимых нуля.
0 | |||
Рис. 4.
Отсюда сформулируем алгоритм второго этапа.
Алгоритм выполнения второго этапа
Шаг 1. Отыскивается строка, содержащая один ноль. Этот ноль вычеркивается вертикальной линией. Процесс продолжается пока может быть найдена строка, содержащая один ноль.
Шаг 2. Отыскивается столбец, содержащий один ноль. Этот ноль вычеркивается горизонтальной линией. Процесс продолжается, пока может быть найден столбец, содержащий один ноль.
Шаг 3. Просматриваются невычеркнутые элементы матрицы С.
Шаг 4. Если среди невычеркнутых – имеются , то переход к шагу 7. Иначе Шаг 5.
Шаг 5. Подсчитывается число линий k.
Шаг 6. Если , то переход к четвертому этапу. Если , то переход к третьему этапу.
Шаг 7. Просматриваются строки матрицы С и подсчитывается , где – число невычеркнутых нулей в i -й строке ().
Шаг 8. Просматриваются столбцы матрицы С и подсчитывается , где – число невычеркнутых нулей в j -м столбце.
Шаг 9. Если , то выбирается строка, содержащая , нулей и все нули вычеркиваются вертикальными линиями. Переход к шагу 1.
Шаг 10. Если , то выбирается столбец, содержащий , невычеркнутых нулей и все нули вычеркиваются горизонтальными линиями. Переход к шагу 2.
Замечание. В случае выхода на восьмой, девятый или десятые шаги, алгоритм, к сожалению, не гарантирует получение минимального числа линий, так как эти шаги являются эвристическими. Читатели могут попробовать предложить свои подходы к вычеркиванию нулей для случаев, когда их более одного в строке или столбце.
Этап 3. Преобразование матрицы С с целью получения новых нулей.
Третий этап осуществляется, если полученное на втором этапе число независимых нулей недостаточно, поэтому необходимо преобразовать матрицу так, чтобы получить новые нули. Пометим через , те элементы матрицы С, которые вычеркнуты одной линией, через , те элементы, которые вычеркнуты одновременно горизонтальной и вертикальной линиями, невычеркнутые элементы помечать не будем.
Алгоритм выполнения третьего этапа
Шаг 1. Найдем (из невычеркнутых ).
Шаг 2. Элементы матрицы С преобразуются по следующему правилу:
(для невычеркнутых),
(для вычеркнутых одной линией),
(для вычеркнутых одновременно двумя линиями).
Шаг 3. .
Шаг 4. Переход ко второму этапу.
Покажем, что приведенный алгоритм есть формализация преобразования матрицы с помощью () шагов, основанных на первом свойстве матрицы С. Шаги 2-3 могут быть представлены следующим образом.
Шаг 2. Из всех строк вычисляется с, то есть .
Шаг 3. .
Шаг 4. Ко всем вычеркнутым строкам и столбцам прибавляется число с, то есть все вычеркнутые определяются по формуле .
Шаг 5. .
Отсюда получается, что после второго шага все элементы матрицы С уменьшаются на величину c. Следовательно, все нули становятся отрицательными числами равными (), после четвертого шага все вычеркнутые элементы увеличиваются на с, при этом если элементы были вычеркнуты одной линией, то они не изменяются по сравнению с исходными значениями, а те элементы которые были вычеркнуты горизонтальной и вертикальной линиями одновременно увеличились на с, так как с один раз вычиталось и два раза прибавлялось. Именно эта процедура описана в алгоритме, но более кратко.
Этап 4. Поиск независимых нулей и получение оптимального решения.
Алгоритм четвертого этапа подобен алгоритму второго этапа, однако имеет некоторые модификации.
Алгоритм выполнения четвертого этапа.
Шаг 1. В матрице размера () помечаются места всех нулей.
Шаг 2. .
Шаг 3. Отыскивается строка, содержащая один ноль. Этот ноль выделяется, а соответствующие строка и столбец вычеркиваются. . (Процесс продолжается пока существует строка, содержащая один ноль.)
Шаг 4. Если , то переход к шагу 11. Иначе Шаг 5.
Шаг 5. Отыскивается столбец, содержащий один ноль. Этот ноль выделяется, а соответствующие строка и столбец вычеркиваются. . (Процесс продолжается пока существует столбец, содержащий один ноль.)
Шаг 6. Если , то переход к шагу 11. Иначе Шаг 7.
Шаг 7. Просматриваются строки, и определяется – число невычеркнутых нулей в i -й строке.
Шаг 8. Просматриваются строки, и определяется – число невычеркнутых нулей в j -м столбце.
Шаг 9. Если , то выбирается строка, содержащая нулей, один из нулей выделяется, а строка и столбец вычеркиваются. .
Переход к шагу 3.
Шаг 10. Если , то выбирается столбец, содержащий нулей, один из нулей выделяется, а строка и столбец вычеркиваются. .
Переход к шагу 3.
Шаг 11. На исходной матрице С помечаются элементы соответствующие помеченным нулям.
Шаг 12. Вычисляется целевая функция
.
Шаг 13. Сравнивается и S. Эти значения должны совпасть.
Пример 1. Дана матрица С (рис. 5). Решить задачу о назначениях.
Рис. 5.
Этап 1.
Шаг 0. S =0.
Шаг 1.
Рис. 6.
Шаг 2. Из строк матрицы вычитаем соответствующее .
Рис. 7.
Шаг 3. S =0+20=20.
Шаг 4.
Рис. 8.
Шаг 5. Из каждого столбца вычитаем соответствующее .
Рис. 9.
Шаг 6. S =20+0+1+1+3+4+5=34.
Этап 2.
0 | |||||
Рис. 10.
переход к этапу 3.
Шаг 1. с=1.
Шаг 2. Элементы матрицы С преобразуются по следующему правилу:
(для невычеркнутых),
(для вычеркнутых одной линией),
(для вычеркнутых одновременно двумя линиями).
Рис.11.
Шаг 3. .
Переход к этапу 2.
0 | 0 | ||||
0 | |||||
1 | |||||
0 |
Рис. 12.
. Выбираем столбец. .
Переход к этапу 3.
Шаг 1. с=1.
Шаг 2. Аналогично предыдущей итерации.
Рис. 13.
Шаг 3. .
Переход к этапу 2.
0 | |||||
2 | |||||
1 |
Рис. 14.
.
Переход к этапу 4.
0 | 0 | ||||
0 | |||||
Рис. 15.
Переносим места выделенных нулей на исходную матрицу С. Получаем
.
Упражнения к §2
Дана матрица С (рис. 16).
Рис. 16.
Решить задачу о назначениях.
Для каждого варианта в исходной матрице С вычеркнуть три элемента. Координаты вычеркиваемых элементов приведены в таблице 1.
Таблица 1.
№ | Координаты | № | Координаты | № | Координаты | № | Координаты |
(1,3);(2,1); (3,2) | (1,3);(3,2); (5,6) | (2,1);(3,2); (4,5) | (2,1);(5,6); (6,4) | ||||
(1,3);(2,1); (4,5) | (1,3);(3,2); (6,4) | (2,1);(3,2); (5,6) | (3,2);(4,5); (5,6) | ||||
№ | Координаты | № | Координаты | № | Координаты | № | Координаты |
(1,3);(2,1); (5,6) | (1,3);(4,5); (5,6); | (2,1);(3,2); (6,4) | (3,2);(4,5); (6,4) | ||||
(1,3);(2,1); (6,4) | (1,3);(4,5); (6,4) | (2,1);(4,5); (5,6) | (3,2);(5,6); (6,4) | ||||
(1,3);(3,2); (4,5) | (1,3);(5,6); (6,4) | (2,1);(4,5); (6,4) | (4,5);(5,6); (6,4) |