Sei sulla pagina 1di 3

El problema de las ocho reinas.

Colocar 4 reinas en este tablero de 4x4 sin amenazarse. Las reinas amenazan en línea horizontal,
vertical y en diagonal.

Las cuatro reinas no se pueden amenazar. Tenemos 4 filas y cuatro columnas.


1ra Solución puede denotarse por el vector (3, 1, 4, 2) y significará que:
la reina 1 está en la columna 3, (1,3); la reina 2 está en la columna 1, (2,1); la reina 3 está en la
columna 4, (3,4); la reina 4 está en la columna 2, (4,2).
Las cuatro reinas están en las posiciones: (1,3), (2,1), (3,4), (4,2).
Si numeramos las filas de arriba hacia abajo decimos que en la fila 1 intersección columna 3 está
la primera reina. Abreviadamente: (1,3).
Si giramos 90º el tablero sin mover las reinas aparece la misma solución.
Si colocamos un espejo en un lado del tablero 4x4 aparece su simétrico especular y el orden de
las componentes es al contrario o la misma pero ordenadas de derecha a izquierda.
2da Solución: (2, 4, 1, 3). Al girar el tablero 90º aparece la misma solución.
Sólo hay dos soluciones diferentes: (3, 1, 4, 2) y (2, 4, 1, 3) puesto que necesitamos mover las
reinas. Observe que al sumar las dos soluciones como si fueran vectores da el vector (5, 5, 5, 5).

diagReina(_,[],_):-
true.
diagReina(Reina,[C|L],Col):-
(Reina + Col) =\= C,
(Reina - Col) =\= C,
diagReina(Reina,L,Col+1).
diagsOK([ _|[] ]):-
true.
diagsOK([Cabeza|Lista]):-
diagReina(Cabeza,Lista,1),
diagsOK(Lista).
reinas(N,X):-
numlist(1,N,Base),
permutation(X,Base),
diagsOK(X).
El problema del Viajante

El problema del viajante (TSP: Travelling Salesman Problem) es uno de los problemas más
famosos y estudiados en el campo de la optimización combinatoria computacional, ya que a pesar
de la aparente sencillez de su planteamiento es uno de los más complejos de resolver, haciéndolo
comparable en complejidad a la de otros problemas aparentemente mucho más complejos que
han retado a los matemáticos desde hace siglos.
Es un ejemplo que muestra la problemática que subyace tras algunos tipos de problemas
matemáticos que a priori parecen tener una solución relativamente fácil, pero que en la práctica
presentan un gran reto. La dificultad de este tipo de problemas no radica en que no se sepa cómo
resolverlo, sino en la eficiencia de la solución que se conoce, ya que en la práctica la solución no
es factible debido al tiempo computacional que se precisa para obtenerla.
Definición: El problema del viajante consiste en encontrar la ruta más corta que debe llevar a
cabo un vendedor que, comenzando por una ciudad de origen visite un determinado y
preestablecido conjunto de ciudades y vuelva a la ciudad original, con la restricción de que por
cada ciudad sólo pase una vez.

Si se desea expresar el problema de forma matemática utilizando la teoría de grafos, el TSP


consiste en encontrar en un grafo, [Math Processing Error]G, que tiene asignado un coste
(longitud) para cada arista, el ciclo Hamiltoniano que tenga la menor suma de costes de las aristas
que lo componen.
Dentro de la Teoría de la Complejidad, que es la rama de la Teoría de la Computación que
estudia, de manera teórica, la complejidad inherente a la resolución de un problema computable,
se le cataloga como un problema NP-completo, lo que supone que los recursos computacionales
necesarios para encontrar una solución óptima crecen de forma exponencial con la entrada del
problema.
En el caso concreto del TSP la entrada es el número de nodos (o ciudades) del grafo. Cuanto
mayor sea el número de nodos, mayor va a ser el número de rutas posibles, y por lo tanto mayor
será el esfuerzo requerido para calcular todas ellas. Así, el número de rutas posibles entre [Math
Processing Error] Nnodos es igual a [Math Processing Error]N!, lo que hace que la resolución del
TSP mediante la obtención de todas las rutas posibles y posterior comparación entre ellas (que es
el primer algoritmo que a uno se le ocurre para dar solución) es poco factible incluso para un
número de nodos no muy elevado. Basta una red simple de [Math Processing Error]7 ciudades
para que sea necesario calcular más de [Math Processing Error]5000 combinaciones, ([Math
Processing Error]7!=5040), y si subimos hasta Math Processing Error]10 el número de ciudades
de la red, entonces las posibles rutas se disparan hasta más de tres millones ([Math Processing
Error]10!=3.628.800).
Por ello, intentar resolver el TSP en redes relativamente simples mediante el método de
generación y comparación de todas las rutas es absolutamente inabordable mediante los medios
computacionales disponibles actualmente, lo que hace que sea necesario utilizar otros
procedimientos que, aunque no obtengan la solución óptima, sí proporcionen una respuesta
aproximada lo suficientemente optimizada en un tiempo razonablemente bajo.
Mediante estas aproximaciones se han conseguido resolver TSP con varios miles de nodos
que solo se diferencian en un 1% de la solución óptima. Uno de estos métodos aproximados para
resolver el TSP es el que presentamos aquí y que se inspira en la forma en que las colonias de
hormigas resuelven el problema de búsqueda y recolección de alimentos.

El vendedor viajero.
Un agente comercial debe visitar N ciudades dadas minimizando el número total de km.
recorridos. Puede escoger el orden en el que visita las ciudades, en particular dónde
comenzar y dónde acabar. Para la planificación el agente dispone de:
Una lista de ciudades a visitar, expresada mediante una cláusula Prolog de la forma:
ciudades([lima,huancayo,trujillo]).(Aquí N=3)
Una tabla precalculada (a partir de un mapa del país) con las distancias mínimas entre cada par
de ciudades, representada mediante cláusulas Prolog de la forma:
dist(lima,huancayo, 200).
dist(huancayo,lima, 200).
dist(lima,trujillo, 200).
dist(trujillo,lima, 200).
dist(huancayo,trujillo, 100).
dist(trujillo,huancayo, 100).
1. Denominamos recorrido a una lista Prolog que contiene las N ciudades en el orden en
el que se visitan. Escribimos un predicado dist_tot(R, D) que, dado un recorrido R
instancie la variable D a la distancia total de dicho recorrido
dist_tot([_], 0).
dist_tot([X, Y |L], T) : −dist(X, Y, D), dist_tot([Y |L], U), T is D + U.
2. Escribimos un predicado recorrido_min que muestre el recorrido más corto posible
recorrido_min : −nat(N), ciudades(L), permutation(L, R), dist_tot(R, N), write(R), nl, !.

TAREA:
1. Elaborar un programa para colocar ocho reinas en un tablero de ajedrez de dimensión 8 de
tal forma que ninguna amenace a la otra (como reinas de ajedrez)
2. En el problema del viajero, incrementar 5 ciudades más y solucionar el problema buscando
la ruta mas corta.

Potrebbero piacerti anche