Algoritmo per trovare la rotta commerciale ottimale (ciclo negativo con costo più basso per spigolo in un digramma)

6

Dato il seguente problema (una descrizione leggermente semplificata del trading nel gioco per computer Escape Velocity: Nova ( mappa di sistema )):

  • Dato un insieme di sistemi (solari).
  • Ogni sistema è collegato da una rotta di viaggio dell'iperspazio a uno o più altri sistemi; ogni rotta collega due sistemi.
  • Fare un salto iperspaziale ha un costo in dollari (che copre i costi del carburante). Il costo è lo stesso indipendentemente dal salto che stai facendo.
  • Ogni sistema ha un centro commerciale con vari prodotti (cibo, metallo, attrezzature, ecc.) disponibili per il commercio ad un determinato prezzo. Il prezzo varia tra i sistemi.
  • Per semplificare, diremo che puoi tenere una sola unità di una singola merce in un dato momento.
  • Una rotta commerciale è una serie di salti iperspaziali che iniziano e finiscono nello stesso sistema (un ciclo), comprando e vendendo merci lungo la strada.
  • Il profitto di una rotta commerciale è definito come profitto ottenuto comprando e vendendo merci lungo la strada meno il costo totale dei salti iperspaziali realizzati.

Voglio essere in grado di rispondere a domande come le seguenti:

  1. Qual è la rotta commerciale più redditizia?
  2. Qual è la rotta commerciale più redditizia che inizia e finisce in un sistema specifico?
  3. Qual è la rotta commerciale più redditizia che coinvolge meno di X salti?
  4. Qual è la rotta commerciale più redditizia che coinvolge meno di X salti che iniziano e finiscono in un sistema specifico?

Ho intenzione di modellarlo come un digrafo:

  1. Ogni sistema è un vertice.
  2. Per ogni percorso di viaggio dell'iperspazio aggiungi due spigoli (uno in ogni direzione) che collegano i due vertici con un peso uguale al costo di un salto iperspaziale.
  3. Per ogni sistema
    • per ogni merce disponibile in quel sistema
      • per ogni sistema in cui il prezzo della merce è inferiore a quello del sistema corrente (non otterremo mai un profitto se il costo alla destinazione è più alto, quindi omettiamo quei bordi)
        • aggiungi un bordo dal sistema corrente a quel sistema con il peso di (number of jumps to reach that system) * (cost per jump) - (difference in price of the commodity) (vale a dire il profitto che deve essere ottenuto acquistando nel sistema corrente e vendendo nel sistema di destinazione)

Credo che la descrizione tecnica di ciò che sto cercando sia (per la domanda 1): dato il digrafo precedente qual è il ciclo negativo con il più basso costo medio per spigolo.

Mi rendo conto che posso usare una ricerca in ampiezza per rispondere alle domande 3 e 4 a condizione che il numero massimo di salti sia abbastanza piccolo da non esaurire la memoria, ma sospetto che non sia pratico rispondi 1 o 2 in questo modo.

Ho letto il capitolo Risolvi problemi cercando in AI: un approccio moderno ma, per quanto posso dire, gli algoritmi richiedono pesi di bordo positivi.

Un po 'di Google su Google mi ha trovato l'algoritmo Bellman-Ford e mentre ciò supporta il margine negativo la mia comprensione è che non fornisce costi accurati quando sono coinvolti cicli negativi.

Ci sono degli algoritmi che posso usare per risolvere questo problema in modo più efficiente?

    
posta Lawrence Johnston 21.06.2015 - 23:08
fonte

2 risposte

4

Questo non è un problema di venditore ambulante se non esiste il divieto di rivedere un sistema.

Il problema per la domanda 1 è canonicamente definito come il problema del ciclo medio minimo , che ha algoritmi tempo-polinomiale. Questa è una subroutine in alcuni algoritmi di flusso a costo minimo.

La domanda 2 è un po 'mal definita perché non ci sarà un percorso migliore in generale; ti consigliamo di volare al miglior loop, fallo un po 'di volte (più sono e meglio è) e torna indietro.

Le domande 3 e 4 possono essere risolte espandendo il digramma con una dimensione temporale (dove un'unità di "tempo" è un salto) e quindi calcolando i percorsi più brevi sul digrafo aciclico risultante.

    
risposta data 24.06.2015 - 21:30
fonte
4

Esamina Problemi relativi al venditore in viaggio e all'ottimizzazione.

Stai sostanzialmente ottimizzando un TSP per tutte le tue quattro domande.

I dettagli specifici varieranno in base alla dimensione del problema (se hai 10 nodi puoi solo forzarlo, se hai 1000 dovrai essere più efficiente).

Il sito di wikipedia su TSP suggerisce un gran numero di algoritmi da utilizzare. sembra come se potessi utilizzare un metodo Ant Colony Optimization modificato in base al valore totale del intero viaggio (es. la prima e la seconda domanda).

    
risposta data 22.06.2015 - 20:28
fonte

Leggi altre domande sui tag