Skip to content

Commit

Permalink
material da aula do dia 28/08
Browse files Browse the repository at this point in the history
  • Loading branch information
fbarth committed Aug 27, 2024
1 parent cb13571 commit 4ebd395
Show file tree
Hide file tree
Showing 6 changed files with 287 additions and 22 deletions.
29 changes: 29 additions & 0 deletions docs/aulas/04_modelagem_espaco/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Modelagem e espaço de busca

Na aula passada implementamos alguns aspiradores de pó com configurações diferentes:

* [Aspirador de pó com 2 quartos](./src/robo_aspirador.py)
* [Aspirador de pó com 4 quartos](./src/robo_aspirador_quadrado.py)
* [Aspirador de pó com 4 quartos e sofás](./src/robo_aspirador_quadrado_poltrona.py)

Muitos de vocês conseguiram verificar que dependendo da configuração do ambiente o aspirador demorava mais ou menos tempo para limpar o ambiente considerando cenários similares, ou seja, todos os quartos sujos:

```bash
(venv) ➜ disciplina_ai python robo_aspirador.py
Busca em largura
Tempo de execucao: 0.0002803802490234375 segundos
Achou!
; ir p/ direita ; limpar ; ir p/ esquerda ; limpar
(venv) ➜ disciplina_ai python robo_aspirador_quadrado.py
Busca em largura
Tempo de execucao: 0.008468866348266602 segundos
Achou!
; limpar ; ir p/ direita ; limpar ; ir p/ baixo ; limpar ; ir p/ esquerda ; limpar
(venv) ➜ disciplina_ai python robo_aspirador_quadrado_poltrona.py
Busca em largura
Tempo de execucao: 0.2716667652130127 segundos
Achou!
; limpar ; ir p/ direita ; virar poltrona ; limpar ; ir p/ baixo ; virar poltrona ; limpar ; ir p/ esquerda ; limpar
```

## Qual é a explicação para isto acontecer?
56 changes: 56 additions & 0 deletions docs/aulas/04_modelagem_espaco/src/robo_aspirador.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
from aigyminsper.search.SearchAlgorithms import BuscaLargura, BuscaProfundidade
from aigyminsper.search.Graph import State
import json
import time

class RoboAspirador(State):

def __init__(self, op, posicao_robo, situacao_esq, situacao_dir):
# You must use this name for the operator!
self.operator = op
self.posicao_robo = posicao_robo
self.situacao_esq = situacao_esq
self.situacao_dir = situacao_dir

def successors(self):
successors = []
# ir p/ esquerda
successors.append(RoboAspirador('ir p/ esquerda','ESQ',self.situacao_esq,self.situacao_dir))
# ir p/ direita
successors.append(RoboAspirador('ir p/ direita','DIR',self.situacao_esq,self.situacao_dir))
# limpar
if self.posicao_robo == 'ESQ':
successors.append(RoboAspirador('limpar',self.posicao_robo,'LIMPO',self.situacao_dir))
else:
successors.append(RoboAspirador('limpar',self.posicao_robo,self.situacao_esq,'LIMPO'))
return successors

def is_goal(self):
return self.situacao_esq == 'LIMPO' and self.situacao_dir == 'LIMPO' and self.posicao_robo == 'ESQ'

def description(self):
return "Robo simples limpador de chao"

def cost(self):
return 1

def env(self):
return json.dumps(self.__dict__)

def main():
print('Busca em largura')
state = RoboAspirador('','ESQ','SUJO','SUJO')
algorithm = BuscaLargura()
start = time.time()
result = algorithm.search(state)
print(f'Tempo de execucao: {time.time() - start} segundos')
#algorithm = BuscaProfundidade()
#result = algorithm.search(state, m=5, trace=True)
if result != None:
print('Achou!')
print(result.show_path())
else:
print('Nao achou solucao')

if __name__ == '__main__':
main()
69 changes: 69 additions & 0 deletions docs/aulas/04_modelagem_espaco/src/robo_aspirador_quadrado.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
from aigyminsper.search.SearchAlgorithms import BuscaLargura, BuscaProfundidade
from aigyminsper.search.Graph import State
import json
import copy
import time

class RoboAspiradorQuadrado(State):

