-
Notifications
You must be signed in to change notification settings - Fork 1
/
TripPlanner.py
107 lines (94 loc) · 4.63 KB
/
TripPlanner.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# TripPlanner.py
# Rutu Patel
# rpatel53@stu.parkland.edu
# CSC 220, Spring 2017
from graph import Graph
from shortest_paths import *
class TripPlanner:
def __init__(self, timetable, itinerary=None):
self.__myGraph = Graph()
self.__cities = dict()
self.__shortestPath = list()
self.__timetable = timetable
self.__listOfEdges = list()
self.__itinerary = itinerary
def load_data(self):
print("File loading...")
with open(self.__timetable, 'r') as infile:
lines = infile.readlines()
for line in lines:
source, destination, time = line.split(',')
hour, minutes = time.split(':')
minutes = int(minutes) + 60 * int(hour)
if source not in self.__cities:
sourceVertex = self.__myGraph.insert_vertex(source)
self.__cities[source] = sourceVertex
if destination not in self.__cities:
destinationVertex = self.__myGraph.insert_vertex(
destination)
self.__cities[destination] = destinationVertex
self.__myGraph.insert_edge(self.__cities[source],
self.__cities[destination], minutes)
print("There are", len(self.__cities), "cities with",
self.__myGraph.edge_count(), "connections.")
def User_Interface(self):
while True:
origination = input("Please enter the origination: ")
destination = input("Please enter the destination: ")
origination = origination.strip().capitalize()
destination = destination.strip().capitalize()
if origination not in self.__cities:
print(origination + " not in the eurail system.")
elif destination not in self.__cities:
print(destination + " not in the eurail system.")
else:
originationVertex = self.__cities[origination]
destinationVertex = self.__cities[destination]
cloud = shortest_path_lengths(self.__myGraph, originationVertex)
if cloud[destinationVertex] != float('inf'):
path = shortest_path_tree(self.__myGraph, originationVertex,
cloud)
currentVertex = destinationVertex
self.__shortestPath = [currentVertex.element()]
travelTime = cloud[destinationVertex]
while True:
currentEdge = path[currentVertex]
currentVertex = currentEdge.opposite(currentVertex)
self.__shortestPath.append(currentVertex.element())
self.__listOfEdges.append(currentEdge)
if currentVertex is originationVertex:
self.__shortestPath.reverse()
print("...")
print("The shortest travel time is by going through"
" these intermediary stops:")
for city in self.__shortestPath:
print(city)
print("The whole journey takes", travelTime // 60,
"hours","and", travelTime % 60, "minutes.")
break
else:
print("There is no path between " + origination + " and "
+ destination)
if not input(
"Do you want to continue and look for another "
"route?").startswith('y'):
if self.__itinerary is not None:
self.writeFile()
break
def writeFile(self):
with open(self.__itinerary + ".gv", 'w') as outfile:
outfile.write("graph {")
for edge in self.__myGraph.edges():
endpoints = edge.endpoints()
outfile.write(endpoints[0].element() + " -- " +
endpoints[1].element())
hr, min = edge.element() // 60, edge.element() % 60
outfile.write('[label="' + str(hr) + ":" + str(min) + '"')
if edge in self.__listOfEdges:
outfile.write(", style = bold , color = red")
outfile.write("]")
outfile.write("\n")
outfile.write("}")
if __name__ == '__main__':
print('TripPlanner class file does not contain tests.')
print("This module is not made to run directly.")