Implementação do Mundo do Aspirador
Baixar o código-fonte Python
from aigyminsper.search.search_algorithms import BuscaProfundidadeIterativa, AEstrela
from aigyminsper.search.graph import State
import numpy
import sys
# Importa as bibliotecas necessárias.
# Este exemplo utiliza a classe base State e algoritmos de busca compatíveis.
class VacuumWorldGeneric(State):
def __init__(self, mapa, lin, col, op):
"""Inicializa o estado do mundo do aspirador.
mapa: uma matriz binária NumPy retangular que representa o mapa
ex: [[0, 1, 1, 1],
[0, 0, 1, 1]
[1, 1, 1, 1]]
observação: é uma matriz NumPy, não uma lista de listas.
lin: posição horizontal do agente (linha)
col: posição vertical do agente (coluna)
op: operação que levou ao estado atual
ex.: se o agente moveu para a esquerda, op = 'esq'.
"""
super().__init__(op)
self.mapa = mapa
self.lin_max = self.mapa.shape[0]-1 # Linha máxima que o agente pode alcançar
self.col_max = self.mapa.shape[1]-1 # Coluna máxima que o agente pode alcançar
self.lin = lin
self.col = col
def successors(self):
"""Retorna os estados produzidos por cada movimento ou limpeza válida."""
sucessors = []
# Move para a esquerda
if self.col - 1 >= 0:
new = self.mapa.copy()
sucessors.append(VacuumWorldGeneric(new, self.lin, self.col-1, 'esq'))
# Move para a direita
if self.col + 1 <= self.col_max:
new = self.mapa.copy()
sucessors.append(VacuumWorldGeneric(new, self.lin, self.col+1, 'dir'))
# Move para cima
if self.lin - 1 >=0:
new = self.mapa.copy()
sucessors.append(VacuumWorldGeneric(new, self.lin-1, self.col, 'cima'))
# Move para baixo
if self.lin + 1 <= self.lin_max:
new = self.mapa.copy()
sucessors.append(VacuumWorldGeneric(new, self.lin+1, self.col, 'baixo'))
# Limpa o cômodo atual
if self.mapa[self.lin][self.col] == 1:
new = self.mapa.copy()
new[self.lin][self.col] = 0
sucessors.append(VacuumWorldGeneric(new, self.lin, self.col, 'limpar'))
return sucessors
def is_goal(self):
"""Retorna se todos os cômodos do mapa estão limpos."""
for y in self.mapa:
for x in y:
if x != 0:
return False
return True
def h(self):
"""Estima o trabalho restante contando os cômodos sujos."""
count = 0
for y in self.mapa:
for x in y:
if x != 0:
count = count + 1
return count
def description(self):
"""Descreve o problema representado por este estado."""
return "Agente genérico para o problema do aspirador de pó"
def cost(self):
"""Atribui custo unitário às ações de movimento e limpeza."""
return 1
def env(self):
"""Identifica o estado pelo mapa e pela posição do agente."""
return str(self.mapa)+" "+str(self.lin)+" "+str(self.col)
def convert_file_to_map(file_map_path):
"""Converte um arquivo separado por ponto e vírgula em uma matriz NumPy."""
return numpy.loadtxt(open(file_map_path, "rb"), delimiter=";")
def main(file_map_path, lin, col):
mapa = convert_file_to_map(file_map_path)
print(mapa)
# Cria o estado inicial
state = VacuumWorldGeneric(mapa, lin, col, '')
#print('Busca em AEstrela')
algorithm = AEstrela()
print('Busca Profundidade Iterativa')
# Cria o objeto do algoritmo de busca
# algorithm = BuscaProfundidadeIterativa()
# Executa a busca
result = algorithm.search(state, trace=True)
if result != None:
print('Achou!')
print(result.show_path())
else:
print('Nao achou solucao')
if __name__ == '__main__':
main(sys.argv[1], int(sys.argv[2]), int(sys.argv[3]))