¿Cuál es la forma más rápida de determinar si una serpiente tiene un camino hacia su cola?

Uno puede formular el problema de la siguiente manera. Tenemos un subgrafo conectado (subpatch) de una cuadrícula con un vértice (celda) [math] v [/ math] especificado en su borde (decimos que un vértice pertenece al borde si tiene menos de 4 vecinos en el subgraph en cuestión) . Deje que [math] B [/ math] denote sus vértices de borde, excluyendo [math] v [/ math].

Cada [matemática] b \ en B [/ matemática] también tiene un entero positivo asignado [matemática] t (b) [/ matemática]. En nuestra interpretación del juego de serpientes, [math] t (b) [/ math] representa el número de movimientos necesarios para que la cola llegue a una celda adyacente a [math] b [/ math]. Después de esa cantidad de movimientos, la cabeza podrá escapar a través de la celda [matemáticas] b [/ matemáticas] y perseguir la cola.

Nuestra tarea aquí es determinar si para algunos [matemática] b \ en B [/ matemática] la ruta más larga entre [matemática] v [/ matemática] y [matemática] b [/ matemática] es al menos [matemática] t ( b) [/ math] de longitud. Ese hombre: ¿existe una celda límite a la que podamos ir, pero retrase la visita hasta que se abra ?

Encontrar el camino más largo entre dos puntos dados en un gráfico es NP-difícil incluso para gráficos planos, lo que hace que sea bastante difícil de resolver de manera óptima. Pero quizás uno pueda usar algunas características especiales del gráfico. Por ejemplo, no mencioné que no tiene agujeros . Además, en realidad no tenemos que encontrar la ruta más larga; es suficiente verificar si existe una ruta de al menos una longitud determinada.

De todos modos, mi enfoque sería tratar heurísticamente de encontrar los caminos más largos a todas las celdas fronterizas, lo que daría una estimación más baja para el camino más largo. Una vez hice algo similar al generar el camino más corto entre dos puntos e intentar estimularlo después. Proporcionó algunos buenos resultados.

Si está interesado en leer sobre el trabajo de CS en problemas similares, esta es esencialmente una versión restringida de conectividad st no dirigida (existe una ruta entre los vértices syt) conocida como “accesibilidad de gráfico de cuadrícula”. La mayor parte del enfoque de la investigación se ha centrado en la complejidad espacial de la pregunta de accesibilidad, ya que los algoritmos habituales de ruta más corta darán una solución de tiempo lineal.

Un problema alternativo interesante sería un “solucionador” de serpientes: dado un juego de serpientes en un estado particular, ¿existe una estrategia para llevar a la serpiente a su comida, sabiendo que la cola sigue el camino de la cabeza? (y más allá de eso, ¿qué estrategia para llegar a la comida maximizará la probabilidad de la comida subsecuente, colocada al azar?)

Comience en la cabeza. traza hacia atrás a lo largo del costado de tu serpiente, como si acabara de girar. rastrear alrededor de cada objeto que encuentre.
Si golpeas la cabeza nuevamente antes de llegar a la cola, no tienes camino: simplemente trazaste el exterior del área que puedes alcanzar, determinaste que no hay aberturas y que la cola no está dentro de esta área. Este será el costo mínimo para descartar un camino.
Si existe una ruta, entonces A * probablemente podrá encontrar esa ruta más rápido que esto, pero si no existe ninguna ruta, creo que tiene que explorar el área completa a la que puede llegar. Imagine una situación como la que muestra, solo que la mayor parte del tablero está dentro del área, con la cola en una sola fila debajo de ella. esta rutina tendrá un costo del perimitador, mientras que A * tendrá un costo del área.

Estoy tratando de averiguar si hay un atajo. Por ejemplo. Sé que si dibujas una forma arbitraria, puedes averiguar si un punto está contenido dentro de él por cuántas veces una línea que va fuera de la forma lo intersectará. Si es extraño, estás dentro, incluso si estás afuera. Sin embargo, no creo que eso ayude aquí. Puede idear formas con números arbitrarios de segmentos entre usted y la cola.

Algoritmo de Lee
Creo que puedes aprender más de la traducción de Google de un artículo rumano sobre él, que lo explica mucho mejor: Algoritmul lui Lee.
Es decir, una búsqueda de Breadth first si desea una solución directa.

Posiblemente el algoritmo A * (A-star). Básicamente es un algoritmo que encuentra la forma más rápida del punto A al punto B. Puede leer este artículo wiki para comprender mejor cómo funciona. A * algoritmo de búsqueda

Hay dos preguntas separadas:

  1. ¿Está atrapada la serpiente?
  2. ¿Tiene un camino hacia su cola?

Para la pregunta que hizo (2), haría un relleno (buscarlo en wikipedia) desde un extremo y comprobar si me encuentro con la cola en algún momento.

Pero esto no es equivalente a la primera pregunta. Por ejemplo, si solo invertimos la cabeza y la cola en su imagen, la serpiente no queda atrapada, aunque no haya un camino desde la cola hasta la cabeza.