Flusso massimo incrementale nei grafici dinamici


12

Sto cercando un algoritmo veloce per calcolare il flusso massimo nei grafici dinamici. cioè dato un grafico e s , t V abbiamo il flusso massimo F in G da s a t . Poi nuovo / vecchio nodo u aggiunti / eliminati con i corrispondenti bordi per formare un grafo G 1 . Qual è il flusso massimo nel grafico appena creato? Esiste un modo per impedire il ricalcolo del flusso massimo?G=(V,E)s,tVFGstuG1

Qualsiasi preelaborazione che non richiede molto tempo / memoria è apprezzata.

L'idea più semplice è ricalcolare il flusso.

Un'altra idea semplice è come questa, salvare tutti i percorsi di aumento utilizzati nel precedente calcolo del flusso massimo, per l'aggiunta di un vertice , possiamo trovare percorsi semplici (nel grafico della capacità aggiornato dal passaggio precedente) che iniziano dalla sorgente, vanno alla v quindi vanno verso la destinazione, ma il problema è che questo percorso dovrebbe essere semplice, non ho trovato di meglio di O ( n m ) per questo caso, per m = | E | . (Nota anche che se fosse solo un percorso, ciò potrebbe essere fatto in O ( n + m ) ma non è così.)vvO(nm)m=|E|O(n+m)

Anche per rimuovere il nodo sopra l'idea non funziona.

Inoltre ho già visto documenti come l' approccio incrementale per i bordi , ma sembra che non siano abbastanza buoni in questo caso, è più di per ogni bordo e sembra non sia un'estensione adatta in questo caso (abbiamo solo ricalcolato un flusso). Inoltre attualmente sto usando l' algoritmo di flusso massimo Ford-Fulkerson Se esiste una migliore opzione per gli algoritmi online, è bene saperlo.O(m)


Potresti chiarire "ma il problema è che questo percorso dovrebbe essere semplice" parte? Non l'ho capito.
Dmytro Korduban,

@ maldini.ua, In realtà intendo, il percorso che va dalla sorgente a e quindi il percorso da v a destinazione non dovrebbe avere un vertice comune (tranne v ). Supponiamo che v sia un nuovo nodo aggiunto. In caso contrario, possiamo saltare alcuni controlli e possiamo avere un algoritmo più veloce (in media, o possiamo essere asintoticamente). vvvv
Saeed,

Capito, ma per quanto mi riguarda non è qualcosa di speciale in . Penso che l'idea di ricalcolo più semplice sia la seguente: 1) aggiungere un nuovo vertice con bordi al grafico residuo ; 2) trova il flusso massimo nel grafico residuo aggiornato usando un algoritmo di flusso massimo a tua scelta. Il caso suggerito verrà elaborato "automaticamente" dall'algoritmo di flusso massimo (ad esempio, non troverà alcun percorso di aumento, ecc.). Se sei interessato a rimuovere i nodi, posso scriverlo in risposta. PS Per essere chiari, hai un grafico diretto o non indirizzato? v
Dmytro Korduban,

@ maldini.ua, aggiunge il normale ricalcolo complessità alla soluzione attuale, quindi non penso che sia buono (potrebbe essere buono sapendo che normalmente troppi bordi sono inutili e in realtà non causa un problema di prestazioni molto elevate), ma se hai idea di rimuovere nodo, sono interessato a vedere la tua idea, anche il grafico è diretto. PS ma sono interessato in entrambi i casi. |G|
Saeed,

Ricorda di eseguirlo nel grafico residuo, in questo momento dovrebbero esserci molti spigoli di capacità zero. Di solito funziona abbastanza velocemente soprattutto nei grafici sparsi (almeno per me ha funzionato). D'altro canto, l'approccio del "percorso semplice" mi sembra un po 'più sofisticato. Inoltre, non dimenticare di avere legato al tempo di esecuzione per Ford-Fulkerson (dove | f | è limitato dalla somma delle capacità dei bordi adiacenti di v ). O(|f||E|)|f|v
Dmytro Korduban,

Risposte:


6

