Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 4 additions & 5 deletions entornos_f.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ def simulador(entorno, agente, s, T=10, c=0):
@param agente: Un objeto de la clase Agente
@param s: Una tupla con un estado legal del entorno
@param T: Un int con el número de pasos a simular
@param c: Un flotante con el costo hasta s
@param c: Un flotante con el costo hasta s

@return: [(a_1, s_1, c_1), ..., (a_T, s_T, c_T)] una lista de tripletas con
la acción, estado y costo total en cada paso de simulación.
Expand All @@ -90,7 +90,7 @@ def simulador(entorno, agente, s, T=10, c=0):

return ([] + [(a, s_n, c + c_local)] if T <= 1 else
[(a, s_n, c + c_local)] + simulador(entorno, agente, s_n, T - 1, c + c_local))

def imprime_simulacion(historial, s_0):
"""
Imprime una secuencia generada por simulador
Expand All @@ -100,7 +100,7 @@ def imprime_simulacion(historial, s_0):

"""
print("\n\nSimulación, iniciando en el estado" +
str(s_0) + "\n")
str(s_0) + "\n")

print('Paso'.center(10) +
'Acción'.center(40) +
Expand All @@ -113,5 +113,4 @@ def imprime_simulacion(historial, s_0):
str(a_i).center(40) +
str(s_i).center(25) +
str(c_i).rjust(12))
print('_' * (10 + 40 + 25 + 15) + '\n\n')

print('_' * (10 + 40 + 25 + 15) + '\n\n')
121 changes: 119 additions & 2 deletions tarea_1.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,129 @@
Revisa el archivo README.md con las instrucciones de la tarea.

"""
__author__ = 'escribe_tu_nombre'
__author__ = 'Manuel Búsani Yanes'

import entornos_f
import entornos_o
from random import choice

# Requiere el modulo entornos_f.py o entornos_o.py
# Usa el modulo doscuartos_f.py para reutilizar código
# Agrega los modulos que requieras de python


class NueveCuartos(entornos_f.Entorno):
'''
acciones = ["ir_Derecha", "ir_Izquierda", "subir", "bajar", "limpiar", "nada"]

estados = [x, y, cuartos]

x es un número de 0 a 2 y representa la posición horizontal

y es un número de 0 a 2 y representa la posición vertical

cuartos es una lista de listas de booleanos donde los indices
con que se acceden representa el cuarto, e.g cuartos[0][0] es
el cuarto del primer piso en la izquierda, y el valor booleano
representa si está limpio o no, donde True significa limpio

'''
def accion_legal(self, estado, accion):
x = estado[0]
y = estado[1]

return ((x == 2 and y != 2) if accion == "subir" else
(x == 0 and y != 0) if accion == "bajar" else
accion in ["ir_Derecha", "ir_Izquierda", "limpiar", "nada"])

def transicion(self, estado, accion):
# no se si aqui hay que checar si la accion es legal
if not self.accion_legal(estado, accion):
raise ValueError("Error en transicion, la acción recibida no es legal")

x, y, cuartos = estado

tmp = [[True,True,True],[True,True,True],[True,True,True]]
c_local = (3 if ((accion == "subir") or (accion == "bajar")) else
2 if ((accion == "ir_Derecha") or (accion == "ir_Izquierda")) else
0 if ((accion == "nada") and (cuartos == tmp)) else 1)

if accion == "ir_Derecha":
if x != 2:
x = x+1
elif accion == "ir_Izquierda":
if x != 0:
x = x-1
elif accion == "subir":
y = y+1
elif accion == "bajar":
y = y-1
elif accion == "limpiar":
cuartos[x][y] = True

return ([x, y, cuartos], c_local)

def percepcion(self, estado):
x, y, cuartos = estado
return (x, y, cuartos[x][y])

class AgenteAleatorio(entornos_f.Agente):
"""
Un agente que solo regresa una accion al azar entre las acciones legales

"""
def __init__(self, acciones):
self.acciones = acciones

def programa(self, percepcion):
x = percepcion[0]
y = percepcion[1]

if (x != 2) or (y == 2):
self.acciones.remove("subir")
if (x != 0) or (y == 0):
self.acciones.remove("bajar")
salida = choice(self.acciones)

if (not "subir" in self.acciones):
self.acciones.append("subir")
if (not "bajar" in self.acciones):
self.acciones.append("bajar")

return salida

'''
class AgenteReactivoModeloNueveCuartos(entornos_f.Agente):
# Un agente reactivo basado en modelo

def __init__(self):
# Inicializa el modelo interno
self.modelo = [0, 0, [[False,False,False],[False,False,False],[False,False,False]]]

def programa(self, percepcion):
x, y, cuarto_limpio = percepcion
cuartos = self.modelo[2]

# Actualiza el modelo interno
self.modelo[0] = x
self.modelo[1] = y
self.modelo[2][x][y] = cuartoLimpio

# Decide sobre el modelo interno
return ("limpiar" if not cuartoLimpio else
"ir_Derecha" if ((x != 2) and (not cuartos[x+1][y]) or (x == 0) and (not(cuartos[2][y]))) else
"ir_Izquierda" if ((x != 0) and (not cuartos[x-1][y]) or (x == 2) and (not(cuartos[0][y]))) else
"subir" if ((x == 0) and (y != 2) and (cuartos[0] != [True, True, True])) else True)
'''
def prueba_nueve_cuartos(agente):
entornos_f.imprime_simulacion(
entornos_f.simulador(
NueveCuartos(),
agente,
[0,0,[[False,False,False],[False,False,False],[False,False,False]]],
300
),
[0,0,[[False,False,False],[False,False,False],[False,False,False]]]
)

if __name__ == "__main__":
prueba_nueve_cuartos(AgenteAleatorio(["ir_Derecha", "ir_Izquierda", "subir", "bajar", "limpiar", "nada"]))