Come trovare i cicli che, insieme, coinvolgono il maggior numero di spigoli non condivisi in un grafico diretto?


26

Non sono un teorico dell'informatica, ma penso che questo problema del mondo reale appartenga qui.

Il problema

La mia azienda ha diverse unità in tutto il paese.

Abbiamo offerto ai dipendenti la possibilità di lavorare su un'altra unità. Ma c'è una condizione: il numero totale di lavoratori in un'unità non può cambiare.

Ciò significa: permetteremo a un dipendente di lasciare la sua unità se qualcuno vuole il suo posto.

Dati di richiesta (fittizi) di esempio:

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

Quanto sopra, tracciato: Visualizzazione dei dati di cui sopra

Vedi come dobbiamo scegliere tra le opzioni rosso, blu o nero?

Il vero problema è un po 'più complesso, perché abbiamo 27 unità e 751 richieste. Dai un'occhiata alla visualizzazione

L'obiettivo. il gol

Dopo aver raccolto tutte le richieste, come soddisfare la maggior parte di esse?

Teoria (?) Applicazione

Avendo il grafico , lascia che ogni unità sia un vertice e una richiesta sia un bordo diretto , uno scambio riuscito prenderà la forma di un cyle diretto.V EG(V,E)VE

Ogni ciclo deve usare una sola volta ( un lavoratore non può lasciare la sua unità due volte ), ma può visitare più volte ( un'unità può avere molti lavoratori che vogliono andarsene ).VEV

La domanda

Se questo problema è espresso come

"Come trovare i cicli che, insieme, coinvolgono il maggior numero di spigoli non condivisi in un grafico diretto"?

Soddisferemo la maggior parte dei richiedenti?

Detto questo, esiste un algoritmo per trovare quell'insieme ottimale di cicli?

Questo approccio greddy risolverà il problema?

  1. Trova il più grande ciclo diretto su ;G
  2. Rimuovi i suoi bordi da ;G
  3. Ripeti 1 fino a quando non c'è un ciclo diretto su ;G

Mi potete aiutare?

Conosci un altro modo per descrivere il problema originale (rendere felice la maggior parte dei richiedenti)?

Modifica : cambiato reparto in unità, per descrivere meglio il problema.


3
Sei sicuro di voler evitare di usare lo stesso bordo più di una volta? Dalla tua descrizione dell'applicazione, mi sembra che dovresti evitare di usare lo stesso vertice più di una volta, il che è una condizione più forte.
Tsuyoshi Ito,

3
@TsuyoshiIto: Come ho capito dalla descrizione, la condizione è che ad ogni vertice l'indegree dovrebbe essere uguale al livello inferiore. Pertanto, non è necessaria la disgiunzione dei vertici.
Yoshio Okamoto,

7
A proposito, se la mia comprensione è corretta, il problema dovrebbe essere risolvibile in tempo polinomiale mediante il flusso di rete. Vale a dire, se diamo un'unità di profitto per un'unità di flusso lungo un bordo e diamo un'unità di capacità su ciascun bordo, il problema è trovare una circolazione del massimo profitto.
Yoshio Okamoto,

3
Questo post discute una generalizzazione del tuo problema okasaki.blogspot.co.uk/2008/03/what-heck-is-math-trade.html (pensa a ogni persona come avere un oggetto da scambiare, vale a dire il posto di lavoro).
Radu GRIGore,

4
Fantastica domanda, ci fa sentire come quello che facciamo può davvero essere usato nella vita reale :).
Gopi,

Risposte:


9

OK, ho letto il codice di TradeMaximizer e credo che risolva il seguente problema più generale.

PROBLEMA: Dato è un grafico diretto i cui archi hanno dei costi. Trova una serie di cicli disgiunti vertici che massimizza prima il numero di vertici coperti e minimizza il costo totale in secondo luogo.

xyxyyz

Soluzione:

  1. xxLxRxLxRxyxLyR

  2. Trova una corrispondenza perfetta costo minimo nel grafico bipartito.

>1

(In effetti, TradeMaximizer esegue un'iterazione su tutte le soluzioni ottimali, secondo i due criteri sopra riportati, al fine di ottimizzare euristicamente altre cose, come la lunghezza del ciclo più grande. I cicli più grandi aumentano la possibilità che un "affare" non vada a buon fine perché uno persona cambia idea.)

PS: L'autore, Chris Okasaki, ha confermato che questo è ciò che fa il codice, nel post sul blog .


Sono riuscito a trovare una soluzione al problema originale utilizzando TradeMaximizer. Pubblicherò detais domani.
motobói,

@ motobói, ma tutto quello che devi fare è quello che ho scritto nel secondo paragrafo ...
Radu GRIGore

Ho trovato questa spiegazione sull'algoritmo: boardgamegeek.com/wiki/page/TradeMaximizer
motobói

Potresti spiegare o indicare una spiegazione sul perché è necessario rimuovere gli archi tra i componenti forti collegati?
motobói,

@ motobói, è un'ottimizzazione (per il caso medio). I passaggi (1) e (2) dovrebbero essere sufficienti.
Radu GRIGore,

22

11

Poiché tutti i costi e le capacità sono delimitati da costanti, un semplice algoritmo di annullamento del ciclo troverà la circolazione richiesta nel tempo polinomiale. Questo è quasi lo stesso dell'algoritmo ovvio ovvio:

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)

