Universidade Federal de Santa Catarina
|
Para realizar os experimentos com é necessário o GNU Prolog.
% Resolução de CSP com GNU Prolog % % Exemplo básico: % variáveis: % X1, X2, X3 % domínios: % X1: {1, 2} % X2: {2} % X3: {1, 2} % restrições (\= significa diferente): % X1 \= X3 % X2 \= X3 % % Para executar, digite em uma shell de comandos: % gprolog --query-goal "consult('explo-basico'), resolve, halt" resolve :- % cria uma lista com todas as variáveis Todas = [X1, X2, X3], % cria as variáveis e os domínios fd_domain(X1, [1,2]), fd_domain(X2, [2]), fd_domain(X3, [1,2]), % restrições X1 #\= X3, X2 #\= X3, % resolve o CSP fd_labeling( Todas ), % imprime resultado write('X1 = '), write(X1), nl, write('X2 = '), write(X2), nl, write('X3 = '), write(X3), nl.
% variáveis: supondo uma rainha por linha, % as variáveis representam as colunas das % rainhas: R1, R2, R3, R4 % domínios: % Ri: {1..4} % restrições (|....| significa módulo): % Ri \= Rj % | i-j | \= |Ri - Rj| % % Para executar, digite em uma shell de comandos: % gprolog --query-goal "consult('4-rainhas'), resolve, halt" resolve :- % cria uma lista com todas as variáveis Todas = [R1, R2, R3, R4], % cria as variáveis e os domínios (valores de 1 a 4) fd_domain(Todas, 1, 4), % restrições fd_all_different(Todas), % todas devem ter valores diferentes % diagonais (dist retorna a diferença entre as variáveis) 1 #\= dist(R1, R2), 2 #\= dist(R1, R3), 3 #\= dist(R1, R4), 1 #\= dist(R2, R3), 2 #\= dist(R2, R4), 1 #\= dist(R3, R4), % resolve o CSP fd_labeling( Todas ), % imprime resultado write('R1 = '), write(R1), nl, write('R2 = '), write(R2), nl, write('R3 = '), write(R3), nl, write('R4 = '), write(R4), nl.
Três macacos sábios têm os seguintes nomes: Zé, Chico e Tonho. Seu sobrenomes são Galho, Banana e Pulo, não necessariamente nesse ordem. Um deles não vê, outro não fala e outro não ouve, também não necessariamente nesse ordem. Zé lamenta que seu amigo Galho não possa ouvir. Chico e Pulo adoram ver as macaquices mútuas. Aquele que não ouve vive assistindo às provocações entre Tonho e Banana. Qual o nome completo e a característica de cada um?
% run with % gprolog --query-goal "consult(macacos), resolve, halt" resolve :- Todas = [Ze, Ch, Tn, Ga, Bn, Pl, Cg, Md, Sr], fd_domain(Todas,1,3), fd_all_different([Ze, Ch, Tn]), fd_all_different([Ga, Bn, Pl]), fd_all_different([Cg, Md, Sr]), Ze #\= Ga, Ga #= Sr, Ze #\= Sr, Tn #\= Bn, Sr #\= Tn, Sr #\= Bn, Ch #\= Pl, Ch #\= Cg, Pl #\= Cg, fd_labeling(Todas), write('nomes [Ze, Ch, Tn] = '), write([Ze, Ch, Tn]), nl, write('sobre nomes [Ga, Bn, Pl] = '), write([Ga, Bn, Pl]), nl, write('deficiencias [Cg, Md, Sr] = '), write([Cg, Md, Sr]), nl, nl.
Suponha que você precisa comprar adubo para melhorar a qualidade do solo de uma determinada propriedade. São necessários 500 Kg de adubo com a seguinte composição mínima:
Existem 3 tipos de adubos para comprar, cada um com uma determinada composição e preço, conforme a tabela abaixo:
Adubo 1 | Adubo 2 | Adubo 3 | |
Nitrato | 8% | 4% | 3% |
Fósforo | 15% | 17% | 14% |
Potássio | 10% | 10% | 7% |
Custo Kg | $ 1,50 | $ 1,00 | $ 0,70 |
Pergunta-se: quantos Kg devem ser comprados de cada tipo de adubo para atender os requisitos e ter o menor valor final a pagar?
% Resolucao de CSP com GNU Prolog % % Exemplo Orimizacao na Compra de Adubo % % Para executar, digite em uma shell de comandos: % gprolog --query-goal "consult('adubo.pl'), resolve, halt" % % by Jomi resolve :- % cria uma lista com todas as variaveis Todas = [A1, A2, A3], Qtd = 500, % Qtd de adubo a ser comprada % cria as variaveis e os dominios (valores de 1 a Qtd) fd_domain(Todas, 0, Qtd), % restricoes % qtd de nitrato ((A1*8) + (A2*4) + (A3*3)) #>= (4*Qtd), % qtd de fosforo ((A1*15) + (A2*17) + (A3*14)) #>= (14*Qtd), % qtd de potassio ((A1*10) + (A2*10) + (A3*7)) #>= (8*Qtd), A1 + A2 + A3 #= Qtd, % custo C #= A1 * 15 + A2 * 10 + A3 * 7, % otimiza o CSP fd_minimize(fd_labeling(Todas), C), % imprime resultado write('A1 = '), write(A1), nl, write('A2 = '), write(A2), nl, write('A3 = '), write(A3), nl, write('Custo='), write(C), nl.
Fazer os exemplos de coloração de mapas, quadrado mágico e do escalonamento de tarefas (enunciados vistos em sala).
Avalie o desempenho de diferentes heurísticas. Veja na seção 8.9 do manual do GProlog (``Labeling constraints'') como determinar as heurísticas utilizadas.