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

2.2 Математическая модель

Для каждой i-й работы (i=1,…,n) и для каждого j-го исполнителя (j=1,…,n) введем переменную которая может принимать всего два значения (0 или 1):

Тогда суммарная эффективность выполнения всех работ выражается функцией:

.

Ограничения задачи:

, (2.1)

(2.2)

интерпретируются следующим образом. Уравнения (2.1) означают, что каждая i-я работа выполняется ровно один раз. Уравнения (2.2) предъявляют требования к каждому j-му исполнителю: каждый j-й исполнитель выполняет ровно одну работу.

Таким образом, математическая модель задачи о назначениях является задачей целочисленного линейного программирования вида

(2.3)

при ограничениях (2.1), (2.2) и

, (2.4)

– целочисленные, . (2.5)

Нетрудно видеть, что модель (2.1)-(2.4) является частным случаем классической транспортной задачи, в которой число поставщиков совпадает с числом потребителей (=n), а запасы и потребности всех пунктов совпадают и равны единице .

2.3 Венгерский метод для задачи о назначениях

По существу венгерский метод является уточнением двойственного симплекс-метода применительно к транспортной задаче. Идею метода высказал венгерский математик Эгервари в 1931, в 1953 г. Другой венгерский математик – Г.Кун развил его идею и назвал метод венгерским [3].

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

1. Две матрицы и называются эквивалентными , если для любых i и j.

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

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

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

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

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

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

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.