From 615a76acca0608dd2536c16e3ae500d0d4653ac9 Mon Sep 17 00:00:00 2001 From: Piotr Rychlicki Date: Tue, 12 May 2020 22:10:52 +0000 Subject: [PATCH] funkcje dodatkowe do Piotrek.py --- pathfinding_tractor.py | 82 ++++++++++++++++++++++++++++++++++++++ pathfinding_tractorless.py | 68 +++++++++++++++++++++++++++++++ 2 files changed, 150 insertions(+) create mode 100644 pathfinding_tractor.py create mode 100644 pathfinding_tractorless.py diff --git a/pathfinding_tractor.py b/pathfinding_tractor.py new file mode 100644 index 0000000..72876d8 --- /dev/null +++ b/pathfinding_tractor.py @@ -0,0 +1,82 @@ +from queue import PriorityQueue +import time + +class pathfinding_tractor(): + def __init__(self): + pass + + def heuristic(self,a, b): + (x1, y1) = a + (x2, y2) = b + return abs(x1 - x2) + abs(y1 - y2) + + def points(self, point): + self.point = [] + for i in [[point[0],point[1]-1],[point[0]-1,point[1]],[point[0],point[1]+1],[point[0]+1,point[1]]]: + if i[0] in [-1,10] or i[1] in [-1,10]: + pass + else: + self.point.append(i) + return self.point + + def pathfinding_tractor(self,field,traktor,ui,pola_buraczane,i): + self.pola = pola_buraczane + self.ui = ui + self.traktor = traktor + self.start_position = [int(self.pola[i])%10,int(self.pola[i])//10] + # print(str(self.start_position)) + self.field = field + self.end_point = [int(self.pola[i+1])%10,int(self.pola[i+1])//10] + # print(str(self.end_point)) + + if self.start_position == self.end_point: + self.traktor.work() + else: + self.route = self.a_star(self.start_position,self.end_point) + for i in self.route[::-1]: + self.poz = self.traktor.get_poz() + if i[1]> self.poz[1]: + self.traktor.move_down() + elif i[1]< self.poz[1]: + self.traktor.move_up() + elif i[0]> self.poz[0]: + self.traktor.move_right() + elif i[0]< self.poz[0]: + self.traktor.move_left() + self.ui.update() + time.sleep(0.1) + self.traktor.work() + + + def a_star(self,start,end): + self.a_queue = PriorityQueue() + self.a_queue.put(start,0) + self.cost = {tuple(start): 0} + self.path_from = {tuple(start): None} + self.finall_path = [tuple(end)] + self.found = 0 + while not self.a_queue.empty(): + self.current = tuple(self.a_queue.get()) + + if self.current == tuple(end): + break + + for self.next in self.points(self.current): + self.new_cost = self.cost[tuple(self.current)] + self.field.get_value(self.next) + if tuple(self.next) not in self.cost or self.new_cost < self.cost[tuple(self.next)]: + self.cost[tuple(self.next)] = self.new_cost + self.priority = self.new_cost + self.heuristic(end, self.next) + self.a_queue.put(self.next,self.priority) + self.path_from[tuple(self.next)] = self.current + if self.next == end: + self.found = 1 + break + if self.found: + break + + self.pth = self.path_from[tuple(end)] + while not self.pth == tuple(start): + self.finall_path.append(self.pth) + self.pth = self.path_from[self.pth] + + return self.finall_path \ No newline at end of file diff --git a/pathfinding_tractorless.py b/pathfinding_tractorless.py new file mode 100644 index 0000000..e74af5c --- /dev/null +++ b/pathfinding_tractorless.py @@ -0,0 +1,68 @@ +from queue import PriorityQueue +import time + +class pathfinding_tractorless(): + def __init__(self): + pass + + def heuristic(self,a, b): + (x1, y1) = a + (x2, y2) = b + return abs(x1 - x2) + abs(y1 - y2) + + def points(self, point): + self.point = [] + for i in [[point[0],point[1]-1],[point[0]-1,point[1]],[point[0],point[1]+1],[point[0]+1,point[1]]]: + if i[0] in [-1,10] or i[1] in [-1,10]: + pass + else: + self.point.append(i) + return self.point + + def pathfinding_tractorless(self,field,pola_buraczane,i): + self.pola = pola_buraczane + self.start_position = [int(self.pola[i])%10,int(self.pola[i])//10] + # print(str(self.start_position)) + self.field = field + self.end_point = [int(self.pola[i+1])%10,int(self.pola[i+1])//10] + # print(str(self.end_point)) + + if self.start_position == self.end_point: + return 0 + else: + self.route = self.a_star(self.start_position,self.end_point) + return self.route + + + def a_star(self,start,end): + self.a_queue = PriorityQueue() + self.a_queue.put(start,0) + self.cost = {tuple(start): 0} + self.path_from = {tuple(start): None} + self.finall_path = [tuple(end)] + self.found = 0 + while not self.a_queue.empty(): + self.current = tuple(self.a_queue.get()) + + if self.current == tuple(end): + break + + for self.next in self.points(self.current): + self.new_cost = self.cost[tuple(self.current)] + self.field.get_value(self.next) + if tuple(self.next) not in self.cost or self.new_cost < self.cost[tuple(self.next)]: + self.cost[tuple(self.next)] = self.new_cost + self.priority = self.new_cost + self.heuristic(end, self.next) + self.a_queue.put(self.next,self.priority) + self.path_from[tuple(self.next)] = self.current + if self.next == end: + self.found = 1 + break + if self.found: + break + + self.pth = self.path_from[tuple(end)] + while not self.pth == tuple(start): + self.finall_path.append(self.pth) + self.pth = self.path_from[self.pth] + + return self.new_cost \ No newline at end of file