SZI-Smieciarka/astar.py

47 lines
1.6 KiB
Python
Raw Normal View History

2020-04-25 22:30:39 +02:00
import heapq
2020-04-25 23:03:25 +02:00
def heurystyka(obiekty, a, b):
heur = abs((b[0] - a[0])) + abs((b[1] - a[1]))
if obiekty["plansza"][b[0], b[1]].jestDomem is True:
heur += 2
return heur
2020-04-25 22:30:39 +02:00
2020-04-25 23:03:25 +02:00
def astar(obiekty, start, cel):
2020-04-25 22:30:39 +02:00
sasiedzi = [(0, 1), (0, -1), (1, 0), (-1, 0)]
close_set = set()
came_from = {}
gscore = {start: 0}
2020-04-25 23:03:25 +02:00
fscore = {start: heurystyka(obiekty, start, cel)}
2020-04-25 22:30:39 +02:00
oheap = []
2020-04-25 23:03:25 +02:00
dodatkowy_koszt = 0
2020-04-25 22:30:39 +02:00
heapq.heappush(oheap, (fscore[start], start))
while oheap:
current = heapq.heappop(oheap)[1]
if current == cel:
data = []
while current in came_from:
data.append(current)
current = came_from[current]
return data[::-1]
close_set.add(current)
for i, j in sasiedzi:
sasiad = current[0] + i, current[1] + j
2020-04-25 23:03:25 +02:00
2020-04-25 22:30:39 +02:00
if 14 < sasiad[0] or sasiad[0] < 0:
continue
elif 14 < sasiad[1] or sasiad[1] < 0:
continue
elif 6 <= sasiad[0] <= 7 and 10 <= sasiad[1] <= 11:
continue
2020-04-25 23:03:25 +02:00
tentative_g_score = gscore[current] + heurystyka(obiekty, current, sasiad)
2020-04-25 22:30:39 +02:00
if sasiad in close_set and tentative_g_score >= gscore.get(sasiad, 0):
continue
if tentative_g_score < gscore.get(sasiad, 0) or sasiad not in [i[1] for i in oheap]:
came_from[sasiad] = current
gscore[sasiad] = tentative_g_score
2020-04-25 23:03:25 +02:00
fscore[sasiad] = tentative_g_score + heurystyka(obiekty, sasiad, cel)
2020-04-25 22:30:39 +02:00
heapq.heappush(oheap, (fscore[sasiad], sasiad))
return False