L'approccio descritto potrebbe non essere teoricamente ottimale. È solo una semplice soluzione pratica che può funzionare per l'autore. Non posso fornire riferimenti perché ho sempre pensato che fosse un folklore ampiamente conosciuto, ma stranamente nessuno lo ha pubblicato nella risposta. Quindi lo faccio.

Supponiamo di avere una rete non indirizzata . Supponiamo che sia memorizzato in una struttura di dati che consente facili inserimenti / eliminazioni di vertici / archi. A volte useremo la rete residua G f (cioè con capacità aggiornate c f = c - f ).G=(V,E,c)Gfcf=cf

La prima parte è come elaborare gli inserimenti / eliminazioni di vertici. È più o meno semplice per gli inserimenti:

  1. Aggiungi un nuovo vertice con i bordi corrispondenti alla rete residua.
  2. Trova un flusso massimo nella rete residua aggiornata usando un algoritmo maxflow a tua scelta.

Per le cancellazioni le cose sono diventate più complicate. Immaginiamo abbiamo diviso il vertice stiamo per eliminare in 2 metà V i n e v o u t tale che tutti in-archi punti a v i n , tutti fuori-archi va da v o u t e questa nuova vertici sono collegati da un arco di capacità infinita. Poi soppressione v è equivalente alla soppressione dell'arco tra v i n e v o u t . Cosa succederà in questo caso? Indichiamo con f vvvinvoutvinvoutvvinvoutfvil flusso che passa attraverso il vertice . Poi v i n sperimenteranno eccesso di f v unità di flusso e v o u t sperimenterà carenza di f v unità di flusso subito dopo l'eliminazione (le limitazioni del flusso saranno ovviamente rotti). Per mantenere nuovamente i vincoli di flusso dovremmo riorganizzare i flussi, ma vogliamo anche mantenere il valore del flusso originale il più alto possibile. Vediamo prima se possiamo fare il riarrangiamento senza ridurre il flusso totale. Per verificare che trovi un maxflow ~ f v da v i n a v o uvvinfvvoutfvfv~vin nella rete "tagliata" residuo (cioè senza l'arco di collegamento v i n e v o u t ). Dovremmo limitarlo con f v ovviamente. Se capita che sia uguale a f v, siamo fortunati: abbiamo riassegnato il flusso che stava attraversandovin modo tale che il flusso totale non fosse cambiato. Nell'altro caso il flusso totale deve essere ridotto di un eccesso "inutile" diΔ= f v - ~ f v unità. Per fare ciò, collegare temporaneamentesetvoutvinvoutfvfvvΔ=fvfv~stda un arco di capacità infinita ed eseguire di nuovo algoritmo MaxFlow da a v o u t (dovremmo vincolato flusso mediante Δ ). Ciò riparerà la rete residua e farà ritenere i vincoli di flusso, riducendo automaticamente il flusso totale di Δ .vinvoutΔΔ

La complessità temporale di tali aggiornamenti può dipendere dall'algoritmo maxflow che utilizziamo. I casi peggiori possono essere piuttosto negativi, ma è comunque meglio del ricalcolo totale.

O(|V|2|E|)O(|E|2logCmax)


Dopo aver letto la risposta dell'ultima vzn ho trovato l'approccio simile descritto alla pagina 90 di questo .
Dmytro Korduban,

fv~fvfv~Δ

vucf(v,u)cf(u,v)f(v,u)=f(u,v)

Qualche idea su come lo faresti se vuoi cambiare una capacità limite?
Chet,

-1

ok prendendo in considerazione le nuove informazioni ed evitando alcuni difficili falsi start / ref di aringhe rosse (mea culpa), ecco alcuni nuovi ref su questo.

Risoluzione rapida di una sequenza online di problemi di portata massima con estensioni al calcolo Riduzioni minime robuste Doug Altner e Özlem Ergun

questo riferimento considera sequenze online di MFP e "avviamenti a caldo", ovvero basandosi su chg incrementali su un MFP precedente. "Dimostriamo che i nostri algoritmi riducono il tempo di esecuzione di un ordine di grandezza se confrontati con codici simili che utilizzano un solutore MFP black-box. In particolare, mostriamo che il nostro algoritmo per tagli minimi robusti può risolvere istanze in pochi secondi che richiederebbero oltre quattro ore usando un risolutore di flusso massimo in scatola nera. "


avanzamenti su problemi che coinvolgono i flussi massimi Altner, Douglas S., georgia tech

in questa tesi di dottorato del 2008 (pdf scaricabile) l'autore considera il problema di aggiungere in modo incrementale archi che sembra essere "abbastanza vicino" al problema di aggiungere nuovi vertici (con più nuovi archi).

gran parte di questo riferimento riguarda l'eliminazione di parti della rete (tagli / "interdizione") come indicato nella prima parte dell'abstract

vedere esp "IV RISOLUZIONE DELLE SEQUENZE ONLINE DEI MASSIMI FLUSSI...... p63".

p 63 "L'obiettivo di questo capitolo, tuttavia, è convincere il lettore che l'uso ripetitivo di un risolutore di flusso massimo in scatola nera per risolvere un'ampia sequenza di stampanti multifunzione può portare a un numero enorme di calcoli non necessari."

p66 "Nelle applicazioni sopra menzionate, le stampanti multifunzione sono in genere topologicamente simili. Cioè, la stampante multifunzione successiva nella sequenza differisce dalla precedente aggiungendo o rimuovendo un piccolo numero di archi o modificando prevedibilmente le capacità di un set di arco localizzato. , quando si risolvono questi casi, il tempo e lo spazio necessari per archiviare qualsiasi cosa oltre la soluzione al problema precedente sono in genere ingiustificati. "

p67 autore usa anche l'approccio "avvio a caldo" qui. "Una strategia efficace per risolvere rapidamente un'intera sequenza online di problemi di ottimizzazione è quella di sviluppare l'euristica di riaottimizzazione efficiente. A tal fine, sviluppiamo un algoritmo di flusso massimo modificato progettato per efficienti avviamenti a caldo." "

vedi esp p71 che presenta il problema incrementale specifico del new-arc:

Nuovo problema di riaottimizzazione del flusso massimo di nuovi archi (NAMFRP)

l'autore considera i problemi più generali p67

Problema di riaottimizzazione del flusso massimo (MFROP)
Problema di riaottimizzazione dell'arco singolo flusso massimo (MFSAROP)


-3

da alcune ricerche rapide sembra che la versione online sia un'area di ricerca attiva. non menzionate l'area di applicazione che potrebbe aiutare a restringere la ricerca della letteratura. un'opzione è quella di cercare un'area di applicazione in cui c'è l'innovazione più o più recente. quindi c'è qualche applicazione del flusso massimo incrementale nei sistemi di visione e alcuni algoritmi per esso lì; prova i flussi massimi in base alla ricerca incrementale in ampiezza nei laboratori di ricerca Microsoft. parafrasando l'intro di questo documento, apparentemente per i casi di visione l'algoritmo di Boykov e Kolmogorov fa bene e non ci sono controesempi di tempo esponenziale noti, sebbene al di fuori delle applicazioni di visione potrebbe funzionare male. quindi potrebbe valere la pena provare l'algoritmo B&K sui tuoi dati e vedere come si comporta e

sembra che tu stia dicendo che un algoritmo incrementale che è lineare nel numero di spigoli del grafico non è una velocità sufficiente? ma non è abbastanza alta efficienza? con quanti bordi hai a che fare? forse l'approccio potrebbe essere quello di ridurre i costi di attraversamento del grafico se questo è costoso o un fattore significativo (ad es. grafico archiviato in db vs grafico archiviato in memoria)

ecco un articolo interessante che sostiene che mentre l'algoritmo non incrementale per il flusso massimo è in P la versione incrementale è NP completa. "Per quanto ne sappiamo, i nostri risultati sono i primi a trovare un problema P-time la cui versione incrementale è NP completa."

Flusso incrementale di Hartline, Sharp


Grazie, non ho letto i tuoi documenti di riferimento, li darò un'occhiata (ho visto alcuni documenti prima e li ho trovati inutili), ma sulla mia area problematica, è un problema nella reale situazione lavorativa nel mercato azionario. È un po 'complicato dire cosa è successo quando ho scoperto che avrei dovuto risolvere questo problema. In realtà non pensavo che fosse difficile a prima vista, ma dopo aver provato un po 'di codice vedo che non è così facile. questo algoritmo verrà eseguito sui telefoni cellulari, non sono così veloci (e ai miei clienti non piace il mio algoritmo :). Inoltre a volte arriveranno troppi bordi con il nuovo nodo. e questo è un collo di bottiglia.
Saeed,

interessante. sembra che dovresti probabilmente andare con l'euristica basata su una potenza di elaborazione limitata e la necessità di aggiornamenti rapidi. è invece possibile spostare l'elaborazione dal "client" (nel tuo caso apparentemente i telefoni) al server? ogni client deve calcolare una versione diversa (ovvero dati diversi) del problema?
dal

In Iran, il problema maggiore è la velocità della connessione Internet, quindi non posso spostarla sul lato server. Se andasse bene (buona velocità), sicuramente il ricalcolo non sarebbe male.
Saeed,

6
Non vedo come questo risponda alla domanda originale, che riguarda un grafico che si evolve nel tempo con l'aggiunta di nodi e bordi. Il primo documento descrive un algoritmo incrementale per il problema standard del flusso massimo in un colpo. Il secondo documento descrive un documento per un diverso problema di "flusso massimo incrementale", in cui l'insieme dei bordi è fisso ma le loro capacità aumentano nel tempo.
Jeffε

1
@ Jɛ ff E, sì, hai ragione :) infatti prima vedo documenti simili ai documenti di riferimento, ma come hai detto che non sono correlati al mio problema, la maggior parte dei documenti che vedo fino ad ora è ciò a cui ho fatto riferimento.
Saeed,

