Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по теории игр.doc
Скачиваний:
46
Добавлен:
15.06.2014
Размер:
2 Мб
Скачать
☆

2.3. Венгерский метод

Идея метода была высказана венгерским математиком Е.Эгервари в 1931 г.,а в 1953 г. другой венгерский математик Г.Кун развил его идею и назвал метод венгерским [3].

Введем следующие понятия:

  1. Две матрицы и назовем эквивалентными , если , . Задачи о назначениях, определяемые эквивалентными матрицами, называются эквивалентными.

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

  3. Выделенные элементы матрицы - это элементы строк или столбцов, помеченных знаком +. Все остальные элементы матрицы - невыделенные элементы.

Алгоритм состоит из подготовительного этапа и не более, чем ( - 2)-х последовательно проводимых итераций. Каждая итерация состоит из эквивалентных преобразований матрицы и выбора максимального числа независимых нулей. Окончательным результатом каждой итерации является увеличение числа независимых нулей, имеющих в начале итерации, на единицу. Как только количество независимых нулей становится равным , задача о назначениях решена: оптимальный вариант определяется позициями независимых нулей в последней из матриц, эквивалентных исходной матрице .

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

Подговительный этап

  1. Находим максимальный элемент в каждом столбце матрицы .

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

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

  4. Помечаем независимые нули символом "*" по схеме:

а) в первом столбце помечаем произвольный нуль;

б) во втром столбце помечаем (если найдется) тот нуль, в строке которого нет нуля, помеченного "*";

в) аналогично просматриваем один за другим все столбцы матрицы .

На этом подготовительный этап заканчивается.

Основной этап

Шаг 0. Получена матрица . Если в матрице отмечено ровно нулей, процесс решения заканчивается, и оптимальное решение определяется позициями независимых нулей (0*) матрицы .

Если же число независимых нулей меньше , то помечаем знаком + столбцы матрицы , содержащие 0*. Соответствующие элементы столбцов являются выделенными элементами.

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

а) строка, содержащая невыделенный нуль, содержит также 0*;

б) строка, содержащая невыделенный нуль, не содержит 0*.

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

В случае б) помечаем найденный путь штрихом и переходим к шагу 2.

Таким образом, шаг 1 закончится, когда:

  1. либо все нули будут выделены - при этом преходим к шагу 3;

  2. либо обнаружится невыделенный нуль в строке, где нет 0* - при этом переходим к шагу 2.

Шаг 2. Строим последовательность из элементов 0' и 0* матрицы по правилу:

а) последовательность начинается с исходного 0' (последнего нуля, помеченного штрихом);

б) от 0' по столбцу идем к 0* (если такой найдется;

в) от 0* по строке идем к 0';

г) повторяем пункт б).

Итак, последовательность образуется передвижением от 0' к 0* по столбцу, от 0* к 0' по строке и т.д. при этом последовательность всегда начинается с 0' (пункт а) и заканчивается 0' (завершение построения последовательности возможно в пункте б) на элементе 0').

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

Шаг 3. К этому шагу в матрице среди невыделенных элементов нет нулевых элементов. Поэтому:

а) выбираем среди невыделенных элементов минимальный (обозначим его значение через );

б) величину вычитаем из всех элементов матрицы , расположенных в невыделенных строках;

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

В результате получим эквивалентную матрицу с невыделенными нулевыми элементами. Полагаем и переходим к шагу 1.