¿Número de rutas entre puntos en una cuadrícula con nodos bloqueados?

Estoy trabajando en un proyecto de investigación y me encontré con este problema. Tenía curiosidad por saber si existe una estrategia para contar la cantidad de rutas de A a B, usando nodos libres y evitando los nodos bloqueados.

El punto de partida siempre es la esquina inferior izquierda y el punto final siempre es la esquina superior derecha. Sólo podemos movernos hacia arriba o hacia la derecha.

Los nodos bloqueados siempre aparecen en la esquina superior izquierda de la cuadrícula. No hay ningún nodo libre en el lado izquierdo, o encima de cualquier nodo prohibido.

Puedo encontrar la respuesta usando algoritmos de búsqueda, pero eso no es eficiente, especialmente con problemas a gran escala. Tenía curiosidad por saber si hay una mejor expresión/estrategia matemática para este problema. ¡Gracias! Esto es un ejemplo:

ingrese la descripción de la imagen aquí

En otras varitas, tiene un gráfico de cuadrícula con una "pared" definida por los nodos bloqueados exteriores

Respuestas (4)

Una forma de hacerlo es por inclusión-exclusión .

Basta con excluir el nodo inferior prohibido de cada columna. En tu ejemplo, estos son los nodos. ( 0 , 2 ) , ( 1 , 2 ) , ( 2 , 4 ) y ( 3 , 5 ) . Denote el conjunto de estos nodos por norte y el número de caminos que usan todos los nodos en un conjunto S por a S . Entonces por inclusión-exclusión el número de caminos admisibles es

S norte ( 1 ) | S | a S .

Hay ( X 2 X 1 + y 2 y 1 X 2 X 1 ) caminos desde ( X 1 , y 1 ) a ( X 2 , y 2 ) . Al insertar los nodos prohibidos como pasos intermedios, podemos escribir la suma anterior como

S norte ( 1 ) | S | i = 0 | S | ( y s i + 1 y s i + X s i + 1 X s i X s i + 1 X s i ) ,

dónde s 1 , , s | S | son los nodos en S en orden ascendente X coordenadas, y s 0 = A y s | S | + 1 = B .

En tu ejemplo, esto es

( 10 5 ) ( 2 0 ) ( 8 5 ) ( 3 1 ) ( 7 4 ) ( 6 2 ) ( 4 3 ) ( 8 3 ) ( 2 2 ) + ( 2 0 ) ( 1 1 ) ( 7 4 ) + ( 2 0 ) ( 4 2 ) ( 4 3 ) + ( 2 0 ) ( 6 3 ) ( 2 2 ) + ( 3 1 ) ( 3 1 ) ( 4 3 ) + ( 3 1 ) ( 5 2 ) ( 2 2 ) + ( 6 2 ) ( 2 1 ) ( 2 2 ) ( 2 0 ) ( 1 1 ) ( 3 1 ) ( 4 3 ) ( 2 0 ) ( 1 1 ) ( 5 2 ) ( 2 2 ) ( 2 0 ) ( 4 2 ) ( 2 1 ) ( 2 2 ) ( 3 1 ) ( 3 1 ) ( 2 1 ) ( 2 2 ) + ( 2 0 ) ( 1 1 ) ( 3 1 ) ( 2 1 ) ( 2 2 ) = 104 .

¡Impresionante! Estaba trabajando con los cuatro nodos de límite, pero tenía el problema de contar en exceso. Ahora veo mi error. ¡Muchas gracias por su tiempo y su prolija formulación!
@Sadegh: ¡De nada! Tenga en cuenta, sin embargo, que la complejidad computacional aquí es O ( 2 norte ) ) , dónde norte es el número de nodos límite prohibidos, mientras que para la recurrencia en las otras dos respuestas es O ( k 2 ) , dónde k es la dimensión de la cuadrícula, por lo que dependiendo de si sus problemas a gran escala tienen grandes norte o grande k , las otras respuestas pueden ser más eficientes. Si ambos norte y k son grandes, solo son cuadráticos mientras que esto es exponencial.

Dejar pag ( X , y ) sea ​​el número de tales caminos desde ( 0 , 0 ) a ( X , y ) . Al considerar el último paso en ( X , y ) , encontramos eso

pag ( X , y ) = pag ( X 1 , y ) + pag ( X , y 1 ) ,
dónde pag ( X , y ) = 0 si X < 0 , y < 0 , o ( X , y ) está bloqueado. La condición de frontera es pag ( 0 , 0 ) = 1 , y desea calcular pag ( 5 , 5 ) .

