Як знайти цикли, які разом включають найбільшу кількість неподілених ребер у спрямованому графіку?


26

Я не теоретик інформатики, але думаю, що ця проблема справжнього світу належить саме тут.

Проблема

Моя компанія має кілька підрозділів по всій країні.

Ми запропонували працівникам можливість працювати в іншому підрозділі. Але є умова: загальна кількість робітників у підрозділі не може змінюватися.

Це означає: ми дозволимо працівникові залишити свій підрозділ, якщо хтось захоче його місця.

Приклад (вигаданих) даних запиту:

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 запит. Будь ласка, погляньте на візуалізацію

Мета

Зібравши всі запити, як задовольнити більшість із них?

Теорія (?) Застосування

Маючи графік , нехай кожна одиниця буде вершиною V, а запит - направленим краєм E , успішний обмін прийме форму спрямованого кілець.G(V,E)VE

Кожен цикл повинен використовувати лише один раз ( працівник не може залишити свою одиницю двічі ), але може відвідувати V кілька разів ( у підрозділі може бути багато працівників, які бажають виїхати ).EV

Питання

Якщо ця проблема виражається як

"Як знайти цикли, які разом включають найбільшу кількість неподілених ребер у спрямованому графіку"?

Чи задовольнимо ми більшість запитувачів?

Щоправда, існує алгоритм, щоб знайти той оптимальний набір циклів?

Чи вирішить цей ґредді підхід проблему?

  1. Знайдіть найбільший спрямований цикл на ;G
  2. Видаліть його краї з ;G
  3. Повторюйте 1, поки на не буде направлений цикл ;G

Можеш мені допомогти?

Чи знаєте ви інший спосіб описати початкову проблему (зробити щасливою більшість запитувачів)?

Редагувати : змінив відділ на підрозділ, щоб краще описати проблему.


3
Ви впевнені, що хочете не раз використовувати один і той же край ? З вашого опису програми, мені здається, вам слід уникати використання однієї і тієї ж вершини не один раз, що є сильнішим умовою.
Цуйосі Іто

3
@TsuyoshiIto: Як я розумію з опису, умова полягає в тому, що в кожній вершині значення рівня має бути рівним перевищення рівня. Отже, вершина-нерозбірливість не потрібна.
Йосіо Окамото

7
До речі, якщо моє розуміння правильне, проблема повинна бути вирішена в поліноміальний час за допомогою мережевого потоку. А саме, якщо ми даємо одиницю прибутку за одиницю потоку по краю, а ми даємо одиницю ємності на кожному краї, проблема полягає в пошуку тиражу максимального прибутку.
Йосіо Окамото

3
У цій публікації обговорюється узагальнення вашої проблеми okasaki.blogspot.co.uk/2008/03/what-heck-is-math-trade.html (подумайте про кожну людину як про один предмет для торгівлі, а саме про їх роботу).
Radu GRIGбільше

4
Дивовижне запитання змушує нас відчувати, що те, що ми робимо, може бути реально використане в реальному житті :).
Гопі

Відповіді:


9

Гаразд, я читаю код TradeMaximizer і вважаю, що він вирішує наступну, більш загальну проблему.

ПРОБЛЕМА: Даний графік, спрямований на дуги. Знайдіть набір циклів, що розмежовуються на вершину, який спочатку максимально збільшує кількість критих вершин і мінімізує загальну вартість секунди.

Щоб вирішити задане тут питання, зробіть вершини службовцями та намалюйте дугу вартості одиниці, коли x хотіла б роботу y . Зауважте, що зараз співробітники мають вершини, а не краї. Приємно те, що працівник може сказати: "Я дуже хочу роботу у , але і z z теж зробив би".xyxyyz

Рішення:

  1. Побудуйте двосторонній графік наступним чином: Для кожної вершини у вихідний графік введіть ліву вершину x L , праву вершину x R та дугу x Lx R , вартість якої величезна (більша, ніж сума витрат у оригіналі графік). Для кожної дуги x y у вихідний графік введіть дугу x Ly R у двопартійний графік.xxLxRxLxRxyxLyR

  2. Знайдіть ідеальну відповідність із мінімальною вартістю у двосторонньому графіку.

Існує деяка попередня обробка вихідного графіка: Видаліть дуги між SCC, а потім обробіть всі SCC розміром як зазначено вище.>1

(Насправді TradeMaximizer здійснює повторне налаштування всіх оптимальних рішень, відповідно до двох вищевказаних критеріїв, для того, щоб евристично оптимізувати інші речі, наприклад, тривалість найбільшого циклу. Великі цикли збільшують шанс "угоди" не відбутися через те, що один людина передумає.)

PS: Автор, Кріс Окасакі, підтвердив, що саме це робить код, ще в публікації блогу .


Мені вдалося знайти вихідну проблему за допомогою TradeMaximizer. Я відправляю деталі завтра.
motobói

@ motobói, але все, що вам потрібно зробити, - це те, що я написав у другому абзаці ...
Radu GRIGо

Я знайшов це пояснення про алгоритм: boardgamegeek.com/wiki/page/TradeMaximizer
motobói

