Je fais un générateur de cartes aléatoires pour un jeu spatial 4X.
Chaque nœud du jeu est placé selon une coordonnée aléatoire (x, y) sur une grille 2D. Un nœud peut avoir un ou plusieurs bords bidirectionnels vers un autre nœud (représentant des trous de ver). Tous les nœuds doivent avoir au moins un trou de ver et tous les nœuds doivent appartenir au même graphique.
Idéalement, un trou de ver ne doit pas dépasser une longueur maximale et, si possible, les trous de ver ne doivent pas se croiser.
Ma mise en œuvre naïve consiste à parcourir tous les nœuds et à avoir le lien de nœud vers les 3 nœuds les plus proches. Cependant, je me retrouve avec de nombreux sous-graphiques. Quelle est la bonne méthode pour générer les bords des nœuds?
random
graph-theory
Extrakun
la source
la source
Réponses:
Voici une bonne réponse à une question similaire.
Faites d'abord un graphique connecté, en utilisant peut-être un arbre couvrant minimum comme dans le lien ci-dessus. Il suggère d'utiliser des poids de bord aléatoires pour rendre l'arbre "minimum" aléatoire. Ensuite, vous pouvez ajouter au hasard plus d'arêtes afin que ce ne soit pas seulement l'arborescence minimale. La façon exacte dont vous ajoutez les bords aléatoires dépend du type de graphique que vous souhaitez.
En fait, si le problème consiste simplement à s'assurer que les nœuds appartiennent tous au même graphique, vous pouvez prendre votre méthode actuelle de génération aléatoire (ou toute autre) et appliquer l'algorithme de Prim par-dessus. Si vous souhaitez apporter des modifications minimes au graphique juste pour être sûr que les sous-graphiques sont tous connectés, vous pouvez définir le coût de l'arête à 0 pour les arêtes déjà présentes.
la source
Les principales contraintes de votre problème sont doubles: créer un graphe 1-connecté; et le créer avec des connexions proximales. La réponse de Philip, bien que quelque peu valable, ne répond pas à toutes les contraintes de votre problème
Lorsque vous connectez naïvement des points dans un cloud, vous courez le risque (et le plus élevé, à cela) que ces conditions ne soient pas remplies.
Donc, vous voyez, le problème n'est pas tant celui de la connectivité que celui de la proximité sur ces connexions. Il est trivial de connecter chaque nœud d'un graphique à tous les autres nœuds, mais se connecter uniquement à ceux qui sont les plus proches tout en conservant la connectivité 1 du graphique global est un peu plus délicat.
C'est ce que crée une triangulation de Delaunay , en n dimensions. La première raison d'utiliser la triangulation de Delaunay est qu'elle remplit ces deux implicitement. La deuxième raison est qu'il est beaucoup plus facile de travailler en arrière à partir d'un tel graphique (soustraire des arêtes et des sommets que vous ne voulez pas), que d'essayer de le créer d'autres manières.
Il est important de voir qu'il s'agit d'un processus hiérarchique. Le premier niveau traite de la connectivité des trous de ver; le second traite des distances vraisemblablement traversables à l'aide d'un entraînement de navire standard. Vous pouvez appliquer Delaunay à un ou deux niveaux pour satisfaire vos contraintes.
Faire cela purement topologiquement vous laissera des trous de ver qui n'ont pas de sens, car ils pourraient relier un côté de la galaxie à un autre, malgré une forte densité d'étoiles entre les deux (et peut-être même tomber sur la route directe du trou de ver). La topologie n'est pas la topographie; ce dernier est une considération au-delà du premier. Vous vous souciez de la proximité et donc de la topographie.
la source