def __init__(self, op, posicao_robo, situacao):
# You must use this name for the operator!
self.operator = op
self.posicao_robo = posicao_robo
self.situacao = situacao

def successors(self):
successors = []
# ir p/ esquerda
if self.posicao_robo[1] > 0:
new_posicao_robo = [self.posicao_robo[0], self.posicao_robo[1]-1]
successors.append(RoboAspiradorQuadrado('ir p/ esquerda', new_posicao_robo, self.situacao))
# ir p/ direita
if self.posicao_robo[1] < 1:
new_posicao_robo = [self.posicao_robo[0], self.posicao_robo[1]+1]
successors.append(RoboAspiradorQuadrado('ir p/ direita', new_posicao_robo, self.situacao))
# ir p/ cima
if self.posicao_robo[0] > 0:
new_posicao_robo = [self.posicao_robo[0]-1, self.posicao_robo[1]]
successors.append(RoboAspiradorQuadrado('ir p/ cima', new_posicao_robo, self.situacao))
# ir p/ baixo
if self.posicao_robo[0] < 1:
new_posicao_robo = [self.posicao_robo[0]+1, self.posicao_robo[1]]
successors.append(RoboAspiradorQuadrado('ir p/ baixo', new_posicao_robo, self.situacao))
# limpar
if self.situacao[self.posicao_robo[0]][self.posicao_robo[1]] == 0:
new_situacao = copy.deepcopy(self.situacao)
new_situacao[self.posicao_robo[0]][self.posicao_robo[1]] = 1
successors.append(RoboAspiradorQuadrado('limpar', self.posicao_robo, new_situacao))

return successors

def is_goal(self):
return self.situacao == [[1,1],[1,1]]

def description(self):
return "Robô aspirador de pó em uma matriz 2x2"

def cost(self):
return 1

def env(self):
return json.dumps(self.__dict__)

def main():
print('Busca em largura')
state = RoboAspiradorQuadrado('',[0,0],[[0,0],[0,0]])
algorithm = BuscaLargura()
start = time.time()
result = algorithm.search(state)
print(f'Tempo de execucao: {time.time() - start} segundos')
#algorithm = BuscaProfundidade()
#result = algorithm.search(state, m=5, trace=True)
if result != None:
print('Achou!')
print(result.show_path())
else:
print('Nao achou solucao')

if __name__ == '__main__':
main()
116 changes: 116 additions & 0 deletions docs/aulas/04_modelagem_espaco/src/robo_aspirador_quadrado_poltrona.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
from aigyminsper.search.SearchAlgorithms import BuscaLargura, BuscaProfundidade
from aigyminsper.search.Graph import State
import json
import copy
import time

class Quarto:

def __init__(self, situacao, poltrona, situacao_poltrona):
self.situacao = situacao
self.poltrona = poltrona
self.estado_poltrona = situacao_poltrona

def estah_sujo(self):
return self.situacao == 'SUJO'

def limpar(self):
self.situacao = 'LIMPO'

def tem_poltrona(self):
return self.poltrona

def situacao_poltrona(self):
return self.estado_poltrona

def virar_poltrona(self):
self.estado_poltrona = 'VIRADA'

def desvirar_poltrona(self):
self.estado_poltrona = 'NORMAL'


class RoboAspiradorQuadrado(State):

def __init__(self, op, posicao_robo, quartos):
# You must use this name for the operator!
self.operator = op
self.posicao_robo = posicao_robo
self.quartos = quartos

def successors(self):
successors = []
# ir p/ esquerda
if self.posicao_robo[1] > 0:
new_posicao_robo = [self.posicao_robo[0], self.posicao_robo[1]-1]
successors.append(RoboAspiradorQuadrado('ir p/ esquerda', new_posicao_robo, self.quartos))
# ir p/ direita
if self.posicao_robo[1] < 1:
new_posicao_robo = [self.posicao_robo[0], self.posicao_robo[1]+1]
successors.append(RoboAspiradorQuadrado('ir p/ direita', new_posicao_robo, self.quartos))
# ir p/ cima
if self.posicao_robo[0] > 0:
new_posicao_robo = [self.posicao_robo[0]-1, self.posicao_robo[1]]
successors.append(RoboAspiradorQuadrado('ir p/ cima', new_posicao_robo, self.quartos))
# ir p/ baixo
if self.posicao_robo[0] < 1:
new_posicao_robo = [self.posicao_robo[0]+1, self.posicao_robo[1]]
successors.append(RoboAspiradorQuadrado('ir p/ baixo', new_posicao_robo, self.quartos))

