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

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

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 é

Apresentações semelhantes


Apresentação em tema: "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 é"— 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=

8 Programas (cont.) Algoritmo 2 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

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 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 é"

Apresentações semelhantes


Anúncios Google