Дано
- n сотрудников
- n работ Стоимость выполнения j работы i-ым сотрудником: i, j=1,…n
Найти
Распределить работы среди сотрудников так, чтобы суммарная стоимость выполнения работ была минимальной, при этом один работник берется только за одну работу, и наоборот, одна работа назначается только одному работнику. То есть найти назначения
Модель
Представим исходные данные в виде матрицы работ n*n, у которой на пересечении i-ой строки и j-го столбца стоит стоимость выполнения j-ой работы i-ым сотрудником. Будем проводить манипуляции с этой матрицей.
Идея алгоритма
- если из всех элементов некой строки матрицы или столбца матрицы вычесть одно и то же число y, общая стоимость уменьшится на y, а оптимальное решение не изменится;
- если есть решение нулевой стоимости, то оно оптимально. Отсюда следует, что будем модифицировать матрицу работ по определенным правилам, пока не найдется решение нулевой стоимости. Когда назначение найдется, оно совпадет с искомым
Алгоритм
- Редукция матрицы работ по строкам: для каждой строки матрицы:
- находим минимальный элемент в строке
- Из каждого элемента строки вычитаем минимальный элемент
- Если назначение нулевой стоимости нашлось, оно оптимально
- Редукция матрицы работ по столбцам: для каждой строки матрицы
- находим минимальный элемент в столбце
- Из каждого элемента столбца вычитаем минимальный элемент
- Дописать
Алгоритм
- Редукция матрицы работ по строкам: для каждой строки матрицы:
- находим минимальный элемент в столбце
- Из каждого элемента столбца вычитаем минимальный элемент