65 lines
1.9 KiB
Python
Executable File
65 lines
1.9 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
#f score is the sum of the cost to reach that node and the heuristic value of that node.
|
|
import config
|
|
from Node import *
|
|
import numpy as np
|
|
from PriorityQueue import *
|
|
|
|
def chunks(l, n):
|
|
return [l[i:i+n] for i in range(0, len(l), n)]
|
|
|
|
def print_recc(f, elem):
|
|
if (elem.child):
|
|
print_recc(f, elem.child)
|
|
print(np.matrix(chunks(elem.grid, elem.sqrt)))
|
|
print()
|
|
f.write(' '.join(['{: >2}'.format(x) for x in elem.grid]))
|
|
f.write('\n')
|
|
|
|
def print_for_visu(process):
|
|
f = open("test/visu.txt", "w")
|
|
print_recc(f, process)
|
|
f.close()
|
|
|
|
def a_star_impl(grid, goal, heuristic_ptr):
|
|
heuristic_ptr= config.heuristic_fn
|
|
start = Node(h = heuristic_ptr(grid), empty_case_index = grid.index(0), grid = grid)
|
|
open_set = PriorityQueue()
|
|
closed_set = PriorityQueue()
|
|
open_set.put(start)
|
|
time_complexity = 0
|
|
size_complexity = 1
|
|
|
|
while open_set:
|
|
process = open_set.get()
|
|
if process.h is 0 or process.grid is goal:
|
|
print("Ordered Sequence:")
|
|
print_for_visu(process)
|
|
print("Number of moves: {}\n"
|
|
"Time Complexity: {}\n"
|
|
"Size Complexity: {}"
|
|
.format(process.g, time_complexity, size_complexity))
|
|
return
|
|
closed_set.put(process)
|
|
process.set_parent()
|
|
for node in process.parents:
|
|
in_close = node.grid in [x.grid for (p, x) in closed_set.elements]
|
|
in_open = node.grid in [x.grid for (p, x) in open_set.elements]
|
|
|
|
if in_close:
|
|
continue
|
|
new_g = process.g + 1
|
|
|
|
if not in_open:
|
|
node.g = new_g
|
|
open_set.put(node)
|
|
size_complexity += 1
|
|
else:
|
|
if (node.g > new_g):
|
|
node.g = new_g
|
|
|
|
node.f = config.calc_fScore(node.h, node.g)
|
|
time_complexity += 1
|
|
raise ValueError('No Path Found')
|