Qual è un buon metodo per generare casualmente i bordi tra i nodi del grafico?


10

Sto realizzando un generatore di mappe casuali per un gioco spaziale 4X.

Ogni nodo nel gioco è posto su una coordinata casuale (x, y) su una griglia 2d. Un nodo può avere uno o più bordi bidirezionali rispetto a un altro nodo (che rappresenta wormhole). Tutti i nodi devono avere almeno un wormhole e tutti i nodi devono appartenere allo stesso grafico.

Idealmente, un wormhole non dovrebbe superare una lunghezza massima e, se possibile, i wormhole non dovrebbero incrociarsi.

La mia ingenua implementazione è iterare attraverso tutti i nodi e avere il collegamento del nodo ai 3 nodi più vicini. Tuttavia, finisco con numerosi sotto-grafici. Qual è un buon metodo per generare i bordi per i nodi?


come sono sparsi i nodi nella galassia? Voglio dire, posso supporre che per ogni punto (X, Y) nella galassia ci sia un nodo? o almeno per la maggior parte di loro o no?
Ali1S232,

Non tutte le coordinate avranno un nodo. Circa il 40% direi.
Extrakun,

Risposte:


9

Ecco una buona risposta a una domanda simile.

Per prima cosa crea un grafico connesso, magari usando un albero di spanning minimo come nel link sopra. Suggerisce di usare pesi al bordo casuali per rendere casuale l'albero "minimo". Quindi puoi aggiungere casualmente più bordi in modo che non sia solo l'albero minimo. Il modo in cui aggiungi esattamente i bordi casuali dipende dal tipo di grafico che desideri.


In effetti, se il problema è solo quello di assicurarsi che tutti i nodi appartengano allo stesso grafico, è possibile prendere il metodo corrente di generazione casuale (o qualsiasi altro) e applicare l'algoritmo di Prim su di esso. Se si desidera apportare modifiche minime al grafico solo per essere sicuri che i sottografi siano tutti collegati, è possibile impostare il costo del bordo su 0 per i bordi già presenti.


+1 poiché è un'ottima risposta, ma non mi piace questo tipo di generazione, quindi nei prossimi giorni penserò a un algoritmo migliore!
Ali1S232,

Sì, non esiste una risposta "giusta" a questo, sono interessato a vedere cosa ne pensano gli altri.
Filippo,

Offtopic, ma stavo per collegare anche la mia risposta! : p
r2d2rigo,

In questo modo ottengo punti per questo, ah!
Filippo,

7

I principali vincoli del tuo problema sono duplici: creazione di un grafico a 1 connessione; e crearlo con connessioni prossimali. La risposta di Philip, sebbene in qualche modo preziosa, non affronta tutti i vincoli del tuo problema

Idealmente, un wormhole non dovrebbe superare una lunghezza massima e, se possibile, i wormhole non dovrebbero incrociarsi.

Quando si collegano in modo ingenuo i punti in una nuvola, si corre il rischio (e quello elevato, a quello) di queste condizioni che non vengono soddisfatte.

Come vedi, il problema non è tanto quello della connettività quanto quello della prossimità su quelle connessioni. È banale connettere tutti i nodi di un grafico a tutti gli altri nodi, ma collegarsi solo a quelli più vicini pur mantenendo l'1-connessione del grafico complessivo è un po 'più complicato.

Questo è ciò che crea una triangolazione Delaunay , in n dimensioni. Il primo motivo per usare la triangolazione di Delaunay è che soddisfa entrambi implicitamente. Il secondo motivo è che è molto più semplice lavorare all'indietro da un tale grafico (sottraendo bordi e vertici che non si desidera), piuttosto che provare a crearlo in altri modi.

  1. Crea in modo casuale la nuvola di punti completa.
  2. Delaunay-triangolarlo.
  3. Costruisci il grafico (connessione dei punti). In questo, è possibile generare prima l'intero grafico (ogni stella) e quindi derivare il grafico come minori rappresentano le regioni collegate al wormhole, quando si esegue il passaggio 4. In alternativa, è possibile lavorare al contrario, generando solo le regioni connesse al wormhole prima come nodi del supergrafo, e poi in una seconda fase, generano singole stelle all'interno dei volumi limitanti di quelle regioni (per queste deriverei il grafico della triangolazione di Delaunay doppio - il diagramma di Voronoi in 3 dimensioni) come sottografie. Ora disponi di ammassi stellari collegati prossimalmente e tutti gli ammassi sono collegati da wormhole più rari: la tua topologia e topografia hanno senso per il giocatore.
  4. Applica metodi intelligenti per modellare i super e i sottografi, a seconda di come hai scelto di trattarlo nel passaggio 3.

È importante vedere che questo è un processo gerarchico. Il primo livello riguarda la connettività wormhole; la seconda riguarda le distanze presumibilmente percorribili usando una nave standard. Puoi applicare Delaunay a uno o entrambi i livelli per soddisfare i tuoi vincoli.

Fare questo puramente topologicamente ti lascerà con wormhole che non hanno senso, dal momento che potrebbero collegare un lato della galassia a un altro, nonostante un'alta densità di stelle tra di loro (e forse anche cadere sulla rotta diretta del wormhole). La topologia non è topografia; la seconda è una considerazione che va oltre la prima. Ti preoccupi della prossimità e quindi della topografia.


La triangolazione Delaunay è una buona idea, ma non crea bordi casuali. Potresti rimuovere i bordi casualmente dai bordi creati dalla triangolazione di Delaunay, ma rischierai di ottenere nuovamente grafici separati ...
bummzack,

@Bummzack "Non crea bordi casuali". Hai mai sentito parlare di minori grafici? Una volta risolti i vincoli più difficili con Delaunay, è banale eseguire aggiunte o rimozioni su quel grafico come preferisci.
Ingegnere

@Bummzack, l'ho appena aggiornato di nuovo - grazie per il feedback.
Ingegnere,
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.