Notas de aula da disciplina IME 0-0 ALGORITMOS E ESTRUTURAS DE DADOS II Paulo Eustáquio Duarte Pinto (pauloedp arroba ime.uerj.br) É uma técnica de solução de problemas (construção de algoritmos) que eamina o espaço de soluções de forma eaustiva, mas abandonando famílias de caminhos tão logo alguma inviabilidade seja determinada (eaustão inteligente). É particularmente aplicável a problemas NP-Completos. fevereiro/0 Quando um caminho é inviável, VOLTAR para caminhos promissores!!! BANQUETE Quer-se distribuir n convidados em volta de uma mesa, tal que inimigos não sentem lado a lado. Eemplo: n =. Lula Obama Luana Piovani Dado Dolabela Pelé Maradona... P: Como fazer? R: Tentar de todas as maneiras... mas de forma inteligente... BANQUETE Este é um problema NP-Completo. A solução é tentar de todas as maneiras possíveis (todas as permutações circulares de a n).. Lula. L.Piovani. Obama. D. Dolabela. Pelé. Maradona........ Permutações circulares:...... Geração de Permutações Listar todas as n! permutações de um conjunto Geração de Permutações - Versão Listar todas as n! permutações de um conjunto Perm: Para i de a n: Se (i P) Então P P + i; Se ( P = n) Então Perm; P P - i; P ; Perm; Perm: Para i de a n: Se (not S[i]) Então np np + ; P[np] i; S[i] V; Se (np = n) Então Perm; np np - ; S[i] F; S[*] F; np 0; Perm;
- Geração de Permutações n = i = - Geração de Permutações n = i = i =, i =, {,} i =,, {,,} i =,, - Geração de Permutações n = i = - Geração de Permutações n = i = i =,, i =,, {,} i =,, {,} i =, {,} i =,, {,,} i =, - Geração de Permutações n = i =,, i =,, i =,, i =,, {,} {,} {,} {,} i =,, i =,, i =,, i =,, {,} {,} i =,, i =,, Geração de Permutações - Torres Pacíficas Problema: colocar torres num tabuleiro tal que as torres não se ataquem. Solução: cada permutação dos números a é uma solução distinta! (em cada linha a torre deve ser colocada na coluna indicada pelo i-ésimo elemento da permutação).
Geração de Permutações - Torres Pacíficas Solução relativa à permutação. Geração de Arranjos - A(n, q) Basta modificar uma instrução do algoritmo para geração de Permutações!!! Arranjo: Para i de a n: Se (not S[i]) Então np np + ; P[np] i; S[i] V; Se (np = q) Então Arranjo; np np - ; S[i] F; S[*] F; np 0; Arranjo; Geração de Permutações circulares Basta fiar o último elemento da permutação e gerar as permutações para n- elementos!!! PermCircular: Para i de a n-: Se (not S[i]) Então np np + ; P[np] i; S[i] V; Se (np = (n-)) Então PermCircular; np np - ; S[i] F; Geração de Combinações - C(n, q) Gera-se arranjos ordenados (um novo elemento só entra no arranjo se > último). Usa-se sentinela na posição 0. Não é mais necessári conjunto S. Comb: Para i de a n: Se (i > P[np]) Então np np + ; P[np] i; Se (np = q) Então Comb; np np - ; S[*] F; np 0; P[n] n; PermCircular; np 0; P[0] 0; Comb; Geração de Combinações - C(n, q) - Versão Usa-se um parâmetro para indicar os elementos que podem entrar na configuração. Comb (t): Para i de t a n: np np + ; P[np] i; Se (np = q) Então Comb (i+); np np - ; np 0; Comb(); Esquema Geral para Quase sempre bjetivo da técnica é eibir uma ou mais configurações de determinados conjuntos. O esquema a seguir aplica-se nesses casos. Config: Para cada elemento e i do conjunto: Se e i pode ser acrescentado à configuração Então Acrescentar e i à configuração. Se a configuração está completa Então Config; Retirar e i da configuração. Esvaziar configuração; Config;
Damas Pacíficas Problema: colocar Damas num tabuleiro tal que as Damas não se ataquem. Solução: usar o esquema geral. sempre se consegue colocar n Damas em um tabuleiro n n, para n >. Obs: Eistem 9 soluções distintas para um tabuleiro. Damas Pacíficas Eemplo de uma solução para n =. Damas Pacíficas Damas_Pacíficas: Para c de a : Se Possivel(l +, c) Então l l + ; P[l] c; Se (l = ) Então Imprimir P Damas_Pacificas; l l - ; Damas Pacíficas Eercício: simular as primeiras soluções para um tabuleiro de ou. l 0; Damas_Pacificas; Resta (Chinese Checkers) O objetivo é "comer" os pinos, deiando só um pino no tabuleiro Eight (Versão reduzida do ) O objetivo é deiar os números ordenados de a, por linha. Solução por : Tentar movimentar os pinos de todas as maneiras. (Entretanto só funciona bem para versões reduzidas...). Solução por : Movimentar o buraco de todas as maneiras, mas... guardar as configurações já consideradas...
Problema do Percurso do Cavalo O objetivo é fazer o cavalo "passar" por todas as casas do tabuleiro, sem repetições. Solução por : Sudoku O objetivo é completar o preenchimento da matriz tal que, em cada linha, coluna e mini-grid haja uma permutação dos números a 9. Movimentar o cavalo de todas as maneiras, mas... funciona melhor se ordenar convenientemente as possibilidades... 9 9 Solução por : Tentar, em cada posição vaga, os números a 9 que não conflitem com os já preenchidos. Geração de Subconjuntos Número de subconjuntos de C = {c... c n } = n GeraSub (t): Para i de t a n: ns ns + ; S[ns] i; ; Se (i < n) Então GeraSub (i + ); ns ns - ; ns 0; GeraSub (); - Geração de Subconjuntos C = {a, b, c, d} {,} i =,,, {,,} i =,, i =, i = {,,,} {,,} {,} {,,} {,} {, } {, } {, } {,} i =, i = i = {,,} {,} {,, } i =. {,} Geração de Subconjuntos Subconjuntos gerados para: { a, b, c, d } { a }, { b }, { a, b }, { b, c }, { a, b, c }, { b, c, d }, { a, b, c, d }, { b, d }, { a, b, d }, { c }, { a, c }, { c, d }, { a, c, d }, { d } { a, d }, Geração de Subconjuntos Eercício: modificar o algoritmo de geração de subconjuntos para que a geração seja por ordem de tamanho dos subconjuntos.
- Soma de Subconjuntos - Soma de Subconjuntos Problema: Dado um conjunto de números, obter os subconjuntos tal que a soma dos seus elementos seja igual a um valor dado, s. Eemplo: C = {0,,,,, 9, 9}, s = 0 Soluções: 0, + O problema Partição é um caso particular deste. SomaSub (t): i t; Enquanto (i n) e ((soma + C[i]) s): ns ns + ; S[ns] i; soma soma + C[i]; Se (soma = s) Então SomaSub (i+); ns ns - ; soma soma - C[i]; i i + ; Fe; ns 0; soma 0; Ordena C; SomaSub (); - Soma de Subconjuntos C = {,,,,,, 9}, s = i =,,, i = i =,,,,,, i = i = - Partição Aproimada Problema: Particionar um conjunto de números, em outros, tal que a diferença entre suas somas seja mínima. Eemplo: C = {0,,,,, 9, 9} {, } i = {, } i = Solução: {,, 9, 0} e {,, 9}, c/ diferença de,,. O problema Partição é um caso particular deste. Partição Aproimada Part_apro (t): i t; Enquanto (i n) e ((soma +C[i]) < msmp): ns ns + ; S[ns] i; soma soma + C[i]; Se (abs(tot - *soma) < dif) Então Guarda; dif abs(tot - *soma); msmp ma(soma, tot-soma); Part_apro (i + ); ns ns - ; soma soma - C[i]; i i + ; Fe; Ordena C; soma C[]; ns ; S[] ; Guarda; tot ΣC[i]; dif tot-*c[]; msmp ma(c[],tot-c[]); Part_aproimada(); solução guardada;. - Partição aproimada C = {,,,, }, tot = 0, msmp = 99, dif = 9 Part/candidato {, } {,,} soma {,,,} 0 {,,} {, } {,,} {, } {, } {, } 0 9 tot- *soma 9 0 0 msmp dif 99 9 Melhor partição {, } 9 {,, } 0 {,,, } {,, }
Partição Aproimada Eercício: mostrar a Partição Aproimada do conjunto {,, 9, 0, }, Eercício: mostrar a Partição Aproimada do conjunto {,,, 0} - Jogos Árvore de jogo Em jogos de turno pode-se construir a árvore de jogo, para se avaliar a melhor jogada a fazer a cada momento. A árvore de jogo é construída com, para se verificar todas as possibilidades. Depois a árvore é avaliada com a técnica MaMin. o A() - Jogos Árvore de jogo do Jogo da Velha o P o o o o o D H(0) B o o E(-) F I(0) C o o o o o o o o o o o G J() o o o o o o o o - Jogos Avaliação da Árvore de jogo - A() o D(0) H(0) P() B(-) B E(-) F(0) I(0) C(0) C G() J() - Jogos Avaliação da Árvore de jogo - Avalia_arv (F, Modo); Se (F é folha) Então Retornar (Calcula_valor(F)); Se (Modo = ) Então Valor - Valor ; Para cada filho w de F: Se (Modo = ) Então Valor ma (Valor, Avalia_arv(w, )); Valor min (Valor, Avalia_arv(w, )); Retornar Valor; - Jogos EXERCÍCIO DESENHAR e AVALIAR a árvore de jogo para o Jogo dos Palitos, entre competidores: São dados palitos e cada um deve tirar, alternadamente, de a palitos. Ganha o que tirar o último palito.
- Jogos Criação/avaliação da Árvore de jogo - Criaavalia_arv (Modo); Se (configuração é final) Então Retornar (Calcula_valor); Se (Modo = ) Então Valor - Valor ; Para cada possível modificação na configuração: Modifica a configuração; Se (Modo = ) Então Valor ma (Valor, Criaavalia_arv( )); Valor min (Valor, Criaavalia_arv( )); Restaura configuração; Retornar Valor; - Jogos Memorização Na criação/avaliação simultânea da árvore de jogo pode-se (deve-se) usar memorização, simplificando a construção da árvore. No eemplo abaio para o jogo com palitos, ao se cria ro segundo nó de valor em nível de mínimo, usa-se a avaliação já feita. (-)... (-) - Jogos Poda de Simetria Nos jogos de turnos, onde, dada uma configuração, as jogadas são as mesmas para qualquer um dos dois jogadores que vai jogar, pode-se aplicar a poda por simetria, derivada do princípio de que, para essas situações: T(, ) = -T(, ), onde é uma dada configuração e T a avaliação de determinado nó. Considere, por eemplo, a árvore de jogo para o jogo de palitos com palitos inicialmente. A árvore de jogo da página seguinte foi criada usando-se esse princípio. - Jogos Jogo dos palitos para n =. Criação e avaliação usando poda de simetria (-) (-) (-) (-) 0 0 0 (-) (-) () () () (-) - Jogos Poda de Valor limite Na criação/avaliação simultâneas da árvore de jognde há um valor limite para avaliação, pára-se de construir a árvore quando esse valor limite é obtido. Ordenação de configurações As diversas podas podem tirar partido do fato de que a ordem das configurações do pode ser arbitrada para o que for conveniente para cada problema. Na próima página é mostrada a árvore de jogo para palitos usando as podas de valor limite e simetria, escolhendo-se a ordem da retirada de palitos conveniente. - Jogos Jogo dos palitos para n =. Criação e avaliação usando podas de valor limite e simetria, com ordenação conveniente da retirada de palitos () () () () 0 0 0 () () () ()
- Jogos Poda Heurística - Jogos Árvore de jogo Poda Heurística Em muitas situações (jogo de adrez, damas, gamão, por eemplo), não é possível criar toda a árvore de jogo. Então cria-se um certo número de níveis da árvore e faz-se a avaliação heurística das folhas e avalia-se a árvore com. - - - 9 - - - - Jogos - Jogos Poda Alfa-Beta A poda alfa-beta permite simplificar a criação da árvore. É uma etensão da poda de valor limite e é usada em geral, para jogos compleos tais como adrez, damas, gamão. Na chamada para criação/avaliação são passados dois parâmetros (alfa/beta). No nível de máimo, o parâmetro beta indica o valor mínimo atingido por algum filho do nível anterior. Se algum filho do nível atual atingir ou superar esse valor, pode-se parar a avaliação do nó atual. Árvore de jogo Poda Alfa-Beta p/ jogos compleos - Jogos Avaliação da Árvore de jogo - Alfabeta - Jogos Árvore de jogo Poda Alfa-Beta Avalia_arv (F, Modo, α, β); Se (F é folha) Então Retornar (Calcula_valor(F)); Para cada filho w de F: Se (Modo = ) Então v ma (α, Avalia_arv(w,, α, β)); Se (v β ) Então Retornar β; α v; v min (β, Avalia_arv(w,, α, β)); Se (v α ) Então Retornar α; β v; Retornar v; Avalia_Arv(T,, -, ) (-, ) (, ) 9
- Jogos Jogo de adrez Técnicas usadas: -Poda heurística -Memorização -Poda alfa-beta -Aprodundamento desigual -Busca aquiescente -Livro de aberturas -Bancos de Dados de finais FIM ICE: http://www.nn.kit.net/ice/ Thinking machine: http://www.turbulence.org/spotlight/thinking/chess.html 0