550 likes | 658 Views
Inteligência Artificial. Aula 05 – Busca Heurística. Aulas Anteriores. Busca no Espaço de Estados serve para decidir que parte do conhecimento armazenado deve ser explorada em busca da solução ; Formulação problema de busca Espaço de estados (conjunto de estados + ações possíveis)
E N D
Inteligência Artificial Aula 05 – Busca Heurística
Aulas Anteriores • Busca no Espaço de Estados • serve para decidir que parte do conhecimento armazenado deve ser explorada em busca da solução; • Formulação problema de busca • Espaço de estados (conjunto de estados + ações possíveis) • Estado inicial do problema • Estado meta do problema (solução)
Atividade 4 - Missionários • Três missionários e três canibais vão atravessar de uma margem para a outra de um rio, usando um barco onde só cabem duas pessoas de cada vez. • O número de canibais não pode exceder o número de missionários em nenhuma das margens do rio. • Encontre uma forma de levar todos para a outra margem do rio, utilizando este barco. • Formule o problema (represente estados e ações).
Atividade 4 - Missionários • Para representar os estados podemos usar uma estrutura da forma [B; M; C], onde: • B pode assumir {e, d}: indica se o barco está na margem esquerda ou direita. • M pode assumir {0, 1, 2, 3}: indica a quantidade de missionários na margem esquerda. • C pode assumir {0, 1, 2, 3}: indica a quantidade de canibais na margem esquerda.
Missionários e Canibais – Conjunto de Ações A = { oper(atravessar1C; [e; 3; C]; [d; 3; C-1]) C > 0, oper(atravessar1C; [d; M; C]; [e; M; C+1]) C < 3, M > C, oper(atravessar1M; [e; M; C]; [d; M-1; C]) M > 0, M > C, oper(atravessar1M; [d; M; C]; [e; M+1; C]) M < 3, C < 2, oper(atravessar1M1C; [e; M; C]; [d; M-1; C-1]) M > 0, C > 0, M = C, oper(atravessar1M1C; [d; M; C]; [e; M+1; C+1]) M < 3, C < 3, M = C, ...
Missionários e Canibais – Conjunto de Ações ... oper(atravessar2M; [e; M; C]; [d; M-2; C]) C < 2, M > 1, oper(atravessar2M; [d; M; C]; [e; M+2; C]) C < 3, M < 2, oper(atravessar2C; [e; 3; C]; [d; 3; C-2]) C > 1, oper(atravessar2C; [d; 3; C]; [e; 3; C+1]) C < 2 }
Missionários e Canibais – Conjunto de Ações • Conjunto de Estados: S = { [e; 3; 3]; [e; 3; 2]; [e; 3; 1]; [e; 3; 0]; [e; 0; 3]; [e; 0; 2]; [e; 0; 1]; [e; 0; 0]; [e; 2; 2]; [e; 1; 1]; [d; 3; 3]; [d; 3; 2]; [d; 3; 1]; [d; 3; 0]; [d; 0; 3]; [d; 0; 2]; [d; 0; 1]; [d; 0; 0]; [d; 2; 2]; [d; 1; 1] }
Estratégias de Busca • Busca não determinística: encontram soluções testando e expandindo estados aleatoriamente. • Com e Sem ciclos • Busca Cega: encontram soluções testando e expandindo estados, sistematicamente • Busca em largura • Busca em profundidade
Atividade 8 - Jarros • O Problema dos Jarros [Rich] consiste no seguinte: • Há dois jarros com capacidades de 3 e 4 litros, respectivamente. • Nenhum dos jarros contém qualquer medida ou escala, de modo que só se pode saber o conteúdo exato quando eles estão cheios. • Sabendo-se que podemos encher ou esvaziar um jarro, bem como transferir água de um jarro para outro, encontre uma sequência de passos que deixe o jarro de 4 litros com exatamente 2 litros de água.
Representação de estados • Para representar os estados desse problema, podemos usar um par [X; Y ], onde X pertencente a {0; 1; 2; 3} representa o conteúdo do primeiro jarro e Y pertencente a {0; 1; 2; 3; 4} representa o conteúdo do segundo jarro. • As ações podem ser representadas pelos seguintes operadores:
Árvore de Busca • O estado inicial é s0 = [0; 0] • O conjunto de estados meta é G = {[X; 2]}. • Com base nessa especificação, desenhe a árvore de busca criada pelo algoritmo BuscaLargura, ao procurar a solução do problema. • Em que nível da árvore foi encontrada a solução?
Atividade 9 - Fazendeiro • Um fazendeiro encontra-se na margem esquerda de um rio, levando consigo um lobo, uma ovelha e um repolho. • O fazendeiro precisa atingir a outra margem do rio com toda a sua carga intacta, mas para isso dispõe somente de um pequeno bote com capacidade para levar apenas ele mesmo e mais uma de suas cargas. • O fazendeiro poderia cruzar o rio quantas vezes fossem necessárias para transportar seus pertences, mas o problema é que, na ausência do fazendeiro, o lobo pode comer a ovelha e essa, por sua vez, pode comer o repolho. • Encontre uma sequência de passos que resolva esse problema.
Espaço de estados • Para representar os estados desse problema, podemos usar uma estrutura da forma [F; L;O;R], cujas variáveis denotam, respectivamente, as posições do fazendeiro, do lobo, da ovelha e do repolho. • Cada variável pode assumir os valores e ou d, dependendo da margem do rio onde o objeto se encontra. • O estado inicial é s0 = [e; e; e; e] • O conjunto de estados meta é G = {[d; d; d; d]}
Ações • As ações podem ser representadas pelos seguintes operadores: • Com base nessa especificação, desenhe a árvore de busca criada pelo algoritmo BuscaProfundidade, ao procurar a solução do problema.
ImplementaçãoBusca Profundidade Problema do Labirinto • Consideremos o problema de um rato preso num labirinto que precisa achar um caminho para a saída. • Para isso, ele tenta sistematicamente cada caminho. • Quando o caminho leva a um beco, ele retrocede até um ponto que possa tentar outro caminho não explorado.
Programa principal Função dada para criar matriz representando o labirinto Função saída do labirinto (a programar)
Algoritmo – Cria Labirinto Função preenche uma matriz 15x15: 1º laço -> cria a borda 2º laço -> preenche labirinto aleatório Libera a posição para rato Libera posição de saída L[13][14]
Uso da Pilha • Função saída • Recebe matriz representando o labirinto; • Estado Inicial: o rato inicia na posição L[1,1]; • Estado meta: L[13][14]; • Inicializa a pilha; • O rato deve ir se deslocando em busca da saída (estados sucessores), de maneira que ele guarde na pilha as posições visitadas, ou seja, por onde já passou (aprofundando na árvore). • Isso permite que o rato volte a posição anterior caso chegue a um beco sem saída (nó folha da árvore de busca – não tem sucessores a expandir).
Uso da Pilha • Estados Sucessores e Uso da Pilha • A função investiga se é possível andar para direita. • Se possível, segue para direita e guarda esta posição visitada na pilha. • Caso não esteja livre a direita, tentaremos para baixo, à esquerda e para cima. • Caso não tenhamos sucesso, estamos num beco sem saída (nó folha da árvore): • Devemos marcar essa posição como beco • Recorrer a pilha, desempilhando o último lugar visitado
Rato na posição [1, 1] Marca posição já visitada Se direita livre, empilha posição visitada e reposiciona rato Senão se p/ baixo livre, empilha posição visitada e reposiciona rato Teste à esquerda Teste p/ cima Pilha vazia sem saída Senão, marca posição atual como beco e desempilha última posição visitada Reexibe a matriz atualizada Encontrou a saída
Uso da Pilha • Laço de Repetição – A cada novo estado (nova posição) • A função volta ao laço testando se a partir dessa nova posição o rato consegue se deslocar (direita, baixo, esquerda, cima). • Caso não tenhamos sucesso, voltamos a recorrer a pilha. • Quando o Laço termina? • Ou porquê não tenho mais opções na minha pilha, já tentei tudo e não cheguei a saída neste caso devolvemos zero (Falso). • Ou quando chegarmos a saída: posição L[13][14] devolve 1 (Verdadeiro)
Operações básicas da Pilha • Criar uma estrutura de pilha; | Inicializapilha • Inserir um elemento no topo (push); | Empilha • Remover o elemento do topo (pop);| Desempilha • Verificar se a pilha está vazia; | Pilhavazia • Verificar se a pilha esta cheia; | Pilhacheia • Pesquisa topo de pilha. | Pesquisatopo
Estratégias de Busca • Desvantagens de buscas cegas : • Ineficientes – expandem muitos estados para encontrar a solução; • Não garantem encontrar soluções de custo mínimo (ex.: busca em profundidade); • Vamos estudar três estratégias de busca: • 1ª) baseada no conceito de custo de ação: ineficiente, mas garante encontrar uma solução de custo mínimo; • 2ª) utiliza o conceito de função heurística: muito eficiente, mas não garante encontrar uma solução de custo mínimo; • 3ª) combina as duas estratégias anteriores;
Custo de ação • Em muitos problemas, as ações podem ter custos associados, dependendo da dificuldade que o agente tem em executá-las. • Para levar essa informação em conta durante a busca, precisamos adicionar mais um campo na especificação dos operadores: oper(α, s, s´, g(α)) β onde g(α) é o custo da ação α, que transforma o estado s num estado s´, dado que a condição β esteja satisfeita.
Problema das Rotas • Dado um mapa de vias, uma cidade de origem e uma cidade de destino, encontrar uma rota de distância mínima entre essas duas cidades.
Custo de ação • Observe que neste problema podemos definir a ação: • (vai(X, Y), X, Y) como sendo uma ação que leva o agente do estado X para o estado Y. • Porém, será que tenho o mesmo custo para me deslocar entre duas cidades do mapa? • Mais ainda, qual a pré condição para sair de X e chegar a Y? Preciso que exista uma estrada entre X e Y.
Especificando ações • Nesse domínio, o agente é capaz de viajar de uma cidade a outra e, portanto, suas ações podem ser especificadas conforme segue: • 1º) Especificamos o custo de cada via (bidirecional): via(a; b; 7) via(a; c; 9) via(a; d; 3) via(b; f; 3) via(b; i; 4) via(c; j; 5) via(d; e; 1) via(f; g; 2) via(g; h; 3) via(i; k; 5) via(j; l; 6) via(k; l; 4) • 2º) Especificar as operações: • oper(vai(X, Y), X, Y, C) via(X, Y, C) • oper(vai(X, Y), X, Y, C) via(Y, X, C)
Custo de caminho • Quando as ações têm custo, o custo de um caminho [a1, a2,..., an] é Σni=1 g(ai), onde g(ai) é o custo de cada ação ai, ou seja, g(a1) + g(a2)+...+g(an). • Por exemplo, de acordo com a figura anterior, o custo do caminho [vai(a,d), vai(d,e)] é 3 +1 = 4.
Custo de um estado • Numa árvore de busca, todo estado s está associado a um caminho que leva do estado inicial s0 até s. • Custo de um estado: custo do caminho que leva do estado inicial s0 até s. • No algoritmo de busca pelo menor custo, cada vez que um estado é expandido, um custo é associado a cada um de seus sucessores. • O algoritmo progride expandindo sempre o estado de menor custo, até que um estado meta seja encontrado.
Busca pelo menor custo • Combina os comportamentos da busca em largura (expande todos sucessores) e da busca em profundidade (aprofunda no de menor custo). • Este algoritmo é obtido através do uso de uma fila de prioridades ascendente (do menor para o maior) para guardar os estados a serem expandidos.
Exemplo Problema das Rotas (11) (10) (12) (15) (14) (20) (16) (4)
Exemplo Problema das Rotas • Estado inicial: s0 = a • Estados meta: G = {[k]} • Apesar de encontrar o menor caminho expande muitos estados tornando-o ineficiente. • O que aconteceria se todos os custos fossem iguais a 1? S0 7 9 3 4 14 10 11 12 16 20 15
Função heurística • Estima o custo mínimo de um caminho (desconhecido) que leva de um determinado estado a um estado meta. • Seja h* uma função que calcula o custo mínimo exato de um caminho que leva de um determinado estado a um estado meta. • Formalmente, uma função heurística pode ser qualquer função h que apresente as seguintes propriedades: • h(s) = 0 se e somente se s é um estado meta e • para todo s pertencente a S, h(s) <= h*(s).
Propriedades da função heurística • Essas propriedades garantem que a estimativa dada pela função heurística seja admissível, ou seja, que nunca superestime o custo real de uma solução. • Note que as funções heurísticas dependem do domínio de aplicação, bem como da criatividade e experiência de quem a projeta.
Problema do Quebra-Cabeça • O problema do Quebra-Cabeça de 8 consiste em movimentar as peças do quebra-cabeça horizontal ou verticalmente (para ocupar a posição vazia adjacente a peça) de modo que a configuração final seja alcançada:
Expandindo o estado corrente • Agora, usando uma função heurística, o algoritmo de busca deveria expandir o melhor entre esses dois estados sucessores. • Mas como decidir qual é o melhor? • Uma possibilidade é: • Verificar o quão longe cada peça encontra-se de sua posição na configuração final; • Apontar como melhor estado aquele cuja soma das distâncias é mínima.
Estimativa • No estado s1, as peças 1, 5, 6, 7 e 8 já estão em suas posições finais. • Para as peças 2, 3 e 4, a distância é 1. • Portanto, h(s1) = 3. • Analogamente, h(s2) = 5. • Isso indica que: • uma solução a partir de s1 pode ser obtida com no mínimo mais três expansões, • uma solução a partir de s2 requer no mínimo mais cinco expansões. • O algoritmo deve escolher o estado s1.
Busca pela melhor estimativa • É semelhante ao algoritmo de busca pelo menor custo. • A diferença é que, em vez de se basear no custo g(s), do caminho já percorrido até s, para selecionar os estados a serem expandidos, a busca pela melhor estimativa se baseia no custo estimado h(s) do caminho que ainda precisa ser percorrido, a partir de s, até um estado meta. • Baseia-se numa estimativa do que irei gastar.
Busca pela melhor estimativa • Nesse algoritmo, a função sucessoresH devolve uma lista de estados sucessores e seus respectivos custos estimados (necessários para estabelecer a ordem dos estados na fila de prioridades ascendente), que são dados pela função h(s).
Exemplo • Vamos considerar o Problema das Rotas. • Como heurística, usaremos a distância em linha reta entre a cidade corrente e a cidade que se deseja atingir (obtido a partir de um mapa). • Vamos encontrar uma rota que leve da cidade a a cidade k e, para facilitar a exposição, vamos definir a função heurística da seguinte forma: h(a) = 15 h(b) = 7 h(c) = 6 h(d) = 14 h(e) = 15 h(f) = 7 h(g) = 8 h(h) = 5 h(i) = 5 h(j) = 3 h(k) = 0 h(l) = 4
Exemplo Problema das Rotas • Estado inicial: s0 = a • Estados meta: G = {[k]} • Observe que este não é o menor caminho mas a busca foi mais eficiente. S0 7 6 14 3 4 0
Problema das Rotas 7 Menor custo = 16 6 4 0 15 3 14 Custo = 24
Análise dos algoritmos • A busca pelo menor custo minimiza o custo do caminho percorrido até o estado corrente; • Para garantir a solução de custo mínimo, o algoritmo acaba tendo que examinar uma grande quantidade de estados no espaço de estados do problema, podendo ser muito ineficiente. • A busca pela melhor estimativa tenta minimizar o custo estimado do caminho a ser percorrido do estado corrente até um estado meta. • Este algoritmo reduz o espaço de busca consideravelmente; porém, não consegue garantir uma solução de custo mínimo.
Atividade 10 • Elabore uma função heurística para o problema do Labirinto e desenhe uma possível árvore busca (com 2 ou 3 níveis apenas) produzidas pelo algoritmo BuscaMelhorEstimativa. • s0 = L[1][1] • G = {L[13][14]}.
Busca A* • Felizmente, é possível combinar essas duas estratégias de busca num mesmo algoritmo, denominado A*. • O algoritmo minimiza o custo total do caminho percorrido, desde o estado inicial até um estado meta, usando uma função da forma f(s) = g(s) + h(s), onde g(s) é uma função de custo e h(s) e uma função heurística.
Busca A* • Nesse algoritmo, a função sucessoresF devolve uma lista de estados sucessores e seus respectivos custos g(s)+h(s) (necessários para estabelecer a ordem dos estados na fila de prioridades ascendente), que são dados pela função f(s).