CBC vs CP-SAT: My Lineup Optimizer Got 8x Faster

Two months ago I wrote about CBC vs HiGHS on my staff scheduler, where swapping solvers turned a model that took minutes into one that took seconds. So when my daily fantasy lineup optimizer started feeling slow, I reached for the same fix — and HiGHS came back three times slower. This is the story of CBC vs CP-SAT on that model, why my own previous result did not transfer, and the failure mode I found on the way that was worse than being slow.

Continue reading “CBC vs CP-SAT: My Lineup Optimizer Got 8x Faster”

Same Three Files, Much Harder Problem

When I finished porting the routing engine to Python, I had a 480-line file that solved vehicle routing problems and printed results to a terminal. That’s useful exactly to me, in exactly one context. The staff scheduler had already gone through the same transition — terminal script to Flask web app — and I’d figured out the pattern there. So I assumed wrapping the VRP would be roughly the same amount of work.

It wasn’t the same amount of work. But the structure was.

Vehicle routing problem with time windows solver interface
Continue reading “Same Three Files, Much Harder Problem”

Porting 1,500 Lines of C# to Python Without Losing My Mind

The original routing model was 1,500 lines of C#. The Python port ended up around 480 lines. Some of that compression is the language — Python is more concise. Some of it is that I stripped out the proprietary cloud backend, the database calls, and the dispatch interface. What remained was the core: the model structure, the constraints, the solver parameters.

The translation itself was mostly mechanical. OR-Tools has Python bindings that mirror the C# API closely enough that you’re often just changing syntax: camelCase to snake_case, semicolons disappear, type declarations disappear. But “mostly mechanical” left room for a few things that didn’t work the first time.

OR Tools c sharp version

Continue reading “Porting 1,500 Lines of C# to Python Without Losing My Mind”

Why Google OR-Tools and Not the Excel Solver You Already Know

The staff scheduler I wrote about a few weeks ago was a MILP — a Mixed Integer Linear Program. You define variables, constraints, and an objective function. Hand it to a solver, get an answer. Clean, relatively tractable, runs in seconds on a laptop.

The vehicle routing problem is something else entirely.

routing optimization directions
Continue reading “Why Google OR-Tools and Not the Excel Solver You Already Know”

From Localhost to the Internet: Deploying for $7/Month

The app was working. On my laptop. Which is the same as not working, for most purposes.

If the goal was to keep it to myself — test it occasionally, tinker with it, update the model when I felt like it — a working local copy would be enough. But that’s not what I built it for. The point of converting these models to web apps is that they can run anywhere, for anyone, without requiring someone to have Python installed and know how to use a terminal.

So: deployment.

deploy render localhost to live url
Continue reading “From Localhost to the Internet: Deploying for $7/Month”