Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
М-М для решения п-р.doc
Скачиваний:
6
Добавлен:
01.05.2025
Размер:
12.34 Mб
Скачать

Практическая работа №15 решение задач выбора венгерским методом.

Алгоритм венгерского метода

Алгоритм состоит из предварительного этапа и не более чем n-2 итераций, каждая итерация – это эквивалентное преобразование матрицы для получения независимых нулей. Каждая итерация увеличивает число независимых нулей на 1.

Задача считается решенной, когда количество независимых нулей станет = n. А оптимальный план указывает позицию независимых нулей в последней матрице.

Предварительный этап.

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

  2. Берем последовательно каждую строку, ищем в ней минимальный элемент и вычитаем этот элемент из каждого элемента данной строки. В результате получаем в каждой строке хотя бы один ноль.

  3. В первом столбце, первый ноль отмечаем звездочкой (0*), затем просматриваем следующие столбцы, и если в нем есть ноль, расположенный в строке, где нет 0*, то отмечаем его звездочкой. В результате 0* по построению являются независимыми.

Итерация.

Предположим, что К-я итерация закончена. Если в матрице n независимых нулей (т.е. 0*), то задача решена, в противном случае переходим к следующей итерации (К+1).

Каждая итерация начинается первым и заканчивается вторым этапом, а между ними может быть сколько угодно третьих этапов.

Перед итерацией обозначаем плюсом (+) выделенные столбцы, где есть 0*.

Этапы:

  1. Просматриваем невыделенные столбцы, и если среди них нет нулевых элементов, то переходим к третьему этапу. Если же невыделенный ноль есть, то возможны два случая:

- Строка с невыделенным нулем не содержит 0*

- Строка с невыделенным нулем содержит 0*.

Здесь невыделенный ноль отмечают штрихом, выделяют строку плюсом (справа), затем уничтожают знак плюс над тем столбцом, на пересечении которого находится 0*, просматриваем этот столбец, отыскиваем в нем невыделенный ноль, отмечаем его 0', выделяем строку плюсом и т.д. В результате процесс заканчивается одним из следующих случаев:

Все нули выделены, т.е. находятся в выделенных строках и столбцах, тогда переходим к третьему этапу.

Имеется невыделенный ноль в строке где нет 0*, тогда переходим ко второму этапу, отметив последним по порядку 0'.

  1. Строим следующую цепочку из элементов по следующему правилу: от ' к * по столбцу, а от * к ' по строке. Всегда цепочка начинается и заканчивается штрихом.

Заменяем ' на *, а * уничтожаем. Рисуем следующую матрицу и переходим к первому этапу.

  1. К этому этапу переходят после первого, если все нули матрицы выделены, т.е. находятся на выделенных строках или столбцах. Тогда среди невыделенных элементов матрицы выбирают минимальный, обозначают его h (элемент > 0). Вычитаем h из всех элементов в невыделенных строках и прибавляем ко всем элементам в выделенных столбцах. Получаем новую матрицу и переходим к первому этапу.