diff --git a/ov9/test_files/bensin.csv b/ov9/test_files/bensin.csv new file mode 100644 index 0000000000000000000000000000000000000000..e21432bc524d3f6ceabf63a1f0c014151c5c495f --- /dev/null +++ b/ov9/test_files/bensin.csv @@ -0,0 +1,10 @@ +63.8813596,-16.6455209 +63.9903364,-16.8955556 +63.7945675,-18.0385077 +64.313597,-15.2297097 +64.2502585,-15.1949877 +63.4175347,-18.9933282 +63.4179445,-19.0012901 +64.6561578,-14.2858315 +63.7515328,-20.2356732 +64.1971287,-19.2852893 diff --git a/ov9/test_files/path.csv b/ov9/test_files/path.csv new file mode 100644 index 0000000000000000000000000000000000000000..45c3cb3156def97bb6e1cc9b8a9fae47865a07c0 --- /dev/null +++ b/ov9/test_files/path.csv @@ -0,0 +1,93 @@ +63.9080694,-16.7247592 +63.9058785,-16.7175168 +63.9053932,-16.7164037 +63.8984011,-16.7045815 +63.8958595,-16.7006431 +63.8788854,-16.6651085 +63.8792685,-16.6591009 +63.8794908,-16.6573676 +63.8795259,-16.657084 +63.8799829,-16.6536394 +63.8809548,-16.6463462 +63.8810457,-16.6441901 +63.8807691,-16.6417122 +63.8970268,-16.6095471 +63.8999179,-16.6034102 +63.9015935,-16.5988398 +63.9023605,-16.5962541 +63.9032713,-16.5926439 +63.9041303,-16.5883577 +63.9049538,-16.5836906 +63.9064261,-16.575349 +63.9064199,-16.5751942 +63.9085433,-16.5630039 +63.9097247,-16.5562989 +63.9097825,-16.5559677 +63.9110282,-16.5486619 +63.9149785,-16.5261211 +63.9150235,-16.5258561 +63.9169339,-16.5148584 +63.9186839,-16.5090143 +63.9368728,-16.435842 +63.9370849,-16.4352787 +63.9375038,-16.4342226 +63.9377556,-16.4335838 +63.9670962,-16.421953 +63.9671789,-16.4219303 +63.9702458,-16.4210221 +63.970349,-16.4209937 +63.9728414,-16.4202795 +63.9886289,-16.3949099 +63.9980515,-16.3778152 +63.9983779,-16.377229 +63.999214,-16.3757345 +64.0038366,-16.3682666 +64.0049154,-16.3666422 +64.0082142,-16.36195 +64.0134973,-16.3554615 +64.0333107,-16.2947833 +64.038132,-16.2753317 +64.0408405,-16.2271325 +64.0414318,-16.210348 +64.0419552,-16.2030044 +64.0442611,-16.188184 +64.0447244,-16.1853663 +64.045077,-16.18327 +64.0452331,-16.1823756 +64.0459113,-16.1782831 +64.046234,-16.1763095 +64.0467697,-16.1734513 +64.0468423,-16.1730869 +64.0775564,-16.1095094 +64.1013533,-16.0985618 +64.1042143,-16.0972793 +64.1104545,-16.0925534 +64.1148614,-16.086098 +64.1151636,-16.0855979 +64.1159302,-16.0843098 +64.1178375,-16.0810708 +64.1182334,-16.0803977 +64.1283951,-16.0631721 +64.1307222,-16.0574631 +64.1294137,-16.0268267 +64.1308707,-16.0190398 +64.1377904,-15.9788655 +64.1391655,-15.9750754 +64.1478335,-15.9590389 +64.157832,-15.9382984 +64.1581111,-15.9375419 +64.1582809,-15.9370867 +64.1588947,-15.9354365 +64.1592013,-15.9346244 +64.1625567,-15.9256263 +64.1687298,-15.9088622 +64.1752083,-15.8885745 +64.175332,-15.8877376 +64.1774706,-15.8752666 +64.1782483,-15.8705538 +64.1784346,-15.868437 +64.1788698,-15.8526315 +64.1788447,-15.8512749 +64.1788146,-15.8506283 +64.1785192,-15.8476394 +64.1782867,-15.8352699 diff --git a/ov9/test_files/set_test.py b/ov9/test_files/set_test.py index ec5a2901e9c61f9b155ac0f882fbe18444bc9256..ade277aff1e93e274f158afb0e29d93f41c5ed97 100644 --- a/ov9/test_files/set_test.py +++ b/ov9/test_files/set_test.py @@ -1,6 +1,6 @@ import sys from queue import PriorityQueue - +import timeit class int_points (object): def __init__(self, id, type, name): @@ -32,45 +32,51 @@ class results(object): #prep nodes +node_arr = [] +start = timeit.default_timer() with open('./noder.txt','r') as file: - node_file = file.read() + for i in file: + i = i.split() + if len(i) == 1: + num_of_nodes = int(i[0]) + else: + node_arr.append(nodes(int(i[0]), float(i[1]), float(i[2]))) -node_file = node_file.split() -num_of_nodes = int(node_file[0]) -node_file.pop(0) +slutt = timeit.default_timer() +print('nodes loaded correct in: ', slutt - start) -node_arr = [] -for i in range(0, len(node_file), 3): - #nodenr breddegrad lengdegrad - node_arr.append(nodes(int(node_file[i]), float(node_file[i+1]), float(node_file[i+2]))) +edge_arr = [] #prep edges +start = timeit.default_timer() with open('./kanter.txt','r') as file: - edge_file = file.read() - -edge_file = edge_file.split() -num_of_edges = int(edge_file[0]) -edge_file.pop(0) + for i in file: + i = i.split() + if len(i) == 1: + num_of_edges= int(i[0]) + else: + edge_arr.append(edges(int(i[0]), int(i[1]), int(i[2]), int(i[3]), int(i[4]))) + +slutt = timeit.default_timer() +print('edges loaded correct in: ', slutt - start) -edge_arr = [] -for i in range(0, len(edge_file), 5): - #franode tilnode kjøretid lengde fartsgrense - edge_arr.append(edges(int(edge_file[i]), int(edge_file[i+1]), int(edge_file[i+2]), int(edge_file[i+3]), int(edge_file[i+4]))) #prep intresting -with open('./interessepkt.txt','r') as file: - intresting_file = file.read() - -intresting_file = intresting_file.split('\n') -num_of_intresting = int(intresting_file[0]) -intresting_file.pop(0) - intresting_arr = [] -for i in range(len(intresting_file)): - #nodenr kode "Navn på stedet" - tmp_values = intresting_file[i].split() - intresting_arr.append(int_points(int(tmp_values[0]), int(tmp_values[1]), ' '.join(tmp_values[2:]))) - +start = timeit.default_timer() +with open('./interessepkt.txt','r') as file: + for i in file: + i = i.split() + if len(i) == 1: + num_of_intresting= int(i[0]) + else: + try: + intresting_arr.append(int_points(int(i[0]), int(i[1]), ' '.join(i[2:]))) + except: + print(i) + exit() +slutt = timeit.default_timer() +print('int_points loaded correct in: ', slutt - start) max_num = max(edge_arr,key=lambda item:item.time) res_arr = [] @@ -78,28 +84,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: @@ -108,87 +94,93 @@ def rec_func2(node, global_fra): path.append(node.node) 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 - - +def find_bensin(arr): + with open('./bensin.csv', 'w') as file: + print('bensin to be found on disse benserne: ') + for u in arr: + a = next(a for a in node_arr if str(a.node) == str(u.id)) + print(u.name) + file.write(f'{a.bredde},{a.lengde}\n') + return end_que = PriorityQueue() queue = PriorityQueue() we_soon_to_be_done = False -def dijkstras(slutt, start): +def dijkstras(slutt, start, bensin): 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 + bensin_arr = [] + while queue or not end_que.empty: + node_count +=1 + if node_count % (num_of_nodes//100) == 0: + print(f'searched {node_count/(num_of_nodes//100)}% of nodes') + 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 bensin: + a = next((a for a in intresting_arr if a.id == current_neighbour.node), -1) + if a != -1: + if a.type == 2: + print(f'en benser er funnet: {a.name}') + bensin_arr.append(a) + if len(bensin_arr) >= 10: + find_bensin(bensin_arr) + break + if tmp_edge.til == slutt and not bensin: + 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 and not bensin: + 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 = list(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) + with open('./path.csv', 'w') as file: + for noob in travel_arr: + a = next(a for a in node_arr if str(a.node) == str(noob)) + file.write(f'{a.bredde},{a.lengde}\n') + 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,13 +190,24 @@ 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) start_node.total_time = 0 start_node.in_que = True - dijkstras(slutt, start) + if len(sys.argv) > 2: + if sys.argv[2] == '-b': + print('les go bensin') + start = timeit.default_timer() + dijkstras(slutt, start, True) + slutt = timeit.default_timer() + print(f'total time for locating bensin is: {slutt-start}') + else: + start = timeit.default_timer() + dijkstras(slutt, start, False) + slutt = timeit.default_timer() + print(f'total time for locating path is: {slutt-start}') elif sys.argv[1] == '-a': print('A* not yet implemented') else: diff --git a/ov9/test_files/test.py b/ov9/test_files/test.py index 466155924dae5bf81a391ceb1c35a155f6bd405b..c9c8ddf3b7a8518afb0f43877f3b5e5c443e2173 100644 --- a/ov9/test_files/test.py +++ b/ov9/test_files/test.py @@ -12,12 +12,26 @@ class results(object): self.in_que = in_que self.prev = prev - + +arr1 = [] arr = PriorityQueue() + + for i in range(10): - arr.put((i ,results(i*10, i, False, True, 0))) + arr1.append(results(i*10, i, False, True, 0)) + + +for i in arr1: + arr.put((i.total_time, i)) + +elem = arr1[1] +index = arr.queue.index((elem.total_time,elem)) +elem.total_time = 50 +arr.queue[index] = (50, elem) + while not arr.empty(): - b = arr.get() - print(b) + b = arr.get()[1] + print(b.total_time) +