7.14. Análisis de la gira del caballo¶
Hay un último tema interesante sobre el problema de la gira del caballo, luego pasaremos a la versión general de la búsqueda en profundidad. El tema es el desempeño. En particular, giraCaballo
es muy sensible al método que usted use para seleccionar el siguiente vértice a visitar. Por ejemplo, en un tablero de cinco por cinco usted puede producir una ruta en aproximadamente 1.5 segundos en una computadora razonablemente rápida. Pero, ¿qué ocurre si usted intenta hacerlo con un tablero de ocho por ocho? En este caso, dependiendo de la velocidad de su computadora, ¡usted podría tener que esperar hasta media hora para obtener los resultados! La razón de esto es que el problema de la gira del caballo, como lo hemos implementado hasta ahora, es un algoritmo exponencial de tamaño

Figura 12: Un árbol de búsqueda para la gira del caballo¶
Figura 12: Un árbol de búsqueda para la gira del caballo

Figura 13: Número de movimientos posibles para cada cuadrado¶
Figura 13: Número de movimientos posibles para cada cuadrado
Ya hemos visto que el número de nodos en un árbol binario de altura N es
Por suerte hay una manera de acelerar el caso de un tablero ocho por ocho para que funcione en menos de un segundo. En el programa siguiente mostramos el código que acelera giraCaballo
. Esta función (ver el Programa 4), llamada ordenPorDisp
se utilizará en lugar de la llamada a u.obtenerConexiones
en el código mostrado anteriormente. La línea crítica en la función ordenPorDisp
es la línea 10. Esta línea asegura que seleccionemos, para ir a continuación, el vértice que tenga el menor número de movimientos disponibles. Usted podría pensar que esto es realmente contraproducente; ¿por qué no seleccionar el nodo que tiene la mayor cantidad de movimientos disponibles? Usted puede probar ese enfoque fácilmente ejecutando el programa usted mismo e insertando la línea listaRes.reverse()
justo después del ordenamiento.
El problema de usar el vértice con la mayor cantidad de movimientos disponibles como siguiente vértice en la ruta es que tiende a que el caballo tenga que visitar los cuadrados del medio anticipadamente durante la gira. Cuando esto sucede, es factible que el caballo se quede varado en un lado del tablero donde no puede alcanzar cuadrados no visitados en el otro lado del tablero. Por otro lado, visitar primero los cuadrados con el menor número de movimientos disponibles obliga al caballo a visitar primero los cuadrados alrededor de los bordes del tablero. Esto asegura que el caballo visite temprano las esquinas difíciles de alcanzar y pueda usar los cuadrados del medio para saltar a través del tablero solamente cuando sea necesario. Utilizar este tipo de conocimiento para acelerar un algoritmo se denomina heurística. Los seres humanos usan la heurística todos los días para ayudar a tomar decisiones, las búsquedas heurísticas se utilizan a menudo en el campo de la inteligencia artificial. Esta heurística particular se llama el algoritmo de Warnsdorff, nombrado en honor a H. C. Warnsdorff que publicó su idea en 1823.
Programa 4
1def ordenPorDisp(n):
2 listaRes = []
3 for v in n.obtenerConexiones():
4 if v.obtenerColor() == 'blanco':
5 c = 0
6 for w in v.obtenerConexiones():
7 if w.obtenerColor() == 'blanco':
8 c = c + 1
9 listaRes.append((c,v))
10 listaRes.sort(key=lambda x: x[0])
11 return [y[1] for y in listaRes]