Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Latest commit

 

History

33 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Network Optimization 2 (C++) — Truck-Load Packing as a Mixed-Integer Program

This project re-implements, in C++, the truck-load packing / logistics optimization model described on my resume as "Network Optimization 2" (originally built in Python using COIN-OR/CBC, GLPK, and PuLP). The goal of this rewrite is to demonstrate hands-on C++ proficiency — object-oriented design, data structures and algorithms, and unit testing — applied to a real optimization problem I have already formulated, solved, and deployed, rather than a generic textbook exercise.

Problem

Given a set of shipments (each with a weight and a volume) and a fleet of truck types (each with a weight capacity, a volume capacity, and a cost per trip), assign every shipment to exactly one truck instance so that:

  • No truck instance exceeds its weight or volume capacity.
  • The total cost (number of trucks used × cost per trip) is minimized.

This is a classic bin-packing / vehicle-loading mixed-integer program:

minimize   sum_k  cost_k * y_k
subject to sum_i  w_i * x_ik <= W_k * y_k        for every truck k
           sum_i  v_i * x_ik <= V_k * y_k        for every truck k
           sum_k  x_ik = 1                        for every shipment i
           x_ik, y_k in {0, 1}

where x_ik = 1 if shipment i is assigned to truck k, and y_k = 1 if truck k is used at all.

Design

  • Shipment, Truck — plain value types describing the problem instance.
  • PackingProblem — owns the shipment list and available truck types, and validates a candidate solution against the capacity constraints.
  • PackingSolver — abstract interface (Strategy pattern), so the exact algorithm used to solve an instance can be swapped without touching the rest of the codebase. Two implementations are provided:
    • GreedyFirstFitDecreasingSolver — a fast heuristic upper bound.
    • BranchAndBoundSolver — an exact solver for small/medium instances, using the greedy solution as an initial incumbent and a continuous-relaxation lower bound (total weight / truck capacity, rounded up) to prune the search tree.

Solver backends

This repository ships with the from-scratch BranchAndBoundSolver above so the project builds and runs with no external dependencies — useful for review on any machine with just a C++17 compiler and CMake.

In production, the same PackingProblem model is designed to be solved with a commercial-grade MIP solver instead. A CbcMipSolver implementation (see include/CbcMipSolver.h) is included as a header showing how the exact same problem would be handed to COIN-OR CBC's C++ API (OsiClpSolverInterface + CbcModel) — this mirrors how the equivalent Python version of this model uses CBC/GLPK/PuLP. To build it, install the COIN-OR development libraries and enable it in CMakeLists.txt (instructions inline):

# Debian/Ubuntu
sudo apt-get install coinor-libcbc-dev coinor-libclp-dev coinor-libosi-dev coinor-libcoinutils-dev
cmake -DUSE_CBC=ON -B build && cmake --build build

Build & run

cmake -B build
cmake --build build
./build/network_opt2_demo        # runs a sample instance, prints the assignment
./build/network_opt2_tests       # runs the unit test suite

Tests

tests/ contains a small, dependency-free unit test harness (no external test framework required — again, so this builds anywhere) covering:

  • Feasibility checking (capacity constraints respected / violated).
  • Correctness of the greedy solver on a known instance.
  • Correctness of the branch-and-bound solver against a hand-verified optimum.
  • Edge cases: a single oversized shipment, zero shipments, exact-capacity fit.

About

C++ & Python — MIP truck-load packing optimizer (Strategy pattern, branch-and-bound with COIN-OR CBC integration path). Greedy FFD heuristic and exact branch-and-bound solver, unit tested in both languages.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages