2012-01-17 9 views
9

Supponiamo di avere un CICLICO grafico DIRETTO, PONDERATA e .Algoritmo per reperire percorsi distinti da A a B in ponderati, diretto, grafico ciclico

Supponiamo di essere interessati solo nei percorsi con un peso totale inferiore MAX_WEIGHT

Qual è la più appropriata (o qualsiasi) algoritmo per trovare il numero di percorsi distinti tra due nodi A e B che hanno un peso totale inferiore a MAX_WEIGHT?

P.S: Non sono i miei compiti. Solo un progetto personale e non commerciale.

+0

Consentite ai percorsi che visitano lo stesso vertice più di una volta (a condizione che la lunghezza del percorso sia inferiore a MAX_WEIGHT)? – NPE

+2

Possiamo supporre che non ci siano cicli a peso zero? – bdares

+1

@aix: Sì, scusa ho dimenticato di dirlo. Puoi andare in loop quanto vuoi finché sono soddisfatti i criteri MAX_WEIGHT. – Babak

risposta

2

Se il numero di nodi e MAX_WEIGHT non sono troppo grandi (e tutti i pesi sono numeri interi), è possibile utilizzare la programmazione dinamica

unsigned long long int num_of_paths[MAX_WEIGHT+1][num_nodes]; 

inizializzare a 0, tranne num_of_paths[0][start] = 1;.

for(w = 0; w < MAX_WEIGHT; ++w){ 
    for(n = 0; n < num_nodes; ++n){ 
     if (num_of_paths[w][n] > 0){ 
      /* for each child c of node n 
      * if w + weight(n->c) <= MAX_WEIGHT 
      * num_of_paths[w+weight(n->c)][c] += num_of_paths[w][n]; 
      */ 
     } 
    } 
} 

soluzione è la somma di num_of_paths[w][target], 0 <= w <= MAX_WEIGHT.

+0

Se puoi risolverlo in questo modo puoi risolvere k-disjoint path general caso in O (n * MAX_WEIGHT) e se si assume che tutti i bordi abbiano il peso '1', è possibile risolverlo in O (n^3), ma in questo caso è NP-difficile. –

+0

Non riesco a vedere come i percorsi disgiunti siano rilevanti per il problema come affermato. –

+0

Questa è una parte della domanda: "Qual è l'algoritmo più appropriato (o qualsiasi) per trovare il' numero di percorsi distinti tra due nodi A e B "e per maggiori dettagli leggere la mia risposta. –

1

Semplice ricorsione. Ce l'hai in tempo esponenziale. Ovviamente, non sono consentiti cicli a peso zero.

funzione NOE (nodo N, limite di peso W)

  1. n. di percorso è zero se tutti i fronti uscenti hanno peso> W

  2. altrimenti no. di percorso è somma di numeri di percorso ottenuti per somma (noe (C1, W-W1), noe (C2, W-W2), ... noe (Cn, W-Wn)) dove C1 ... Cn sono i nodi connessi a N per cui W-Wi non è negativo, dove Wi è il peso del bordo di connessione, scritto nella tua lingua preferita.

Più soluzione eficient dovrebbe esistere, lungo le linee di algoritmo di Dijkstra, ma penso che questo è sufficiente per i compiti a casa.

0

tuo problema è caso più generale di K-Disjoint Path In directed planar graphs, con non fissato K. problema

K percorsi disgiunti per grafi planari indirizzate è come questo:

proposta: un grafo planare orientato G = (V ; E) e k coppie (r ; s); ....; (r k; s k) di vertici di G;

trovare: k due a due vertici disgiunti percorsi diretti P ; ...; P k in G, dove P i va da r i di s i (i = 1; ....; k).

in K-disgiunto percorso è possibile disegnare arco da tutti s i a B, e inoltre: Arco da A a tutti i r in questo modo si crea grafo G' dal G.

Ora, se puoi risolvere il tuo problema in G 'in P puoi risolvere k percorso disgiunto in G, quindi P = NP.

Ma se si legge la carta collegata, si ha un'idea del grafico generale (risolvendo il percorso k-disgiunto con k fisso) e si può usare per avere una buona approssimazione.

Inoltre, esiste un algoritmo più complicato che risolve questo problema in P (per fixed k) nei grafici generali. ma in tutto non è facile (è di Seymour).

Quindi la scelta migliore attualmente è quella di utilizzare algoritmi di forza bruta.

Edit: Perché MaxWeight è indipendente alle dimensioni di ingresso (la dimensione del grafico) non influisce a questo problema, anche perché è NP-Hard per grafo non pesato non orientato, ancora si può semplicemente concludere che sia NP-Hard .

+0

Se sei interessato a più argomenti intorno a questo puoi dare un'occhiata a http://homepages.cwi.nl/~lex/files/agt3.pdf –