-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
6 changed files
with
287 additions
and
22 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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? |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
69
docs/aulas/04_modelagem_espaco/src/robo_aspirador_quadrado.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
116
docs/aulas/04_modelagem_espaco/src/robo_aspirador_quadrado_poltrona.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters