A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Problema das N-Rainhas

Apresentações semelhantes


Apresentação em tema: "Problema das N-Rainhas"— Transcrição da apresentação:

1 Problema das N-Rainhas
Definição Colocar N rainhas em um tabuleiro N x N de forma que nenhuma seja atacada pelas outras. A forma geral de uma solução é uma permutação de um vetor de inteiros [1, , N]. A solução para o problema de 8 rainhas mostrada abaixo é representada pelo vetor [4, 2, 7, 3, 6, 8, 5, 1].

2 Histórico

3 Complexidade

4 Testes em PROLOG Não é permitido abrir um nó que represente uma posição em uma linha já preenchida. Algoritmo 1: Teste das diagonais utilizando operador =\=. Eliminação automática de linhas e colunas já preenchidas. Algoritmo 2: Teste das diagonais utilizando operador abs. Eliminação automática de linhas e colunas já preenchidas. Algoritmo 3: Eliminação de linhas, colunas e diagonais já preenchidas. Não há teste de diagonais. Algoritmo 4: Inversão da lista de linhas candidatas.

5 Resultados

6 Conclusões O PROLOG conseguiu resolver instâncias de até 25 rainhas em menos de 1000 segundos (Amzi Pentium II 266 MHz Mb) Quando o número de rainhas é impar, a busca é bem mais rápida do que quando temos um número par de rainhas. A implementação em PROLOG é dependente dos operadores utilizados. O uso do operador abs, no lugar do =\= se mostrou vantajoso, sendo que a estrutura do programa permanece a mesma.

7 Programas Algoritmo 1 time(N):- timer(X), solve_Queens(N), timer(Y), Z is Y-X, write(Z). Queens(N,S):- make_list(N,L), move_safe(L,[],S). make_list(0,[]). make_list(N,[N|T]):- N>0, M is N-1, make_list(M,T). move_safe([],S,S). move_safe(L,Qs,S):- select(Q,L,R), safe(Q,1,Qs), move_safe(R,[Q|Qs],S). select(X,[X|T],T). select(X,[H|T],[H|T1]):- select(X,T,T1). safe(_,_,[]). safe(Q,D,[Q1|Qs]):- Q+D=\=Q1, Q-D=\=Q1, D1 is D+1, safe(Q,D1,Qs). solve_Queens(N):- Queens(N,S), print_sol(S,1,N). print_sol(S,M,N):- M>N. print_sol(S,M,N):- M=<N, print_row(M,S), M1 is M+1, print_sol(S,M1,N). print_row(_,[]):- nl. print_row(M,[Q|Qs]):- (M=Q, write(' Q '); M \= Q, write(' . ')), print_row(M,Qs).

8 Programas (cont.) Algoritmo 2 Algoritmo 3 safe(_,_,[]).
safe(Q,D,[Q1|Qs]):- abs(Q+D-Q1)>0, abs(Q-D-Q1)>0, D1 is D+1, safe(Q,D1,Qs). Algoritmo 3 Queens(N,S):- gen(1,N,Dxy), Nu1 is 1-N, Nu2 is N-1, gen(Nu1,Nu2,Du), Nv2 is N+N, gen(2,Nv2,Dv), sol(S,Dxy,Dxy,Du,Dv). gen(N,N,[N]). gen(N1,N2,[N1|List]):- N1<N2, M is N1+1, gen(M,N2,List). sol([],[],Dy,Du,Dv). sol([Y|Ylist],[X|Dx1],Dy,Du,Dv):- del(Y,Dy,Dy1), U is X-Y, del(U,Du,Du1), V is X+Y, del(V,Dv,Dv1), sol(Ylist, Dx1, Dy1, Du1, Dv1). del(Item,[Item|List],List). del(Item,[First|List],[First|List1]):- del(Item,List,List1).

9 Programas (cont.) Algoritmo 4 move_safe([],S,S).
move_safe(L,Qs,S):- select(Q,L,R), safe(Q,1,Qs), reverse(R,R1), move_safe(R1,[Q|Qs],S). reverse([],[]). reverse([First|Rest],Reversed):- reverse(Rest,ReversedRest),conc(ReversedRest,[First],Reversed). conc([],L,L). conc([X|L1],L2,[X|L3]):- conc(L1,L2,L3).

10 Exemplo ?- tempo(10). Q Q Q Q Q Q . Q Q Q Q yes ?- queens(10,S). S = [5,7,9,3,8,2,4,6,1,10]


Carregar ppt "Problema das N-Rainhas"

Apresentações semelhantes


Anúncios Google