Générer aléatoirement un graphique dirigé sur une grille

11

J'essaie de générer au hasard un graphique dirigé dans le but de créer un jeu de puzzle similaire aux puzzles de glissement de glace de Pokemon.
C'est essentiellement ce que je veux pouvoir générer aléatoirement: http://bulbanews.bulbagarden.net/wiki/Crunching_the_numbers:_Graph_theory .

Je dois pouvoir limiter la taille du graphique dans une dimension x et y. Dans l'exemple donné dans le lien, il serait limité à une grille 8x4.
Le problème que je rencontre n'est pas de générer un graphique au hasard, mais de générer un graphique au hasard, que je peux correctement cartographier dans un espace 2D, car j'ai besoin de quelque chose (comme une roche) de l'autre côté d'un nœud, pour le faire avoir un sens visuel lorsque vous cessez de glisser. Le problème avec cela est que parfois la roche se retrouve dans le chemin entre deux autres nœuds ou peut-être sur un autre nœud lui-même, ce qui provoque la rupture du graphique entier.

Après avoir discuté du problème avec quelques personnes que je connais, nous sommes arrivés à quelques conclusions qui pourraient conduire à une solution.

  • Inclusion des obstacles dans la grille dans le graphique lors de sa construction.
  • Commencez avec une grille entièrement remplie et dessinez simplement un chemin aléatoire et supprimez les blocs qui feront fonctionner ce chemin.