Questo non è l'algoritmo più veloce conosciuto.


pensi che funzioni fintanto che una persona non vuole lavorare in più di una "unità", giusto? usando il fraseggio della domanda originale. ma se la gente vuole lavorare in più di una unità, sospetta che questa astrazione si rompa. OP ha dichiarato il problema in termini di una sola unità, ma questo mi sembra piuttosto artificiosamente restrittivo. [quale umano ha una sola preferenza ...?]
vzn

1
Che cos'è una "persona" e una "unità"? Questa è una domanda sui grafici.
Jeffε

Sono perplesso: il mio esempio non è un contro esempio per questo algoritmo? Dopo aver scelto C, i cicli C_1 e C_2 non sono più cicli (perché ogni ciclo ha un fronte invertito); C non verrà più utilizzato perché ha un costo positivo dopo aver invertito i suoi bordi e non sono stati introdotti nuovi cicli. Stiamo parlando dello stesso problema? Mi piacerebbe avere una formulazione matematica del problema.
FiB

3
CCC1C2CCC1C2C=C1+C2C

apparentemente una "unità" è qualcosa di simile a un "dipartimento" e gli utenti stanno registrando richieste di trasferimenti tra dipartimenti [posizioni non esattamente specifiche nei dipartimenti]? Il diagramma delle FIB sembra avere unità come vertici e spigoli come richieste empl tra unità. FiB-- "mi piacerebbe avere una formulazione matematica del problema" .. spetta davvero a te fornire una formulazione precisa .. sembri essere a metà strada ..
vzn

4

Questo approccio avido non fornirà sempre la soluzione migliore.

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

CnC1C2

C1C22(n1)=2n2

n2


-3

esiste probabilmente un modo / formulazione di teoria dei grafi per risolvere questo problema, ma questo problema mi sembra più un problema di permutazione in cui alcune di tutte le permutazioni sono respinte e altre sono valide. le permutazioni sono dipendenti e le posizioni sono "posizioni" all'interno dell'azienda. una permutazione viene respinta se non soddisfa i requisiti di "persona [x] vuole posizione [y]". la distinzione dei confini unità / dept / org è apparentemente in qualche modo superflua alla soluzione in questo caso.

questo tipo di problema di permutazione con vincoli può essere prontamente convertito in un'istanza di problema SAT (soddisfacibilità). le assegnazioni di variabili booleane rappresentano i dipendenti e le clausole di vincolo rappresentano i vincoli "persona [x] vuole posizione [y]". ci sono esempi classici vicini di questo, uno di solito chiamato il problema del "tavolo da pranzo" in cui ci sono posti a sedere e ospiti e non tutti gli ospiti vogliono sedersi uno accanto all'altro (o allo stesso modo alcuni ospiti vogliono sedersi accanto ad altri ospiti).

e ovviamente ci sono sofisticati solutori SAT per istanze abbastanza grandi che coinvolgono all'incirca fino a centinaia di variabili e clausole, su PC, e se il problema non è "difficile", a migliaia.

vedi ad esempio [1] per un riferimento professionale e [2] per un esercizio di classe. c'è anche una certa somiglianza strutturale con quelli che sono noti come "problemi dei buchi dei piccioni" che sono ben studiati nei circoli SAT in cui i piccioni sono assegnati ai buchi dei piccioni e tu hai più o meno buchi dei piccioni. in quel caso tuttavia i piccioni sono generalmente visti come intercambiabili. in altre parole il problema del tavolo da pranzo è come il problema del buco del piccione con vincoli più forti e gli ospiti / piccioni hanno richiesto preferenze.

notare naturalmente / tenere presente che per questi tipi di problemi, a seconda dei vincoli, la risposta potrebbe essere "non esiste una soluzione vincolata".

[1] l'algoritmo del tavolo da pranzo, di crato

[2] CS402 princeton HW SAT

[3] Problema di soddisfazione, wikipedia


Ho provato la permutazione usando trademaximizer. Impostare un dipendente come un utente che vuole scambiare la sua unità X per l'unità Y . Ma il software non consentirà a più di un utente di scambiare lo stesso oggetto (la sua unità). Ogni oggetto deve essere unico. Per ovviare a ciò, avrei dovuto dire, (Jones) che vuole scambiare l'Unità-C-James con l'Unità-D-Laura o l'Unità-D-Sergio o l'Unità-D-Maria]
motobói
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.