示例#1
0
class Truck:
    def __init__(self, _id):
        self.id = _id
        self.route = Route()
        self.miles_traveled = 0
        self.max_speed = 18  # Truck can reach a max speed of 18 MPH.
        self.max_packages = 16  # Truck can contain a max of 16 packages per route
        self.completed_route = False
        self.departure_time = None
        self.started_delivering = False

    def at_base(self):
        """
        Complexity: Big O(1)
        Returns if the truck is at starting location
        """
        return self.route._current_location == self.route.starting_location

    def assign_delivery(self, delivery, add_index):
        """
        Complexity: Big O(1)
        assign a single delivery at a specific index
        """
        self.route.add_delivery(self.id, delivery, add_index)

    def assign_deliveries(self, deliveries_list):
        """
        Complexity: Big O(n)
        Assign a List of deliveries to this Truck
        """
        self.route.add_deliveries(self.id, deliveries_list)

    def will_fit(self, delivery):
        """
        Complexity: Big O(n)
        Checks to see if this delivery will fit in the Truck
        """
        return len(self.get_packages()) + len(
            delivery.packages) <= self.max_packages

    def will_fit_list(self, delivery_list):
        """
        Complexity: Big O(n)
        Checks to see if this list of deliveries will fit in the Truck
        """
        package_list_sum = sum(
            [len(delivery.packages) for delivery in delivery_list])
        return len(self.get_packages()) + package_list_sum <= 16

    def get_deliveries(self):
        """
        Complexity: Big O(n)
        Get all the deliveries assigned to this truck
        """
        return [delivery for delivery in self.route.deliveries]

    def get_packages(self):
        """
        Complexity: Big O(n)
        Get all the packages assigned to this truck
        """
        package_list = []
        for delivery in self.route.deliveries:
            package_list += delivery.packages
        return package_list

    def start_delivering(self, time):
        """
        Complexity: Big O(1)
        Start the route and timestamp the departure time of the truck
        """
        self.started_delivering = True
        self.route.init(time)
        self.departure_time = time
        print(f"Truck {self.id} has started its route at {time}")

    def minutes_passed(self, minutes):
        """
        Complexity: Big O(n)
        Notify this truck a specified amount of minutes have passed.
        Convert the time to miles and advance the route
        """
        miles_left = self.route.get_miles_left
        miles_traveled = 0.3 * minutes
        if self.completed_route or miles_left() == 0:
            if self.route._current_location != self.route.starting_location:
                self.route.return_to_base(self.id)
            self.completed_route = True
            print(f"Truck {self.id} has completed route")
            return
        print(f"Truck {self.id} has {miles_left()} miles left to go")
        self.miles_traveled += miles_traveled
        self.route.advance_by_miles(miles_traveled)
        print(
            f"Truck {self.id} has driven {round(self.miles_traveled, 2)} miles"
        )
        if miles_left() == 0:
            self.completed_route = True
            print(f"Truck {self.id} has completed route")
            return

    def get_ETA_back_at_depot(self):
        return self.route.get_ETA_back_at_depot()

    def populate_ETA(self, departure_time):
        """
        Complexity: Big O(n^2)
        """
        self.route.populate_ETA(departure_time)