diff --git a/ov9/program1.py b/ov9/program1.py index b419bf76a604ec4d28db41fdaeab52cbc4cbc7a2..4580ad2e1207933552edddb3c24dd556920393a3 100644 --- a/ov9/program1.py +++ b/ov9/program1.py @@ -1,4 +1,6 @@ import sys +from queue import PriorityQueue + class int_points (object): def __init__(self, id, type, name): @@ -21,10 +23,11 @@ class edges (object): self.speed = speed class results(object): - def __init__(self, node, time, visited, prev): + def __init__(self, node, total_time, visited, in_que, prev): self.node = node - self.time = time + self.total_time = total_time self.visited = visited + self.in_que = in_que self.prev = prev @@ -73,7 +76,11 @@ max_num = max(edge_arr,key=lambda item:item.time) res_arr = [] def init_table(): for i in range(num_of_nodes): - res_arr.append(results(i, max_num.time+1, False, None)) + res_arr.append(results(i, max_num.time+1, False, False, None)) + + + +print('prep done, files loaded to lists') # def rec_func(node, counter, global_fra, end_switch): # if not end_switch: @@ -93,82 +100,95 @@ def init_table(): # return rec_func(node, counter, global_fra, end_switch) -def rec_func2(node, counter, global_fra): +def rec_func2(node, global_fra): path=[] while node.node != global_fra: - counter +=node.time path.append(node.node) node = [a for a in res_arr if a.node == node.prev][0] path.append(node.node) - return counter,path + return path -def calculate_shortest_path(current_node, time, current_neighbour, slutt): - count_a = 0 - count_a, _ = rec_func2(current_neighbour, count_a, slutt) - count_b = 0 - count_b, _ = rec_func2(current_node, count_b, slutt) - count_b += time - if count_b < count_a: - return True - else: - return False +# def calculate_shortest_path(current_node, time, current_neighbour, slutt): +# count_a = 0 +# count_a, _ = rec_func2(current_neighbour, count_a, slutt) +# count_b = 0 +# count_b, _ = rec_func2(current_node, count_b, slutt) +# count_b += time +# if count_b < count_a: +# return True +# else: +# return False -def update_que(que): - tmp_arr = [a for a in res_arr if a.node in que] - tmp_arr.sort(key=lambda x: x.time, reverse=True) - que = [a.node for a in tmp_arr if a in tmp_arr] - return que +# def update_que(que): +# tmp_arr = [a for a in res_arr if a.node in que] +# tmp_arr.sort(key=lambda x: x.total_time, reverse=True) +# que = [a.node for a in tmp_arr if a in tmp_arr] +# return que -end_que = [] -queue = [] + + +end_que = PriorityQueue() +queue = PriorityQueue() we_soon_to_be_done = False -def dijkstras(slutt, fra, start): +def dijkstras(slutt, start): global we_soon_to_be_done global queue if we_soon_to_be_done: - end_que.pop(0) - current_node = [b for b in res_arr if b.node == fra][0] + tmp_que_item = end_que.get() + current_node = [b for b in res_arr if b.node == tmp_que_item][0] + else: + tmp_que_item = queue.get() + current_node = [b for b in res_arr if b.total_time == tmp_que_item and b.in_que][0] for tmp_edge in edge_arr: - if tmp_edge.fra == fra: + if tmp_edge.fra == current_node.node: current_neighbour = [a for a in res_arr if a.node == tmp_edge.til][0] - if current_neighbour.visited == False and current_neighbour.node not in queue: - current_neighbour.time = tmp_edge.time - current_neighbour.prev = fra + if not current_neighbour.visited and not current_neighbour.in_que: + current_neighbour.total_time = current_node.total_time + tmp_edge.time + current_neighbour.prev = current_node.node if tmp_edge.til == slutt: current_node.visited = True + current_node.in_que = False we_soon_to_be_done = True - end_que.append(tmp_edge.til) + end_que.put(tmp_edge.til) else: if tmp_edge.fra == slutt: - end_que.append(tmp_edge.til) + end_que.put(tmp_edge.til) else: - queue.append(tmp_edge.til) + current_neighbour.in_que = True + queue.put(current_neighbour.total_time) elif current_neighbour.node != start: - if calculate_shortest_path(current_node, tmp_edge.time, current_neighbour, start): - current_neighbour.time = tmp_edge.time - current_neighbour.prev = tmp_edge.fra - if we_soon_to_be_done and not len(end_que): - #not finished + if current_node.total_time + tmp_edge.time < current_neighbour.total_time: + index_in_que = queue.queue.index(current_neighbour.total_time) + current_neighbour.total_time = tmp_edge.time + current_node.total_time + current_neighbour.prev = current_node.node + queue.queue[index_in_que] = current_neighbour.total_time + + if we_soon_to_be_done and end_que.empty(): end_node = [b for b in res_arr if b.node == slutt][0] - total_time = 0 - total_time,travel_arr = rec_func2(end_node, total_time, start) + travel_arr = rec_func2(end_node, start) travel_arr = reversed(travel_arr) - print(f'total time: {total_time}\nshortest path: {"->".join(str(v) for v in travel_arr)}') + print(f'total time: {end_node.total_time}\nshortest path: {"->".join(str(v) for v in travel_arr)}') + count = 0 + for i in res_arr: + if i.total_time != max_num.time +1: + count +=1 + print('total nodes added to map: ', count) exit() else: if we_soon_to_be_done: current_node.visited = True - dijkstras(slutt,end_que[0],start) + current_node.in_que = False + dijkstras(slutt,start) else: - queue.pop(0) current_node.visited = True - queue = update_que(queue) - dijkstras(slutt,queue[0],start) + current_node.in_que = False + #queue = update_que(queue) + dijkstras(slutt,start) @@ -178,12 +198,13 @@ def init_things(): if sys.argv[1] == '-d': #node_id start = 20 - slutt = 25 + slutt = 30 init_table() - queue.append(start) - start_node = [a for a in res_arr if a.node == start][0] - start_node.time = 0 - dijkstras(slutt, start, start) + queue.put(0) + start_node = next(a for a in res_arr if a.node == start) + start_node.total_time = 0 + start_node.in_que = True + dijkstras(slutt, start) elif sys.argv[1] == '-a': print('A* not yet implemented') else: diff --git a/ov9/test_files/set_test.py b/ov9/test_files/set_test.py index 0da8ebe4e0c56467c4b282c45465e9f6ce41611e..ec5a2901e9c61f9b155ac0f882fbe18444bc9256 100644 --- a/ov9/test_files/set_test.py +++ b/ov9/test_files/set_test.py @@ -1,4 +1,6 @@ import sys +from queue import PriorityQueue + class int_points (object): def __init__(self, id, type, name): @@ -21,10 +23,11 @@ class edges (object): self.speed = speed class results(object): - def __init__(self, node, total_time, visited, prev): + def __init__(self, node, total_time, visited, in_que, prev): self.node = node self.total_time = total_time self.visited = visited + self.in_que = in_que self.prev = prev @@ -73,7 +76,11 @@ max_num = max(edge_arr,key=lambda item:item.time) res_arr = [] def init_table(): for i in range(num_of_nodes): - res_arr.append(results(i, max_num.time+1, False, None)) + res_arr.append(results(i, max_num.time+1, False, False, None)) + + + +print('prep done, files loaded to lists') # def rec_func(node, counter, global_fra, end_switch): # if not end_switch: @@ -116,59 +123,72 @@ def rec_func2(node, global_fra): -def update_que(que): - tmp_arr = [a for a in res_arr if a.node in que] - tmp_arr.sort(key=lambda x: x.total_time, reverse=True) - que = [a.node for a in tmp_arr if a in tmp_arr] - return que +# def update_que(que): +# tmp_arr = [a for a in res_arr if a.node in que] +# tmp_arr.sort(key=lambda x: x.total_time, reverse=True) +# que = [a.node for a in tmp_arr if a in tmp_arr] +# return que -end_que = [] -queue = [] +end_que = PriorityQueue() +queue = PriorityQueue() we_soon_to_be_done = False -def dijkstras(slutt, fra, start): +def dijkstras(slutt, start): global we_soon_to_be_done global queue if we_soon_to_be_done: - end_que.pop(0) - current_node = [b for b in res_arr if b.node == fra][0] + tmp_que_item = end_que.get() + current_node = [b for b in res_arr if b.node == tmp_que_item][0] + else: + tmp_que_item = queue.get() + current_node = [b for b in res_arr if b.total_time == tmp_que_item and b.in_que][0] for tmp_edge in edge_arr: - if tmp_edge.fra == fra: + if tmp_edge.fra == current_node.node: current_neighbour = [a for a in res_arr if a.node == tmp_edge.til][0] - if current_neighbour.visited == False and current_neighbour.node not in queue: + if not current_neighbour.visited and not current_neighbour.in_que: current_neighbour.total_time = current_node.total_time + tmp_edge.time current_neighbour.prev = current_node.node if tmp_edge.til == slutt: current_node.visited = True + current_node.in_que = False we_soon_to_be_done = True - end_que.append(tmp_edge.til) + end_que.put(tmp_edge.til) else: if tmp_edge.fra == slutt: - end_que.append(tmp_edge.til) + end_que.put(tmp_edge.til) else: - queue.append(tmp_edge.til) + current_neighbour.in_que = True + queue.put(current_neighbour.total_time) elif current_neighbour.node != start: - if current_node.total_time + tmp_edge.time < current_neighbour.total_time: - current_neighbour.total_time = tmp_edge.time + current_node.total_time - current_neighbour.prev = current_node.node - if we_soon_to_be_done and not len(end_que): - #not finished + if current_node.total_time + tmp_edge.time < current_neighbour.total_time: + index_in_que = queue.queue.index(current_neighbour.total_time) + current_neighbour.total_time = tmp_edge.time + current_node.total_time + current_neighbour.prev = current_node.node + queue.queue[index_in_que] = current_neighbour.total_time + + if we_soon_to_be_done and end_que.empty(): end_node = [b for b in res_arr if b.node == slutt][0] travel_arr = rec_func2(end_node, start) travel_arr = reversed(travel_arr) print(f'total time: {end_node.total_time}\nshortest path: {"->".join(str(v) for v in travel_arr)}') + count = 0 + for i in res_arr: + if i.total_time != max_num.time +1: + count +=1 + print('total nodes added to map: ', count) exit() else: if we_soon_to_be_done: current_node.visited = True - dijkstras(slutt,end_que[0],start) + current_node.in_que = False + dijkstras(slutt,start) else: - queue.pop(0) current_node.visited = True - queue = update_que(queue) - dijkstras(slutt,queue[0],start) + current_node.in_que = False + #queue = update_que(queue) + dijkstras(slutt,start) @@ -180,10 +200,11 @@ def init_things(): start = 20 slutt = 30 init_table() - queue.append(start) - start_node = [a for a in res_arr if a.node == start][0] + queue.put(0) + start_node = next(a for a in res_arr if a.node == start) start_node.total_time = 0 - dijkstras(slutt, start, start) + start_node.in_que = True + dijkstras(slutt, start) elif sys.argv[1] == '-a': print('A* not yet implemented') else: