Escolar Documentos
Profissional Documentos
Cultura Documentos
## Exercício 3.1 ##
Explique por que a formulação do problema deve seguir a formulação do objetivo
## Exercício 3.2 ##
Considere o mundo acessível do vácuo em dois locais sob a Lei de Murphy. Mostre
isso para
cada estado inicial, há uma sequência de ações que garantem atingir um estado
objetivo.
## Exercício 3.3 ##
Forneça o estado inicial, o teste de meta, os operadores e a função de custo do
caminho para cada um dos itens a seguir.
Existem diversas formulações possíveis para cada problema, com variados níveis de
detalhe. O
O principal é que suas formulações sejam precisas e "colocadas" para que possam
ser
implementado.
####T3####
* Estado inicial - Posição lat /long/alt, localização do mar
* Teste de Meta - Você está no mar
* Operadores - Caminhada
* Custo Passado - Tempo necessário para chegar ao mar
* Algoritmo - Siga o riacho em declive enquanto o mar está em 0 alt
####Q5####
* Estado Inicial - Localização do macaco, caixa e bananas
* Teste de Meta - O macaco está com as bananas
* Operadores - O macaco pode mover a si mesmo e a caixa
* Custo Passado - Tempo gasto
* Algoritmo - Mova a caixa sob as bananas. Análise Meios-Fins
####Q6####
* Estado inicial - Layout da cidade, sua localização
* Teste de Meta - Você está na farmácia
* Operadores - Caminhe, olhe, faça mapa
* Custo Passado - Tempo gasto
* Algoritmo - Caminhe em direção à área mais construída e trabalhe a partir daí
## Exercício 3.4 ##
Implemente o problema dos missionários e canibais e use a pesquisa ampla para
encontrar o
solução mais curta. É uma boa ideia verificar estados repetidos? Desenhe um
diagrama completo
espaço de estado para ajudá-lo a decidir
## Exercício 3.5 ##
Na página 76, dissemos que não consideraríamos problemas com custos de caminho
negativo. Nisso
exercício, exploramos isso com mais profundidade.
## Exercício 3.6 ##
O algoritmo GENERAL-SEARCH consiste em três etapas: teste de meta, geração e
função de ordenação, nesta ordem.
Parece uma pena gerar um nó que é de fato uma solução, mas deixar de reconhecê-lo
porque o pedido
a função não consegue colocá-lo primeiro.
1. Escreva uma versão do GENERAL-SEARCH que teste cada nó assim que ele é gerado
e pare imediatamente se encontrar um objetivo.
2. Mostre como o algoritmo GENERAL-SEARCH pode ser usado inalterado para fazer
isso, fornecendo-lhe a função de ordenação adequada
1. GeneralSearchImmediateCheck ( ) em imediato_search.py
2. BreadthFirstSearchImmediateCheck ( ) em imediato_search.py
## Exercício 3.7 ##
A formulação do problema, solução e algoritmo de busca dada neste capítulo
explicitamente
menciona o caminho para um estado objetivo. Isso ocorre porque o caminho é
importante em muitos problemas. Para
outros problemas, o caminho é irrelevante e apenas o estado objetivo importa.
Considere o problema
"Encontre a raiz quadrada de 123454321." Uma busca no espaço dos números pode
passar por
muitos estados, mas o único que importa é o estado objetivo, o número 11111.
Claro, de um ponto de vista
do ponto de vista teórico, é fácil executar o algoritmo de busca geral e depois
ignorar todos os
caminho, exceto o estado objetivo. Mas como programador, você pode obter um ganho
de eficiência codificando um
versão do algoritmo de busca que não rastreia caminhos. Considere uma versão do
problema
resolver onde não há caminhos e apenas os estados importam. Escreva definições de
problema e
solução e o algoritmo de busca geral. Qual dos problemas da Seção 3.3 usaria
melhor
esse algoritmo, e qual deve usar a versão que rastreia os caminhos?
## Exercício 3.8 ##
Dado um algoritmo de busca sem caminho como o solicitado no Exercício 3.7,
explique como
você pode modificar os operadores para acompanhar os caminhos como parte das
informações em um estado. Mostrar
os operadores precisavam resolver os problemas de localização de rotas e turismo.
## Exercício 3.10 ##
A Figura 3.17 mostra uma visão esquemática da busca bidirecional. Por que você
acha que escolhemos
para mostrar árvores crescendo a partir dos estados inicial e objetivo, em vez de
duas árvores de pesquisa crescendo
horizontalmente um em direção ao outro
## Exercício 3.11 ##
Escreva o algoritmo para busca bidirecional, em pseudocódigo ou em uma
programação
linguagem. Suponha que cada pesquisa será uma pesquisa em largura e que as
pesquisas direta e
pesquisas retroativas se revezam na expansão de um nó por vez. Tenha cuidado para
evitar verificar cada nó
na pesquisa direta em cada nó na pesquisa regressiva
## Exercício 3.12 ##
Dê a complexidade temporal da pesquisa bidirecional quando o teste para conectar
os dois
pesquisas são feitas comparando um estado recém-gerado na direção direta com
todos os
estados gerados na direção inversa, um de cada vez.
### Solução ###
O(n^2). Na pior das hipóteses, cada nó é comparado com metade dos outros nós
(fator constante)
## Exercício 3.13 ##
Dissemos que pelo menos uma direção de uma busca bidirecional deve ser uma busca
em largura.
Qual seria uma boa escolha para a outra direção? Por que?
## Exercício 3.14 ##
Considere o seguinte operador para o problema das 8 rainhas: coloque uma rainha
na coluna
com o menor número de casas não atacadas, de forma que não ataque nenhuma outra
rainha. Como
muitos nós isso se expande antes de encontrar uma solução? (Você pode querer ter
um programa
calcule isso para você.)
## Exercício 3.15 ##
O problema da cadeia (Figura 3.20) consiste em vários comprimentos de cadeia que
devem ser reconfigurados
em novos arranjos. Os operadores podem abrir um link e fechar um link. No padrão
Na forma do problema, o estado inicial contém quatro cadeias, cada uma com três
elos. O estado objetivo
consiste em uma única cadeia de 12 elos em um círculo. Configure isso como um
problema de pesquisa formal e encontre
a solução mais curta.
Solução mais curta 8 ações para este modelo, seja abrindo e conectando cada link
de borda,
ou dividindo uma corrente em 3 elos e conectando cada um deles.
## Exercício 3.16 ##
Os testes de inteligência humana geralmente contêm problemas de previsão de
sequências. O objetivo em
tais problemas é prever o próximo membro de uma sequência de inteiros, assumindo
que o número
na posição n da sequência é gerada usando alguma função de sequência s(n), onde o
primeiro
elemento da sequência corresponde a n = 0. Por exemplo, a função s(n) = 2**n gera
o
sequência [1,2,4,8,16, ...].
1. Primeiro, escreva a função de teste de meta. Seu argumento será uma função de
sequência candidata s. Isto
conterá a sequência de números observada como estado local.
2. Agora escreva a função sucessora. Dada uma expressão de função s, ela deve
gerar todos
expressões um passo mais complexas que s. Isto pode ser feito substituindo
qualquer folha do
expressão com uma árvore binária de duas folhas.
3. Qual dos algoritmos discutidos neste capítulo seria adequado para este
problema?
Implemente-o e use-o para encontrar expressões de sequência para as sequências [
1,2,3,4,5 ],
[1,2,4,8,16, ... ] e [ 0,5,2,4,5,8 ].
4. Se o nível d do espaço de busca contém todas as expressões de complexidade d
+1, onde complexidade
é medido pelo número de nós folha (por exemplo, n + (1 xn) tem complexidade 3),
prove por
indução de que existem aproximadamente 20* *d* (d+1)! expressões no nível d.
5. Comente sobre a adequação de algoritmos de busca desinformados para resolver
este problema. Pode
você sugere outras abordagens?
## Exercício 3.17 ##
O mundo do vácuo total dos exercícios do Capítulo 2 pode ser visto como um
problema de busca
no sentido que definimos, desde que assumamos que o estado inicial é
completamente conhecido.
## Exercício 3.18 ##
Os agentes de busca que discutimos fazem uso de um modelo completo do mundo para
construir uma solução que eles então executam. Modifique o algoritmo de busca em
profundidade com repetições
verificação de estado para que um agente possa usá-la para explorar um mundo de
vácuo arbitrário, mesmo sem um
modelo das localizações de paredes e sujeira. Não deve ficar preso mesmo em loops
ou becos sem saída.
Você também pode desejar que seu agente construa uma descrição de ambiente do
tipo usado por
os algoritmos de pesquisa padrão.
## Exercício 3.19 ##
Ao discutir o problema criptoaritmético, propusemos que um operador deveria
atribuir
um valor para qualquer letra que tenha o menor valor restante possível. Esta
regra é garantida para
produzir o menor espaço de busca possível? Por que não)?
## Exercício 3.20 ##
Defina cada um dos seguintes problemas como problemas de satisfação de
restrições:
1. O problema criptoaritmético.
2. O problema de roteamento de canal no layout VLSI.
3. O problema da coloração do mapa. Na coloração de mapas, o objetivo é colorir
países em um mapa usando
um determinado conjunto de cores, de modo que não haja dois países adjacentes da
mesma cor.
4. O problema do planejamento retilíneo, que envolve encontrar locais não
sobrepostos em
um retângulo grande para vários retângulos menores.
### Solução ###
1. * X = {(L1, ..., Ln), W1, W2, W3 } Cada letra mais três palavras
* D = {(0, 1, ..., 9), [L1, ..., Ln], [L1, ..., Ln], [L1, ..., Ln ]} Contém um
número ou uma lista de cartas
* C = { R (W1) + R(W2) = R(W3) } Quando letras são substituídas (R) por números,
a sequência deve ser uma adição válida
## Exercício 3.21 ##
Implemente um sistema de satisfação de restrições da seguinte forma:
1. Defina um tipo de dados para CSPs com domínios discretos e finitos. Você
precisará encontrar uma maneira de
representam domínios e restrições.
2. Implementar operadores que atribuam valores às variáveis, onde as variáveis
são atribuídas em um
ordem fixa em cada nível da árvore.
3. Implemente um teste de meta que verifique um estado completo para satisfação
de todas as restrições.
4. Implemente o retrocesso modificando DEPTH-FIRST-SEARCH.
5. Adicione verificação futura ao seu algoritmo de retrocesso.
6. Execute os três algoritmos em alguns exemplos de problemas e compare seu
desempenho.