CaseStudyForm | |
---|---|
Title | Modelling Requests to a Courier Service |
DateSubmitted | 9 Aug 2009 |
CaseStudyType | TeachingCaseStudy |
OperationsResearchTopics | SimulationModelling |
ApplicationAreas | Logistics |
ProblemDescription | A courier company offers two services: an Inner City delivery service that delivers packages within the Inner City area in under an hour; a Metropolitan delivery service that delivers packages within the Metrolpolitan area in less than 4 hours. An Inner City courier leaves the distribution centre if EITHER there are 10 deliveries to make OR it has been 15 minutes since the "oldest" delivery request arrived, i.e., the first request that arrived after the last delivery run departed. A Metropolitan courier leaves the distribution centre if EITHER there are 30 deliveries to make OR it has been 30 mins since the oldest delivery arrived. The courier company works for 8 hours a day and starts each day with no deliveries to make. The courier company has collected data on the time between requests for both Inner City and Metropolitan deliveries as well as the time to make Inner City and Metropolitan deliveries. They want to know how many deliveries their Inner City and Metropolitan couriers make each day and also how long they are on the road during a day. |
ProblemFormulation |
To simplify the modelling we will abstract 4 sections of the problem:
![]() |
ComputationalModel |
To model the flow digram from Figure 1 we first abstract the delivery requests and request runs as Arena submodels. The submodel for requests only generate requests, so a single submodel with only an exit point is needed. The submodel for a delivery run has the load of deliveries as input and outputs the load of deliveries after the delivery run finishes, so it has a single entry and exit point. The following flash tutorial shows how to add the appropriate submodels in Arena:
Adding submodels for Courier Model
Next, we want queues that store delivery entities until a delivery run occurs. The next flash tutorial shows how to add a Hold module and a Variable to implement this queue for Inner City deliveries:
Adding waiting queue for Courier Model
Next, we want to create logical entities to take care of triggering delivery runs if the oldest delivery request has waited long enough. Each time a delivery request comes in and there are no other deliveries waiting we note down its arrival time and create a timing entity using a Delay module. When the timing entity leaves the system a calendar event will be generated. We will see how this calendar event is used later. The following flash tutorial shows how to create the timing entity for the Inner City deliveries:
Adding timing entity to Courier Model
Next, we create logical entities to trigger a delivery if:
![]() DebuggingYou should notice that your model appears to "stall". If you look carefully you will see the logic entity that triggers Inner City delivery runs in an infinite loop. This happens because our hold condition is not quite correct. We rely on a request arriving and resetting the oldest delivery time. However, this does not happen before the truck is loaded, so the initial trigger hold does not work. We need to wait for a delivery after we load the truck. By adding an extra condition to the timing trigger, we can fix the problem. Figure 3 shows this extra condition, that the delivery queue must have at least one delivery AND that the oldest delivery has been there for too long for a delivery run to take place. Figure 3 Extra condition for timing trigger![]() Finding Input DistributionsAs discussed previously, the courier company has recorded data on their delivery requests and delivery runs. This data is given courier.xls. We can use Arena's built-in Input Analyzer to determine distributions that fit the data well. First, we need to break the data up into separate text files as shown in Figure 4. Figure 4 Splitting data into text files![]() ![]() |
Results | Coming soon! |
Conclusions | Coming soon! |
ExtraForExperts | |
StudentTasks |
I | Attachment | History | Action | Size | Date | Who | Comment |
---|---|---|---|---|---|---|---|
![]() |
courier-animation.swf | r1 | manage | 2601.9 K | 2009-08-09 - 14:29 | TWikiAdminUser | Adding animation to Courier Model |
![]() |
courier-delivery.swf | r1 | manage | 2229.3 K | 2009-08-09 - 13:17 | TWikiAdminUser | Adding deliveries to Courier Model |
![]() |
courier-input.swf | r1 | manage | 313.1 K | 2009-08-09 - 14:37 | TWikiAdminUser | Analysing Inner City delivery requests |
![]() |
courier-submodels.swf | r1 | manage | 798.0 K | 2009-08-09 - 08:45 | MichaelOSullivan | Adding submodels for Courier Model |
![]() |
courier-timing.swf | r1 | manage | 1957.7 K | 2009-08-09 - 12:21 | TWikiAdminUser | Adding timing entity to Courier Model |
![]() |
courier-trigger.swf | r1 | manage | 1726.5 K | 2009-08-09 - 12:50 | TWikiAdminUser | Adding trigger entity to Courier Model |
![]() |
courier-waiting.swf | r2 r1 | manage | 523.1 K | 2009-08-09 - 12:47 | TWikiAdminUser | Adding waiting queue for Courier Model |
![]() |
courier.xls | r1 | manage | 344.5 K | 2009-08-09 - 13:56 | TWikiAdminUser | Data from the Courier company |