-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcsp_robots_defensivos_secretos.py
107 lines (80 loc) · 2.71 KB
/
csp_robots_defensivos_secretos.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
"""
Robots defensivos secretos. (continúa…)
Luego del último ataque, se decidió incrementar el número de robots a 6, y ya no
permanecerán almacenados, sino que se ubicarán en posiciones defensivas fijas y
permanentes.
Pero deben respetarse algunas restricciones:
- No puede haber dos robots en la misma habitación, generarían demasiadas molestias para
los científicos.
- No puede haber dos robots en habitaciones adyacentes, impedirían demasiado la
circulación.
- Las habitaciones restringidas siguen sin poder contener robots.
- Las dos habitaciones que poseen puertas al exterior deben contener un robot.
------+-----+-----+-----+-----+
| | | X | | P |
------+-----+-----+-----+-----+
| | | | X | |
------+-----+-----+-----+-----+
| | X | | | |
------+-----+-----+-----+-----+
| | | P | | |
------+-----+-----+-----+-----+
X: Habitación no accesible por los Robots
P: Ubicación de las puertas
"""
from itertools import combinations
from simpleai.search import (
CspProblem,
backtrack,
min_conflicts,
MOST_CONSTRAINED_VARIABLE,
HIGHEST_DEGREE_VARIABLE,
LEAST_CONSTRAINING_VALUE,
)
from simpleai.search.csp import convert_to_binary
from utils import print_grid
ROWS = 4
COLUMNS = 5
RESTRICTED_AREAS = [(0, 2), (1, 3), (2, 1)]
DOORS = [(0, 4), (3, 2)]
VARIABLES = [f"R{x}" for x in range(6)]
ALL_ROOMS = [
(row, column)
for row in range(ROWS)
for column in range(COLUMNS)
]
NON_RESTRICTED_ROOMS = [room for room in ALL_ROOMS if room not in RESTRICTED_AREAS]
DOMAINS = {robot: NON_RESTRICTED_ROOMS for robot in VARIABLES}
CONSTRAINTS = []
def no_adjacent_nor_same_room(variables, values):
(row_robot_a, column_robot_a), (row_robot_b, column_robot_b) = values
manhattan_distance = (
abs(row_robot_a - row_robot_b)
+ abs(column_robot_a - column_robot_b)
)
return manhattan_distance > 1
for two_variables in combinations(VARIABLES, 2):
CONSTRAINTS.append((two_variables, no_adjacent_nor_same_room))
def robots_in_door(variables, values):
for door in DOORS:
if not door in values:
return False
return True
CONSTRAINTS.append((VARIABLES, robots_in_door))
def print_result(result):
elements = {
"D": DOORS,
"X": RESTRICTED_AREAS,
}
for robot, position in result.items():
elements[robot] = [position]
print_grid(ROWS, COLUMNS, elements)
if __name__ == "__main__":
problem = CspProblem(VARIABLES, DOMAINS, CONSTRAINTS)
print("MIN CONFLICTS")
result = min_conflicts(problem, iterations_limit=100)
print_result(result)
print("-"* 50)
print("BACKTRACKING")
result = backtrack(problem)
print_result(result)