Задача о назначениях

Автор работы: Пользователь скрыл имя, 19 Марта 2013 в 02:00, лабораторная работа

Краткое описание

Пусть имеется n видов работ и n претендентов (рабочих, механизмов и др.) для их выполнения, причём каждый претендент может использоваться на любой работе. Известна производительность i-го претендента на j-й работе (сij). Требуется так распределить претендентов по работам, чтобы суммарная производительность была максимальной. При этом каждого претендента можно назначить только на одну работу и на каждую работу можно назначить только одного претендента.

Вложенные файлы: 1 файл

Отчёт о лр№11.doc

— 451.50 Кб (Скачать файл)

1.Постановка  задачи

Пусть имеется n видов работ и n претендентов (рабочих, механизмов и др.) для их выполнения, причём каждый претендент может использоваться на любой работе. Известна производительность i-го претендента на j-й работе (сij). Требуется так распределить претендентов по работам, чтобы суммарная производительность была максимальной. При этом каждого претендента можно назначить только на одну работу и на каждую работу можно назначить только одного претендента.

Эффективным методом решения  задачи о назначениях является венгерский метод.

2.Описание венгерского  метода

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

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

Первое преобразование проделывается  со всеми столбцами матрицы С. Из максимального элемента j-го столбца (i=1, 2, …, n) вычитаются элементы этого столбца:

C = (cij) → C’ = (c’ij) = (max cij – cij).

Полученная матрица С’ является неотрицательной, и в каждом столбце этой матрицы имеется хотя бы один нуль.

Второе преобразование производится со строками матрицы С’. Из элементов i-строки матрицы C’ вычитается минимальный элемент этой строки:

C’ = (c’ij) → C” = (c”ij) = (c’ij – min c’ij).

Если в каждой строке матрицы C’ = (c’ij), полученной после первого преобразования матрицы С, уже имеется хотя бы один нуль, то второе преобразование не производится.

В результате предварительных  преобразований мы переходим от задачи выбора на максимум с матрицей С к задаче выбора на минимум с матрицей С”. Наименьшее возможное значение суммы n элементов неотрицательной матрицы равно, очевидно, нулю. Следовательно, наша задача сводится к выбору в матрице С” (или в эквивалентной ей матрице с неотрицательными элементами) n нулевых элементов, по одному в каждой строке и каждом столбце.

Отмечаем произвольный нуль в первом столбце звёздочкой (*). Затем  просматриваем второй столбец, и  если в нем есть нуль, расположенный  в строке, где нет 0*, то отмечаем его звездочкой. Аналогично просматриваются один за другим все остальные столбцы матрицы С”. Нули, отмеченные звездочкой, - независимые.

(k+1)-я итерация

Допустим, что k-я итерация проведена и в результате получена матрица Ck. Если в матрице Сk имеется ровно n нулей со звездочкой, то процесс решения заканчивается. Если же число нулей со звездочкой меньше n, то переходим к (k+1)-й итерации. Каждая итерация начинается первым и заканчивается вторым этапом. Между ними несколько раз может проводиться пара этапов: третий-первый. Перед началом итерации знаком   «+» выделяют столбцы матрицы Ck, которые содержат нули со звёздочкой.

Первый этап

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

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

б)эта строка не содержит нуля со звездочкой.

В случае а) невыделенный нуль отмечают штрихом и выделяют строку, в которой он содержится, знаком «+» справа от нее. Затем уничтожают знак «+», обводя его рамкой, над тем столбцом, на пересечении которого с данной выделенной строкой содержится нуль со звездочкой. Далее опять просматриваются невыделенные столбцы, отыскиваются невыделенные в них нули. Этот процесс за конечное число шагов заканчивается одним из следующих исходов:

IA – имеется невыделенный нуль в строке, где нет нуля со звездочкой. В этом случае переходят ко второму этапу, отметив последний по порядку нуль штрихом.

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

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

Второй этап

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

Далее, над элементами цепочки, стоящими на нечетных местах (0’), ставят звездочки, уничтожая их над четными элементами (0*). Затем уничтожают все штрихи над элементами матрицы и знаки «+». При этом количество независимых нулей будет увеличено на единицу, итерация закончена.

Третий  этап

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

Поскольку среди  невыделенных элементов новой матрицы появятся новые нули (согласно определению), то переходят к первому этапу, совершая действия над новой матрицей. Завершив этот этап, либо переходят ко второму этапу, либо к третьему, если все нули – выделенные.

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

 

 

 

3.Решение задачи

Вариант 12

Условие: Определить оптимальный вариант назначений, если матрица эффективности имеет следующий вид:

С =

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

На этом этапе  осуществляются два последовательных преобразования матрицы С. Сначала находится максимальный элемент в каждом столбце: в первом столбце максимальный элемент равен 7, во втором – 9, в третьем – 8, в четвертом – 6, в пятом – 7. Из максимального элемента вычитаются элементы этого столбца. Получается неотрицательная матрица,  в каждом столбце которой есть хотя бы один нуль. Затем из каждой строки полученной матрицы вычитаем минимальный элемент этой строки. В результате подготовительного этапа осуществлен переход к неотрицательной матрице, в каждом столбце и каждой строке которой имеется хотя бы один нуль.

С = → С’ =

→ C'' =

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

C'' = 

Итерации

Перед началом  итерации знаком «+» выделяем первый, второй и четвертый столбцы, т.к. они содержат 0*.

Первый  этап

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

 

C'' = 

 

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

 

 

 

 

 

 

 

 

Третий этап

Среди невыделенных элементов матрицы выбираем минимальный  – h=1. Далее h=1 вычитаем из всех элементов матрицы, расположенных в первой, третьей, четвертой и пятой строках (невыделенные строки), и прибавляем к элементам, расположенным в первом и четвертом столбцах (выделенные столбцы).

C'' = 

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

Число независимых  нулей = 5, поэтому процесс закончен. 
Оптимальный вариант: 7+9+7+6+4=33

 

 

 

 

 

 

 

 

4.Решение задачи в Excel


 

 

 

 

 

 

 

 

 

 

 

 

В качестве переменных будем использовать диапазон B13:F17. Для значения целевой функции будем использовать ячейку С20, в которую введем формулу = СУММПРОИЗВ(B4:F8;B13:F17). Функция СУММПРОИЗВ перемножает соответствующие элементы заданных массивов и возвращает сумму произведений. Для вычисления ограничений задачи используется функция СУММ. Функция СУММ суммирует все числа в интервале ячеек.

Далее выбираем пункт меню «Поиск решения», устанавливаем целевую ячейку (С20), ограничения и диапазон изменения. Нажимаем кнопку «Выполнить»,  получаем решение.


Информация о работе Задача о назначениях