Пример #1
0
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()
Пример #2
0
    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