Ciclo di peso negativo vs ciclo di peso massimo


8

Ho difficoltà a capire perché è facile rilevare cicli di peso negativo (Bellman Ford) ma è difficile trovare il ciclo di peso massimo in un grafico non orientato.

Se neghiamo il peso di ciascun bordo, possiamo facilmente trovare se ci sono cicli con peso totale> 0. Tuttavia non deve essere facile trovare se ci sono cicli con peso> 1 oppure possiamo ripetere con 2, 3 , 4 ecc. Fino a quando la risposta è no.

È corretto? Perché è molto più difficile rilevare se esiste un ciclo con peso> 1, quindi scoprire se esiste un ciclo con peso> 0?

Risposte:


2

Non credo sia sorprendente che trovare un singolo ciclo di peso negativo sia più facile che trovare il ciclo di peso più alto. Se mi chiedi di trovare un ciclo a peso negativo, riesco a trovarne uno e, se ti do quello che pretendo sia una risposta, è molto facile per te controllare la sequenza dei vertici e vedere che il peso è davvero negativo. Ma il ciclo di peso massimo sembra un oggetto molto speciale. Anche se avessi affermato di averlo trovato, come potrei convincerti che non esiste un altro ciclo con un peso ancora maggiore?

D'altra parte, forse questa intuizione non è utile, poiché è anche banale verificare che un determinato ciclo abbia un peso di almeno 1 o 2 o 17 ...


1

Questa è un'ottima domanda Non ho una spiegazione pienamente soddisfacente, ma lascia che ti dia un inizio.

Prima di tutto, è importante capire che non possiamo risolvere questo problema semplicemente enumerando tutti i cicli e controllando il peso di ognuno. Perchè no? Perché ci possono essere (e spesso lo sono) in modo esponenziale molti cicli. Pertanto, il semplice enumerarli richiederà necessariamente tempo esponenziale - troppo tempo per essere fattibile.

Quindi, come funziona Bellman-Ford? Funziona con un trucco intelligente che evita la necessità di esaminare individualmente ogni ciclo uno per uno. Invece, crea un sommario che riassume qualcosa sull'effetto di tutti i percorsi e cicli di lunghezza fino an. In effetti, per ogni verticev, riassume tutti i percorsi che iniziano da v, fine a ve prendi al massimo npassi. Poiché ogni ciclo deve contenere un percorso di questo modulo, il riepilogo incapsula in qualche modo l'effetto di tutti i cicli possibili.

Perché non possiamo usarlo per rilevare (diciamo) se esiste un ciclo di peso 1? È perché il sommario di Bellman-Ford include percorsi che percorrono il ciclo più volte. Se il ciclo è di lunghezzak, quindi includerà percorsi di lunghezza n, cioè, percorsi che percorrono il ciclo n/kvolte. Ad esempio, se hai un ciclo di lunghezzan/3, quindi il riepilogo include un percorso che percorre tre volte il ciclo.

Qual è l'effetto di camminare un ciclo più volte? Se si desidera distinguere i cicli a peso positivo dai cicli il cui peso non è positivo, camminare più volte in un ciclo non danneggia. Se il ciclo ha un peso positivo, allora puoi camminarlo un paio di volte e il peso totale sarà comunque positivo. Se il peso del ciclo non è positivo, puoi girarci attorno alcune volte e il peso totale sarà comunque non positivo. Quindi, se tutto ciò che ci interessa è la differenza tra peso positivo e non positivo, camminare più volte nel ciclo non fa male.

Ma ora considera come cambiano le cose se ciò che ci interessa è la differenza tra "peso" 1peso "vs" <1". Se abbiamo un ciclo il cui peso è <1 e andiamo in giro per quel ciclo più volte, il peso totale potrebbe diventare 1. Ad esempio, se il peso del ciclo è1/2 e percorriamo il ciclo tre volte, quindi il peso totale di quel percorso è 1.5, che è 1: abbiamo iniziato con un ciclo di peso <1 e finì con un percorso di peso 1.5. Questo fatto rovina totalmente Bellman-Ford e lo rende inutile per verificare se esiste un ciclo di peso1. (Vedi la differenza?)

Mi rendo conto che questa non è una risposta soddisfacente al 100%. Ti dice perché Bellman-Ford non lavorerà per risolvere il tuo problema. Tuttavia, non ti dà alcuna intuizione spiegare perché questo è difficile in generale (ad esempio, perché è difficile trovare qualche altro algoritmo per risolverlo). Non ho una buona intuizione per questo - forse qualcun altro avrà una spiegazione migliore per te. Nel frattempo, forse questo ti dà il punto di partenza per capire perché questo problema è difficile.


0

decidere weightc è ancora facile per qualsiasi costante ce pesi di bordo interi. Posso controllare tutti i cicli di lunghezzac in O(nc)(assumendo pesi unitari). Ma cosa succede sec non è una costante, per esempio c=n/2? Non sarebbe più polinomiale.

D'altra parte con il problema decisionale generale (cioè quando c non è costante) possiamo decidere il problema del ciclo hamiltoniano che è NP-Complete.


Sì, ma questo non dà alcuna intuizione sul perché sia difficile decidere il problema decisionale generale. Sì, c'è una riduzione del ciclo hamiltoniano, ovviamente, ma questo non dà alcuna intuizione al perché. Se leggi la domanda, è abbastanza chiaro che l'autore sta chiedendo intuizione perché questo è difficile quando trovare un ciclo di peso positivo non è difficile.
DW

Sì, lo so che. Il richiedente sembra confuso sulla differenza tra decidere su un numero e decidere su una data lunghezza. Si prega di dare un'occhiata alla domanda nell'ultimo paragrafo. Sto cercando di correggerlo da quella parte. Essere più duro o più facile in termini di tracciabilità dipende da questa distinzione.
Parham,

Verifica di tutti i cicli di lunghezza cinoltre non funziona se i bordi possono avere un peso zero. OK, il peso zero viene spesso identificato senza il bordo ma è facile immaginare applicazioni in cui un bordo con peso zero non è uguale a nessun bordo: ad esempio, i bordi sono segmenti di strada e il peso è il pedaggio che deve essere pagato per quel segmento.
David Richerby,

0

Consideriamo le versioni più semplici di questi problemi in cui i bordi non sono ponderati.

  1. Dato un grafico G, controlla se G ha un ciclo.

  2. Dato un grafico G e un numero k, controlla se G ha almeno un ciclo di lunghezza k.

Il primo è semplice e può essere risolto utilizzando DFS. Il secondo è NP-difficile.


Diamo un'occhiata a un problema ancora più semplice:

  1. Dato un grafico G e due vertici s e t, controlla se esiste un percorso semplice da s per t in G.

  2. Dato un grafico G e due vertici s e t e un numero k, controlla se esiste un percorso semplice da s per t in G di lunghezza almeno k.

Tutti questi problemi hanno lo stesso sapore. Quello in alto è facile mentre quello in basso è NP-difficile. Spiegherò la differenza per l'ultimo perché è più semplice ma la stessa spiegazione si applica alle altre coppie.

Il motivo per cui quelli migliori sono facili mentre quelli inferiori non lo sono è il risultato della struttura delle risposte a questi problemi.

Diamo prima un'occhiata al problema di trovare un percorso semplice e proviamo a risolverlo in modo ricorsivo. Se proviamo semplicemente a risolvere direttamente questo problema, dovremmo tenere traccia dei vertici che abbiamo usato finora:

SimplePath(s,t,G):= c'è un percorso da s per t in G.

SimplePath(s,t,G) se e solo se
s=t o per alcuni uG SimplePath(s,u,Gt) e utG.

Se proviamo a risolvere il problema con questo ingenuo algoritmo ricorsivo ci vorrà tempo esponenziale: ci sono esponenzialmente molte possibilità per l'insieme di vertici inutilizzati! Dobbiamo essere più intelligenti.

Perché abbiamo avuto esponenzialmente molte possibilità? Dato che stavamo cercando di trovare un percorso semplice e di applicare questa condizione, dovevamo tenere traccia dei vertici non utilizzati.

OK, quindi lasciamo cadere questa condizione e vediamo dove possiamo ottenere:

Considera il problema di trovare un percorso (non necessariamente semplice) da s per t. Poiché il percorso non deve essere semplice, non è necessario tenere traccia dei vertici non utilizzati. In altre parole, il grafico non cambia nel tempo.

PathG(s,t):= c'è un percorso da s per t.

PathG(s,t) se e solo se
s=to
per alcuniuG PathG(s,t) e utG.

Ma non abbiamo ancora finito. Il problema è che non sappiamo sePathG(s,u) è un problema minore di PathG(s,t). Quindi questa soluzione ricorsiva potrebbe finire in un ciclo e non terminare mai.

Per evitare ciò, possiamo aggiungere un parametro aggiuntivo che assicura che il problema si riduca: il numero di spigoli nel percorso.

PathG(s,t,k):= c'è un percorso da s per t con al massimo k bordi.

PathG(s,t,k) se e solo se
k=0 e s=t o
k>0 e per alcuni uG PathG(s,u,k1) e utG.

Ora nota che c'è un percorso semplice da s per t se c'è un percorso da s per t con al massimo nbordi. In altre parole:

SimplePath(s,t,G) se e solo se PathG(s,t,n).

I punti essenziali qui sono:

  1. Ogni percorso semplice (non banale) da s per t consiste in un semplice percorso da s a qualche vertice u e un vantaggio ut.

  2. Possiamo supporre che t non appare nel percorso semplice da s per u.

  3. Non abbiamo bisogno di mantenere esplicitamente l'elenco dei vertici inutilizzati.

Queste proprietà ci consentono di avere una ricorsione intelligente per l'esistenza di un semplice problema di percorso.

Ora, questi non si applicano al problema di trovare almeno un percorso di lunghezza k. Non sappiamo almeno ridurre il problema di trovare un semplice percorso di lunghezzak a un sottoproblema più piccolo senza mantenere l'elenco dei vertici inutilizzati. Tali proprietà ci consentono di risolvere in modo efficiente l'esistenza del problema del percorso.

Quando un grafico non ha un ciclo negativo, ci consentono di risolvere al massimo l'esistenza di un percorso di lunghezza k problema e i problemi del percorso semplice più breve in modo efficiente.

Tuttavia non sostengono per l'esistenza di un percorso di lunghezza almeno k. Considera un grafico con3 vertici s,u,t. w(su)=1000,w(st)=1000,w(ut)=10,w(tu)=10. Il percorso di lunghezza almeno1001 a partire dal s per t contiene u e il percorso di lunghezza almeno 1001 a partire dal s per u contiene t. Quindi non possiamo ridurre un'istanza del problema a un'istanza più piccola del problema senza fornire esplicitamente l'elenco dei vertici inutilizzati.

In altre parole, non conosciamo almeno una ricorsione intelligente per l'esistenza di un semplice percorso di lunghezza k problema mentre conosciamo una ricorsione intelligente per l'esistenza di un percorso semplice.


Tornando all'ultima parte della tua domanda, c'è un problema con il tuo argomento.

È vero che l'esistenza di un ciclo di lunghezza >k può essere risolto in tempo polinomiale per qualsiasi fisso k (vale a dire knon fa parte dell'input). (Simile a come si può verificare se un grafico non ponderato ha un ciclo di lunghezzak in tempo O(nk).)

Tuttavia quando k fa parte dell'input che non regge più poiché il tempo di esecuzione dipende k in un brutto modo.

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.