Inteligência Artificial
Aula 04
Busca não-determinística
e Busca cega
Aula Anterior
Conhecimento em IA
Estratégia de busca
Como gerar? Como armazenar?
Como buscar soluções usando esse conhecimento?
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 3:
Aspirador com 2 pisos
Considere uma versão do Mundo do Aspirador
onde há um prédio com dois pisos;
Cada piso possui duas salas (1 e 2) e um
saguão (0).
Não há passagem direta de uma sala para
outra, de modo que o aspirador tem que estar
no saguão para entrar numa sala ou para
mudar de piso.
Atividade 3:
Aspirador com 2 pisos
Para representar os estados nessa versão do
problema, podemos usar uma estrutura da forma
[Pos; Piso1; Piso2], onde:
Pos = [Piso; Sala], podendo Piso assumir {1, 2} e
Sala {0, 1, 2}: indica a posição corrente do
aspirador.
Piso1 = [X; Y ], podendo X e Y assumir {0, 1}: indica
se as salas 1 e 2 do piso 1 estão limpas ou sujas.
Piso2 = [X; Y ], podendo X e Y assumir {0, 1}: indica
se as salas 1 e 2 do piso 2 estão limpas ou sujas.
Espaço de Estados do
Aspirador com 2 pisos
Conjunto de ações:
A = {oper(entrarSala1; [[P;0];[X1;Y1];[X2 ;Y2]]; [[P;1];[X1;Y1];[X2;Y2]]),
oper( entrarSala2; [[P; 0];[X1;Y1];[X2 ;Y2]]; [[P;2];[X1;Y1];[X2 ;Y2]]),
oper( sair; [[P ; 1] [X1; Y1] ;[X2 ;Y2]]; [[P ; 0] [X1; Y1] ;[X2 ;Y2]]),
oper( sair; [[P ; 2] [X1; Y1] ;[X2 ;Y2]]; [[P ; 0] [X1; Y1] ;[X2 ;Y2]]),
oper( subir; [[1 ; 0] [X1; Y1] ;[X2 ;Y2]]; [[2 ; 0] [X1; Y1] ;[X2 ;Y2]]),
oper( descer; [[2 ; 0] [X1; Y1] ;[X2 ;Y2]]; [[1 ; 0] [X1; Y1] ;[X2 ;Y2]]),
oper( aspirar; [[1 ; 1] [1; Y1] ;[X2 ;Y2]]; [[1 ; 1] [0; Y1] ;[X2 ;Y2]]),
oper( aspirar; [[1 ; 2] [X1; 1] ;[X2 ;Y2]]; [[1 ; 2] [X1; 0] ;[X2 ;Y2]]),
oper( aspirar; [[2 ; 1] [X1; Y1] ;[1 ; Y2]]; [[2 ; 1] [X1; Y1] ;[0 ; Y2]]),
oper( aspirar; [[2 ; 2] [X1; Y1] ;[X2 ; 1]]; [[2 ; 2] [X1; Y1] ;[X2 ; 0]])}
Espaço de Estados do
Aspirador com 2 pisos
Conjunto de Estados:
S = { [[1; 0]; [0; 0]; [0; 0]],
[[1; 0]; [0; 0]; [0; 1]],
[[1; 0]; [0; 0]; [1; 0]],
[[1; 0]; [0; 0]; [1; 1]],
[[1; 0]; [0; 1]; [0; 0]],
[[1; 0]; [0; 1]; [0; 1]],
[[1; 0]; [0; 1]; [1; 0]],
[[1; 0]; [0; 1]; [1; 1]],
[[1; 0]; [1; 0]; [0; 0]],
[[1; 0]; [1; 0]; [0; 1]],
[[1; 0]; [1; 0]; [1; 0]],
[[1; 0]; [1; 0]; [1; 1]],
[[1; 0]; [1; 1]; [0; 0]],
[[1; 0]; [1; 1]; [0; 1]],
[[1; 0]; [1; 1]; [1; 0]],
[[1; 0]; [1; 1]; [1; 1]],
...
Aspirador com 2 pisos
...
[[1; 1]; [0; 0]; [0; 0]],
[[1; 1]; [0; 0]; [1; 0]],
[[1; 1]; [0; 1]; [0; 0]],
[[1; 1]; [0; 1]; [1; 0]],
...
[[1; 2]; [0; 0]; [0; 0]],
...
[[2; 0]; [0; 0]; [0; 0]],
...
[[2; 1]; [0; 0]; [0; 0]],
...
[[2; 2]; [0; 0]; [0; 0]],
...
[[2; 2]; [1; 1]; [1; 0]],
}
[[1; 1]; [0; 0]; [0; 1]],
[[1; 1]; [0; 0]; [1; 1]],
[[1; 1]; [0; 1]; [0; 1]],
[[1; 1]; [0; 1]; [1; 1]],
[[1; 2]; [0; 0]; [0; 1]],
[[2; 0]; [0; 0]; [0; 1]],
[[2; 1]; [0; 0]; [0; 1]],
[[2; 2]; [0; 0]; [0; 1]]
Total: 96 estados
[[2; 2]; [1; 1]; [1; 1]],
Grafo do Espaço de Estados
...
[[2;0];[1;1];[1;1]]
descer
sair
subir
sair
[[1;0];[1;1];[1;1]]
[[1;1];[1;1];[1;1]]
entrarSala1
[[1;2];[1;1];[1;1]]
entrarSala2
aspirar
[[1;1];[0;1];[1;1]]
sair
entrarSala1
[[1;0];[0;1];[1;1]]
sair
subir
descer
[[1;2];[1;0];[1;1]]
Sair
entrarSala2
[[1;0];[1;0];[1;1]]
entrarSala2
[[1;2];[0;1];[1;1]]
[[2;0];[0;1];[1;1]] ...
...
aspirar
subir
entrarSala1
sair
descer
[[1;1];[1;0];[1;1]]
... [[2;0];[1;0];[1;1]]
...
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
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]
}
Busca no espaço de estados
Técnica que supõe a existência de um agente capaz de
realizar ações que modificam o estado do seu mundo.
Descrição do problema de busca:
Espaço de estados: Conjunto de estados (S) e ações (A) que
o agente é capaz de realizar;
Estado inicial: configuração atual do mundo do agente
(estado s0 pertencente a S);
Estado meta: que se deseja atingir (conjunto G contido em S);
Solução: conjunto de ações executadas pelo
agente que transforma o estado inicial num
estado meta.
Exemplo
Problema: Dado que inicialmente o aspirador esteja na
primeira sala e que ambas as salas estejam sujas,
encontre um estado onde ambas as salas estejam limpas.
Descrição do problema:
Espaço de estados (conjuntos S e A);
S = { [1; 0; 0]; [1; 0; 1]; [1; 1; 0]; [1; 1; 1];
[2; 0; 0]; [2; 0; 1]; [2; 1; 0]; [2; 1; 1]}
A = { oper(entrarSala1; [2; Y;Z]; [1; Y;Z]),
oper(entrarSala2; [1; Y;Z]; [2; Y;Z]),
oper(aspirar; [1; 1;Z]; [1; 0;Z]),
oper(aspirar; [2; Y; 1]; [2; Y; 0])}
Estado inicial: [1; 1; 1]
Estados meta: G = {[1; 0; 0]; [2; 0; 0]}
Solução para problema de busca
Consiste numa sequência de ações;
Rotulam o caminho que leva do estado inicial a um
dos estados meta no espaço de estados do
problema.
Exemplo: Mundo do aspirador
Caminho: [aspirar; entrarSala2; aspirar]
Leva do estado inicial [1; 1; 1] ao estado meta [2; 0; 0]
Uma possível solução
[1;1;1]
entrarSala2
entrarSala1
[2;1;1]
aspirar
aspirar
[1;0;1]
entrarSala2
[2;0;1]
entrarSala1
[2;0;1]
entrarSala1
entrarSala2
[1;1;0]
aspirar
aspirar
[2;0;0]
entrarSala1
entrarSala2
[1;0;0]
Encontre mais uma possível solução
Grafo do Espaço de Estados
[1;1;1]
entrarSala2
entrarSala1
[2;1;1]
aspirar
aspirar
[1;0;1]
entrarSala2
[2;0;1]
entrarSala1
[2;0;1]
[1;1;0]
aspirar
aspirar
[2;0;0]
entrarSala2
entrarSala1
entrarSala1
entrarSala2
[1;0;0]
Caminho: [entrarSala2; aspirar; entrarSala1; aspirar]
Leva do estado inicial [1; 1; 1] ao estado meta [1; 0; 0]
Reflexões
Será que preciso especificar todos os
estados de um problema para encontrar uma
solução?
Será que todos os algoritmos de busca
sempre dão a “melhor” resposta?
Tenho garantia que sempre vou percorrer o
menor caminho?
Algoritmo de Busca
Geralmente, os algoritmos de busca não
especificam explicitamente o conjunto de estados
de um problema.
Esses estados podem ser gerados a medida em que
forem sendo encontrados durante a busca.
Uma estratégia de busca pode ser realizada a
partir do estado inicial e gerando os estados
sucessores até chegar a um estado meta.
Algoritmo de Busca
não-determinístico
Dados um conjunto A de ações, um estado inicial s0
pertencente a S e um conjunto de estados meta G contido em
S, um algoritmo não-determinístico de busca pode ser
especificado da seguinte maneira:
O conjunto sigma armazena os
estados a serem explorados
• remove(Σ): escolhe estado em Σ aleatoriamente;
• sucessores (s, A): gera os estados sucessores
de s a partir de A;
• caminho(s): caminho entre estado inicial e
estado s;
Exemplo Mundo do aspirador
Estado inicial: s0 = [1; 1; 1]
Estados Meta: G = {[1; 0; 0]; [2; 0; 0]}
1ª iteração
Σ = {[1,1,1]}
s = remove(Σ) s = [1,1,1]
[1,1,1] não é estado meta, portanto, são gerados
seus sucessores e adicionados ao conjunto Σ;
Σ = {[2,1,1]; [1,0,1]}
Exemplo Mundo do aspirador
2ª iteração
Σ = {[2,1,1]; [1,0,1]}
s = remove(Σ) s = [2,1,1] (aleatório)
[2,1,1] não é estado meta, portanto, são gerados
seus sucessores e adicionados ao conjunto Σ;
Σ = {[1; 1; 1]; [2; 1; 0]; [1; 0; 1]}
Exemplo Mundo do aspirador
3ª iteração
Σ = {[1; 1; 1]; [2; 1; 0]; [1; 0; 1]}
s = remove(Σ) s = [2,1,0] (aleatório)
[2,1,0] não é estado meta, portanto, são gerados
seus sucessores e adicionados ao conjunto Σ;
Σ = {[1; 1; 0]; [1; 1; 1]; [1; 0; 1]}
Exemplo Mundo do aspirador
4ª iteração
Σ = {[1; 1; 0]; [1; 1; 1]; [1; 0; 1]}
s = remove(Σ) s = [1,1,0] (aleatório)
[1,1,0] não é estado meta, portanto, são gerados
seus sucessores e adicionados ao conjunto Σ;
Σ = {[1; 0; 0]; [1; 1; 1]; [1; 0; 1]}
Exemplo Mundo do aspirador
5ª iteração
Σ = {[1; 0; 0]; [1; 1; 1]; [1; 0; 1]}
s=remove(Σ) s = [1,0,0] (aleatório)
[1,0,0] é estado meta
devolve o caminho:
[entrarSala2, aspirar,
entrarSala1, aspirar]
Atividades
Exercício 5. Mostre que, fazendo outras escolhas, o
algoritmo de busca não-determinística poderia ter
encontrado uma solução mais curta (i.e. com menos
ações) para o mesmo problema.
Atividades
Exercício 6. Mostre que, fazendo outras escolhas, o
algoritmo de busca não-determinística poderia ficar
executando infinitamente, sem nunca encontrar
uma solução para este problema.
Detectando ciclos
Um problema com o algoritmo de busca nãodeterminística é que, caso o espaço de
estados do problema contenha ciclos, ele
pode executar infinitamente.
Para evitar que isso aconteça, podemos
guardar os estados já expandidos e
impedir que esses estados sejam
expandidos novamente durante a busca.
Busca sem ciclos
O conjunto gama armazena os
estados já visitados
Atividade 7 – Para Casa
Desenhe uma das árvores de buscas que
poderiam ser produzidas pelo rastreamento da
chamada Busca´(A; s0; G) – busca sem ciclos,
sendo:
A = conjunto de ações para o Mundo do Aspirador;
s0 = [1; 1; 1];
G = {[2; 0; 0]}.
Mais estratégias de Busca
Estratégias de busca cega bastante utilizadas:
Busca em largura (breadth first search)
Busca em profundidade (depth first search)
As estratégias de busca cega ou busca nãoinformada não levam em conta a qualidade da
solução encontrada.
Estratégias de busca heurística tentam minimizar o
custo da solução, seja em termos do número de
ações ou em termos dos custos dessas ações.
Busca em largura
Na busca em largura, o estado inicial (nível 0) é
expandido primeiro:
Em seguida, cada um dos estados do nível 1 são
expandidos:
seus sucessores são posicionados no nível 1 da árvore
de busca;
seus sucessores são posicionados no nível 2, e assim
por diante
De maneira que todos os estados num nível n
sejam expandidos antes daqueles no nível n + 1.
Busca em largura
O algoritmo de busca em largura é obtido
simplesmente sistematizando a ordem de inserção e
remoção de estados no conjunto Σ, que agora passa
a se comportar como uma fila (FIFO).
Busca em largura
O algoritmo BuscaLargura sempre encontra uma
solução com o menor número de ações, mas pode levar
mais tempo expandindo os estados do que a busca em
profundidade.
Busca em profundidade
Expandimos sempre o estado mais a esquerda, no
nível mais profundo da árvore de busca até que:
uma solução seja encontrada;
ou um beco seja atingido (estado sem expansão);
Nesse último caso, retrocedemos e reiniciamos a
busca no próximo estado ainda não expandido,
posicionado mais a esquerda, no nível mais
profundo da árvore (backtracking).
Busca em profundidade
O algoritmo é obtido pela sistematização da ordem
de inserção e remoção de estados no conjunto Σ.
Entretanto, em vez de fila usamos pilha (LIFO).
Exemplo: Mundo do aspirador
A = conjunto de ações para o Mundo do Aspirador;
s0 = [1; 1; 1]
G = {[2; 0; 1]}
Observe que o estado
[2,0,0] é um beco;
A busca retrocede e
toma outro caminho;
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.
Seminários e Grupos
1.
Planejamento
2.
Visão Computacional
3.
Aprendizagem e Redes Neurais
4.
Data mining e Sistemas de recomendação
5.
Proc. Ling. Natural e Text Mining
6.
Chatter Bot
7.
Jogo 1 – Sudoku
8.
Jogo 2 – Jogo da onça
9.
Jogo 3 – Pet Squares
Apresentação dos Trabalhos
Média: 60 a 90 min
Entregar:
Apresentação (slides)
Trabalho teórico: Texto incluindo referências
bibliográficas (.doc ou pdf).
Trabalho prático: código fonte dos programas
Calendário de aulas (previsão)
02/Mar – Algoritmos de Busca
09/Mar – Algoritmos de Busca
16/Mar – Não haverá aula
23/Mar – Sem. 1 – Planejamento
30/Mar – Sem. 2 – Visão Computacional
06/Abr – Semana Santa
13/Abr – Não haverá aula
20/Abr – Sem. 3 – Aprendizagem e Redes Neurais
Calendário de aulas (previsão)
27/Abr – Sem. 4 - Data Mining e Sist. Recomendação
04/Mai - Sem. 5 – Proc. Ling. Natural e Text Mining
11/Mai – Sem. 6 – Chatter Bot
18/Mai – Não haverá aula (evento externo)
25/Mai – Sem. 7 – Sudoku
01/Jun – Sem. 8 e 9 – Jogo da Onça e Pet Squares
08/Jun – Corpus Christi
15/Jun – Não haverá aula (evento externo)
22/Jun - Entrega de Notas