# limpar
if self.quartos[self.posicao_robo[0]][self.posicao_robo[1]].estah_sujo():

if not self.quartos[self.posicao_robo[0]][self.posicao_robo[1]].tem_poltrona():
new_quartos = copy.deepcopy(self.quartos)
new_quartos[self.posicao_robo[0]][self.posicao_robo[1]].limpar()
successors.append(RoboAspiradorQuadrado('limpar', self.posicao_robo, new_quartos))
elif self.quartos[self.posicao_robo[0]][self.posicao_robo[1]].situacao_poltrona() == 'VIRADA':
new_quartos = copy.deepcopy(self.quartos)
new_quartos[self.posicao_robo[0]][self.posicao_robo[1]].limpar()
successors.append(RoboAspiradorQuadrado('limpar', self.posicao_robo, new_quartos))
elif self.quartos[self.posicao_robo[0]][self.posicao_robo[1]].situacao_poltrona() == 'NORMAL':
new_quartos = copy.deepcopy(self.quartos)
new_quartos[self.posicao_robo[0]][self.posicao_robo[1]].virar_poltrona()
successors.append(RoboAspiradorQuadrado('virar poltrona', self.posicao_robo, new_quartos))

return successors

def is_goal(self):
for lista in self.quartos:
for quarto in lista:
if quarto.estah_sujo():
return False
return True

def description(self):
return "Robô aspirador de pó em uma matriz 2x2 com poltronas"

def cost(self):
return 1

def env(self):
return json.dumps(self.__dict__)

def main():
print('Busca em largura')

state = RoboAspiradorQuadrado(
op='',
posicao_robo=[0,0],
quartos=[[Quarto('SUJO',False,None),Quarto('SUJO',True,'NORMAL')],[Quarto('SUJO',True,'VIRADA'),Quarto('SUJO',True,'NORMAL')]]
)

algorithm = BuscaLargura()
start = time.time()
result = algorithm.search(state)
print(f'Tempo de execucao: {time.time() - start} segundos')
#algorithm = BuscaProfundidade()
#result = algorithm.search(state, m=5, trace=True)
if result != None:
print('Achou!')
print(result.show_path())
else:
print('Nao achou solucao')

if __name__ == '__main__':
main()
30 changes: 12 additions & 18 deletions docs/aulas/04_x_buscas/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,24 +91,22 @@ No caso do algoritmo em profundidade, teste duas versões ($m = 10$ e $m = 100$)

Armazene o tempo de processamento criando uma tabela similar a esta:

| Algoritmo | Objetivo | Tempo de processamento |
| Algoritmo | Objetivo | Tempo de processamento em segundos |
|:----------|:--------:|:----------------------:|
| Busca em Largura | 1 | 0:00:00.000036 |
| Busca em Largura | 1 | 0.000036 |
| Busca em Largua | $\cdots$ | $\cdots$ |
| Busca em Largura| 10 | 0:00:00.000378 |
| Busca em Largura| 10 | 0.000378 |
| Busca em Largura | 50 | $\cdots$ |
| Busca em Profundidade com $m= 10$ | 1 | 0:00:00.000033 |
| Busca em Profundidade com $m= 10$ | 1 | 0.000033 |
| Busca em Produndidade com $m= 10$ | $\cdots$ | $\cdots$ |
| Busca em Produndidade com $m= 100$ | $\cdots$ | $\cdots$ |
| Busca em Profundidade Iterativa | 1 | $\cdots$ |
| Busca em Profundidade Iterativa | $\cdots$ | $\cdots$ |
| Busca em Profundidade Iterativa | 50 | $\cdots$ |

Em alguns casos a combinação do algoritmo com o objetivo não fornece um resultado. Você deve informar na tabela estes casos.
Em alguns casos a combinação do algoritmo com o objetivo não fornece um resultado. Você deve informar na tabela estes casos. Nestas situações você deve colocar o tempo de processamento como NaN, ou seja, valor faltante. De forma alguma você pode colocar o valor zero nestas situações. Utilize os conhecimentos adquiridos na disciplina de Ciência de Dados do semestre passado e faça um *plot* destes dados em um único gráfico.

