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.