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?
random
graph-theory
Extrakun
fuente
fuente
Respuestas:
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í.
fuente
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.
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.
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.
fuente