Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
ESTADOS E BUSCAS
¡ Muitas vezes não recebemos um algoritmo para resolver um
problema, mas apenas uma especificação do que é uma
solução ─ então temos de procurar por uma solução.
¡ Um problema típico ocorre quando o agente está em um
estado inicial, tendo um conjunto de ações determinísticas
que ele pode realizar e quer chegar a um estado objetivo.
¡ Muitos problemas de IA podem ser abstraídos para o
problema de encontrar um caminho em um grafo dirigido.
¡ Muitas vezes há mais de uma maneira de representar um
problema como grafo.
RESOLUÇÃO DE PROBLEMAS POR BUSCA
¡ Formulação
§ do OBJETIVO
§ do PROBLEMA
§ Decidir quais ações e estados considerar.
¡ Busca
§ Dada várias sequências de ações, qual é a melhor?
¡ Execução
Formulação à Busca àExecução
TAREFAS PARA A RESOLUÇÃO DE
PROBLEMAS POR BUSCA
def
agente_resolvedor_problemas_simples(percepção):
entrada:
percepção
#
uma
percepção
local:
sequencia
#
uma
sequência
de
ações,
inicialmente
vazia
estado
#
uma
descrição
do
estado
atual
do
mundo
objetivo
#
um
objetivo,
inicialmente
nulo
problema
#
uma
formulação
de
problema
estado
ß
ATUALIZAR_ESTADO(estado,
percepção)
se
sequencia
está
vazia:
objetivo
ß
FORMULAR_OBJETIVO(estado)
problema
ß
FORMULAR_PROBLEMA(estado,
objetivo)
sequencia
ß
BUSCA(problema)
ação
ß
PRIMEIRO(sequencia)
sequencia
ß
RESTO(sequencia)
retornar
ação
ESTRUTURA BÁSICA DE UM AGENTE
RESOLVEDOR DE PROBLEMAS POR BUSCA
¡ Um estado contém toda a informação necessária para
predizer os efeitos de uma ação e determinar se ele é um
estado objetivo.
¡ O nível de abstração, ou detalhe, que modelamos o mundo
interfere na resolução do problema.
§ Um nível muito fino e perderemos a visão do problemas global.
§ Um nível muito grosso e perderemos detalhes críticos para resolver o
problema.
¡ O número de estados depende da representação e do nível de
abstração escolhidos.
ESPAÇO DE ESTADOS
¡ O estado inicial e uma função de ação definem
implicitamente o espaço de estados, o qual é o conjunto de
todos os estados acessíveis a partir do estado inicial.
¡ O espaço de estados forma um grafo (nem sempre explícito)
em que os nós são estados e os arcos são as ações
¡ Um caminho no espaço de estados é uma sequência de
estados conectados por uma sequência de ações.
ESPAÇO DE ESTADOS
¡ Consistem de:
§ Um conjunto de estados;
§ Um conjunto distinto de estado chamado de estados iniciais;
§ Um conjunto de ações disponíveis para o agente em cada estado;
§ Uma função de ação que dado um estado e uma ação retorna um
novo estado;
§ Um conjunto de estados objetivos, sempre especificado por uma
função boolena, objetivo(s), que é verdadeira quando s é um estado
objetivo;
§ Um critério que especifica a qualidade de uma solução aceitável.
PROBLEMAS NO ESPAÇO DE ESTADOS
¡ Problemas com um único estado:
§ São problemas em que é possível calcular exatamente que estados
estaremos após uma sequência de ações.
¡ Problemas com múltiplos estados:
§ São problemas em que sabemos os efeitos das ações, mas temos acesso
limitado ao estado no qual se encontra o ambiente.
¡ Problemas de contingência:
§ Sã problemas em que as ações realizadas pelo agente podem resultar
em efeitos não esperados (não determinístico). Não há como fazer uma
árvore de busca que garanta o resultado.
¡ Problemas de exploração:
§ São problemas em que o agente não tem informações sobre o efeitos de
suas ações. Ele sabe somente sobre o que foi aprendido anteriormente
pela exploração do problema.
TIPO DE PROBLEMAS
¡ Problemas de estado único:
§ O agente sabe em que estado está.
§ O agente sabe o que cada uma das suas ações fazem.
§ O agente poderá calcular exatamente o que fazer.
¡ Problemas de múltiplos estados:
§ O agente sabe o que cada uma das suas ações fazem.
¡ Problemas de contingência:
§ O agente deve usar os sensores enquanto age.
§ A solução é uma árvore de ações ou uma política.
§ Às vezes pode ser viável o entrelaçamento (agir antes de buscar).
¡ Problemas de exploração:
§ O espaço de estados é desconhecido.
CARACTERÍSTICAS DOS TIPO DE
PROBLEMAS
Estado inicial possível Estado final
EXEMPLO: MUNDO DO ASPIRADOR
• Estado é representado por um par:
<local do robô; sujidade do local>
• Número de estados = 2.22 à k. 2k onde k é o número de
locais.
¡ Estado único:
§ Início no estado 5.
¡ Múltiplos estados:
§ Início em
§ {1, 2, 3, 4, 5, 6, 7, 8)
§ Ação à Direita
§ {2, 4, 6, 8}
¡ Contingência:
§ Ação à Aspirar
§ Pode sujar um carpete limpo.
§ Sensoriamento
§ Local
§ Sujo ou não
EXEMPLO DE TIPOS DE PROBLEMAS:
MUNDO DO ASPIRADOR
ESPAÇO DE ESTADOS EM PROBLEMAS DE
ESTADO ÚNICO
ESPAÇO DE ESTADO EM PROBLEMAS DE
MÚLTIPLOS ESTADOS
¡ Estados: matriz 3x3 com a especificação da posição de cada símbolo de
1-8 e o espaço em branco.
¡ Estado Inicial : qualquer um dos estados acima especificados.
¡ Função de ação: gera os estados válidos resultantes das quatro ações de
mover o espaço vazio para direita , esquerda , cima , baixo .
¡ Teste de objetivo: verifica se o estado corresponde ao estado objetivo.
EXEMPLO: 8- PUZZLE
Número de estados = 9! = 362.880
8- PUZZLE – ESPAÇO DE ESTADOS
¡ Estados: qualquer arranjo de
0 a 8 rainhas no tabuleiro.
¡ Estado inicial: nenhuma
rainha no tabuleiro.
¡ Função de ação: colocar uma
rainha em uma casa.
¡ Teste de Objetivo: 8 rainhas
estão no tabuleiro e
nenhuma está sendo
atacada.
¡ 3x1014 possíveis sequências
a serem investigadas.
EXEMPLO: 8 RAINHAS
¡ Estados: 0 a 8 rainhas no
tabuleiro, uma por coluna nas
n colunas mais a esquerda e
sem ataques.
¡ Estado inicial: nenhuma
rainha no tabuleiro.
¡ Função de ação: colocar uma
rainha em uma casa cuja
coluna seja a primeira à
esquerda que não esteja
ameaçada por outra rainha.
¡ 2057 possíveis sequências a
serem investigadas.
A formulação do problema é
FUNDAMENTAL!!!
EXEMPLO: 8 RAINHAS – OUTRA
FORMULAÇÃO
¡ A busca no espaço de estados assume que:
§ O agente tem um conhecimento perfeito do espaço de estados
e pode observar em que estado ele está.
§ O agente tem um conjunto de ações que tem efeitos
determinísticos conhecidos.
§ Alguns estados são estados objetivo e o agente quer atingir um
destes estados, podendo reconhecer um estado objetivo.
§ Uma solução é uma sequencia de ações que levam o agente do
seu estado atual para um estado objetivo.
BUSCA NO ESPAÇO DE ESTADOS
¡ Existem muitas formas de representar um problema como um
grafo, mas duas formas merecem atenção:
¡ Grafo do Espaço de Estados: no qual um nó representa um
estado do mundo e um arco representa uma mudança de um
estado para outro no mundo.
§ Ex.: problema das 8 rainhas – mudar uma rainha de linha gera um
novo estado.
¡ Grafo do Espaço de Problemas: no qual um nó representa um
problema a ser resolvido e um arco representa decomposições
alternativas do problemas.
§ Ex.: problema das 8 rainhas – colocar uma rainha na n-ésima coluna,
sem gerar conflito com as
outras que já estão no tabuleiro, gera um
novo estado.
BUSCANDO EM GRAFOS
¡ Um grafo consiste em um conjunto N de nós e um conjunto
A de pares ordenados de nós <nx, ny> , chamados arcos.
¡ O nó n2 é um vizinho de n1 se houver um arco de n1 para
n2. Ou seja, se ‹n1, n2› ∈ A.
¡ Um caminho é uma sequência de nós ‹n0, n1, ..., nK› que tal
que ‹ni-1, ni› ∈ A.
¡ Tendo em conta um conjunto de nós de início e de nós
objetivo, uma solução é um caminho de um nó de início para
um nó objetivo.
¡ Muitas vezes há um custo associado com os arcos e o custo
de um caminho é a soma dos custos dos arcos no caminho.
GRAFOS DIRIGIDOS
• O robô quer ir de fora do quarto 103 para dentro do quarto
123.
EXEMPLO: O ROBÔ DE ENTREGA
EXEMPLO: GRAFO PARA O ROBÔ DE
ENTREGA
¡ Um estado é uma representação de uma configuração física.
¡ Um nó é uma estrutura de dados.
¡ Estados não têm pais, filhos, profundidade ou custo.
ESTADOS X NÓS
¡ Algoritmo genérico de busca:
§ Dado um grafo, nós iniciais e nós objetivos, explorar
incrementalmente caminhos a partir dos nós de início até um nó
objetivo.
§ Manter uma fronteira de caminhos, a partir do nó de início, que já
tenham sido explorados.
§ Com o andamento da busca, a fronteira se expande para os nós
inexplorados até que seja encontrado um nó objetivo.
¡ A maneira na qual a fronteira é expandida define a
estratégia de busca.
BUSCANDO EM GRAFOS
RESOLVENDO PROBLEMAS PELA BUSCA
EM GRAFOS
¡ A função de exploração (ou função de ação) cria novos nós
usando os operadores do problema para criar os estados
correspondentes.
¡ A definição de busca é simétrica: é possível encontrar o
caminho dos nós iniciais para a um nó objetivo ou de um nó
objetivo para algum nó inicial.
¡ Direção da expansão:
§ Do estado inicial para um estado final (busca dirigida por dados ou
encadeamento para frente).
§ De um estado final para o estado inicial (busca baseada em objetivo
ou encadeamento para trás).
§ Busca bidirecional (é realizada nas duas direções ao mesmo tempo).
DIREÇÃO DA BUSCA
ENCADEAMENTO PARA FRENTE
ENCADEAMENTO PARA TRÁS
• Você pode buscar para trás a partir do objetivo e
simultaneamente para frente a partir do início.
• Quando os dois lados da busca gerarem um estado igual uma
solução foi encontrada.
• É possível uti l izar estratégias diferentes para cada direção da
busca
BUSCA BIDIRECIONAL
def
busca(G,
S,
goal):
entrada:
G
#
a
grafo
S
#
um
conjunto
de
nós
iniciais
objetivo
#
função
booleana
que
testa
se
S
é
um
nó
objetivo
saída:
um
caminho
de
um
membro
de
S
para
um
nó
para
o
qual
a
função
objetivo
é
verdadeira,
ou
⟘
se
não
existir
solução
local:
fronteira
#
um
conjunto
de
caminhos
fronteira
ß
{<s>|s
∈
S}
while
fronteira
≠{ }:
seleciona
e
remove
<s0,…,sk>
da
fronteira
if
objetivo(sk):
return
<s0,…,sk>
fronteira
ß
fronteira
∪ {⟨s0,… ,sk,s⟩|⟨𝑠𝑘 , 𝑠⟩ ∈S}
return
⟘
ALGORITMO GERAL DE BUSCA EM GRAFO
¡ Completude (completeza):
§ A estratégia é completa se, sempre que existir uma solução, ela a
encontra em uma quantidade de tempo finito.
¡ Qualidade/otimicidade:
§ A estratégia é ótima se, quando ela acha uma solução, esta é a
melhor solução.
¡ Custo do tempo:
§ Quanto tempo a estratégia gasta para encontrar a solução no pior
caso. Normalmente medida em termos do número máximo de nós
expandidos.
¡ Custo de memória:
§ Quanta memória a estratégia usa para encontrar a solução, no pior
caso. Normalmente medida pelo tamanho máximo que a lista de nós
abertos (fronteira) assume durante a busca.
CRITÉRIOS DE AVALIAÇÃO DAS
ESTRATÉGIAS DE BUSCA
¡ O fator de ramificação de um nó é o seu número de vizinhos.
§ Fator de ramificação para frente: número de arcos saindo de um
nó.
§ Fator de ramificação para trás: número de arcos entrando um nó.
¡ As complexidades de tempo e espaço são medidas em termos
dos seguintes fatores:
§ b : Fator de ramificação máximo da árvore de busca.
§ d : Profundidade da solução de menor custo.
§ m : Profundidade máxima do espaço de estados (pode ser ∞).
CRITÉRIOS DE AVALIAÇÃO DAS
ESTRATÉGIAS DE BUSCA
¡ Busca desinformada:
§ Busca em profundidade.
§ Busca em largura.
§ Busca pelo custo mínimo (Busca Gulosa).
§ Busca por aprofundamento iterativo.
BUSCA SISTEMÁTICA
¡ Trata a fronteira como uma pilha.
§ i.e. sempre seleciona um dos últimos elementos adicionados à
fronteira.
¡ Se a lista de caminhos na fronteira é [p1, p2, ... ]
§ p1 é selecionado e os caminhos que estendem p1 são adicionados
à frente da pilha (em frente a p2).
§ p2 é selecionado somente quando todos os caminhos de p1 foram
explorados.
BUSCA EM PROFUNDIDADE
¡ Considere o seguinte problema:
§ Estado inicial: A
§ Função de ação:
§ O estado A gera os estados B e C
§ O estado B gera os estados D e E
§ O estado C gera os estados F e G
§ O estado D gera os estados H e I
§ O estado E gera os estados J e K
§ O estado F gera os estados L e M
§ O estado G gera os estados N e O
§ Os estados H, I, J, K, L, M, N e O não geram sucessores
§ Estado objetivo: M
§ Custo do caminho: zero
¡ Representação de cada nó da fronteira:
§ no(último estado, [caminho], custo)
¡ Fronteira inicial: [no(A, [A], 0)]
BUSCA EM PROFUNDIDADE - EXEMPLO
¡ Função de ação:
§ O estado A gera os estados B e C
§ O estado B gera os estados D e E
§ O estado C gera os estados F e G
§ O estado D gera os estados H e I
§ O estado E gera os estados J e K
§ O estado F gera os estados L e M
§ O estado G gera os estados N e O
§ Os estados H, I, J, K, L, M, N e O não geram sucessores
• O estado A não é o objetivo.
• Fronteira após expandir o estado A:
• [no(B, [A, B], 0), no(C, [A, C], 0)]
EXEMPLO – ONDE M É O NÓ OBJETIVO
¡ Função de ação:
§ O estado A gera os estados B e C
§ O estado B gera os estados D e E
§ O estado C gera os estados F e G
§ O estado D gera os estados H e I
§ O estado E gera os estados J e K
§ O estado F gera os estados L e M
§ O estado G gera os estados N e O
§ Os estados H, I, J, K, L, M, N e O não geram sucessores
• O estado B não é o objetivo.
• Fronteira após expandir o estado B:
• [no(D, [A, B, D], 0), no(E, [A, B, E], 0), no(C, [A, C], 0)]
EXEMPLO – ONDE M É O NÓ OBJETIVO
¡ Função de ação:
§ O estado A gera os estados B e C
§ O estado B gera os estados D e E
§ O estado C gera os estados F e G
§ O estado D gera os estados H e I
§ O estado E gera os estados J e K
§ O estado F gera os estados L e M
§ O estado G gera os estados N e O
§ Os estados H, I, J, K, L, M, N e O não geram sucessores
• O estado D não é o objetivo.
• Fronteira após expandir o estado D:
• [no(H, [A, B, D, H], 0), no(I, [A, B, D, I], 0), no(E, [A, B, E], 0), no(C, [A,
C], 0)]
EXEMPLO – ONDE M É O NÓ OBJETIVO
¡ Função de ação:
§ O estado A gera os estados B e C
§ O estado B gera os estados D e E
§ O estado C gera os estados F e G
§ O estado D gera os estados H e I
§ O estado E gera os estados J e K
§
O estado F gera os estados L e M
§ O estado G gera os estados N e O
§ Os estados H, I, J, K, L, M, N e O não geram sucessores
• O estado H não é o objetivo.
• Fronteira após expandir o estado H (sem filhos):
• [no(I, [A, B, D, I], 0), no(E, [A, B, E], 0), no(C, [A, C], 0)]
EXEMPLO – ONDE M É O NÓ OBJETIVO
¡ Função de ação:
§ O estado A gera os estados B e C
§ O estado B gera os estados D e E
§ O estado C gera os estados F e G
§ O estado D gera os estados H e I
§ O estado E gera os estados J e K
§ O estado F gera os estados L e M
§ O estado G gera os estados N e O
§ Os estados H, I, J, K, L, M, N e O não geram sucessores
• O estado I não é o objetivo.
• Fronteira após expandir o estado I (sem filhos):
• [no(E, [A, B, E], 0), no(C, [A, C], 0)]
EXEMPLO – ONDE M É O NÓ OBJETIVO
¡ Função de ação:
§ O estado A gera os estados B e C
§ O estado B gera os estados D e E
§ O estado C gera os estados F e G
§ O estado D gera os estados H e I
§ O estado E gera os estados J e K
§ O estado F gera os estados L e M
§ O estado G gera os estados N e O
§ Os estados H, I, J, K, L, M, N e O não geram sucessores
• O estado E não é o objetivo.
• Fronteira após expandir o estado E:
• [no(J, [A, B, E, J], 0), no(K, [A, B, E, K], 0), no(C, [A, C], 0)]
EXEMPLO – ONDE M É O NÓ OBJETIVO
¡ Função de ação:
§ O estado A gera os estados B e C
§ O estado B gera os estados D e E
§ O estado C gera os estados F e G
§ O estado D gera os estados H e I
§ O estado E gera os estados J e K
§ O estado F gera os estados L e M
§ O estado G gera os estados N e O
§ Os estados H, I, J, K, L, M, N e O não geram sucessores
• O estado J não é o objetivo.
• Fronteira após expandir o estado J (sem filhos):
• [no(K, [A, B, E, K], 0), no(C, [A, C], 0)]
EXEMPLO – ONDE M É O NÓ OBJETIVO
¡ Função de ação:
§ O estado A gera os estados B e C
§ O estado B gera os estados D e E
§ O estado C gera os estados F e G
§ O estado D gera os estados H e I
§ O estado E gera os estados J e K
§ O estado F gera os estados L e M
§ O estado G gera os estados N e O
§ Os estados H, I, J, K, L, M, N e O não geram sucessores
• O estado K não é o objetivo.
• Fronteira após expandir o estado K (sem filhos):
• [no(C, [A, C], 0)]
EXEMPLO – ONDE M É O NÓ OBJETIVO
¡ Função de ação:
§ O estado A gera os estados B e C
§ O estado B gera os estados D e E
§ O estado C gera os estados F e G
§ O estado D gera os estados H e I
§ O estado E gera os estados J e K
§ O estado F gera os estados L e M
§ O estado G gera os estados N e O
§ Os estados H, I, J, K, L, M, N e O não geram sucessores
• O estado C não é o objetivo.
• Fronteira após expandir o estado C:
• [no(F, [A, C, F], 0), no(G, [A, C, G], 0)]
EXEMPLO – ONDE M É O NÓ OBJETIVO
¡ Função de ação:
§ O estado A gera os estados B e C
§ O estado B gera os estados D e E
§ O estado C gera os estados F e G
§ O estado D gera os estados H e I
§ O estado E gera os estados J e K
§ O estado F gera os estados L e M
§ O estado G gera os estados N e O
§ Os estados H, I, J, K, L, M, N e O não geram sucessores
• O estado F não é o objetivo.
• Fronteira após expandir o estado F:
• [no(L, [A, C, F, L], 0), no(M, [A, C, F, M], 0), no(G, [A, C, G], 0)]
EXEMPLO – ONDE M É O NÓ OBJETIVO
¡ Função de ação:
§ O estado A gera os estados B e C
§ O estado B gera os estados D e E
§ O estado C gera os estados F e G
§ O estado D gera os estados H e I
§ O estado E gera os estados J e K
§ O estado F gera os estados L e M
§ O estado G gera os estados N e O
§ Os estados H, I, J, K, L, M, N e O não geram sucessores
• O estado L não é o objetivo.
• Fronteira após expandir o estado L:
• [no(M, [A, C, F, M], 0), no(G, [A, C, G], 0)]
EXEMPLO – ONDE M É O NÓ OBJETIVO
¡ Função de ação:
§ O estado A gera os estados B e C
§ O estado B gera os estados D e E
§ O estado C gera os estados F e G
§ O estado D gera os estados H e I
§ O estado E gera os estados J e K
§ O estado F gera os estados L e M
§ O estado G gera os estados N e O
§ Os estados H, I, J, K, L, M, N e O não geram sucessores
• O estado M é o objetivo.
• A busca para tendo como solução o caminho: [A, C, F, M]
EXEMPLO – ONDE M É O NÓ OBJETIVO
• O algoritmo de busca gera como resultado implícito uma
árvore de busca:
ÁRVORE DE BUSCA DA BUSCA EM
PROFUNDIDADE
def
busca_em_profundidade(G,
S,
goal):
entrada:
G
#
a
grafo
S
#
um
conjunto
de
nós
iniciais
objetivo
#
função
booleana
que
testa
se
S
é
um
nó
objetivo
saída:
um
caminho
de
um
membro
de
S
para
um
nó
para
o
qual
a
função
objetivo
é
verdadeira,
ou
⟘
se
não
existir
solução
local:
fronteira
#
um
conjunto
de
caminhos
fronteira
ß
{<s>|s
∈
S}
while
fronteira
≠{ }:
selecione
e
remova
o
1o
nó
<s0,…,sk>
da
fronteira
if
objetivo(sk):
return
<s0,…,sk>
adicione({<s0,…,sk,s>}|<sk,s>
∈
S},
fronteira,
início)
return
⟘
ALGORITMO PARA BUSCA EM
PROFUNDIDADE
¡ A busca em profundidade não tem garantia de terminar em
grafos infinitos ou em grafos com ciclos.
¡ A complexidade do espaço é linear no tamanho do caminho
a ser explorado O(mb), onde b é o fator de ramificação e m
é o tamanho do caminho.
¡ A complexidade do tempo é exponencial no tamanho do
caminho a ser explorado O(bm), onde b é o fator de
ramificação e m é o tamanho do caminho.
¡ A busca não é restringida pelo objetivo até que aconteça
dela tropeçar no objetivo.
COMPLEXIDADE DA BUSCA EM
PROFUNDIDADE
¡ Apropriada:
§ O espaço de estados é restrito (representação complexa de
estados, e.g. robótica)
§ Existe muitas soluções, talvez com caminhos longos,
particularmente para o caso em que todos os caminhos levam
a uma solução.
¡ Inapropriada:
§ Quando se tem ciclos no espaço de estados.
§ Quando existem soluções rasas.
§ Se a otimalidade é importante.
QUANDO A BUSCA EM PROFUNDIDADE É
APROPRIADA
¡ Trata a fronteira como uma fila.
¡ Sempre seleciona um dos primeiros elementos adicionados
à fronteira.
¡ Se a lista de caminhos na fronteira [p1, p2, ... , pr]:
§ p1 é selecionada e seus vizinhos são adicionados ao final da fila,
após pr.
§ p2 é selecionado em seguida.
BUSCA EM LARGURA
GRÁFICO ILUSTRATIVO ─ BUSCA EM
LARGURA
def
busca_em_largura(G,
S,
goal):
entrada:
G
#
a
grafo
S
#
um
conjunto
de
nós
iniciais
objetivo
#
função
booleana
que
testa
se
S
é
um
nó
objetivo
saída:
um
caminho
de
um
membro
de
S
para
um
nó
para
o
qual
a
função
objetivo
é
verdadeira,
ou
se
não
existir
solução
local:
fronteira
#
um
conjunto
de
caminhos
fronteira
ß
{<s>|s
∈
S}
while
fronteira
:
selecione
e
remova
o
1o
nó
<s0,…,sk>
da
fronteira
if
objetivo(sk):
return
<s0,…,sk>
adicione({<s0,…,sk,s>}|<sk,s>
∈
S},
fronteira,
fim)
return
⟘
ALGORITMO PARA BUSCA EM LARGURA
¡ Se o fator de ramificação para todos os nós é finito, a busca
em largura é completa. Também é garantido que ela
encontrará o caminho com o menor número de arcos.
¡ A complexidade do espaço é exponencial no comprimento
do caminho O(bn), onde b é fator de ramificação, n é o
comprimento do caminho.
¡ A complexidade de tempo é exponencial no comprimento do
caminho: O(bn), onde b é fator de ramificação, n é o
comprimento do caminho.
¡ A busca não é restringida pelo objetivo.
COMPLEXIDADE DA BUSCA EM LARGURA
¡ Apropriada:
§ Quando espaço de memória não é problema.
§ Quando é necessário achar a solução com menos arcos.
§ Apesar de nem todas as soluções serem rasas, algumas são.
¡ Inapropriada:
§ Quando o espaço de memória é limitado.
§ Quando todas as soluções estão fundas na árvore de busca.
§ Quando o fator de ramificação é muito grande.
QUANDO A BUSCA EM LARGURA É
APROPRIADA
BUSCA DESINFORMADA COM CUSTOS
¡ Às vezes há custos associados com os arcos. O custo de um
caminho é a soma dos custos de seus arcos. 𝑐𝑜𝑠𝑡(⟨𝑛0, …, 𝑛𝑘⟩)=∑𝑖=1↑𝑘▒|𝑛𝑖−1,𝑛𝑖|
¡ Em cada fase, a busca pelo menor-custo-primeiro seleciona um
caminho na fronteira com o menor custo.
¡ A fronteira é uma f ila de prioridade ordenada pelo custo do
caminho.
¡ Encontra um caminho de menor custo para um nó de objetivo.
¡ Quando os custos do arco são iguais temos uma busca em
largura.
BUSCA PELO MENOR-CUSTO-PRIMEIRO
¡ Considere o seguinte problema:
§ Estado inicial: S
§ Função de ação:
§ O estado S gera os estados A(custo=1), B(custo=5) e C(custo=15)
§ O estado A gera o estado G(custo=10)
§ O estado B gera o estado G(custo=5)
§ O estado C gera o estado G(custo=5)
§ O estado G não gera sucessores
§ Estado objetivo: G
¡ Representação de cada nó da fronteira:
§ no(último estado, [caminho], custo)
¡ Fronteira inicial: [no(S, [S], 0)]
59
BUSCA PELO MENOR CUSTO PRIMEIRO -
EXEMPLO
¡ Considere o seguinte problema:
§ Estado inicial: S
§ Função de ação:
§ O estado S gera os estados A(custo=1), B(custo=5) e C(custo=15)
§ O estado A gera o estado G(custo=10)
§ O estado B gera o estado G(custo=5)
§ O estado C gera o estado G(custo=5)
§ O estado G não gera sucessores
¡ O estado S não é o objetivo.
¡ Fronteira após expandir o estado S:
§ [no(A, [S, A], 1), no(B, [S, B], 5), no(C, [S, C], 15)]
60
EXEMPLO – ONDE G É O OBJETIVO
¡ Considere o seguinte problema:
§ Estado inicial: S
§ Função de ação:
§ O estado S gera os estados A(custo=1), B(custo=5) e C(custo=15)
§ O estado A gera o estado G(custo=10)
§ O estado B gera o estado G(custo=5)
§ O estado C gera o estado G(custo=5)
§ O estado G não gera sucessores
¡ O estado A não é o objetivo.
¡ Fronteira após expandir o estado A:
§ [no(B, [S, B], 5), no(A, [S, A , G], 11), [no(C, [S, C], 15)]
61
EXEMPLO – ONDE G É O OBJETIVO
¡ Considere o seguinte problema:
§ Estado inicial: S
§ Função sucessor:
§ O estado S gera os estados A(custo=1), B(custo=5) e C(custo=15)
§ O estado A gera o estado G(custo=10)
§ O estado B gera o estado G(custo=5)
§ O estado C gera o estado G(custo=5)
§ O estado G não gera sucessores
¡ O estado B não é o objetivo.
¡ Fronteira após expandir o estado B:
§ [no(G, [S, B, G], 10), no(A, [S, A , G], 11), [no(C, [S, C], 15)]
¡ O estado G é o objetivo.
¡ A busca para tendo como resultado o caminho: [S, B, G] com custo =
10
62
BUSCA PELO MENOR-CUSTO-PRIMEIRO -
EXEMPLO
63
BUSCA PELO MENOR-CUSTO-PRIMEIRO
def
busca_pelo_menor_custo(G,
S,
goal):
entrada:
G
#
a
grafo
S
#
um
conjunto
de
nós
iniciais
objetivo
#
função
booleana
que
testa
se
S
é
um
nó
objetivo
saída:
um
caminho
de
um
membro
de
S
para
um
nó
para
o
qual
a
função
objetivo
é
verdadeira,
ou
se
não
existir
solução
local:
fronteira
#
um
conjunto
de
caminhos
fronteira
ß
{<s>|s
∈
S}
while
fronteira
:
selecione
e
remova
o
1o
nó
<s0,…,sk>
da
fronteira
if
objetivo(sk):
return
<s0,…,sk>
adicione({<s0,…,sk,s>}|<sk,s>
∈
S},
fronteira,
ordem
crescente
de
custo)
return
⟘
ALGORITMO PARA BUSCA PELO MENOR-
CUSTO-PRIMEIRO
¡ Completude:
§ Não, pois um ciclo com custo zero ou negativo poderia ser seguido
para sempre.
§ Sim, dado que os custos dos arcos sejam sempre positivos.
¡ Otimalidade:
§ Não, pois podem existir arcos com custo negativos.
§ Sim, sempre que os arcos tiverem custos não negativos.
¡ A complexidade de tempo é exponencial O(bm).
¡ A complexidade de espaço é exponencial O(bm), pois se tem
que armazenar toda a fronteira na memória.
ANALISE DA BUSCA PELO MENOR-CUSTO-
PRIMEIRO
¡ Até agora todas as estratégias de pesquisa que são
garantidas de parar usam espaço exponencial.
¡ Ideia:
§ Vamos recalcular os elementos de fronteira em vez de salvá-los.
§ Assim, vamos procurar caminhos da profundidade 0 e, em seguida,
1, 2, 3, etc.
§ Se um caminho não pode ser encontrado na profundidade B,
procure por um caminho na profundidade B + 1. Aumente o limite
de profundidade quando a busca falhar de forma não natural (i.e. o
limite de profundidade for atingido).
¡ É necessário um buscador em profundidade que verifique
um limite máximo para a profundidade da busca.
BUSCA POR APROFUNDAMENTO
ITERATIVO
67
EXEMPLO: BUSCA POR
APROFUNDAMENTO ITERATIV0
68
EXEMPLO: BUSCA POR
APROFUNDAMENTO ITERATIV0
69
EXEMPLO: BUSCA POR
APROFUNDAMENTO ITERATIV0
70
EXEMPLO: BUSCA POR
APROFUNDAMENTO ITERATIV0
¡ Apesar de parecer bem pouco eficiente…
§ Os nós que são “recomputados” várias vezes são os nós dos níveis
mais altos a árvore de busca , os quais normalmente são em menor
quantidade.
§ O custo de memória é linear como na busca em profundidade.
¡ É completa quando o fator de ramificação for finito.
¡ É ótima quando o custo do caminho é uma função não-
decrescente da profundidade do nó.
71
BUSCA POR APROFUNDAMENTO
ITERATIV0
def
busca_aprofudamento_iterativo(S,
G,
objetivo):
entrada:
G
#
a
grafo
S
#
um
conjunto
de
nós
iniciais
objetivo
#
função
booleana
que
testa
se
S
é
um
nó
objetivo
saída:
um
caminho
de
um
membro
de
S
para
um
nó
para
o
qual
a
função
objetivo
é
verdadeira,
ou
⟘
se
não
existir
solução
local:
limite
#
profundidade
máxima
def
busca_profundidade_limitada(<s0,…,sk>,
G,
limite):
local:
atingiu_limite
#
máxima
profundidade
atingiu_limite
ß
False
if
objetivo(sk):
return
<s0,…,sk>
elif
profundidade(sk)
=
limite:
return
interrupção
else:
for
each
{<s0,…,sk,s>}|<sk,s>
∈
S}:
resultado
ß
busca_profundidade_limitada(<s0,…,sk,s>,
G,
limite)
if
resultado
=
interrupção:
atingiu_limite
ß
True
elif
resultado
≠
⊥:
return
resultado
if
atingiu_limite:
return
interrupção
else:
return
resultado
for
limite
=
0
until
∞:
resultado
ß
busca_profundidade_limitada({<s> ∈
S},
G,
limite)
if
resultado
≠
⊥
:
return
resultado
BUSCA POR APROFUNDAMENTO
ITERATIVO
• Complexidade com uma solução na profundidade k e fator
de ramificação b:
COMPLEXIDADE DA BUSCA POR
APROFUNDAMENTO ITERATIVO
Tipo de Busca Seleção da fronteira Completa Ótima Custo de
Tempo
Custo de
Espaço
Profundidade Último nó adicionado N
S à sem ciclos e
espaço de busca finito
N O(bm) O(mb)
Largura Primeiro nó adicionado S S O(bm) O(bm)
Menor-custo-primeiro Mínimo custo à g(n) S à custos > 0 S à custos > 0 O(bm) O(bm)
Aprofundamento
interativo
Último nó adicionado
N
S à sem ciclos e
espaço de busca finito
N O(bm) O(mb)
SUMÁRIO: BUSCA SISTEMÁTICA
DESINFORMADA
¡ Porque todas as estratégias anteriores são chamadas de
desinformadas?
§ Porque elas não consideram qualquer informação sobre os estados
para decidir qual caminho expandir em primeiro lugar na fronteira.
¡ Em outras palavras, elas são gerais e não levam em conta a
natureza específica do problema.
BUSCA INFORMADA (HEURÍSTICA)
¡ Idéia: não ignore o objetivo ao selecionar os caminhos.
¡ Muitas vezes há conhecimento extra que pode ser usado
para orientar a busca: uma estimativa da distância do nó n
para um nó objetivo,
¡ Uma heurística, h(n), é uma estimativa do custo do
caminho mais curto do nó n para um nó objetivo.
§ h(n) usa apenas informações que podem ser facilmente obtidas
(que são fáceis de calcular) sobre um nó.
§ h pode ser estendido para caminhos: h(<n0, ... , nk>) = h(nk).
§ h(n) é uma subavaliação se não houver nenhum caminho de n para
um nó objetivo que tenha comprimento inferior a h(n).
BUSCA INFORMADA (HEURÍSTICA)
¡ Definição de função heurística admissível:
§ Uma função heurística h(n) é admissível se ela nunca é uma
sobrestimação do custo do nó n para um nó objetivo.
¡ As heurísticas admissíveis tem natureza otimista, pois elas
sempre indicam que o custo da solução é melhor do que ele
realmente é.
§ Desta maneira se uma solução ainda não foi encontrada sempre
existirá um nó com custo menor do que ela.
• Nunca existe um caminho do nó n para um nó objetivo que
tenha caminho de comprimento inferior a h(n) . Outra maneira
de dizer isto:
• h(n) é um limite inferior sobre o custo de ir do nó n para o nó
objetivo mais próximo.
FUNÇÕES HEURÍSTICAS
• Se os nós são pontos num plano Euclidiano e o custo é a
distância, então podemos usar a distância linear entre o
nó n e o nó objetivo mais próximo como o valor da h(n).
EXEMPLO DE FUNÇÕES HEURÍSTICAS
ADMISSÍVEIS
• Exemplo de heurísticas para o quebra-cabeças de 8 peças
• h1(n) = número de quadrados em locais errados
• h2(n) = distância Manhattan total
• número de espaços na vertical e horizontal que devem ser movidos
para chegar no local correto.
• h1(s) = 7 (só o número 7 está no local correto)
• h2(s) = 2+3+3+2+4+2+0+2 = 18
EXEMPLO DE FUNÇÕES HEURÍSTICAS
ADMISSÍVEIS
¡ Você deve identif icar uma versão relaxada do problema:
§ Na qual uma ou mais restrições sobre as ações foram descartadas.
¡ Exemplo:
§ Robô: o agente pode mover através das paredes
§ Motorista: o agente pode mover-se em linha reta ao local
§ 8-puzzle:
§ 1) os elementos podem mover em qualquer lugar
§ 2) os elementos podem mover para qualquer casa adjacente
¡ Resultado:
§ O custo de uma solução ideal para o problema relaxado é uma
heurística admissível para o problema original (porque sempre é
fracamente menos custoso resolver um problema menos restrito!)
COMO CONSTRUIR UMA HEURÍSTICA
¡ Você deve identificar restrições que, quando removidas,
fazem o problema extremamente fácil de ser resolvido
§ Isso é importante porque as heurísticas não são úteis se eles são
tão difíceis de resolver quanto o problema original!
¡ Este é o caso em nossos exemplos:
§ Robô: permitindo que o agente se mova através das paredes. A
solução ideal para este problema relaxado é distância Manhattan.
§ Motorista: permitindo que o agente se mova em linha reta ao
local. A solução ideal para este problema relaxado é
distância em linha reta.
§ 8-puzzle: (1) os elementos podem mover-se para qualquer lugar. A
solução ideal para esse problema relaxado é o número de peças
no local errado; (2) os elementos podem mover-se para qualquer
local adjacente ...
COMO CONSTRUIR UMA HEURÍSTICA
¡ Se h2(n) ≥ h1(n) para todos os n (ambas admissíveis) então h2
domina h1.
§ Qual é a melhor para a busca (porque?)
¡ 8-puzzle:
§ (1) os elementos podem mover-se para qualquer lugar.
§ (2) os elementos podem mover-se para qualquer casa adjacente.
§
¡ No problema original os elementos podem mover-se para um
quadrado adjacentes se ele estiver vazio).
¡ Custos da busca para o 8-puzzle (número médio de caminhos
expandidos):
d = 12 IDS = 3,644,035 caminhos onde d é a profundidade da solução
A*(h1) = 227 caminhos
A*(h2) = 73 caminhos
d = 24 IDS = caminhos demais
A*(h1) = 39,135 caminhos
A*(h2) = 1,641 caminhos
HEURÍSTICA: DOMINÂNCIA
¡ Se h2(n) ≥ h1(n) para todos os n (ambas admissíveis) então h2
domina h1.
§ h2 é melhor para a pesquisa
¡ 8-puzzle:
§ (1) os elementos podem mover-se para qualquer lugar.
§ (2) os elementos podem mover-se para qualquer casa adjacente.
§
¡ No problema original os elementos podem mover-se para um
quadrado adjacentes se ele estiver vazio).
¡ Custos da busca para o 8-puzzle (número médio de caminhos
expandidos):
d = 12 IDS = 3,644,035 caminhos onde d é a profundidade da solução
A*(h1) = 227 caminhos
A*(h2) = 73 caminhos
d = 24 IDS = caminhos demais
A*(h1) = 39,135 caminhos
A*(h2) = 1,641 caminhos
HEURÍSTICA: DOMINÂNCIA
¡ Como combinar heurística quando não há nenhuma
dominância?
¡ Se h1(n) é admissível e h2(n) também é admissível, então
h(n) = max(h1, h2) também é admissível e domina todos seus
componentes.
COMBINANDO HEURÍSTICAS
¡ Busca informada
§ Busca pelo melhor-primeiro
§ Busca A*
§ Busca em aprofundamento por enumeração e poda
BUSCA HEURÍSTICA SISTEMÁTICA
¡ Ideia: selecione o caminho cujo fim está mais próximo a um
nó objetivo de acordo com a função heurística.
¡ A busca pelo melhor-primeiro seleciona um caminho na
fronteira com o valor h mínimo.
¡ Ela trata a fronteira como uma fila de prioridade ordenada
por h(n).
¡ É um algoritmo guloso que seleciona o melhor caminho
local.
BUSCA PELO MELHOR-PRIMEIRO
GRÁFICO ILUSTRATIVO ─ BUSCA PELO
MELHOR-PRIMEIRO
• Estado Inic ial : Em(Arad) = Arad
• Estado Final : Em(Bucharest) = Bucharest
• Nós que podem gerar c ic los são marcados com *, e não são inser idos na
fronteira
Começando pelo nó inicial:
[no(Arad, [Arad], 366)]
Arad não é o objetivo – Expandindo Arad => Sibiu, Timisoara, Zerind,
[no(Sibiu, [Arad, Sibiu],
253),
no(Timisoara, [Arad, Timisoara], 329),
no(Zerind, [Arad, Zerind], 374)]
Sibiu não é o objetivo – Expandindo Sibiu => Arad*, Fagaras, Oradea, RV
[no(Fagaras, [Arad, Sibiu, Fagaras], 176),
no(RV, [Arad, Sibiu, RV], 193),
no(Timisoara, [Arad, Timisoara], 329),
no(Zerind, [Arad, Zerind], 374),
no(Oradea, [Arad, Sibiu, Oradea], 380)]
EXEMPLO DE BUSCA PELO MELHOR
PRIMEIRO (GULOSA)
Fagaras não é o objetivo – Expandindo Fagaras => Bucharest, Sibiu*
[no(Bucharest, [Arad, Sibiu, Fagaras, Bucharest], 0),
no(RV, [Arad, Sibiu, RV], 193),
no(Timisoara, [Arad, Timisoara], 329),
no(Zerind, [Arad, Zerind], 374),
no(Oradea, [Arad, Sibiu, Oradea], 380)]
§ Bucharest é o objetivo
§ Caminho encontrado [Arad, Sibiu, Fagaras, Bucharest]
§ Custo = 450
EXEMPLO DE BUSCA PELO MELHOR
PRIMEIRO (GULOSA)
EXEMPLO DE BUSCA PELO MELHOR
PRIMEIRO (GULOSA)
EXEMPLO DE BUSCA PELO MELHOR
PRIMEIRO (GULOSA)
• Nós em cinza já foram expandidos
• Nós em preto não são inseridos por já estarem no
caminho.
EXEMPLO DE BUSCA PELO MELHOR
PRIMEIRO (GULOSA)
EXEMPLO DE BUSCA PELO MELHOR
PRIMEIRO (GULOSA)
• O solução encontrada não é a solução ótima.
• A solução ótima passa por Rimnicu Vilcea e Pitest e tem 32 km a
menos.
def
busca_pelo_melhor_primeiro(G,
S,
goal):
entrada:
G
#
a
grafo
S
#
um
conjunto
de
nós
iniciais
objetivo
#
função
booleana
que
testa
se
S
é
um
nó
objetivo
saída:
um
caminho
de
um
membro
de
S
para
um
nó
para
o
qual
a
função
objetivo
é
verdadeira,
ou
se
não
existir
solução
local:
fronteira
#
um
conjunto
de
caminhos
fronteira
ß
{<s>|s
∈
S}
while
fronteira
:
selecione
e
remova
o
1o
nó
<s0,…,sk>
da
fronteira
if
objetivo(sk):
return
<s0,…,sk>
adicione({<s0,…,sk,s>}|<sk,s>
∈
S},
fronteira,
ordem
crescente
de
h(n))
return
⟘
BUSCA PELO MELHOR PRIMEIRO
(GULOSA)
¡ Usa espaço exponencial no comprimento do caminho O(bm).
¡ Usa tempo exponencial no comprimento do cominho O(bm).
¡ Não é garantido que ela encontra uma solução, mesmo se
houver uma, pois um valor de heurística baixo pode fazer
com que a busca fique em um ciclo para sempre.
§ No exemplo abaixo os nós laranja tem valor heurístico melhores
que os verde, os quais são o caminho certo para a solução
¡ Nem sempre encontra o caminho
mais curto.
COMPLEXIDADE DO BUSCA PELO
MELHOR-PRIMEIRO
¡ Usa tanto o custo do caminho até o nó atual quanto o valor da heuríst ica do
nó atual .
¡ cost(p ) é o custo do caminho até p .
¡ h (p ) est ima o custo do f inal do caminho de p até um nó objet ivo.
¡ Logo, f (p ) = cost(p ) + h(p ) .
§ f(p) estima o custo total do caminho para ir de um nó de início até um nó objetivo
passando por p.
BUSCA A*
n Problema:
n Ir de Arad à Bucharest.
n Função heurística:
n Distância em linha reta entre a cidade n e Bucharest.
n Satisfaz a condição de admissibilidade, pois não existe distância
menor entre dois pontos do que uma reta.
n É uma boa heurística, pois induz o algoritmo a atingir o objetivo
mais rapidamente.
EXEMPLO: BUSCA A*
EXEMPLO: DE BUSCA A*
EXEMPLO: DE BUSCA A*
EXEMPLO: DE BUSCA A*
EXEMPLO: DE BUSCA A*
EXEMPLO: DE BUSCA A*
EXEMPLO: DE BUSCA A*
¡ A* é uma mistura de busca pelo menor-custo-primeiro
(baseada em cost(n)) e busca pelo melhor-primeiro
(baseada em h(n)).
¡ Ela trata a fronteira como uma fila de prioridade ordenada
por f(p).
¡ Ela sempre seleciona o nó p na fronteira com a menor
distância estimada a partir do início até um nó objetivo,
restringida a passar pelo nó p.
ALGORITMO DA BUSCA A*
def
busca_A*(G,
S,
goal):
entrada:
G
#
a
grafo
S
#
um
conjunto
de
nós
iniciais
objetivo
#
função
booleana
que
testa
se
S
é
um
nó
objetivo
saída:
um
caminho
de
um
membro
de
S
para
um
nó
para
o
qual
a
função
objetivo
é
verdadeira,
ou
se
não
existir
solução
local:
fronteira
#
um
conjunto
de
caminhos
fronteira
ß
{<s>|s
∈
S}
while
fronteira
:
selecione
e
remova
o
1o
nó
<s0,…,sk>
da
fronteira
if
objetivo(sk):
return
<s0,…,sk>
adicione({<s0,…,sk,s>}|<sk,s>
∈
S},
fronteira,
ordem
crescente
de
f(n))
return
⟘
ALGORITMO DA BUSCA A*
¡ Vamos supor que os custos do arco são estritamente
positivos.
¡ Complexidade de tempo é O(bm)
§ Se a heurística for completamente não informativa e os custos dos
arcos forem os mesmos, a busca A* faz a mesma coisa que a
busca em largura.
¡ Complexidade de espaço é O(bm) como na busca em
largura, a busca A* mantém uma fronteira que cresce com o
tamanho da árvore
¡ Completa: Sim.
¡ Ótima: Sim.
ANÁLISE DA BUSCA A*
¡ Se houver uma solução, a busca A* sempre encontra a
solução ótima – i.e. o primeiro caminho para um nó objetivo
selecionado – se:
§ O fator de ramificação é finito.
§ O custo dos arcos são delimitados acima de zero (existe algum
ε > 0 tal que todos os custos dos arcos são superiores a ε).
§ h(n) é uma subavaliação do comprimento do caminho mais curto
da n para um nó de objetivo (heurística admissível).
¡ No entanto, a complexidade de espaço ainda é um problema.
ADMISSIBILIDADE DA BUSCA A*
¡ Se um caminho p para um nó objetivo é selecionado da fronteira,
pode haver um caminho mais curto para um nó objetivo?
¡ Suponha que caminho p´ está na fronteira. Porque p foi escolhido
antes de p´ e h(p) = 0:
cost(p) ≤ cost(p´) + h(p´):
¡ Porque h é uma subavaliação:
cost(p´) + h(p´) ≤ cost(p´´)
para qualquer caminho p´´ até um nó objetivo que estende p´
¡ Logo cost(p) ≤ cost(p´´) para quaisquer outros caminhos p´´ até
um nó objetivo.
PORQUE A BUSCA A* É ÓTIMA?
p''
p p'
¡ Há sempre um elemento do caminho da solução ótima na
fronteira, antes de um nó objetivo ter sido selecionado.
§ Isso ocorre porque, no algoritmo de pesquisa abstrata, existe a
parte inicial de cada caminho para um nó objetivo.
¡ A busca A* para, pois os custos dos caminhos na fronteira
continuam a aumentar e, eventualmente, eles excederão
qualquer número finito.
¡ Se os custos forem positivos não há necessidade verificar a
existência de ciclos na busca A*, pois os custos dos
caminhos com ciclos serão sempre maiores e, portanto, não
serão escolhidos.
PORQUE A BUSCA A* É ÓTIMA?
• Um buscador pode podar um caminho que termina em um nó que
já está no caminho, sem remover a solução ideal.
• Usando métodos de busca em profundidade, com o grafo
explicitamente armazenado, isso pode ser feito em tempo
constante.
• Para outros métodos, o custo é l inear no comprimento do
caminho.
VERIFICAÇÃO DE CICLOS
def
busca_em_grafo(G,
S,
goal):
entrada:
G
#
a
grafo
S
#
um
conjunto
de
nós
iniciais
objetivo
#
função
booleana
que
testa
se
S
é
um
nó
objetivo
saída:
um
caminho
de
um
membro
de
S
para
um
nó
para
o
qual
a
função
objetivo
é
verdadeira,
ou
⟘
se
não
existir
solução
local:
fronteira
#
um
conjunto
de
caminhos
fechado
#
conjunto
de
nós
já
visitados
fechado
ß
{}
fronteira
ß
{<s>|s
∈
S}
while
fronteira
≠{ }:
seleciona
e
remove
<s0,…,sk>
da
fronteira
if
objetivo(sk):
return
<s0,…,sk>
if
not
sk
∈
fechado:
fechado
ß
{sk}
fronteira
ß
fronteira
∪ {⟨s0,… ,sk,s⟩|⟨𝑠𝑘 , 𝑠⟩ ∈S}
return
⟘
ALGORITMO GENÉRICO DE BUSCA EM
GRAFO COM DETECÇÃO DE CICLO
• A remoção de caminho múltiplos consiste em podar um caminho
para o nó n para o qual o buscador já tenha encontrado um
outro caminho.
• A remoção de caminhos múltiplos engloba a verif icação de
ciclos.
• Isto implica em armazenar na memória todos os nós para os
quais já se encontrou caminhos.
• É importante garantir que após a remoção uma solução ótima
ainda pode ser encontrada.
REMOÇÃO DE CAMINHOS MÚLTIPLOS
¡ Problema: o que fazer se um caminho subsequente para n é
menor do que o primeiro caminho para n?
§ Remova todos os caminhos da fronteira que usam o caminho mais
longo.
§ Altere o segmento inicial dos caminhos na fronteira para usar o
caminho mais curto.
§ Certifique-se de que isto não aconteça, garantindo que o caminho
mais curto para um nó é encontrado antes.
REMOÇÃO DE CAMINHOS MÚLTIPLO E
SOLUÇÕES ÓTIMAS
¡ Suponha que o caminho p para o nó n foi selecionado, mas ainda
há um caminho mais curto para n. Suponha que esse caminho
mais curto é via o nó p´ na fronteira.
¡ Suponha que caminho p´ termina no nó n´.
¡ cost(p) + h(n) ≤ cost(p´) + h(n´) porque p foi selecionado antes de
p´.
¡ cost(p´) + cost(n´ , n) < cost(p) porque o caminho para n via p´ é
mais curto.
cost(n´, n) < cost(p) - cost(p´) ≤ h(n´) - h(n):
¡ Você pode garantir que isso não ocorrerá caso:
|h(n´) - h(n)| ≤ cost(n´, n).
REMOÇÃO DE CAMINHOS MÚLTIPLO E
BUSCA A*
¡ A função heurística h satisfaz a restrição monotônica se |
h(m) - h (n) | ≤ custo (m; n) para cada arco <m, n>.
¡ Se h satisfaz a restrição monotônica, a busca A* com
remoção de caminhos múltiplos sempre encontra o caminho
mais curto para um objetivo.
¡ Este é um reforço ao critério de admissibilidade.
RESTRIÇÃO MONOTÔNICA
¡ Remoção de múltiplos caminhos engloba a checagem de ciclos.
§ Pode ser feito em tempo constante se todos os nós encontrados
estiverem armazenados.
¡ Remoção de múltiplos caminhos.
§ Métodos em largura primeiro – quando temos que armazenar
virtualmente todos os nós considerados.
¡ Checagem de ciclos.
§ Métodos em profundidade primeiro – quando armazenamos somente o
caminho para o qual estamos realizando a busca.
116
QUANDO USAR?
¡ É uma forma de combinar a busca em profundidade com
informações de heurísticas.
¡ Os nós vizinhos (nós gerados) são ordenados primeiro para
depois serem colocados na fronteira (que ainda é uma pilha) .
§ Seleciona localmente qual subárvore expandir, mas continua fazendo
busca em profundidade.
¡ A complexidade de espaço é linear no tamanho do caminho.
¡ Não garante encontrar uma solução (como a busca em
profundidade), mas se encontrar é a solução ideal.
¡ Mais útil quando há várias soluções e queremos uma solução
ótima.
BUSCA EM APROFUNDAMENTO POR
ENUMERAÇAO E PODA (DEPTH-FIRST BRANCH-AND-
BOUND)
¡ Ideia: manter o custo do caminho de menor-custo
encontrado até um objetivo até agora, chamar isto de l imite.
¡ Se a busca encontrar um caminho p tal que
cost(p) + h(p) ≤ l imite o caminho p pode ser removido.
¡ Se for encontrado um caminho não-podado para um
objetivo, ele deve ser melhor do que o melhor caminho
anterior. Esta nova solução é lembrada e o l imite é definido
como o seu custo.
¡ A busca pode ser uma busca em profundidade para
economizar espaço.
¡ Como o l imite deve ser inicializado?
BUSCA EM APROFUNDAMENTO POR
ENUMERAÇAO E PODA
¡ O l imite pode ser inicializado em ∞.
¡ O l imite pode ser definido como uma estimativa do custo do
caminho ótimo. Após a busca em profundidade terminar
podemos ter as seguintes situações:
§ Uma solução foi encontrada.
§ Nenhuma solução foi encontrada e nenhum caminho foi podado.
§ Nenhuma solução foi encontrada e um caminho foi removido.
BUSCA EM APROFUNDAMENTO POR
ENUMERAÇAO E PODA: INICIALIZANDO O
LIMITE
def
busca_por_aprofundamento_enumeração_poda(G,
S,
goal):
entrada:
G
#
a
grafo
S
#
um
conjunto
de
nós
iniciais
objetivo
#
função
booleana
que
testa
se
S
é
um
nó
objetivo
saída:
um
caminho
de
um
membro
de
S
para
um
nó
para
o
qual
a
função
objetivo
é
verdadeira,
ou
se
não
existir
solução
local:
fronteira
#
um
conjunto
de
caminhos
fronteira
ß
{<s>|s
∈
S}
while
fronteira
:
selecione
e
remova
o
1o
nó
<s0,…,sk>
da
fronteira
if
objetivo(sk):
return
<s0,…,sk>
adicione({ordenar(<s0,…,sk,s>|<sk,s>
∈
S,
crescente},
fronteira,
início)
return
⟘
ALGORITMO DA BUSCA EM APROFUNDAMENTO
POR ENUMERAÇAO E PODA
EXEMPLO: BUSCA EM APROFUNDAMENTO
POR ENUMERAÇAO E PODA
EXEMPLO: BUSCA EM APROFUNDAMENTO
POR ENUMERAÇAO E PODA
EXEMPLO: APROFUNDAMENTO POR
ENUMERAÇAO E PODA
• Completa: não, pelas mesmas razões que a busca em
profundidade não é completa.
• No entanto, para muitos problemas de interesse não há nenhum
caminho infinito e nenhum ciclo, portanto, para muitos problemas
B & B é completa.
• Complexidade de tempo: O(bm)
• Complexidade de espaço: O(bm)
• Enumeração e poda tem a mesma complexidade de espaço da
busca em profundidade.
• Ótima: Sim
ANALISE DO APROFUNDAMENTO POR
ENUMERAÇAO E PODA
Tipo de Busca Seleção da fronteira Completa Ótima Custo de
Tempo
Custo de
Espaço
Profundidade Último nó adicionado N
S à sem ciclos e
espaço de busca finito
N O(bm) O(mb)
Largura Primeiro nó adicionado S S O(bm) O(bm)
Menor-custo-primeiro Mínimo custo à g(n) S à custos > 0 S à custos > 0 O(bm) O(bm)
Melhor-primeiro Mínimo local à h(n) N O(bm) O(bm)
A* Mínimo custo estimado
à f(n)
S S O(bm) O(bm)
Aprofundamento
interativo
Último nó adicionado
N
S à sem ciclos e
espaço de busca finito
N O(bm) O(mb)
Aprofundamento
enumeração-poda
Mínimo custo estimado
à f(n)
N S O(bm) O(mb)
SUMÁRIO: BUSCA
¡ A definição de busca é simétrica (se os operadores forem
reversíveis), i.e. encontrar o caminho dos nós iniciais para
um nó objetivo ou de um nó objetivo para algum nó inicial.
§ Fator de ramificação
para frente: número de arcos saindo de um
nó.
§ Fator de ramificação para trás: número de arcos entrando um nó.
¡ Se a complexidade da busca é bn, deve-se usar a busca
para frente se o fator de ramificação para frente for inferior
ao fator de ramificação para trás e vice-versa.
¡ Nota: às vezes quando o grafo é construído dinamicamente,
você pode não ser capaz de construir o grafo para trás.
ESCOLHANDO A DIREÇÃO DA BUSCA
¡ Resulta em ganho devido ao fato de que 2.bk/2 ≪ bk, o que
pode resultar em uma economia exponencial no tempo e no
espaço.
¡ O principal problema é ter certeza que as fronteiras se
encontram.
¡ É muitas vezes usada com um método de busca em largura
que cria um conjunto de locais que podem levar a um
objetivo. Na outra direção, outro método pode ser usado
para encontrar um caminho para esses locais interessantes,
como a busca em profundidade, por exemplo.
BUSCA BIDIRECIONAL
¡ Idéia: encontrar um conjunto de i lhas (pequenos espaços de
busca) entre s e g.
S →┴ i1 →┴ i2 →┴ ... →┴ im-1 →┴ g
¡ Deste modo, tem-se m problemas menores em vez de 1 grande
problema. Isso resulta em ganho devido ao fato de que mbk/m ≪
bk .
¡ O problema está em identif icar as i lhas que o caminho deve
passar, sendo difíci l garantir otimalidade.
¡ É possível aplicar a ideia de forma recusrisva, i.e. pode-se
resolver os subproblemas usando i lhas ⇒┴ hierarquia de
abstrações.
BUSCA DIRIGIDA POR ILHA