Le problème devient alors de déterminer ceux à supprimer pour éviter d'introduire un chemin supplémentaire plus court. Nous pensions également qu'un algorithme de programmation dynamique pourrait être bénéfique, bien qu'aucun d'entre nous ne soit trop compétent pour créer des algorithmes de programmation dynamique à partir de rien. Toutes les idées ou références sur le nom officiel de ce problème (s'il s'agit d'un problème de graphe officiel) seraient les plus utiles.

Voici quelques exemples de ce que j'ai accompli jusqu'à présent en plaçant simplement des blocs au hasard et en générant le graphique de navigation à partir du début / de la fin choisi. L'idée (comme décrit dans le lien précédent) est que vous commencez au S vert et que vous souhaitez atteindre le F. vert. mur. Dans ces images, le gris est un mur, le blanc est le sol et la ligne violette est la longueur minimale du début à la fin, et les lignes noires et les points gris représentent les chemins possibles.

Voici quelques mauvais exemples de graphiques générés aléatoirement:

entrez la description de l'image ici

Voici quelques bons exemples de graphiques générés aléatoirement (ou ajustés manuellement):

entrez la description de l'image ici

J'ai également semblé remarquer que les plus difficiles lors de la lecture d'un puzzle sont ceux qui ont beaucoup de nœuds de haut niveau le long du chemin minimum.

Talon876
la source
1
Vous pouvez générer un ensemble de roches complètement aléatoire, puis vérifier si le graphique correspondant a une solution, et sinon, le jeter et recommencer. Avec une grille 8x4, cela ne peut pas prendre autant de temps. Je suis sûr qu'il existe des solutions plus propres.
Job
C'était ma première approche mais je dois le faire à une échelle légèrement plus grande et le forçage brutal semblait prendre un certain temps et essayait de trouver une meilleure approche.
Talon876

Réponses:

2
  • c'est de la glace, vous bougerez à moins que vous ne heurtiez un rocher.
  • la seule façon de changer de direction est de frapper un rocher.
  • si vous frappez un rocher, vous devez changer de direction.
  • les cycles sont bons, pour des raisons évidentes.
  • il peut y avoir plusieurs départs et plusieurs fins.

propriétés plus avancées:

  • les cellules sans roches adjacentes ne sont pas accessibles (certaines peuvent être traversées)
  • les murs sont aussi des rochers, si vous les enlevez, vous pouvez décider de les enrouler.
  • vous pouvez utiliser des sous-grilles comme motifs ("pavage" 3x3, 3x4, 5x5, ... etc)
  • vous pouvez superposer une tuile MxN de puzzle au-dessus de la zone MxN non traversable et ajouter une roche pour la rediriger vers l'intérieur / l'extérieur.
  • la rotation ou la symétrie d'une tuile peut être intéressante
  • vous pouvez développer une tuile en insérant des lignes / colonnes glacées

exemple:

S=start, E=end, o=rock, .=ice

3 . 2 o        3 . . 2 o         . . . . . o o
4 . . E   ~=   4 . . . E   ~=    . . . . . 2 E
o . . .        o . . . .         . . . . . . .
S . 1 o        S . . 1 o         S . . . . 1 o

exemple de combinaison de tuiles:

3 . . 2 o       o 2 . . 3      3 . . 2 o 7 . . 6
4 . . . E   +   E . . . 4  =   4 . . . . . . . 5
o . . . .       . . . . o      o . . . . . . . o
S . . 1 o       o 1 . . S      S . . 1 o 8 . . E

vous aimerez peut-être le jeu Tsuro , il utilise des tuiles pour générer un plateau aléatoire.

dnozay
la source
0

Peut-être que la rétro-ingénierie pourrait vous aider si vous êtes prêt pour cela.

S'il existe une et une seule solution à chaque problème, vous pouvez probablement générer un graphique basé sur la réponse unique. Cela ne vous obligera pas à faire de la programmation dynamique ou même à sauter la force brute et à opter pour une génération méthodique.

Vous pouvez vous y prendre en:

  1. Garder un graphique MxN prêt
  2. créer une / plusieurs solution (s)
  3. faire une question autour d'elle si c'est un problème de solution singulier
  4. s'il existe plusieurs solutions au problème, vous pouvez répéter la procédure ci-dessus de manière à ce que l'itération en cours n'inhibe pas une autre solution.

Bien que vous deviez utiliser un périphérique en fonction de la complexité et de la taille du problème qui générera cette question pour vous. Ne vous contentez pas de force brute. Essayez plutôt un algorithme aléatoire. Cela pourrait vous aider.

c0da
la source
Je savais que je regretterais d'avoir vendu ce livre l'année dernière, mais je pense qu'un de mes amis l'a déjà quelque part. Un algorithme particulier que je devrais rechercher? Ou regardez simplement tous ceux avec des graphiques et voyez si je peux en trouver un qui semble utile? Oh et il y a une solution optimale (je suppose qu'il pourrait y avoir un lien pour cela cependant) et une infinité d'autres solutions puisque vous pouvez simplement faire des allers-retours entre deux nœuds un certain nombre de fois et ensuite la résoudre.
Talon876
0

Que diriez-vous d'une autre approche? Commencez avec un labyrinthe vide et ajoutez des blocs comme celui-ci:

  1. Bloc de départ et bloc de fin aléatoires.
  2. Effectuez 1 à 3 pas "coulissants" dans une direction aléatoire (mais sans retour) et avec une longueur aléatoire (*). Placez un bloc après chaque étape (pour arrêter la diapositive).
  3. Trouvez le chemin le plus court vers la sortie. S'il y a trop peu de segments (difficulté de bas niveau), prenez un segment aléatoire du chemin et divisez-le avec un bloc. Sinon, placez un bloc comme à l'étape 1 et quittez.
  4. Répétez 1 avec prudence (*): lorsque vous choisissez la longueur d'un pas coulissant, faites en sorte que le bloc que vous placez ne ferme pas le chemin précédent.

Touche finale: trouvez l'itinéraire le plus court avec l'algorithme que vous avez fourni. Prenez note de toutes les cellules utilisées et commencez à remplir le reste au hasard, chaque fois en vous assurant que l'itinéraire le plus court ne raccourcit pas.

Il y a une mise en garde à l'étape deux, lorsque vous ne pouvez pas mettre le dernier bloc afin qu'il ne croise pas les chemins utilisés, mais je vois deux solutions à cela: déplacer le bloc de fin plus tôt ou annuler quelques étapes et réessayer.

Et une autre pensée pour la longueur aléatoire des étapes coulissantes - vous voudrez peut-être le choisir de sorte qu'un bloc placé plus tôt soit réutilisé, tant que les chemins ne se chevauchent pas.

Lyth
la source
@ Talon876 Il s'agit d'un type d'algorithme randomisé dont je parlais.
c0da