def main(): m = HashMap() m.load_package_details("package_details.txt", m) d = Distance() d.load_distances('node_list.txt', 'combo.txt', d) t = Truck() truck_1_packages, truck_2_packages, truck_3_packages = t.prep_trucks() all_packages = combine_lists(truck_1_packages, truck_2_packages, truck_3_packages) print print(42 * "-") print("Data Structures and Algorithms 2 - C950") print(13 * " " + "Rob Muhlestein") print(42 * "-") print(30 * '-') print(6 * " " + "M A I N - M E N U") print(30 * '-') print("1. Lookup package details (ID input & Time input") print("2. Lookup package details (Address input & Time input") print("3. Run Delivery Simulation - Input Time") print("4. Print Delivery Report (ID# & Status Only) - Input Time") print(30 * '-') ## Get Input ### choice = raw_input() ### Take action as per selected menu-option ## if choice == '1': # lookup package details (ID and time input) print("Preparing Simulation...") for packages in all_packages: m.retrieve(packages) print user_time = raw_input( "What time would you like to simulate? \n (24 hr format e.g. 0900, 1315): " ) if len(user_time) != 4 or ":" in user_time: # raise error message if time entered is not in a useable format raise ValueError( "Entry: {} is not a valid entry.\n\tPlease ensure the time you enter is in the format '0000'. E.g. 0900.\n\tDo not include ':' or 'AM' or 'PM'." .format(user_time)) else: if user_time[-2:] > '59': # raise error message if time entered isn't a valid time raise ValueError( 'Entry: {} -- minutes > 59 is not a valid time entry.'. format(user_time)) else: inquiry_ID = raw_input("Enter ID#: ") elapsed_time = convert_time(user_time) if elapsed_time < 65: # 0905 # 0800- all trucks get loaded # Truck 1, having the highest priority packages, # leaves first truck_1 = t.load_truck(m, truck_1_packages) distances_1 = d.distance_traveled(elapsed_time, truck_1) send_1(m, elapsed_time, distances_1, truck_1) print("\nPrinting Package Info for {}".format(inquiry_ID)) key, vals = m.retrieve(inquiry_ID) print("{}: {}".format(key, vals)) main() elif elapsed_time < 140: # 1020 # 0905 Delayed packages arrive # Truck 2 delivers delayed packages # with 1030 deadline first. # Truck 1 should arrive back to the hub @ 1007 truck_1 = t.load_truck(m, truck_1_packages) distances_1 = d.distance_traveled(elapsed_time, truck_1) send_1(m, elapsed_time, distances_1, truck_1) start_time = elapsed_time - 65 truck_2 = t.load_truck(m, truck_2_packages) distances_2 = d.distance_traveled(elapsed_time, truck_2) send_2(m, start_time, distances_2, truck_2) print("\nPrinting Package Info for {}".format(inquiry_ID)) key, vals = m.retrieve(inquiry_ID) print("{}: {}".format(key, vals)) main() else: # wrong address is corrected # Truck 3 leaves after correction at 1020 truck_1 = t.load_truck(m, truck_1_packages) distances_1 = d.distance_traveled(elapsed_time, truck_1) total_1 = send_1(m, elapsed_time, distances_1, truck_1) start_time = elapsed_time - 65 truck_2 = t.load_truck(m, truck_2_packages) distances_2 = d.distance_traveled(elapsed_time, truck_2) total_2 = send_2(m, start_time, distances_2, truck_2) start_time = elapsed_time - 140 new_address = "410 S State St" correct_address(m, truck_3_packages, new_address) truck_3 = t.load_truck(m, d, truck_3_packages) distances_3 = d.distance_traveled(elapsed_time, truck_3) total_3 = send_3(m, start_time, distances_3, truck_3) print("\nPrinting Package Info for {}".format(inquiry_ID)) key, vals = m.retrieve(inquiry_ID) print("{}: {}".format(key, vals)) main() elif choice == '2': # lookup package details address and time print("Preparing Simulation...") for packages in all_packages: m.retrieve(packages) print user_time = raw_input( "What time would you like to simulate? \n (24 hr format e.g. 0900, 1315): " ) if len(user_time) != 4 or ":" in user_time: # raise error message if time entered is not in a useable format raise ValueError( "Entry: {} is not a valid entry.\n\tPlease ensure the time you enter is in the format '0000'. E.g. 0900.\n\tDo not include ':' or 'AM' or 'PM'." .format(user_time)) else: if user_time[-2:] > '59': # raise error message if time entered isn't a valid time raise ValueError( 'Entry: {} -- minutes > 59 is not a valid time entry.'. format(user_time)) else: inquiry_address = raw_input("Enter Address: ") elapsed_time = convert_time(user_time) if elapsed_time < 65: # 0905 # 0800- all trucks get loaded # Truck 1, having the highest priority packages, # leaves first truck_1 = t.load_truck(m, d, truck_1_packages) distances_1 = d.distance_traveled(elapsed_time, truck_1) send_1(m, elapsed_time, distances_1, truck_1) print("\nPrinting status for package(s) going to {}". format(inquiry_address)) packages = m.get_package_number(inquiry_address) print("{}\t{}\t{}".format(inquiry_address, packages, m.get_status(packages[0]))) main() elif elapsed_time < 140: # 1020 # 0905 Delayed packages arrive # Truck 2 delivers delayed packages # with 1030 deadline first. # Truck 1 should arrive back to the hub @ 1007 truck_1 = t.load_truck(m, d, truck_1_packages) distances_1 = d.distance_traveled(elapsed_time, truck_1) send_1(m, elapsed_time, distances_1, truck_1) start_time = elapsed_time - 65 truck_2 = t.load_truck(m, d, truck_2_packages) distances_2 = d.distance_traveled(elapsed_time, truck_2) send_2(m, start_time, distances_2, truck_2) print("\nPrinting status for package(s) going to {}". format(inquiry_address)) packages = m.get_package_number(inquiry_address) print("{}\t{}\t{}".format(inquiry_address, packages, m.get_status(packages[0]))) main() else: # wrong address is corrected # Truck 3 leaves after correction at 1020 truck_1 = t.load_truck(m, d, truck_1_packages) distances_1 = d.distance_traveled(elapsed_time, truck_1) total_1 = send_1(m, elapsed_time, distances_1, truck_1) start_time = elapsed_time - 65 truck_2 = t.load_truck(m, d, truck_2_packages) distances_2 = d.distance_traveled(elapsed_time, truck_2) total_2 = send_2(m, start_time, distances_2, truck_2) start_time = elapsed_time - 140 new_address = "410 S State St" correct_address(m, truck_3_packages, new_address) truck_3 = t.load_truck(m, d, truck_3_packages) distances_3 = d.distance_traveled(elapsed_time, truck_3) total_3 = send_3(m, start_time, distances_3, truck_3) print("\nPrinting status for package(s) going to {}". format(inquiry_address)) packages = m.get_package_number(inquiry_address) print("{}\t{}\t{}".format(inquiry_address, packages, m.get_status(packages[0]))) main() elif choice == '3': print("Preparing Simulation...") for packages in all_packages: m.retrieve(packages) print user_time = raw_input( "What time would you like to simulate? \n (24 hr format e.g. 0900, 1315): " ) if len(user_time) != 4 or ":" in user_time: # raise error message if time entered is not in a useable format raise ValueError( "Entry: {} is not a valid entry.\n\tPlease ensure the time you enter is in the format '0000'. E.g. 0900.\n\tDo not include ':' or 'AM' or 'PM'." .format(user_time)) else: if user_time[-2:] > '59': # raise error message if time entered isn't a valid time raise ValueError( 'Entry: {} -- minutes > 59 is not a valid time entry.'. format(user_time)) else: elapsed_time = convert_time(user_time) if elapsed_time < 65: # 0905 # 0800- all trucks get loaded # Truck 1, having the highest priority packages, # leaves first print( '\nloading truck 1...\ntruck 1 departed the hub at 0800\nstatus of packages on truck 1 as of {}...' .format(user_time)) truck_1 = t.load_truck(m, d, truck_1_packages) distances_1 = d.distance_traveled(elapsed_time, truck_1) send_1(m, elapsed_time, distances_1, truck_1) print('\ntruck 2 is scheduled to leave the hub at 0905') print("truck 3 is scheduled to leave the hub at 1020") main() elif elapsed_time < 140: # 1020 # 0905 Delayed packages arrive # Truck 2 delivers delayed packages # with 1030 deadline first. # Truck 1 should arrive back to the hub @ 1007 print( '\nloading truck 1...\ntruck 1 departed the hub at 0800\nstatus of packages on truck 1 as of {}...' .format(user_time)) truck_1 = t.load_truck(m, d, truck_1_packages) distances_1 = d.distance_traveled(elapsed_time, truck_1) send_1(m, elapsed_time, distances_1, truck_1) print( '\nloading truck 2...\ntruck 2 departed the hub at 0905\nstatus of packages on truck 2 as of {}...' .format(user_time)) start_time = elapsed_time - 65 truck_2 = t.load_truck(m, d, truck_2_packages) distances_2 = d.distance_traveled(elapsed_time, truck_2) send_2(m, start_time, distances_2, truck_2) print("\ntruck 3 is scheduled to leave the hub at 1020") main() else: # wrong address is corrected # Truck 3 leaves after correction at 1020 print( '\nloading truck 1...\ntruck 1 departed the hub at 0800\nstatus of packages on truck 1 as of {}...' .format(user_time)) truck_1 = t.load_truck(m, d, truck_1_packages) distances_1 = d.distance_traveled(elapsed_time, truck_1) total_1 = send_1(m, elapsed_time, distances_1, truck_1) print("total milage for truck 1: {}".format(total_1)) print( '\nloading truck 2...\ntruck 2 departed the hub at 0905\nstatus of packages on truck 2 as of {}...' .format(user_time)) start_time = elapsed_time - 65 truck_2 = t.load_truck(m, d, truck_2_packages) distances_2 = d.distance_traveled(elapsed_time, truck_2) total_2 = send_2(m, start_time, distances_2, truck_2) print("total milage for truck 2: {}".format(total_2)) print( '\nloading truck 3...\ntruck 3 departed the hub at 1020\nstatus of packages on truck 3 as of {}...' .format(user_time)) start_time = elapsed_time - 140 new_address = "410 S State St" correct_address(m, truck_3_packages, new_address) truck_3 = t.load_truck(m, d, truck_3_packages) distances_3 = d.distance_traveled(elapsed_time, truck_3) total_3 = send_3(m, start_time, distances_3, truck_3) print("total milage for truck 3: {}".format(total_3)) #print("\nPrinting Package Report as of {}...\n".format(user_time)) #m.print_all() truck_total = float(total_1) + float(total_2) + float( total_3) print("\nTotal distance traveled by all trucks: {:0.1f}". format(truck_total)) print("Last package is delivered at: 1229") main() elif choice == '4': print("Preparing Simulation...") for packages in all_packages: m.retrieve(packages) print user_time = raw_input( "What time would you like to simulate? \n (24 hr format e.g. 0900, 1315): " ) if len(user_time) != 4 or ":" in user_time: # raise error message if time entered is not in a useable format raise ValueError( "Entry: {} is not a valid entry.\n\tPlease ensure the time you enter is in the format '0000'. E.g. 0900.\n\tDo not include ':' or 'AM' or 'PM'." .format(user_time)) else: if user_time[-2:] > '59': # raise error message if time entered isn't a valid time raise ValueError( 'Entry: {} -- minutes > 59 is not a valid time entry.'. format(user_time)) else: elapsed_time = convert_time(user_time) if elapsed_time < 65: # 0905 # 0800- all trucks get loaded # Truck 1, having the highest priority packages, # leaves first print( '\nloading truck 1...\ntruck 1 has the following destinations' ) truck_1 = t.load_truck(m, truck_1_packages) print(truck_1) distances_1 = d.distance_traveled(elapsed_time, truck_1) send_1(m, elapsed_time, distances_1, truck_1) print("\nPrinting Status Report as of {}...\n".format( user_time)) m.print_all_status() main() elif elapsed_time < 140: # 1020 # 0905 Delayed packages arrive # Truck 2 delivers delayed packages # with 1030 deadline first. # Truck 1 should arrive back to the hub @ 1007 print( '\nloading truck 1...\ntruck 1 has the following destinations' ) truck_1 = t.load_truck(m, truck_1_packages) print(truck_1) distances_1 = d.distance_traveled(elapsed_time, truck_1) send_1(m, elapsed_time, distances_1, truck_1) print( '\nloading truck 2...\ntruck 2 has the following destinations' ) start_time = elapsed_time - 65 truck_2 = t.load_truck(m, truck_2_packages) print(truck_2) distances_2 = d.distance_traveled(elapsed_time, truck_2) send_2(m, start_time, distances_2, truck_2) print("\nPrinting Status Report as of {}...\n".format( user_time)) m.print_all_status() main() else: # wrong address is corrected # Truck 3 leaves after correction at 1020 print( '\nloading truck 1...\ntruck 1 has the following destinations' ) truck_1 = t.load_truck(m, truck_1_packages) print(truck_1) distances_1 = d.distance_traveled(elapsed_time, truck_1) total_1 = send_1(m, elapsed_time, distances_1, truck_1) print( '\nloading truck 2...\ntruck 2 has the following destinations' ) start_time = elapsed_time - 65 truck_2 = t.load_truck(m, truck_2_packages) print(truck_2) distances_2 = d.distance_traveled(elapsed_time, truck_2) total_2 = send_2(m, start_time, distances_2, truck_2) print( '\nloading truck 3...\ntruck 3 has the following destinations' ) start_time = elapsed_time - 140 new_address = "410 S State St" correct_address(m, truck_3_packages, new_address) truck_3 = t.load_truck(m, d, truck_3_packages) print(truck_3) distances_3 = d.distance_traveled(elapsed_time, truck_3) total_3 = send_3(m, start_time, distances_3, truck_3) print("\nPrinting Status Report as of {}...\n".format( user_time)) m.print_all_status() print("\nDay ends at: 1312") print("Total distance traveled by all trucks at 1312: {}". format( float(total_1) + float(total_2) + float(total_3))) main() else: print("\n======= Invalid Selection. Please try again. ========") print(" ================= select [1-3] =================\n") main()
def prep_trucks(self): # Big O: O(N^2) h = HashMap() # temporary lists to manage addresses truck2_addresses = [] deadline_addresses = [] delayed_addresses = [] delivered_with_addresses = [] other_addresses = [] # temporary lists to manage packages truck2_packages = [] deadline_packages = [] delayed_packages = [] delivered_with_packages = [] other_packages = [] # loads package details for easy assigning and sorting packages h.load_package_details("package_details.txt", h) # begins the assigning process for item in h.items(): # only applies to the packages that aren't already # on a truck or delivered if "ON TRUCK" or "DELIVERED" not in item[7]: # If it has a deadline (i.e. does not say "EOD" in deadline) # this will add it to a separate list if "EOD" not in item[4].upper(): if item[0] not in deadline_addresses: deadline_addresses.append(item[0]) # If notes says it must be on truck 2 # this will add it to a separate list if "TRUCK" in item[6].upper(): if item[0] not in truck2_addresses: truck2_addresses.append(item[0]) # If notes says it is delayed # this will add it to a separate list if "DELAYED" in item[6].upper(): if item[0] not in delayed_addresses: delayed_addresses.append(item[0]) # if notes says it needs to be delivered with ... # this will add it to a separate list if "DELIVERED WITH" in item[6].upper(): a = [int(s) for s in item[6].split() if s.isdigit()] for number in a: if number not in delivered_with_addresses: address = h.get_address(str(number)) if address not in delivered_with_addresses: delivered_with_addresses.append(address) if item[0] not in delivered_with_addresses: delivered_with_addresses.append(item[0]) # this makes a list for everything else # without a deadline or without any notes if "EOD" in item[4].upper() or "NA" in item[6].upper(): if item[0] not in other_addresses: other_addresses.append(item[0]) # if any overlaps occur between "truck 2", "deadline", or "other" # sets priority to truck 2 for address in truck2_addresses: if address in deadline_addresses: deadline_addresses.remove(address) if address in other_addresses: other_addresses.remove(address) # if any overlaps occur between "delayed", "deadline", or "other" # sets priority to delayed for address in delayed_addresses: if address in deadline_addresses: deadline_addresses.remove(address) if address in other_addresses: other_addresses.remove(address) # if any overlaps occur between "delivered with", "deadline", or "other" # set priority to delivered_with_addresses for address in delivered_with_addresses: if address in deadline_addresses: deadline_addresses.remove(address) if address in other_addresses: other_addresses.remove(address) # if any overlaps occur between deadline and "other" # set priority to deadline_addresses for address in deadline_addresses: if address in other_addresses: other_addresses.remove(address) # gets package IDs for addresses assigned to specific lists truck2_packages = self.reform_list(h, truck2_addresses) deadline_packages = self.reform_list(h, deadline_addresses) delayed_packages = self.reform_list(h, delayed_addresses) delivered_with_packages = self.reform_list(h, delivered_with_addresses) other_packages = self.reform_list(h, other_addresses) # sends each list through a double check function finding # and finds any with "wrong address" and assigns them to truck 3 new_truck2 = self.double_check(h, truck2_packages) new_deadline = self.double_check(h, deadline_packages) new_delayed = self.double_check(h, delayed_packages) new_delivered_with = self.double_check(h, delivered_with_packages) new_other = self.double_check(h, other_packages) # merges package lists, assigns list to trucks self.truck_1_packages(h, new_deadline, new_delivered_with) self.truck_2_packages(h, new_truck2, new_delayed) self.truck_3_packages(h, new_other) return self.truck_1, self.truck_2, self.truck_3