Алгоритм поиска уникального набора элементов, по одному элементу из каждого набора наборов

Предположим, у вас есть набор людей J, и вам нужно сфотографировать каждого человека. У них есть только один фотограф, и у фотографа есть конечное количество раз T (|T| > |J|), доступных для каждой фотографии. В любой момент времени t из T фотограф может сделать только одну фотографию. Каждый человек в J доступен для фотографирования только в определенное время в T, хотя каждого человека попросили выбрать хотя бы один раз, когда он доступен. По сути, в зависимости от доступности каждого человека фотограф хочет попытаться назначить одного человека на каждый доступный временной интервал в T, чтобы каждый мог сфотографироваться. Существует ли алгоритм с полиномиальным временем для решения этой задачи? Если нет, то какая задача неполиномиального времени сводится к этой задаче за полиномиальное время, т. е. как показать, что этой задачи нет в P?

Пример:

Фотограф доступен в [1, 12, 15, 33, 45, 77].
Человек А доступен в [12, 33].
Человек Б доступен в [1, 12].
Человек С доступен в [1, 12].

Мы можем сфотографировать всех, выбрав:
Человек А: 33
Человек Б: 1
Человек В: 12

Если бы мы начали с выбора A: 12, B: 1, мы не смогли бы найти место для C, т. е. нам пришлось бы вернуться назад и переназначить A на 33.

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


person Bryce Thomas    schedule 07.12.2013    source источник


Ответы (2)


Это можно смоделировать как задачу с назначением (или Проблема сопоставления двудольных графов).

Источниками должны быть люди, а пунктами назначения — время, доступное фотографу. Матрицу затрат можно построить, приравняв стоимость отсутствия человека в данный момент времени к 1, а доступность к 0.

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

Если результирующая стоимость оптимального решения отлична от нуля, это означает, что присвоение невозможно.

Ее можно решить с помощью венгерского алгоритма за полиномиальное время.

person Abhishek Bansal    schedule 07.12.2013
comment
Отличный ответ. Ре. ненулевые фиктивные строки, разве они не должны быть добавлены с 0 затратами (не 2)? Если мы используем 2 в фиктивных строках, то не всегда ли решением будет › 0? Тогда как, если мы используем 0, то 0 всегда будет выбрано для фиктивных строк и просто не повлияет на общую стоимость? - person Bryce Thomas; 07.12.2013
comment
@BryceThomas да, я думаю, ты прав. Спасибо за указание на это. Я обновлю ответ. - person Abhishek Bansal; 07.12.2013

Ответ Абхишека подойдет для этой проблемы, но я хотел добавить альтернативу, которую я нашел более быстрой. Абхишек уже упомянул (вскользь) двудольное сопоставление, для которого алгоритм Хопкрофта-Карпа имеет значение. Алгоритм Хопкрофта-Карпа используется для нахождения соответствия максимального количества элементов и выполняется за время $O(sqrt(V)*E)$ против O(n^3) для венгерского алгоритма. «Сопоставление максимального количества элементов» в основном означает, что он находит максимальное количество назначений, которое может быть сделано, поэтому в моем предыдущем примере максимальное количество людей, которые могут быть запланированы для фотографии, основано на доступности каждого и доступном временном интервале фотографа. Таким образом, если возвращаемая максимальная кардинальность равна количеству людей, вы знаете, что назначение возможно для всех.

Обратите внимание, что причина, по которой мы можем использовать алгоритм Хопкрофта-Карпа в этом примере, заключается в том, что мы не заботимся о весовых коэффициентах ребер — не имеет значения, кому назначается какой временной интервал, если каждый получает несколько временной интервал. Нам понадобилось бы что-то вроде венгерского алгоритма, если бы мы заботились о весах, например. если бы у нас был «фактор неудобства», который каждый человек назначает каждому из своих доступных временных интервалов, поскольку венгерский алгоритм предназначен для оптимизации результата в этих условиях, тогда как Хопкрофт-Карп только определяет, сколько назначений вообще возможно.

На практике я начал с венгерского алгоритма, и его выполнение на моем конкретном наборе данных заняло около 30 секунд. После переключения на алгоритм Хопкрофта-Карпа я смог получить тот же результат за ‹ 1 секунды.

person Bryce Thomas    schedule 28.01.2014