¿Cuál es un buen método para generar aristas al azar entre los nodos del gráfico?

10

Estoy haciendo un generador de mapas aleatorio para un juego espacial 4X.

Cada nodo en el juego se coloca en una coordenada aleatoria (x, y) en una cuadrícula 2d. Un nodo puede tener uno o más bordes bidireccionales a otro nodo (que representa agujeros de gusano). Todos los nodos deben tener al menos un agujero de gusano, y todos los nodos deben pertenecer al mismo gráfico.

Idealmente, un agujero de gusano no debe exceder una longitud máxima y, si es posible, los agujeros de gusano no deben cruzarse entre sí.

Mi implementación ingenua es iterar a través de todos los nodos y hacer que el nodo enlace a los 3 nodos más cercanos. Sin embargo, termino con numerosos sub gráficos. ¿Cuál es un buen método para generar los bordes para los nodos?

Extrakun
fuente
¿Cómo se dispersan los nodos en la galaxia? Quiero decir, ¿puedo suponer que por cada punto (X, Y) en la galaxia hay un nodo? o al menos para la mayoría de ellos o no?
Ali1S232
No todas las coordenadas tendrán un nodo. Alrededor del 40% diría.
Extrakun

Respuestas:

9

Aquí hay una buena respuesta a una pregunta similar.

Primero haga un gráfico conectado, tal vez usando un árbol de expansión mínimo como en el enlace de arriba. Sugiere usar pesos de arista al azar para hacer que el árbol "mínimo" sea aleatorio. Luego puede agregar al azar más bordes para que no sea solo el árbol mínimo. La forma exacta en que agrega los bordes aleatorios depende del tipo de gráfico que desee.


De hecho, si el problema es solo asegurarse de que todos los nodos pertenezcan al mismo gráfico, puede tomar su método actual de generación aleatoria (o cualquier otro) y aplicar el algoritmo de Prim encima. Si desea realizar cambios mínimos en el gráfico solo para asegurarse de que todas las subgrafías estén conectadas, puede establecer el costo de borde en 0 para los bordes que ya están allí.

Philip
fuente
+1 ya que es una muy buena respuesta, pero simplemente no me gusta este tipo de generación, ¡así que pensaré en un algoritmo mejor en los próximos días!
Ali1S232
Sí, no hay una respuesta "correcta" a esto, estoy interesado en ver qué piensan los demás.
Philip
Offtopic, ¡pero también iba a vincular a mi respuesta! : p
r2d2rigo
De esta manera obtengo puntos por ello, ¡ja!
Philip
7

Las principales limitaciones de su problema son dobles: crear un gráfico 1 conectado; y creándolo con conexiones proximales. La respuesta de Philip, aunque algo valiosa, no aborda todas las limitaciones de su problema.

Idealmente, un agujero de gusano no debe exceder una longitud máxima y, si es posible, los agujeros de gusano no deben cruzarse entre sí.

Cuando ingenuamente conecta puntos en una nube, corre el riesgo (y uno alto) de que estas condiciones no se cumplan.

Como puede ver, el problema no es tanto de conectividad como de proximidad en esas conexiones. Es trivial conectar todos los nodos de un gráfico a todos los demás nodos, pero conectarse solo a aquellos que están más cerca mientras se mantiene la conexión 1 del gráfico general es un poco más complicado.

Esto es lo que crea una triangulación de Delaunay , en n dimensiones. La primera razón para usar la triangulación de Delaunay es que cumple ambos de manera implícita. La segunda razón es que es mucho más fácil trabajar hacia atrás desde dicho gráfico (restando bordes y vértices que no desea), que tratar de crearlo de otras maneras.

  1. Crea aleatoriamente tu nube de puntos completa.
  2. Delaunay-triangularlo.
  3. Construya el gráfico (conexión de puntos). En esto, puede generar el gráfico completo (cada estrella) primero, y luego derivar el gráfico como menores que representan sus regiones conectadas al agujero de gusano, al realizar el paso 4. Alternativamente, puede trabajar al revés, generando solo las regiones conectadas al agujero de gusano primero como nodos supergráficos, y luego en una segunda fase, generar estrellas individuales dentro de los volúmenes límite de esas regiones (para estos derivaría el gráfico de triangulación de Delaunay dual: el diagrama de Voronoi en 3 dimensiones) como subgráficos. Ahora tiene cúmulos estelares conectados de forma proximal, y todos los cúmulos están conectados por agujeros de gusano más raros: su topología y topografía tienen sentido para el jugador.
  4. Aplique métodos inteligentes para dar forma a las super y subgrafías, dependiendo de cómo haya elegido tratarlo en el paso 3.

Es importante ver que este es un proceso jerárquico. El primer nivel se ocupa de la conectividad del agujero de gusano; el segundo trata con distancias presumiblemente transitables utilizando una unidad de barco estándar. Puede aplicar Delaunay en uno o ambos niveles para satisfacer sus limitaciones.

Hacer esto puramente topológicamente te dejará con agujeros de gusano que no tienen sentido, ya que podrían conectar un lado de la galaxia con otro, a pesar de una alta densidad de estrellas entre ellos (y tal vez incluso cayendo en la ruta directa del agujero de gusano). La topología no es topografía; el último es una consideración más allá del primero. Te preocupa la proximidad y, por tanto, la topografía.

Ingeniero
fuente
La triangulación de Delaunay es una buena idea, pero no crea bordes aleatorios. Se podría eliminar los bordes al azar de los bordes creados por la triangulación de Delaunay, pero luego se arriesga a conseguir gráficos separados de nuevo ...
bummzack
@Bummzack "No crea bordes aleatorios". ¿Has oído hablar de menores gráficos? Una vez que haya resuelto las restricciones más difíciles utilizando Delaunay, es trivial realizar adiciones o eliminaciones en ese gráfico a su gusto.
Ingeniero
@Bummzack, acabo de actualizarlo nuevamente, gracias por los comentarios.
Ingeniero