Quelle est la bonne méthode pour générer aléatoirement des bords entre des nœuds de graphe?


10

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?


comment les nœuds sont-ils dispersés à travers la galaxie? Je veux dire, puis-je supposer que pour chaque point (X, Y) de la galaxie, il y a un nœud? ou du moins pour la plupart d'entre eux ou non?
Ali1S232

Toutes les coordonnées n'auront pas de nœud. Environ 40%, je dirais.
Extrakun

Réponses:


9

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.


+1 car c'est une très bonne réponse mais je n'aime pas ce genre de génération donc je penserai à un meilleur algorithme dans les prochains jours!
Ali1S232

Oui, il n'y a pas de «bonne» réponse à cela, je suis intéressé de voir ce que les autres proposent.
Philip

Hors sujet, mais j'allais aussi faire un lien vers ma réponse! : p
r2d2rigo

De cette façon, j'obtiens des points pour cela, ha!
Philip

7

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

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.

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.

  1. Créez aléatoirement votre nuage de points complet.
  2. Delaunay-triangule.
  3. Construisez le graphique (connexion des points). Dans ce cas, vous pouvez soit générer le graphique entier (chaque étoile) en premier, puis dériver le graphique en tant que mineurs représentant vos régions connectées au trou de ver, lors de l'exécution de l'étape 4. Vous pouvez également travailler dans l'autre sens, en générant uniquement les régions connectées au trou de ver d'abord en tant que nœuds supergraphiques, puis dans une deuxième phase, génèrent des étoiles individuelles dans les volumes limites de ces régions (pour ceux-ci, je dériverais le graphique dual de la triangulation de Delaunay - le diagramme de Voronoi en 3 dimensions) en tant que sous-graphiques. Vous avez maintenant des amas d'étoiles connectés de manière proximale, et tous les amas sont connectés par des trous de ver plus rares: votre topologie et votre topographie ont du sens pour le joueur.
  4. Appliquez des méthodes intelligentes pour façonner les super et sous-graphiques, selon la façon dont vous avez choisi de le traiter à l'étape 3.

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 triangulation de Delaunay est une bonne idée, mais elle ne crée pas d'arêtes aléatoires. Vous pouvez supprimer des arêtes au hasard des arêtes créées par la triangulation de Delaunay, mais vous risquez à nouveau d'obtenir des graphiques séparés ...
bummzack

@Bummzack "Il ne crée pas de bords aléatoires". Avez-vous déjà entendu parler de mineurs graphiques? Une fois que vous avez résolu les contraintes les plus difficiles en utilisant Delaunay, il est trivial d'effectuer des ajouts ou des suppressions sur ce graphique comme vous le souhaitez.
Ingénieur

@Bummzack, je viens de le mettre à jour à nouveau - merci pour les commentaires.
Ingénieur
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.