Чи можете ви пояснити або вказати на пояснення того, чому потрібно видаляти дуги між сильними з’єднаними компонентами?
motobói

@ motobói, Це оптимізація (для середнього випадку). Кроків (1) і (2) повинно бути достатньо.
Раду ГРИГо

22

Це стандартна проблема обігу з мінімальними витратами. Дайте кожному направленому краю ємність а вартість - 1 . Тоді можливий тираж - це сума (тобто об'єднання) керованих циклами, що розмежовуються на край, а вартість тиражу - це заперечення кількості ребер.11

Оскільки всі витрати та потужності обмежені константами, простий алгоритм відміни циклу знайде необхідну циркуляцію в поліноміальний час. Це майже те саме, що очевидний жадібний алгоритм:

while G has any negative-cost directed cycles
    γ = arbitrary negative-cost directed cycle
    reverse every edge in γ
    negate the cost of every edge in γ
return the subgraph of reversed edges

O(VE)0EEO(VE2)

Це не найшвидший відомий алгоритм.


подумайте, що це працює до тих пір, поки людина не хоче працювати в більш ніж одному «підрозділі», правда? використовуючи фразування оригінального запитання. але якщо люди хочуть працювати в більш ніж одній одиниці, підозрюють, що ця абстракція виходить з ладу. ОП заявило про проблему лише з одного підрозділу, але це здається мені штучно обмежуючим. [яка людина має лише одне уподобання ...?]
vzn

1
Що таке "людина" та "одиниця"? Це питання про графіки.
Jeffε

Мені спантеличено: чи мій приклад не є протилежним прикладом для цього алгоритму? Вибравши C, цикли C_1 і C_2 вже не є циклами (оскільки кожен цикл має один зворотний край); C не буде використовуватися знову, оскільки він має позитивну вартість після реверсування країв і немає нових циклів. Ми говоримо про ту саму проблему? Дуже хотів би мати математичну постановку проблеми.
FiB

3
CCC1C2CCC1C2C=C1+C2C

мабуть, "підрозділ" - це щось на кшталт "відділу", і користувачі записують запити на передачу між відділами [не зовсім конкретні посади у відділах]? Діаграма FIBs, схоже, має одиниці у вигляді вершин і ребер, як запити EML між одиницями. FiB-- "хотілося б мати математичну постановку проблеми" .. Вам справді належить надати точну формулювання ... ви, здається, на півдорозі ..
vzn

4

Цей жадібний підхід не завжди дасть найкраще рішення.

Cn{(v1,v2),,(vn,v1)}C1C2n1C

CnC1C2

C1C22(n1)=2n2

n2


-3

Мабуть, існує спосіб / формулювання теорії графів для вирішення цього питання, але ця проблема для мене звучить більше як проблема перестановки, де частина всіх перестановок відхилена, а інші є дійсними. перестановки - це працівники, а посади - "посади" в компанії. перестановка відхиляється, якщо вона не відповідає вимогам "людина [х] хоче позицію [у]". розрізнення меж одиниць / dep / org в цілому, очевидно, дещо зайве для рішення.

цей тип проблеми перестановки з обмеженнями можна легко перетворити на екземпляр задачі SAT (задоволеності). булеві змінні призначення представляють службовців, а обмеження пропозиції представляють обмеження "людина [x] хоче позицію [y]". поблизу є класичні приклади цього, як правило, це називається проблемою "обіднього столу", коли у вас є місця для сидіння та гості, і не всі гості хочуть сидіти поруч (або дуже подібне, деякі гості хочуть сидіти поруч з іншими гостями).

і звичайно, є складні рішення для SAT для досить великих примірників, що містять приблизно до сотень змінних і пропозицій на ПК, і якщо проблема не є «важкою», у тисячах.

див., наприклад, [1] для професійної довідки та [2] для заняття. Існує також деяка структурна схожість з тими, що відомі як "проблеми з голубами", які добре вивчені в колах SAT, де голуби призначаються до голубів, а у вас більш-менш отвори, ніж у голубів. в цьому випадку, проте, голуби, як правило, розглядаються як взаємозамінні. Іншими словами, проблема обіднього столу подібна до проблеми голубів із сильнішими обмеженнями, і гості / голуби мають необхідні переваги.

зауважте, звичайно / майте на увазі, що для таких типів проблем, залежно від обмежень, відповідь може бути "такого обмеженого рішення не існує".

[1] алгоритм обіднього столу, по крато

[2] CS402 Princeton HW SAT

[3] Проблема задоволеності, вікіпедія


Я спробував перестановку за допомогою trademaximizer. Встановити співробітника в якості користувача , який бажає торгувати його блок X для блоку Y . Але програмне забезпечення не дозволить більше одного користувача торгувати одним і тим же предметом (його одиницею). Кожен предмет повинен бути унікальним. Для цього я повинен був, скажімо, [(Джонс) хоче торгувати підрозділом-С-Джеймс для підрозділу-Д-Лора або підрозділу-Д-Серхіо або Блок-Д-Мері]
motobói
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.