Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Colocar 4 reinas en este tablero de 4x4 sin amenazarse. Las reinas amenazan en línea horizontal,
vertical y en diagonal.
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.
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.