Quali algoritmi k-best-path più brevi dovrei considerare?


13

Sto risolvendo un problema di ottimizzazione della ricerca grafica. Ho bisogno di trovare i migliori k percorsi più brevi aciclici attraverso un grafico ponderato diretto.

So che ci sono un certo numero di algoritmi k-best esatti e approssimativi, ma la maggior parte della ricerca recente sembra orientata verso grafici molto grandi e molto scarsamente connessi (ad es. Percorso stradale e direzioni), e il mio grafico non è nessuno dei due.

Distinguere gli aspetti del mio problema:

  • Il grafico è costituito da circa 160 vertici.

  • Il grafico è quasi completamente collegato (bidirezionalmente, quindi ~ 160 ^ 2 ~ = 25k bordi)

  • k sarà piuttosto piccolo (probabilmente meno di 10)

  • La lunghezza massima del percorso sarà probabilmente limitata e anche molto piccola (ad es. 3-5 spigoli)

  • Ho detto "aciclico" sopra, ma solo per ribadire: le soluzioni non devono includere cicli. Questo non è un problema per l'1-percorso più breve, ma diventa un problema per k-best - ad esempio, considera un percorso stradale - il secondo percorso più breve da A a B potrebbe essere lo stesso dell'1-migliore, con un breve viaggio intorno a un isolato da qualche parte. Potrebbe essere matematicamente ottimale, ma non è una soluzione molto utile. ;-)

  • Potremmo aver bisogno di ripesare i bordi al volo per ogni calcolo. Un costo perimetrale è costituito da una somma ponderata di diversi fattori e i requisiti finali (ogni volta che li otteniamo) possono consentire a un utente di specificare la propria priorità di tali fattori di ponderazione, alterando i pesi dei bordi. Questo è un grafico relativamente piccolo (dovremmo essere in grado di rappresentarlo in poche centinaia di KB), quindi è probabilmente ragionevole clonare il grafico in memoria, applicare la ponderazione e quindi eseguire la ricerca sul grafico clonato. Ma se esiste un metodo più efficace per eseguire la ricerca mentre si calcolano i pesi al volo, sono interessato.

Sto esaminando gli algoritmi descritti in Santos (K algoritmi del percorso più breve), Eppstein 1997 (Alla ricerca dei k percorsi più brevi) e altri. L'algoritmo di Yen è di interesse, soprattutto a causa del Java esistente implementazione . Non ho paura di leggere i documenti di ricerca, ma ho pensato che valesse la pena esporre i dettagli del mio problema e chiedere suggerimenti per risparmiare un po 'di tempo a leggere.

E se hai puntatori alle implementazioni Java, ancora meglio.


+1, perché sono interessato ai suggerimenti delle persone, e questo sembra il tipo esatto di domanda per cui questo sito è stato fatto.
KChaloux,

La tua condizione aciclica non significa che QUALUNQUE altro percorso dall'inizio alla fine creerebbe un ciclo con il primo percorso? E se sia l'inizio che l'obiettivo sono in un vicolo cieco, ogni percorso deve usare questi due bordi.
user470365

Forse non ero chiaro. Il vincolo aciclico si applica solo a un singolo percorso: naturalmente, ogni 2 percorsi distinti da A a B formano un ciclo.
AaronD

@AaronD: quindi, quale hai usato alla fine?
Dagnelies,

@arnaud: non sono ancora sicuro di aver optato per un algoritmo; Aggiungerò un aggiornamento a questa domanda quando ho. Ho eliminato Eppstein perché non garantisce soluzioni acicliche (dette "semplici"). Attualmente sto lavorando con l'algoritmo di Yen, ma non ho ancora ottenuto la profilazione dettagliata o l'ottimizzazione, quindi potrei doverlo sostituire con un altro. Lo aggiornerò nella prossima settimana o due.
AaronD,

Risposte:


2

Per rispondere parzialmente alla mia domanda:

Da quando ho pubblicato questa domanda, ho scoperto che dobbiamo gestire pesi sia negativi sia positivi (la limitazione ai percorsi aciclici / semplici / senza loop significa che è definita la soluzione migliore, mentre senza tale limitazione il percorso più breve attraverso un grafico con negativo- i cicli di costo non sono definiti).

L'algoritmo di Yen e la maggior parte degli altri che ho esaminato dipendono da una serie di 1-migliori ricerche; la maggior parte usa Dijkstra per quelle ricerche intermedie. Dijkstra non supporta pesi con il bordo negativo, ma al suo posto possiamo sostituire Bellman-Ford (almeno in Yen; presumibilmente anche in Lawler o Eppstein). Ho sviluppato una modifica di Bellman-Ford con una limitazione della lunghezza del percorso (nei bordi) e un controllo esplicito del ciclo durante la ricerca (al posto del rilevamento del ciclo post-ricerca standard). La complessità computazionale è peggiore, ma ancora trattabile per le mie esigenze. Modificherò questa risposta e collegherò a un rapporto tecnico se avrò il permesso di pubblicarlo.


1

Direi che questa domanda può essere facilmente cercata su google ed è anche un duplicato:

Detto questo, ho già utilizzato e implementato Eppstein e lo consiglio. L'ho trovato abbastanza elegante. Se ricordo bene, potrebbe anche essere ottimale, e il seguente documento lo spiega molto bene:

http://pdf.aminer.org/001/059/121/finding_the_k_shortest_paths.pdf


Innanzitutto, grazie per la raccomandazione di Eppstein. Guarderò di più lì. Direi che questo non è un duplicato esatto, né è facile google; è facile trovare un algoritmo k-best, ma non è così facile scegliere sensibilmente tra di loro. Mi aspetto che vorrei un algoritmo molto diverso per un grafico scarsamente connesso di milioni di vertici rispetto a questo per questo problema. Mi interesserei molto di più della complessità in k se volessi il 1000 migliore invece del 10 migliore. E, mentre i fattori costanti non sono così importanti quando si pubblicano articoli, lo sono certamente quando si spedisce il codice di produzione.
AaronD

@AaronD: solo per tua informazione, penso che l'algoritmo sia molto efficiente in ogni caso. Forse ci sono casi speciali in cui le ricerche euristiche guidate lo battono, ma per il caso generale, penso che lo faccia molto bene. Le esatte prestazioni dipenderanno probabilmente più da come la implementate, dall'efficienza delle vostre strutture dati e da come sono adattate al vostro problema.
Dagnelies,

@arnaud Ciao, è possibile condividere l'implementazione del tuo eppstein? Ho una domanda simile pubblicata qui: math.stackexchange.com/questions/1661737/…
Tina J,
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.