Я не теоретик информатики, но думаю, что проблема реального мира здесь.
Проблема
У моей компании есть несколько подразделений по всей стране.
Мы предложили сотрудникам возможность работать на другом блоке. Но есть условие: общее количество работников на единицу не может измениться.
Это означает: мы позволим сотруднику покинуть свое подразделение, если кто-то захочет его занять.
Пример (вымышленный) запроса данных:
Name Origin Destination
Maria 1 -> 2
Marcos 2 -> 3
Jones 3 -> 4
Terry 4 -> 5
Joe 5 -> 6
Rodrigo 6 -> 1
Barbara 6 -> 1
Marylin 1 -> 4
Brown 4 -> 6
Benjamin 1 -> 3
Lucas 4 -> 1
Выше, построено:
Посмотрите, как мы должны выбирать между красным, синим или черным вариантами?
Реальная проблема немного сложнее, потому что у нас есть 27 единиц и 751 запрос. Пожалуйста, посмотрите на визуализацию
Цель
Собрав все запросы, как удовлетворить большинство из них?
Теория (?) Приложения
Имея граф , пусть каждая единица будет вершиной а запрос - направленным ребром , успешный обмен примет форму направленного cyle.
Каждый цикл должен использовать только один раз ( работник не может покинуть свое подразделение дважды ), но может посещать несколько раз ( в подразделении может быть много работников, желающих уйти ).
Вопрос
Если эта проблема выражается как
«Как найти циклы, которые вместе содержат наибольшее количество не общих ребер в ориентированном графе»?
Удовлетворим ли мы большинство заказчиков?
Что правда, есть алгоритм, чтобы найти этот оптимальный набор циклов?
Этот подход Гредди решит проблему?
- Найдите самый большой направленный цикл на ;
- Удалить его края от ;
- Повторяйте 1, пока не будет направленного цикла на ;
Можете ли вы мне помочь?
Знаете ли вы другой способ описать исходную проблему (осчастливить большинство заказчиков)?
Изменить : изменил отдел на единицу, чтобы лучше описать проблему.
Ответы:
Хорошо, я прочитал код TradeMaximizer и считаю, что он решает следующую, более общую проблему.
Чтобы решить вопрос, заданный здесь, сделайте вершины сотрудниками и нарисуйте дугу удельной стоимости, когда хотел бы работу . Обратите внимание, что сотрудники теперь являются вершинами, а не ребрами. Приятно то, что сотрудник может сказать: «Я действительно хочу работу , но работа у тоже подойдет».x→y x y y z
Решение:
Постройте двудольный граф следующим образом: Для каждой вершины в исходном графе левую вершину , правую вершину и дугу от , стоимость которой огромна (больше, чем сумма затрат в исходном графе). Для каждой дуги в исходном графе дугу в двудольном графе.x xL xR xL→xR x→y xL→yR
Найти минимальную стоимость идеального соответствия в двудольном графе.
Существует также некоторая предварительная обработка исходного графа: Удалите дуги между SCC, затем обработайте все SCC размером как указано выше.>1
(Фактически, TradeMaximizer перебирает все оптимальные решения в соответствии с двумя вышеупомянутыми критериями, чтобы эвристически оптимизировать другие вещи, такие как длина самого большого цикла. Большие циклы увеличивают вероятность того, что «сделка» не состоится, потому что один человек меняет свое мнение.)
PS: автор, Крис Окасаки, подтвердил, что это то, что делает код, еще в посте в блоге .
источник
Это стандартная проблема обращения с минимальными затратами. Дайте каждому направленному ребру емкость и стоимость . Тогда допустимая циркуляция является суммой (т. Е. Объединением) непересекающихся по ребру направленных циклов, а стоимость циркуляции является отрицанием числа ребер.1 −1
Поскольку все затраты и мощности ограничены константами, простой алгоритм отмены цикла найдет требуемую циркуляцию за полиномиальное время. Это почти так же, как очевидный жадный алгоритм:
Здесь стоимость цикла - это сумма затрат на его ребра. Циклы с отрицательной стоимостью можно найти, используя алгоритм кратчайшего пути Беллмана-Форда за . Каждая итерация снижает стоимость текущего тиража как минимум на 1. Начальный (пустой) тираж имеет стоимость , а финальный тираж - как минимум . Таким образом, алгоритм заканчивается после не более чем итераций, поэтому его общее время выполнения составляет не более .O(VE) 0 −E E O(VE2)
Это не самый быстрый из известных алгоритмов.
источник
Этот жадный подход не всегда дает лучшее решение.
Рассмотрим цикл с ребрами и двух циклов непересекающихся и каждый из которых имеет ребер и совместное использование одного ребра с .n { ( v 1 , v 2 ) , … , ( v n , v 1 ) } C 1 C 2 n - 1 CC n {(v1,v2),…,(vn,v1)} C1 C2 n−1 C
Если вы сначала используете самый большой цикл , вы сможете порадовать сотрудников. Тогда циклы и каждый теряют одно ребро и больше не являются циклами.n C 1 C 2C n C1 C2
Но если вы выберете и , вы сможете порадовать сотрудников.C 2 2 ( n - 1 ) = 2 n - 2C1 C2 2(n−1)=2n−2
В сторону: вместо добавления двух циклов в приведенном выше примере, вы можете добавить циклов, что делает жадное решение еще хуже.⌊n2⌋
источник
Вероятно, существует способ / формулировка теории графов, чтобы решить эту проблему, но эта проблема для меня больше напоминает проблему перестановок, когда некоторые из всех перестановок отклоняются, а другие являются действительными. Перестановки - это сотрудники, а должности - это «должности» в компании. перестановка отклоняется, если она не соответствует требованиям «person [x] хочет положение [y]». различие в единицах / границах / границах организации, по-видимому, несколько избыточно для решения в этом случае.
этот тип задачи перестановки с ограничениями может быть легко преобразован в экземпляр задачи SAT (выполнимости). присваивания логических переменных представляют сотрудников, а условия ограничений представляют ограничения «person [x] want position [y]». Есть несколько классических примеров этого, один из которых обычно называют проблемой «обеденного стола», когда у вас есть сидячие места и гости, и не все гости хотят сидеть рядом друг с другом (или очень похоже, что некоторые гости хотят сидеть рядом с другими гостями).
и, конечно, существуют сложные SAT-решатели для довольно больших случаев, включающие примерно до сотни переменных и предложений, на ПК, и, если проблема не «сложная», тысячами.
см., например, [1] для профессиональной справки и [2] для классного упражнения. Существует также некоторое структурное сходство с так называемыми «проблемами с голубями», которые хорошо изучены в кругах SAT, где голуби назначены для голубей, и у вас больше или меньше отверстий, чем у голубей. однако в этом случае голуби обычно считаются взаимозаменяемыми. Другими словами, проблема с обеденным столом подобна проблеме с голубями с более жесткими ограничениями, и у гостей / голубей есть требуемые предпочтения.
обратите внимание, конечно, / имейте в виду, что для этих типов проблем, в зависимости от ограничений, ответ может быть «такого ограниченного решения не существует».
[1] алгоритм обеденного стола, крато
[2] CS402 princeton HW SAT
[3] Проблема удовлетворенности, википедия
источник