Our algorithm looks at each customer’s demand in order of preferred arrival and places them in their preferred arrival window when possible. If all 3 docks are occupied during their preferred window, they will be scheduled wherever there is an available window in the month. In performing our time calculations, we assume that each vessel arrives at the end of their arrival window to prevent time conflicts with later ships. Once a vessel is docked and connected, we assume all available resources are directed toward loading its compartments completely. The time required to load a vessel depends on the volumes of propane and butane requested, and it is assumed both arms for C3 and C4 can work together to deliver 30,000 bph of each product. After allotting the vessel 6 hours to depart, the dock is considered open and the scheduled arrival window of the next vessel begins. This process is cycled through continuously for each of the 3 docks to maximize efficiency.

Sample input and output: Here is a set of sample input data that includes customer ID, month, product split, total volume, propane and butane volumes, and arrival start and end dates. This information will be given in a CSV file. After running this sample data through our code, the output provides each customer's arrival window specific to the hour and which dock they will be using.

One of the things we had trouble with but really wanted to implement was a unique visualization of the results. The structure of the data lends itself well to creative usages because of the overlapping times and distinct docks. We were planning to incorporate layers and heat maps but our JavaScript knowledge limited us. On the technical side, we set up a full stack web app. The website is deployed on AWS Amplify and live at schedule-transfer.online. When a file is uploaded, it is sent over to our RESTful API built with Flask and deployed on Google Cloud Platform. We used Python to analyze the inputs, factor in the parameters, and send back an optimized schedule.

To solve the business problem, we used a greedy approach to schedule customers. Before solving the problem, we laid down a couple of assumptions. First, we did not pursue the extra bonus points of incorporating information about pipelines, chillers, and finite capacity of the storage tanks. Second, we did not incorporate the information on flow from the tanks to dock loading arms. Now to the algorithm, we fed the consumer demand input sorted by preferred start/end date. Our greedy algorithm looks to allocate all consumer demands to their preferred time slot at an available dock. In the case where there is no opening for their preferred arrival time, we store it for later and move on to requests that can obtain a dock for their preferred time slot. Once we have placed all orders that match their preferred time, we go back to requests that aren’t able to be matched with their preference. We will look at all earliest time slots and fit these into the docks’ schedules in an attempt to optimize the productivity of each dock by reducing idle time.

Share this project: