Skip to content
Snippets Groups Projects
Commit 274fcb17 authored by Jacob Theisen's avatar Jacob Theisen
Browse files

shjør

parent 6c4669ca
Branches
No related tags found
No related merge requests found
import sys import sys
from queue import PriorityQueue
class int_points (object): class int_points (object):
def __init__(self, id, type, name): def __init__(self, id, type, name):
...@@ -21,10 +23,11 @@ class edges (object): ...@@ -21,10 +23,11 @@ class edges (object):
self.speed = speed self.speed = speed
class results(object): class results(object):
def __init__(self, node, time, visited, prev): def __init__(self, node, total_time, visited, in_que, prev):
self.node = node self.node = node
self.time = time self.total_time = total_time
self.visited = visited self.visited = visited
self.in_que = in_que
self.prev = prev self.prev = prev
...@@ -73,7 +76,11 @@ max_num = max(edge_arr,key=lambda item:item.time) ...@@ -73,7 +76,11 @@ max_num = max(edge_arr,key=lambda item:item.time)
res_arr = [] res_arr = []
def init_table(): def init_table():
for i in range(num_of_nodes): 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): # def rec_func(node, counter, global_fra, end_switch):
# if not end_switch: # if not end_switch:
...@@ -93,82 +100,95 @@ def init_table(): ...@@ -93,82 +100,95 @@ def init_table():
# return rec_func(node, counter, global_fra, end_switch) # return rec_func(node, counter, global_fra, end_switch)
def rec_func2(node, counter, global_fra): def rec_func2(node, global_fra):
path=[] path=[]
while node.node != global_fra: while node.node != global_fra:
counter +=node.time
path.append(node.node) path.append(node.node)
node = [a for a in res_arr if a.node == node.prev][0] node = [a for a in res_arr if a.node == node.prev][0]
path.append(node.node) path.append(node.node)
return counter,path return path
def calculate_shortest_path(current_node, time, current_neighbour, slutt): # def calculate_shortest_path(current_node, time, current_neighbour, slutt):
count_a = 0 # count_a = 0
count_a, _ = rec_func2(current_neighbour, count_a, slutt) # count_a, _ = rec_func2(current_neighbour, count_a, slutt)
count_b = 0 # count_b = 0
count_b, _ = rec_func2(current_node, count_b, slutt) # count_b, _ = rec_func2(current_node, count_b, slutt)
count_b += time # count_b += time
if count_b < count_a: # if count_b < count_a:
return True # return True
else: # else:
return False # 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 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
end_que = [] end_que = PriorityQueue()
queue = [] queue = PriorityQueue()
we_soon_to_be_done = False we_soon_to_be_done = False
def dijkstras(slutt, fra, start): def dijkstras(slutt, start):
global we_soon_to_be_done global we_soon_to_be_done
global queue global queue
if we_soon_to_be_done: if we_soon_to_be_done:
end_que.pop(0) tmp_que_item = end_que.get()
current_node = [b for b in res_arr if b.node == fra][0] 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: 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] 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.time = tmp_edge.time current_neighbour.total_time = current_node.total_time + tmp_edge.time
current_neighbour.prev = fra current_neighbour.prev = current_node.node
if tmp_edge.til == slutt: if tmp_edge.til == slutt:
current_node.visited = True current_node.visited = True
current_node.in_que = False
we_soon_to_be_done = True we_soon_to_be_done = True
end_que.append(tmp_edge.til) end_que.put(tmp_edge.til)
else: else:
if tmp_edge.fra == slutt: if tmp_edge.fra == slutt:
end_que.append(tmp_edge.til) end_que.put(tmp_edge.til)
else: else:
queue.append(tmp_edge.til) current_neighbour.in_que = True
queue.put(current_neighbour.total_time)
elif current_neighbour.node != start: elif current_neighbour.node != start:
if calculate_shortest_path(current_node, tmp_edge.time, current_neighbour, start): if current_node.total_time + tmp_edge.time < current_neighbour.total_time:
current_neighbour.time = tmp_edge.time index_in_que = queue.queue.index(current_neighbour.total_time)
current_neighbour.prev = tmp_edge.fra current_neighbour.total_time = tmp_edge.time + current_node.total_time
if we_soon_to_be_done and not len(end_que): current_neighbour.prev = current_node.node
#not finished 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] end_node = [b for b in res_arr if b.node == slutt][0]
total_time = 0 travel_arr = rec_func2(end_node, start)
total_time,travel_arr = rec_func2(end_node, total_time, start)
travel_arr = reversed(travel_arr) 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() exit()
else: else:
if we_soon_to_be_done: if we_soon_to_be_done:
current_node.visited = True current_node.visited = True
dijkstras(slutt,end_que[0],start) current_node.in_que = False
dijkstras(slutt,start)
else: else:
queue.pop(0)
current_node.visited = True current_node.visited = True
queue = update_que(queue) current_node.in_que = False
dijkstras(slutt,queue[0],start) #queue = update_que(queue)
dijkstras(slutt,start)
...@@ -178,12 +198,13 @@ def init_things(): ...@@ -178,12 +198,13 @@ def init_things():
if sys.argv[1] == '-d': if sys.argv[1] == '-d':
#node_id #node_id
start = 20 start = 20
slutt = 25 slutt = 30
init_table() init_table()
queue.append(start) queue.put(0)
start_node = [a for a in res_arr if a.node == start][0] start_node = next(a for a in res_arr if a.node == start)
start_node.time = 0 start_node.total_time = 0
dijkstras(slutt, start, start) start_node.in_que = True
dijkstras(slutt, start)
elif sys.argv[1] == '-a': elif sys.argv[1] == '-a':
print('A* not yet implemented') print('A* not yet implemented')
else: else:
......
import sys import sys
from queue import PriorityQueue
class int_points (object): class int_points (object):
def __init__(self, id, type, name): def __init__(self, id, type, name):
...@@ -21,10 +23,11 @@ class edges (object): ...@@ -21,10 +23,11 @@ class edges (object):
self.speed = speed self.speed = speed
class results(object): 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.node = node
self.total_time = total_time self.total_time = total_time
self.visited = visited self.visited = visited
self.in_que = in_que
self.prev = prev self.prev = prev
...@@ -73,7 +76,11 @@ max_num = max(edge_arr,key=lambda item:item.time) ...@@ -73,7 +76,11 @@ max_num = max(edge_arr,key=lambda item:item.time)
res_arr = [] res_arr = []
def init_table(): def init_table():
for i in range(num_of_nodes): 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): # def rec_func(node, counter, global_fra, end_switch):
# if not end_switch: # if not end_switch:
...@@ -116,59 +123,72 @@ def rec_func2(node, global_fra): ...@@ -116,59 +123,72 @@ def rec_func2(node, global_fra):
def update_que(que): # def update_que(que):
tmp_arr = [a for a in res_arr if a.node in 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) # tmp_arr.sort(key=lambda x: x.total_time, reverse=True)
que = [a.node for a in tmp_arr if a in tmp_arr] # que = [a.node for a in tmp_arr if a in tmp_arr]
return que # return que
end_que = [] end_que = PriorityQueue()
queue = [] queue = PriorityQueue()
we_soon_to_be_done = False we_soon_to_be_done = False
def dijkstras(slutt, fra, start): def dijkstras(slutt, start):
global we_soon_to_be_done global we_soon_to_be_done
global queue global queue
if we_soon_to_be_done: if we_soon_to_be_done:
end_que.pop(0) tmp_que_item = end_que.get()
current_node = [b for b in res_arr if b.node == fra][0] 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: 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] 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.total_time = current_node.total_time + tmp_edge.time
current_neighbour.prev = current_node.node current_neighbour.prev = current_node.node
if tmp_edge.til == slutt: if tmp_edge.til == slutt:
current_node.visited = True current_node.visited = True
current_node.in_que = False
we_soon_to_be_done = True we_soon_to_be_done = True
end_que.append(tmp_edge.til) end_que.put(tmp_edge.til)
else: else:
if tmp_edge.fra == slutt: if tmp_edge.fra == slutt:
end_que.append(tmp_edge.til) end_que.put(tmp_edge.til)
else: else:
queue.append(tmp_edge.til) current_neighbour.in_que = True
queue.put(current_neighbour.total_time)
elif current_neighbour.node != start: elif current_neighbour.node != start:
if current_node.total_time + tmp_edge.time < current_neighbour.total_time: 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.total_time = tmp_edge.time + current_node.total_time
current_neighbour.prev = current_node.node current_neighbour.prev = current_node.node
if we_soon_to_be_done and not len(end_que): queue.queue[index_in_que] = current_neighbour.total_time
#not finished
if we_soon_to_be_done and end_que.empty():
end_node = [b for b in res_arr if b.node == slutt][0] end_node = [b for b in res_arr if b.node == slutt][0]
travel_arr = rec_func2(end_node, start) travel_arr = rec_func2(end_node, start)
travel_arr = reversed(travel_arr) travel_arr = reversed(travel_arr)
print(f'total time: {end_node.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() exit()
else: else:
if we_soon_to_be_done: if we_soon_to_be_done:
current_node.visited = True current_node.visited = True
dijkstras(slutt,end_que[0],start) current_node.in_que = False
dijkstras(slutt,start)
else: else:
queue.pop(0)
current_node.visited = True current_node.visited = True
queue = update_que(queue) current_node.in_que = False
dijkstras(slutt,queue[0],start) #queue = update_que(queue)
dijkstras(slutt,start)
...@@ -180,10 +200,11 @@ def init_things(): ...@@ -180,10 +200,11 @@ def init_things():
start = 20 start = 20
slutt = 30 slutt = 30
init_table() init_table()
queue.append(start) queue.put(0)
start_node = [a for a in res_arr if a.node == start][0] start_node = next(a for a in res_arr if a.node == start)
start_node.total_time = 0 start_node.total_time = 0
dijkstras(slutt, start, start) start_node.in_que = True
dijkstras(slutt, start)
elif sys.argv[1] == '-a': elif sys.argv[1] == '-a':
print('A* not yet implemented') print('A* not yet implemented')
else: else:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment