diff --git a/ov9/program1.py b/ov9/program1.py index 4580ad2e1207933552edddb3c24dd556920393a3..591198a5f4b0eb43e35e001043a4df29fba901f0 100644 --- a/ov9/program1.py +++ b/ov9/program1.py @@ -78,28 +78,8 @@ def init_table(): for i in range(num_of_nodes): 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: -# counter += node.time -# if node.node == global_fra: -# return counter -# else: -# node = [a for a in res_arr if a.node == node.prev][0] -# return rec_func(node, counter, global_fra, end_switch) -# elif end_switch: -# counter += node.time -# path.append(node.node) -# if node.node == global_fra: -# return counter, path -# else: -# node = [a for a in res_arr if a.node == node.prev][0] -# return rec_func(node, counter, global_fra, end_switch) - - def rec_func2(node, global_fra): path=[] while node.node != global_fra: @@ -109,86 +89,72 @@ def rec_func2(node, global_fra): 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 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 = PriorityQueue() queue = PriorityQueue() we_soon_to_be_done = False def dijkstras(slutt, start): global we_soon_to_be_done global queue - if we_soon_to_be_done: - 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 == current_node.node: - current_neighbour = [a for a in res_arr if a.node == tmp_edge.til][0] - 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.put(tmp_edge.til) - else: - if tmp_edge.fra == slutt: + node_count= 0 + while queue or not end_que.empty: + node_count +=1 + if node_count % 100 == 0: + print(node_count) + if we_soon_to_be_done: + 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] + + if current_node.total_time == 422488: + print('ye', node_count) + for tmp_edge in edge_arr: + if tmp_edge.fra == current_node.node: + current_neighbour = [a for a in res_arr if a.node == tmp_edge.til][0] + 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.put(tmp_edge.til) else: - 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: - 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 - current_node.in_que = False - dijkstras(slutt,start) + if tmp_edge.fra == slutt: + end_que.put(tmp_edge.til) + else: + 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: + old_time = current_neighbour.total_time + current_neighbour.total_time = tmp_edge.time + current_node.total_time + current_neighbour.prev = current_node.node + if old_time in queue.queue: + index_in_que = queue.queue.index(old_time) + queue.queue[index_in_que] = current_neighbour.total_time + + if we_soon_to_be_done and end_que.empty(): + print('Done mapping, calcualting result') + 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) + break else: - current_node.visited = True - current_node.in_que = False - #queue = update_que(queue) - dijkstras(slutt,start) + if we_soon_to_be_done: + current_node.visited = True + current_node.in_que = False + else: + current_node.visited = True + current_node.in_que = False @@ -198,7 +164,7 @@ def init_things(): if sys.argv[1] == '-d': #node_id start = 20 - slutt = 30 + slutt = 400 init_table() queue.put(0) start_node = next(a for a in res_arr if a.node == start)