0 0 0 0 32 104 0 0 0 10 32 72 0 0 3 10 22 40 0 0 3 7 12 18 1 2 3 4 5 6 1 1 1 1 1 1

Eso suena exactamente como OP tenía en mente cuando escribió "Puedo encontrar la respuesta usando algoritmos de búsqueda, pero eso no es eficiente, especialmente con problemas a gran escala", así que no creo que esto responda a su pregunta.
Compare mi enfoque con una búsqueda primero en amplitud o primero en profundidad de ( 0 , 0 ) que genera caminos explícitamente en lugar de solo contarlos.

Definir PAG X , y como el número de camino para llegar al punto ( X , y ) de ( 0 , 0 ) . Podemos llegar al punto ( X , y ) de ( X 1 , y ) o ( X , y 1 ) . Por lo tanto se aplica la siguiente expresión: PAG X , y = PAG X 1 , y + PAG X , y 1 . Si se le permite usar la computadora, es muy simple. Por ejemplo, uso Excel como a continuación:

ingrese la descripción de la imagen aquí

acabo de ingresar 1 en la celda inferior izquierda, luego 0 en las celdas bloqueadas.

Esto puede no ser importante, pero un caso muy especial es si las celdas bloqueadas forman un triángulo en la esquina superior izquierda, siendo la primera celda bloqueada ( 0 , a )

El número de ruta desde ( 0 , 0 ) a ( X , y ) convertirse ( X + y X ) ( X + y X + a )

Eso suena exactamente como OP tenía en mente cuando escribió "Puedo encontrar la respuesta usando algoritmos de búsqueda, pero eso no es eficiente, especialmente con problemas a gran escala", así que no creo que esto responda a su pregunta.
@FedericoPoloni quizás, pensé que OP significa enumerar todos los caminos posibles y luego buscar entre ellos cuál satisface los criterios "no pasa estos puntos"
La fórmula que muestras es genial. Cómo lo conseguiste? (Puedo ver que se prueba fácilmente por inducción).

Digamos que tenemos un gráfico de cuadrícula de celosía de tamaño norte . Ahora ponemos obstáculos en este gráfico con la siguiente regla:
si ponemos un obstáculo en un nodo, también ponemos obstáculos en todos los nodos al norte y al oeste de él.

En otras palabras, nuestros obstáculos siempre forman una pared que segmenta el gráfico en una parte que se puede atravesar y una parte que está bloqueada.
Llamemos a los nodos de obstáculos que no tienen nodos de obstáculos al sur o al este "nodos de obstáculos externos".

Podemos desmontar el gráfico original en una serie de gráficos de cuadrícula rectangular (sin obstáculos):ingrese la descripción de la imagen aquí

Ahora contamos los caminos de A a B usando los bordes entre las cuadrículas rectangulares.

Una ruta de ejemplo:ingrese la descripción de la imagen aquí

Dejar ( X 1 , y 1 ) , . . . , ( X k , y k ) ser los nodos de obstáculo exterior.

si tenemos un a × b cuadrícula rectangular (es decir, ( 0 , 0 ) a ( a 1 , b 1 ) ), entonces hay ( a + b a , b ) = ( a + b a ) maneras de llegar desde la esquina suroeste a la esquina noreste.
De manera similar, tenemos que el número de caminos desde ( a 1 , b 1 ) a ( a 2 , b 2 ) es

caminos ( ( a 1 b 1 ) , ( a 2 b 2 ) ) := ( ( a 2 a 1 ) + ( b 2 b 1 ) a 2 a 1 )

Usando esto, nuestra recursividad es:

PAG ( X , y ) = { i = X m 1 + 1 X caminos ( ( i y m 1 ) , ( X y 1 ) ) PAG ( i , y m 1 ) ,  si  m : y = y m X m < X norte 1 ,  si  X = y = 0
El primer caso representa la situación en la que se nos da un nodo que está en la parte inferior de una de las cuadrículas rectangulares, y rastreamos las rutas a este nodo hasta las rutas a los nodos inferiores de la cuadrícula rectangular hacia el sur.

Añadiendo ( X 0 , y 0 ) = ( 1 , 0 ) y ( X k + 1 , y k + 1 ) = ( norte , norte 1 ) ,
PAG ( norte , norte ) nos da el número de caminos desde ( 0 , 0 ) a ( norte 1 , norte 1 ) .

Formulando esta recursividad como un programa dinámico, se puede lograr un tiempo de ejecución de O ( norte k ) (dónde k es el número de nodos de obstáculos exteriores, para los que siempre se cumple k norte ).