4.0 KiB
Sztuczna Inteligencja - Raport Route Planning
Członkowie zespołu: Marcin Kwapisz, Kamila Matysiak, Piotr Rychlicki, Justyna Zarzycka
Temat projektu: Inteligentny Traktor
klawisz B - uruchomienie automatycznego znajdowania ścieżki dla jednego z trybów pracy:
- 1 - podlewanie
- 2 - odchwaszczanie
- 3 - sadzenie
- 4 - zbieranie
W celu zaplanowania ruchu agenta na kracie wykorzystano schemat procedury przeszukiwania grafu stanów z uwzględnieniem kosztu. Zaimplementowano strategię A*, czyli funkcję wyznaczającą priorytet następników, uwzględniającą zarówno koszt, jak i odpowiednią heurystykę. Poniżej przedstawiono poszczególne fragmenty kodu, kluczowe dla działania całej procedury.
Pętla główna strategii przeszukiwania
- sprawdzenie aktualnego trybu pracy traktora:
if activity == 0:
avaiable_value = [0,1,2,3]
elif activity == 1:
avaiable_value = [1,3,5,7]
elif activity == 2:
avaiable_value = [0,1,4,5]
elif activity == 3:
avaiable_value = [8]
- ustalenie pozycji startowej
- sprawdzenie czy pozycja startowa równa się pożądanej pozyzji końcowej
- jeżeli nie, ustalenie w którą stronę poruszy się traktor:
if start_position == end_point:
work([int(((config.TRAKTOR_POZ[1]-5)/70)-1), int(((config.TRAKTOR_POZ[0]-5)/70)-1)])
else:
route = a_star(start_position,end_point)
for i in route[::-1]:
poz = [int(((config.TRAKTOR_POZ[1]-5)/70)-1), int(((config.TRAKTOR_POZ[0]-5)/70)-1)]
if i[0]> poz[0]:
move_down()
elif i[0]< poz[0]:
move_up()
elif i[1]> poz[1]:
move_right()
elif i[1]< poz[1]:
move_left()
pygame.display.update()
time.sleep(2)
work([int(((config.TRAKTOR_POZ[1]-5)/70)-1), int(((config.TRAKTOR_POZ[0]-5)/70)-1)])
- funkcja A* - jest to algorytm, którego zadaniem jest znalezienie najkrótszej trasy dla traktora:
def a_star(start, end):
a_queue = PriorityQueue()
a_queue.put(start,0)
cost = {tuple(start): 0}
path_from = {tuple(start): None}
finall_path = [tuple(end)]
found = 0
while not a_queue.empty():
current = tuple(a_queue.get())
if current == tuple(end):
break
for next in points(current):
new_cost = cost[tuple(current)] + int(config.POLE_STAN[next[0],next[1]])
if tuple(next) not in cost or new_cost < cost[tuple(next)]:
cost[tuple(next)] = new_cost
priority = new_cost + heuristic(end, next)
a_queue.put(next,priority)
path_from[tuple(next)] = current
if next == end:
found = 1
break
if found:
break
pth = path_from[tuple(end)]
while not pth==tuple(start):
finall_path.append(pth)
pth = path_from[pth]
return finall_path
Funkcja następnika
for next in points(current):
new_cost = cost[tuple(current)] + int(config.POLE_STAN[next[0],next[1]])
if tuple(next) not in cost or new_cost < cost[tuple(next)]:
cost[tuple(next)] = new_cost
priority = new_cost + heuristic(end, next)
a_queue.put(next,priority)
path_from[tuple(next)] = current
if next == end:
found = 1
break
if found:
break
Heurystyka
Heurystyka to oszacowany dystans między punktem początkowym (aktualnym położeniem agenta na planszy) a punktem końcowym (celem). Wylicza się ją za pomocą różnic między współrzędnymi (agenta i celu) w pionie i poziomie, a następnie podstawienia ich do prostego wzoru Pitagorasa. Krótko mówiąc, za pomocą heurystyki można wstępnie szacować koszt dotarcia do celu z akutualnego położenia traktora na planszy.
def heuristic(a, b):
(x1, y1) = a
(x2, y2) = b
return abs(x1 - x2) + abs(y1 - y2)