Generar aleatoriamente un gráfico dirigido en una cuadrícula

11

Estoy tratando de generar aleatoriamente un gráfico dirigido con el propósito de hacer un juego de rompecabezas similar a los rompecabezas deslizantes de hielo de Pokemon.
Esto es esencialmente lo que quiero poder generar aleatoriamente: http://bulbanews.bulbagarden.net/wiki/Crunching_the_numbers:_Graph_theory .

Necesito poder limitar el tamaño del gráfico en una dimensión x e y. En el ejemplo dado en el enlace, estaría restringido a una cuadrícula de 8x4.
El problema con el que me encuentro no es generar el gráfico al azar, sino generar un gráfico al azar, que puedo trazar correctamente en un espacio 2d, ya que necesito algo (como una roca) en el lado opuesto de un nodo, para hacerlo visualmente tiene sentido cuando deja de deslizarse. El problema con esto es que a veces la roca termina en el camino entre otros dos nodos o posiblemente en otro nodo, lo que hace que se rompa todo el gráfico.

Después de discutir el problema con algunas personas que conozco, llegamos a un par de conclusiones que pueden llevar a una solución.

  • Incluyendo los obstáculos en la cuadrícula como parte del gráfico al construirlo.
  • Comience con una cuadrícula llena y simplemente dibuje una ruta aleatoria y elimine los bloques que harán que esa ruta funcione.

El problema se convierte en averiguar cuáles eliminar para evitar la introducción de una ruta adicional más corta. También estábamos pensando que un algoritmo de programación dinámica puede ser beneficioso, aunque ninguno de nosotros es demasiado hábil para crear algoritmos de programación dinámica de la nada. Cualquier idea o referencia sobre cómo se llama oficialmente este problema (si se trata de un problema gráfico oficial) sería de gran ayuda.

Aquí hay algunos ejemplos de lo que he logrado hasta ahora al colocar bloques al azar y generar el gráfico de navegación desde el inicio / finalización elegidos. La idea (como se describe en el enlace anterior) es que comiences en la S verde y quieras llegar a la F. Verde. Lo haces moviéndote hacia arriba / abajo / izquierda / derecha y continúas en la dirección elegida hasta que tocas un pared. En estas imágenes, el gris es una pared, el blanco es el piso, y la línea púrpura es la longitud mínima de principio a fin, y las líneas negras y los puntos grises representan posibles caminos.

Aquí hay algunos malos ejemplos de gráficos generados aleatoriamente:

ingrese la descripción de la imagen aquí

Aquí hay algunos buenos ejemplos de gráficos generados aleatoriamente (o ajustados a mano):

ingrese la descripción de la imagen aquí

También he notado que los más desafiantes cuando en realidad se juega como un rompecabezas son los que tienen muchos nodos de alto grado a lo largo del camino mínimo.

Talon876
fuente
1
Puede generar un conjunto de rocas completamente al azar, luego verificar si el gráfico correspondiente tiene una solución y, de no ser así, tirarlo y comenzar de nuevo. Con una cuadrícula de 8x4 esto no puede tomar tanto tiempo. Estoy seguro de que hay soluciones más limpias.
Trabajo
Este fue mi primer enfoque, pero necesito hacerlo a una escala un poco más grande y la fuerza bruta pareció tomar un tiempo e intentaba encontrar un mejor enfoque.
Talon876

Respuestas:

2
  • es hielo, te moverás a menos que golpees una roca.
  • La única forma de cambiar de dirección es golpear una roca.
  • Si golpeas una roca, debes cambiar de dirección.
  • Los ciclos son buenos, por razones obvias.
  • puede haber múltiples comienzos y múltiples fines.

propiedades más avanzadas:

  • las celdas sin rocas adyacentes no son accesibles (algunas pueden atravesarse)
  • las paredes también son rocas, si las quitas, puedes decidir envolverlas.
  • puede usar sub-cuadrículas como patrones ("mosaico" 3x3, 3x4, 5x5, ... etc.)
  • puede superponer un mosaico de rompecabezas MxN en la parte superior del área de MxN no transitable y agregar una roca para redirigirla dentro / fuera de ella.
  • La rotación o simetría de un mosaico puede ser interesante
  • puede expandir un mosaico insertando filas / columnas heladas

ejemplo:

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

ejemplo de combinar fichas:

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

puede que te guste el juego Tsuro , usa fichas para generar un tablero aleatorio.

dnozay
fuente
0

Tal vez la ingeniería inversa podría ayudarlo si está preparado para eso.

Si hay una única solución para cada problema, probablemente pueda generar un gráfico basado en la respuesta única. Esto no requerirá que realice una programación dinámica o incluso omita la fuerza bruta y opte por una generación metódica.

Puedes hacerlo al:

  1. Mantener un gráfico MxN listo
  2. creando una / múltiples soluciones
  3. haciendo una pregunta a su alrededor si es un problema de solución singular
  4. Si hay varias soluciones al problema, puede repetir el procedimiento anterior de manera que la iteración actual no inhiba otra solución.

Aunque necesitará un dispositivo de acuerdo con la complejidad del problema y el tamaño del problema que generará esta pregunta para usted. No te limites a la fuerza bruta. Pruebe con un algoritmo aleatorio en su lugar. Esto te puede ayudar.

c0da
fuente
Sabía que lamentaría haber vendido ese libro el año pasado, aunque creo que uno de mis amigos lo tiene en algún lado. ¿Algún algoritmo en particular que deba buscar? ¿O simplemente mire todas las gráficas y vea si puedo encontrar una que parezca útil? Ah, y hay una solución óptima (supongo que podría haber un empate para eso) e infinitas otras soluciones, ya que podría ir y venir entre dos nodos cualquier cantidad de veces y luego resolverlo.
Talon876
0

¿Qué tal otro enfoque? Comience con un laberinto vacío y agregue bloques como este:

  1. Bloque inicial y final aleatorio.
  2. Realice 1-3 pasos "deslizantes" en dirección aleatoria (pero no de retorno) y con longitud aleatoria (*). Coloque un bloque después de cada paso (para detener la diapositiva).
  3. Encuentra el camino más corto hacia la salida. Si hay muy pocos segmentos (dificultad de bajo nivel), tome un segmento aleatorio del camino y divídalo con un bloque. De lo contrario, coloque un bloque como en el paso 1 y salga.
  4. Repita 1 con precaución (*): cuando elige la longitud de un paso deslizante, haga que el bloque que coloque no cierre la ruta anterior.

Toque final: encuentre la ruta más corta con el algoritmo que proporcionó. Tome nota de todas las celdas que se usan y comience a llenar el resto al azar, asegurándose siempre de que la ruta más corta no se acorte.

Hay una advertencia en el paso dos, cuando no puede colocar el último bloque para que no cruce los caminos utilizados, pero veo dos soluciones a esto: mueva el bloque final antes o deshaga algunos pasos e intente nuevamente.

Y otro pensamiento para la longitud aleatoria de los pasos deslizantes: es posible que desee elegirlo para que un bloque colocado anteriormente se reutilice, siempre que las rutas no se superpongan.

Lyth
fuente
@ Talon876 Este es un tipo de algoritmo aleatorio del que estaba hablando.
c0da