-5

un'altra possibilità / direzione è l' algoritmo a flusso massimo con etichetta push che è "uno degli algoritmi più efficienti per il flusso massimo" e può avere profili di complessità migliori a seconda dei dati. ad es. come afferma la pagina di Wikipedia

O(V3)O(V2EO(VElog(V2/E))


3
Ancora una volta, non vedo come questa risposta sia rilevante per la domanda postata. Push-relabel è una strategia ben nota da manuale per rispondere al problema del flusso massimo standard.
Jeffε

così è Ford Fulkerson ... giusto? & OP chiede qualcosa di meglio. conosci qualcosa che dimostra che il push-relabel è peggio del ford-fulkerson? il suo OP non chiaro ha familiarità con il push-relabel. Accidenti, l'algoritmo che appare nel libro di testo non è certamente un criterio immediato per rifiutare la risposta qui, giusto?
vzn

3
Attualmente si; le domande a cui si risponde nei libri di testo standard (o Wikipedia) non sono a livello di ricerca. Tuttavia, la prima domanda postata sui flussi incrementali è interessante e sicuramente di portata. (La mancanza di risposte definitive suggerisce che la risposta corretta potrebbe essere "Buona domanda. Nessuno lo sa.")
Jeffε

vzn, grazie per il tuo contributo, ma: "sai qualcosa che dimostra che il push-relabel è peggio del ford-fulkerson" non è una buona ragione per pubblicarlo come risposta, se sai perché "il push-relabel" negli algoritmi online è meglio di Ford-Falkerson è bello dirlo, personalmente mi piace Ford-Falkerson per semplicità, basso fattore costante e lo conosco dal passato. Ma come ho detto, non potrei dire che è una buona opzione in tutti i casi, anche questi algoritmi non sono semplicemente comparabili, hanno bisogno di test pratici.
Saeed

guarda il pt è che se hai un algoritmo di flusso massimo che non funziona bene per i tuoi dati, prova un altro esp che si dice funzioni bene perché ce ne sono alcuni ottimizzati per profili di dati diversi. no non è online / "vertice incrementale" ma potrebbe funzionare meglio per il caso offline se non ci sono alternative. le versioni online mentre esistono come ho trovato sopra, sono probabilmente molto difficili da implementare ...
vzn
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.