Utilize os conhecimentos adquiridos na disciplina de Ciência de Dados do semestre passado e faça um *plot* destes dados em um único gráfico.

Em um documento, coloque a tabela, o gráfico e responda as seguintes perguntas:
**Em um documento, coloque a tabela, o gráfico e responda as seguintes perguntas**:

* Segundo o que discutimos em sala de aula, quais destes algoritmos são **ótimos**? Os resultado encontrados neste exercício são coerentes com está informação? Justifique a sua resposta.

Expand All @@ -118,7 +116,7 @@ Em um documento, coloque a tabela, o gráfico e responda as seguintes perguntas:

* Qual é o algoritmo que tem um tempo de processamento menor? Justifique a sua resposta.

Esta atividade é individual. O arquivo criado deve ser submetido no Blackboard. A atividade já está disponível no Blackboard e o prazo para entrega é até amanhã, dia **03/03/2024** (domingo) até às 23:30 horas.
Esta atividade é individual. O arquivo criado deve ser submetido no Blackboard. A atividade já está disponível no Blackboard e o prazo para entrega é até sexta, dia **30/08/2024** até às 23:30 horas.

## Rubrica de avaliação

Expand All @@ -130,19 +128,13 @@ Esta atividade é individual. O arquivo criado deve ser submetido no Blackboard.
| D | Submeteu um documento, mas o mesmo não responde todas as perguntas de forma correta e também não apresenta a tabela completa ou *plot*.|


<!--
## Comentários sobre os trabalhos entregues :new:
Pessoal, 
Depois de avaliar os trabalhos entregues por vocês, gostaria de fazer os seguintes comentários: 

* sempre é bom persistir os resultados das simulações. Desta maneira você ou outra pessoa não precisam re-executar novamente todos os experimentos. Para persistir os dados talvez a forma mais simples seja armazenando os dados em um CSV. 

* se você persistir os dados então você deve sempre enviar os dados junto com o relatório. Não adianta persistir os dados e não encaminhar eles junto com o relatório. 

* quando uma simulação não termina (por excesso de tempo ou estouro de memória) vocês não podem colocar zero para o tempo de processamento. Vocês devem sempre colocar algo como valor faltante (NA) ou outro indicador de que este dado não foi possível de ser gerado. 

Além disso, seguem três exemplos de plots bem formados e completos:
Seguem três exemplos de plots bem formados e completos:
<img src="figuras/esdras_convencional.png" width="800" height="600">
Expand All @@ -151,3 +143,5 @@ Além disso, seguem três exemplos de plots bem formados e completos:
<img src="figuras/laura.png" width="800" height="600">
Estes dois *plots* sumarizam muito os experimentos feitos. Principalmente o *plot* com escala logaritmica. Nele é possível perceber a diferença de tempo de processamento e também quando os algoritmos param de responder.
-->
9 changes: 5 additions & 4 deletions mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,10 @@ nav:
- 'aulas/01_introducao_ia/index.md'
- 'aulas/02_agentes_autonomos/index.md'
- 'aulas/03_configuracao/index.md'
# - 'Busca em espaço de estados':
# - 'aulas/04_modelagem/index.md'
# - 'aulas/04_x_buscas/index.md'
- 'Busca em espaço de estados':
- 'aulas/04_modelagem/index.md'
- 'aulas/04_modelagem_espaco/index.md'
- 'aulas/04_x_buscas/index.md'
# - 'aulas/04_x_modelagem/index.md'
## - 'aulas/05_busca_com_custo/index.md'
## # - 'aulas/05_x_busca_cega/index.md'
Expand Down Expand Up @@ -62,7 +63,7 @@ nav:
### - 'aulas/99_topicos/index.md'
- 'Referências':
- 'referencias/01_introducao/index.md'
# - 'referencias/03_algoritmos_busca/index.md'
- 'referencias/03_algoritmos_busca/index.md'
# - 'referencias/03_csp/index.md'
## - 'referencias/03_dijkstra/index.md'
# - 'referencias/04_busca_competitiva/index.md'
Expand Down

0 comments on commit 4ebd395

Please sign in to comment.