- •Содержание Введение
- •Теоретический материал
- •1.1 Содержательная постановка
- •1.2 Венгерский метод для задачи о назначениях
- •1.3 Алгоритм венгерского метода
- •2 Аналитическое решение
- •2.1 Постановка задачи
- •2.2 Составление математической модели
- •3 Численное решение
- •Заключение
- •Список использованных источников
1.3 Алгоритм венгерского метода
Подготовительный этап.
1. Находим максимальный элемент в каждом столбце матрицы C.
2. Для каждого столбца все элементы этого столбца последовательно вычитаем из максимального, а результат оставляем в соответствующей позиции. В результате получаем матрицу с неотрицательными элементами, в каждом столбце которой имеется, по крайней мере, один 0.
3. Из всех элементов каждой строки вычитаем минимальный элемент этой строки. В результате получаем матрицу с неотрицательными элементами, в каждой строке и каждом столбце которой имеется, по меньшей мере, один нуль.
4. Помечаем независимые нули символом «*» по схеме:
а) в первом столбце помечаем произвольный нуль;
б) во втором столбце помечаем (если найдется) тот нуль, в строке которого нет нуля, помеченного «*»;
в) аналогично просматриваем один за другим все столбцы матрицы .
На этом подготовительный этап заканчивается.
Основной этап.
Шаг 0. Получена матрица . Если в матрице отмечено ровноn нулей, процесс решения заканчивается и оптимальное решение определяется позициями независимых нулей (0*) матрицы .
Если же число независимых нулей < n, то помечаем знаком + столбцы матрицы , содержащие 0*. Соответствующие элементы столбцов являются выделенными элементами.
Шаг 1. Если среди невыделенных элементов матрицы нет нулевых, переходим к шагу 3. Если невыделенный нуль есть, то может быть один из случаев:
а) строка, содержащая невыделенный нуль, содержит также 0*;
б) строка, содержащая невыделенный нуль, не содержит 0*.
В случае а) помечаем найденный нуль штрихом, помечаем знаком + строку, содержащую этот 0', и убираем знак выделения + над столбцом, который пересекается с выделенной строкой по 0*. Возвращаемся на начало шага 1.
В случае б) помечаем найденный нуль штрихом и переходим к шагу 2.
Таким образом, шаг 1 закончится, когда:
1) либо все нули будут выделены – при этом переходим к шагу 3;
2) либо обнаружится невыделенный нуль в строке, где нет нуля со звездочкой – при этом переходим к шагу 2.
Шаг 2. Строим последовательность из элементов 0' и 0* матрицы по правилу:
а) последовательность начинается с исходного 0' (последнего нуля, помеченного штрихом);
б) от 0' по столбцу идем к 0* (если такой найдется);
в) от 0* по строке идем к 0';
г) повторяем пункт б).
Итак, последовательность образуется передвижением от 0' к 0* по столбцу, от 0* к 0' по строке и т.д. При этом последовательность всегда начинается с нуля со штрихом (пункт а)) и заканчивается нулем со штрихом (завершение построения последовательности возможно в пункте б) на элементе 0').
Полученную последовательность преобразуем так. Все 0* в последовательности заменяем на обыкновенные нули, все 0' в последовательности заменяем на 0*. Затем чистим матрицу : убираем все штрихи, все знаки выделения +. В результате получаем матрицу, в которой число независимых нулей (0*) увеличено на единицу. На этом итерация алгоритма завершается. Переходим к шагу 0.
Шаг 3. К этому шагу в матрице среди невыделенных элементов нет нулевых элементов. Поэтому:
а) выбираем среди невыделенных элементов минимальный и обозначаем его h;
б) величину h>0 вычитаем из всех элементов матрицы , расположенных ввыделенных строках;
в) величину h прибавляем ко всем элементам матрицы , расположенных ввыделенных столбцах.
В результате получим эквивалентную матрицу с невыделенными нулевыми элементами. Полагаем=и переходим к шагу 1.