Некоторые подходы к решению задачи о назначениях

МА ТЕМА ТИЧЕСКИЕ И ИНСТРУМЕНТАЛЬНЫЕ МЕТОДЫ ЭКОНОМИКИ

УДК 519.86

Н.А. Щукина

канд. техн. наук, доцент, кафедра математических методов в экономике, ФГБОУВО «Российский экономический университет

им. Г.В. Плеханова», г. Москва

НЕКОТОРЫЕ ПОДХОДЫ К РЕШЕНИЮ ЗАДАЧИ О НАЗНАЧЕНИЯХ

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

Ключевые слова: задача о назначениях, венгерский алгоритм, метод ветвей и границ, алгоритм Литтла, динамическое программирование, оптимальное решение, транспортная задача.

N.A. Shchukina, Plekhanov Russian University of Economics, Moscow

SOME APPROACHES TO THE SOLUTION OF THE ASSIGNMENT PROBLEM

Abstract. Discusses various approaches and algorithms to find a solution to the assignment problem in matrix interpretation. The mathematical formulation-balanced and unbalanced problem in the form of a linear programming problem. The adaptation of the method of branches and boundaries for solving the problem of discrete optimization. Proposed one possible solution of the assignment problem using dynamic programming, the recurrence equation. All the algorithms described as sequence of steps.

Keywords: assignment problem, Hungarian algorithm, method of branches and boundaries, Little's algorithm, dynamic programming, optimal solution, the transport task.

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

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

Математическая постановка задачи. Сформулируем математическую постановку сбалансированной задачи о назначениях. Пусть дана неотрицательная матрица C

размерности n*n, где элемент c¡j соответствует стоимости выполнения j-го вида работ i-м работником. Необходимо найти такое соответствие работ исполнителям, чтобы расходы на оплату труда были наименьшими. Если цель состоит в нахождении назначения с наибольшей стоимостью, то решение сводится к решению аналогичной задачи путём замены каждой стоимости cj на разность между максимальной стоимостью и cj, т.е. матрица себестоимостей требует преобразования по правилу c '¡j = max{cj} -Cj.

Введем переменные xtj следующим образом:

|1, если ¡-ый исполнитель назначен на j-ую работу; j [0, если ¡-ый исполнитель не назначен на j-ую работу.

Таким образом, значения xtj образуют матрицу назначений Xразмерности n*n,

состоящую из нулей и единиц.

Запишем целевую функцию F(X) - суммарную стоимость выполнения всех работ:

F

¡=1 j=i

Сформулируем ограничения рассматриваемой задачи. Выполнение условия исполнения работником только одной работы означает, что каждая строка матрицы назначений Х содержит только одно значение равное единице, а все остальные равны нулю, т.е.

£^х1} = 1, i = 1,2,...,n.

j=1

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

£xv = 1, j = 1,2,...,n.

¡=1

Таким образом, получаем задачу линейного программирования. Целевая функция (2) и ограничения (1), (3), (4) составляют математическую постановку задачи дискретной оптимизации.

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

1) число исполнителей п больше числа выполняемых работ т (п>т);

2) число исполнителей п меньше числа выполняемых работ т (п<т).

В каждом из этих случаев для решения не сбалансированной задачи ее сводят к сбалансированной, путем введения фиктивных работ или фиктивных исполнителей с нулевыми значениями су - эффективности (неэффективности) выполнения г-м исполнителем у'-ой работы. В первом случае, когда п>т, вводится к = п-т фиктивных работ Рт+1, Рт+2, ..., Рт+к. Во втором случае (п<т) - рассматриваются к = т - п фиктивных исполнителя Ип+1, Ип+2, ..., Ип+к.

