# Containers Loading Optimization with Python

How can we use heuristic algorithms to find the right strategy to load a maximum number of pallets in a sea container?

How can we use heuristic algorithms to find the right strategy to load a maximum number of pallets in a sea container?

*Article originally published on Medium. *

With the recent surge in shipping prices due to container shortage, the price of a container from Shanghai to North Europe went from $2,000 in November to a peak of $12,000, and optimizing your container loading became a priority.

**Scenario**

You are Logistics Manager in an International Fashion Apparel Retailer and you want to ship 200 containers from Yangshan Port (Shanghai, PRC) to Le Havre Port (Le Havre, France).

your goods’ retail value is 225,000$ per container**Retail value (USD):**: based on pre-crisis shipping cost your profit margin is 8.5%**Profit Margin (%)**100 x 2,000 / 225,000 =**Shipping Costs — Previous (%):****0.88 (%)**100 x 12,000 / 225,000 =**Shipping Costs — Current (%):****5.33 (%)**

Your Finance Team is putting huge pressure on Logistics Operations because ** 4.45 % of profit is lost** because of shipping costs. As you have limited influence on the market price, your only solution is to improve your loading capacity to save space.

💌 New articles straight in your inbox for free: __Newsletter__

## I. Problem Statement

You have received pallets from your plants and suppliers in China ready to be shipped to France.

You have two types of pallets:

Dimensions 80 (cm) x 120 (cm)**European Pallets:**

Dimensions 100 (cm) x 120 (cm)**North American pallets:**

You can use two types of containers

Inner Length**Dry container 20':**5,9 m), Inner Width (2,35 m), Inner Height (2,39 m)**(**Inner Length**Dry container 40':**12,03 m), Inner Width (2,35 m), Inner Height (2,39 m)**(**

**Constraints**

- European pallets and American can be mixed
- 20' or 40' containers are available
- No Pallet Stacking (put a pallet above another pallet)
- The loading strategy must be performed in real life (using a counter-balance truck)

** Objective: **Load a maximum number of pallets per container

## II. Two-Dimensional knapsack problem applied to pallet loading

1. Two-Dimensional knapsack problem

Given a set of rectangular pieces and a rectangular container, the two-dimensional knapsack problem ** (2D-KP)** consists of orthogonally packing a subset of the pieces within the container such that the sum of the values of the packed pieces is maximized.

### 2. Adapt it to our problem

If we consider that

- Pallets cannot be stacked
- Pallets have to be orthogonally packed to respect the loading constraints
- Pallets Height is always lower than the internal height of your containers

We can transform our 3D problem into a 2D knapsack problem and directly apply this algorithm to find an optimal solution.

### 3. Results

Scenario: You need to load in a 40' Container

European Pallets 80 x 120 (cm)**20**North American Pallets 100 x 120 (cm)**4**

**Tentative 1: The Intuitive solution**

Comment: Your forklift driver tried to fit a number maximum of European pallets and find some space for the 4 North American Pallets.

Results: ** 20/20 Euro Pallets **loaded,

**loaded. You need another container for the two remaining pallets.**

**2/4 American pallets****Tentative 2: The Optimization Algorithm Result**

Comment: On the left, you have the solution based on the algorithm output.

Results: ** 20/20 Euro Pallets **loaded,

**loaded. You don’t need another container.**

**4/4 American pallets**Conclusion

- The optimized solution can fit 100% of pallets. It’s based on non-intuitive placement that cannot be found without trying many combinations.
- Our filling rate is increased and pallets are more “packed”.

In the next part, we’ll see how we can implement a model to get this solution.

Edit: You can find a Youtube version of this article with animations in the link below.

*You can find the full code in this Github repository: Link*## III. Build your model

To keep this article concise, we will not build the algorithm from scratch but use a python library ** rectpack**.

**Initialize model and set parameters**

5 cm buffer on the x-axis and y-axis to ensure that we do not damage the pallets**bx, by: we add**container dimensions by type**bins20, bins40:**

**2. Build your Optimization Model**

the list of available containers**bins:***(e.g. bins = [bin20, bin40] means that you have 1 container 20' et 1 container 40')*list of all rectangles that could be included in the bins with their coordinates ready to be plot**all_rects:**the list of pallets that could be loaded in the containers listed in bins**all_pals:**

**3. Plot your result**

**color: black for 80x120, red for 100 x120**

Now you have everything to share your loading plan with your forklift driver :)

## III. Conclusion & Next Steps

We increased the pallet loading rate in both examples vs. the intuitive approach.

This solution was based on a simple scenario of pallets that cannot be stacked.

Questions

- What could be the results if we apply it to stackable pallets?
- What could be the results if we apply it to bulk cartons?

### About Me

Let’s connect on Linkedin and Twitter, I am a Supply Chain Engineer that is using data analytics to improve logistics operations and reduce costs.

## References

[1] Python 2D rectangle packing library (rectpack), Github Documentation, Link