-
Notifications
You must be signed in to change notification settings - Fork 51
/
doscuartos_o.py
131 lines (93 loc) · 3.42 KB
/
doscuartos_o.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
doscuartos.py.py
------------
Ejemplo de un entorno muy simple y agentes idem
"""
import entornos_o
from random import choice
__author__ = 'juliowaissman'
class DosCuartos(entornos_o.Entorno):
"""
Clase para un entorno de dos cuartos. Muy sencilla solo regrupa métodos.
El estado se define como (robot, A, B)
donde robot puede tener los valores "A", "B"
A y B pueden tener los valores "limpio", "sucio"
Las acciones válidas en el entorno son ("ir_A", "ir_B", "limpiar", "nada").
Todas las acciones son válidas en todos los estados.
Los sensores es una tupla (robot, limpio?)
con la ubicación del robot y el estado de limpieza
"""
def __init__(self, x0=["A", "sucio", "sucio"]):
"""
Por default inicialmente el robot está en A y los dos cuartos
están sucios
"""
self.x = x0[:]
self.desempeño = 0
def acción_legal(self, acción):
return acción in ("ir_A", "ir_B", "limpiar", "nada")
def transición(self, acción):
if not self.acción_legal(acción):
raise ValueError("La acción no es legal para este estado")
robot, a, b = self.x
if acción is not "nada" or a is "sucio" or b is "sucio":
self.desempeño -= 1
if acción is "limpiar":
self.x[" AB".find(self.x[0])] = "limpio"
elif acción is "ir_A":
self.x[0] = "A"
elif acción is "ir_B":
self.x[0] = "B"
def percepción(self):
return self.x[0], self.x[" AB".find(self.x[0])]
class AgenteAleatorio(entornos_o.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):
return choice(self.acciones)
class AgenteReactivoDoscuartos(entornos_o.Agente):
"""
Un agente reactivo simple
"""
def programa(self, percepción):
robot, situación = percepción
return ('limpiar' if situación == 'sucio' else
'ir_A' if robot == 'B' else 'ir_B')
class AgenteReactivoModeloDosCuartos(entornos_o.Agente):
"""
Un agente reactivo basado en modelo
"""
def __init__(self):
"""
Inicializa el modelo interno en el peor de los casos
"""
self.modelo = ['A', 'sucio', 'sucio']
def programa(self, percepción):
robot, situación = percepción
# Actualiza el modelo interno
self.modelo[0] = robot
self.modelo[' AB'.find(robot)] = situación
# Decide sobre el modelo interno
a, b = self.modelo[1], self.modelo[2]
return ('nada' if a == b == 'limpio' else
'limpiar' if situación == 'sucio' else
'ir_A' if robot == 'B' else 'ir_B')
def test():
"""
Prueba del entorno y los agentes
"""
print("Prueba del entorno con un agente aleatorio")
entornos_o.simulador(DosCuartos(),
AgenteAleatorio(['ir_A', 'ir_B', 'limpiar', 'nada']),
100)
print("Prueba del entorno con un agente reactivo")
entornos_o.simulador(DosCuartos(), AgenteReactivoDoscuartos(), 100)
print("Prueba del entorno con un agente reactivo con modelo")
entornos_o.simulador(DosCuartos(), AgenteReactivoModeloDosCuartos(), 100)
if __name__ == "__main__":
test()