Динамическое программирование. Для решения сбалансированной задачи о назначениях можно предложить следующий простой алгоритм: на каждом шаге назначений, начиная с первого исполнителя, выбирать самого эффективного (неэффективного). Таким образом, для отыскания оптимального назначения планируемая операция разделяется на ряд последовательных шагов. Соответственно, и сам процесс распределения работ между исполнителями становится многошаговым и развивается последовательно, от этапа к этапу. Однако такой способ решения, как правило, не приводит к получению оптимального решения. Если на первых шагах выбирать самых эффективных (неэффективных) исполнителей, то на последних шагах алгоритма приходится выполнять назначения, которые могут внести негативный вклад в суммарный критерий. Поэтому целесообразно в качестве метода решения задачи «о назначениях» применить математический аппарат динамического программирования, разработанный для решения некоторого класса задач путем их разложения на относительно небольшие, причем, каждый раз оптимизируя управление только на одном шаге [2; 3].

Состояние системы на каждом шаге г = 1, 2, ..., п характеризуется некоторой переменной - параметром состояния хг, который зависит от своего значения на предыдущем шаге хг-1 и от выбранного на данном шагеуправления иг:

X = / (хм, иг), г = 1, 2, ., п.

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

Рассмотрим один из способов решения задачи «о назначениях» методом динамического программирования. Идея заключается в последовательном сравнении исполнителей между собой по каждому виду работ. На каждом этапе к уже рассмотренным исполнителям добавляется еще один и проводится сравнение их суммарной эффективности.

Этап к представляется порядковым номером работы к, на которой проводится сравнение эффективности исполнителей, к = 1, 2, ..., п;

Су - себестоимость выполненияу-ой работы ¡-ым исполнителем;

Р(¿1, ¡2, ., 4) - стоимость выполнения к-ой работы исполнителями ¡1, ¡2, ..., ¡к.

Тогда рекуррентное уравнение можно записать в следующей форме:

Рк (¡1, ¡2, ., ¡к) = тт{сг1,к + Рк-1 (¡2, ¡3, ., ¡к); С/2,к + Рк-1 (¡1, ¡3,., ¡к);

Сгк,к+ Р-1 (¡1, ¡3, ., ¡к-1)}.

Сформулируем решение в виде последовательности шагов.

Шаг 1. Затраты труда при выполнении первой работы всеми исполнителями

равны ^ (/^ = сг11.

Шаг 2. Затраты труда при выполнении второй работы, если первое назначение окажется выполненным, составят

^2 (/1, /2) = т1п(С/1,2 + ^(/2); С/2,2 + ^1(/1)>.

Шаг 3. Затраты труда при выполнении третьей работы, если первые два назначения окажутся выполненным, составят

^з(/1, /2, /3) = т1п(с/1,з + ^г(/2, /3); сг2,з + ^(/'ь /'з);сгз,з+ ^(/'ь /2)}.

Шаг п. Сравним на п-ой работе эффективность всех п исполнителей. Суммар-ныезатратысоставят

Еп (/1, /2, • • •, п = тт(сг1,„ + ^и.1(/2, /3, • • •, 4); сг2,„ + ^(/'ь /3, • • •,

+^„-1(/1, /2, — , /и-1)}.

Минимальному значению ^„(/'1, /2, • .., /„) соответствует с„, г, 5 = 1, 2, •.., п, что означает назначение исполнителю г работы 5. Далее необходимо осуществить обратный проход и восстановить последовательность назначений на каждом из предыдущих шагов при условии известного оптимального назначения на конечном.

Венгерский алгоритм. Специфические особенности задач о назначениях послужили поводом к появлению эффективного венгерского метода их решения [1; 4]. Основная идея венгерского метода заключается в переходе от исходной квадратной матрицы стоимости С к эквивалентной ей матрице Сэ с неотрицательными элементами и системой п независимых нулей, из которых никакие два не принадлежат одной и той же строке или одному и тому же столбцу. Для заданного п существует п! допустимых решений. Если в матрице назначения Xрасположить п единиц так, что в каждой строке и столбце находится только по одной единице, расставленных в соответствии с расположенными п независимыми нулями эквивалентной матрицы стоимости Сэ, то получим допустимые решения задачи о назначениях.

Алгоритм основан на двух идеях:

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

2) если есть решение нулевой стоимости, то оно оптимально.

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

Шаг 1. В каждой строке матрицы стоимости найдем минимальный элемент и вычтем его из всех элементов строки.

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

шагу.

Шаг 3. Провести наименьшее количество линий (вертикалей и горизонталей), чтобы покрыть все нули. Для этого можно воспользоваться любым известным методом.

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

Если назначение окажется невозможным, необходимо повторять шаги 3 и 4 до тех пор, пока назначение не окажется возможным.

Алгоритм Литтла. Задача о назначениях в математической постановке представляет собой задачу дискретной оптимизации. Поэтому для ее решения можно применить алгоритмы целочисленного программирования. В настоящее время наиболее надежным средством решения целочисленных задач, встречающихся в практических исследованиях, является метод «ветвей и границ», предложенный в 1960 году Ленд и Дойг [1; 5]. Главный недостаток алгоритма метода ветвей и границ заключается в необходимости полностью решать задачи линейного программирования, ассоциированные с каждой из вершин многогранника допустимых решений. Для задач большой размерности это требует значительных и неоправданных с практической точки зрения затрат времени. Менее трудоемким методом решения поставленной задачи в этом случае является алгоритм Литтла [1; 6]. Данный алгоритм является частным случаем применения метода «ветвей и границ» и относится к числу точных алгоритмов, однако при решении задач большой размерности, когда разброс данных невелик, этот алгоритм сходится, но очень медленно. Общая идея проста: нужно разделить огромное число перебираемых вариантов на классы и получить оценки (снизу - в задаче минимизации, сверху - в задаче максимизации) для этих классов, чтобы иметь возможность отбрасывать варианты не по одному, а целыми классами. Трудность состоит в том, чтобы найти такое разделение на классы (ветви) и такие оценки (границы), чтобы процедура была эффективной. Применительно к задаче «о назначениях» данный алгоритм можно сформулировать в виде следующей последовательности шагов.

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

Шаг 2. Выбираем пару претендентов на ветвление (i, j), i, j = 1, 2, ..., n, для которых Cj=0. Для выделенных претендентов на назначение рассчитываем коэффициент Г (i, j) = min c. + min c . .Из всех коэффициентов T(i j) выбираем максимальный:

рФ j Р q^i q

Г (k, l) = max{Г (i, j)} . Пара (k, l) включается в оптимальное решение, т.е. на работу l назначается k-ый исполнитель.

Шаг 3. Т.к. каждому исполнителю соответствует только одна работа, то удаляем к-ую строку и столбец l.

Шаг 4. Повторяем шаги 1-3 алгоритмадо тех пор, пока порядок матрицы не станет равным двум. Затем в текущую матрицу назначений X вносим два недостающих назначения, определяющиеся однозначно матрицей второго порядка. Получаем оптимальное решение.

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

Таким образом, в зависимости от предпочтений исследователя, классическую задачу о назначениях можно решить, используя один из подходов, описанных выше. Это далеко не окончательный перечень алгоритмов, которые можно адаптировать для решения конкретной задачи. В основном, описанные выше алгоритмы предназначены для решения задач на графах: построение гамильтонова контура, поиск совершенного паросочетания наименьшей стоимости в двудольном графе. Однако в матричной формулировке она становится доступной для решения менеджерами, незнакомыми с методами и алгоритмами дискретной математики.

Список литературы:

1. Новиков, Ф.А. Дискретная математика для программистов: учебное пособие для вузов. - СПб.: Питер, 2003. - 304 с.

2. Соловьев, В.И. Методы оптимальных решений: учебное пособие. - М.: Финансовый университет, 2012. - 364 с.

3. Хемди А. Таха. Введение в исследование операций. - 7-е изд. - СПб.: Виль-ямс, 2005. - 901 с.

4. Harold W. Kuhn The Hungarian Method for the assignment problem // Naval Research Logistics Quarterly. 1955. No 2. P. 83-97.

5. Land A.H. and Doig A.G. An automatic method of solving discrete programming problems // Econometrica. 1960. V. 28. P. 497-520.

6. Little J.D.C., Murty K.G., Sweeney D.W., and Karel C. An Algorithm for the Traveling Salesman Problem // Operations Research. 1963. No 11. P. 972-989.