-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.py
118 lines (87 loc) · 3.73 KB
/
main.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
import soko
import sys
from State import State
from tree import Tree, Node
import algorithms
import utils
import time
# Definir el tamaño de la ventana y el tamaño de la celda
ANCHO = 550
ALTO = 550
TAMANO_CELDA = 30
def cargar_niveles (ruta_archivo):
"""
Recibe la ruta de un archivo y devuelve una lista de listas, donde cada sublista es un nivel
"""
max_longitud_fila = 0
with open (ruta_archivo) as archivo:
total_niveles = archivo.readlines()
nivel = []
niveles = []
for fila in total_niveles:
fila = fila[:-1]
if not "#" in fila and fila != "":
continue
if fila == "":
for i in range (len(nivel)):
nivel[i] += (" " * (max_longitud_fila - len(nivel[i])))
niveles.append(nivel)
nivel = []
max_longitud_fila = 0
continue
if len(fila) > max_longitud_fila:
max_longitud_fila = len(fila)
nivel.append(fila)
return niveles
def start(*args):
if args:
level, method, heuristic = args
else:
# Si no se pasan argumentos directamente, lee los argumentos de la línea de comandos
parsed_args = utils.readCommand(sys.argv)
level, method, heuristic = parsed_args.values()
heuristicFunction = algorithms.manhattan_heuristic
if heuristic == "combined":
heuristicFunction = algorithms.combined_heuristic
levels = cargar_niveles("niveles.txt")
board = soko.crear_grilla(levels[level])
(boardMatrix, playerPos, goalsPos, boxesPos) = utils.sanitize_level(board)
initialState = State(playerPos, boxesPos, goalsPos)
# Registrar el tiempo de inicio
start = time.time()
path = []
cost = 0
exploredNodes = []
frontierNodes = []
if method == 'bfs':
path, cost, exploredNodes, frontierNodes = algorithms.bfs(initialState, boardMatrix)
elif method == 'dfs':
path, cost, exploredNodes, frontierNodes = algorithms.dfs(initialState, boardMatrix)
elif method == 'greedy':
path, cost, exploredNodes, frontierNodes = algorithms.greedy(initialState, boardMatrix, heuristicFunction)
elif method == 'astar':
path, cost, exploredNodes, frontierNodes = algorithms.astar(initialState, boardMatrix, heuristicFunction)
# Registrar el tiempo de finalización
end = time.time()
original_stdout = sys.stdout
# Abrir un archivo para escribir
with open('output.txt', 'w') as f:
# Redirigir la salida estándar al archivo
sys.stdout = f
for node in path:
node.state.print_board(soko.regenerate(board, node.state.playerPos, node.state.goalsPos, node.state.boxesPos))
print()
sys.stdout = original_stdout
delta = end - start
return {'path': path, 'level': level, 'method': method, 'heuristic': heuristic, 'cost': cost, 'exploredNodes': exploredNodes, 'frontierNodes': frontierNodes, 'delta': delta}
if __name__ == "__main__":
results = start()
print('\nResultados' if results['path'] != 1 else '\nResult: Couldn\'t find solution\n')
print('Se recorrio el nivel: ' + str(results['level']))
print('Se utilizo el metodo: ' + results['method'])
if results['method'] == 'greedy' or results['method'] == 'astar':
print('Con la heuristica: ' + results['heuristic'])
print('El costo de la solución fue: ' + str(results['cost']))
print('Los nodos explorados fueron: ' + str(results['exploredNodes']))
print('La cantidad de nodos fueron: ' + str(results['frontierNodes']))
print('El tiempo fue: %.3f' % results['delta'] + ' seg')