Yet Another Math Programming Consultant
I am a full-time consultant and provide services related to the design, implementation and deployment of mathematical programming, optimization and data-science applications. I also teach courses and workshops. Usually I cannot blog about projects I am doing, but there are many technical notes I'd like to share. Not in the least so I have an easy way to search and find them again myself. You can reach me at erwin@amsterdamoptimization.com.
Thursday, May 28, 2026
Experiments with Hostile Brothers nonconvex NLP model
In this post, let's do some experiments with the "hostile brothers problem." We have a plot of land. In my test models \([L,U]\times [L,U]\) with \(L=0\), \(U=100\)). We want to place \(n\) brothers on this plot. As they don't get along, we want to spread them out by maximizing the distance between neighbors. In modeling terms, we create a maximin model that maximizes the minimum distance between any two brothers. This yields some non-convex problems, so I'll make the problem small: we just have \(n=10\) brothers. This is a very small, but awe-inspiring problem.
Saturday, May 16, 2026
Largest Empty Rotated Square: lots of trigonometry
Here, I delve into the problem of finding the largest empty rotated square. Given \(n\) data points, find the largest square rotated by an angle \(\theta\), such that the square does not contain any of the points. In [1], I discussed two special cases:
- an axis-aligned square (angle is 0°),
- a diamond shape, which is a square rotated by 45°.
Here we focus on arbitrary angles. A picture can help a bit: this is the largest square of all the squares with a 25° angle, which does not cover any of the given data points and is complete inside the outer box:
- The angle is given. In modeling terms, the angle is exogenous.
- Let the model find the best angle. I.e., the angle is endogenous.
Monday, May 11, 2026
Largest empty shapes
Finding the largest empty shapes
This post is about finding empty regions (square, rectangle, or circle) in a (large) collection of given points. These are interesting little optimization problems.
Data
I generated \(n=100\) data points \((x_i,y_i), i=1,\dots,n\) drawn from a uniform distribution \[\begin{align}&x_i \sim U(0,10) \\ & y_i \sim U(0,10)\end{align} \]
It is always a good idea to have a careful look at the data. I.e., print and plot it (for very large datasets, print or plot a subset), and collect some elementary statistics (min, max, average, etc.). In practical modeling, it is surprising how many problems arise from simple data errors.
Thursday, April 30, 2026
Convex hull models
Convex hull as an optimization problem
In the previous posts, the construction of a convex hull played a significant role: it was an easy way to reduce the size of the data sets, often by a large amount. Somehow, it escaped me that we can try to formulate this as what turns out to be a conceptually rather simple optimization problem. This has probably little or no practical value. But it remains an interesting exercise.Friday, April 24, 2026
Minimum enclosing circle/ellipse 2
In [1] where I discussed how to find the minimum enclosing circle and minimum enclosing ellipse around a set of points. This is a follow-up post where I extend this to sets of circles and ellipses.
1. MINIMUM ENCLOSING CIRCLE
Here our data is a set of \(n\) circles (or disks) of different size. We want to find the smallest circle that contains all these circles.An example data set with random circles can look like:
---- 30 PARAMETER circles coordinates of center and radius x y r circle1 4.294 21.082 1.663 circle2 13.759 7.528 4.014 circle3 7.305 5.601 1.961 circle4 8.746 21.407 6.235 circle5 1.678 12.505 2.591 circle6 24.953 14.468 2.715 circle7 24.778 19.056 4.564 circle8 3.267 15.993 5.336 circle9 3.988 6.252 4.769 circle10 16.723 10.884 3.783 circle11 8.993 8.786 3.480 circle12 3.287 3.753 1.706 circle13 14.728 20.772 2.885 circle14 5.770 16.643 1.279 circle15 19.396 7.591 3.031
Wednesday, April 8, 2026
Minimum enclosing ellipse
Minimum encompassing circle and ellipse
I'll discuss SDP (semidefinite programming), SOCP (second order cone programming), rotated SOCP and traditional NLP approaches using gradient based solvers. So there is a lot of ground to cover.
First let's do circles.
Tuesday, March 17, 2026
Revisiting a crazy global NLP problem
Minimum encompassing triangle
Summary
Monday, March 9, 2026
Experience with NLP solvers on a simple economic growth model
Growth Models
In this post, we formulate and solve a relatively simple economic growth model where we want to find an optimal savings rate. Consumers can either use their income for direct consumption or they can save. Savings lead to investment and to more income down the road. The resulting NLP (nonlinear programming) model is not too complicated, and it is interesting to see how we can implement this model using different tools.
I often get the question: why not use Python or R for my (economic) models? This note tries to give an answer using a rather smallish model. Although the model is small and simple, it actually illustrates some of the problems we can face when using say Python or R code. Some of the code I present here is not very obvious, or self-explanatory. One reason is that some algorithm developers look at NLP problems as something like: \[\begin{align}\min\>&f(x) \\ &g(x)=0 \\& h(x)\ge 0\end{align}\] Unfortunately, such a representation is close to the solver, but far away from practical models. It is just the wrong abstraction level. The model implementation impedance becomes even larger if we need to provide analytic gradients. Time we could have spent on developing better models is instead wasted on error-prone low-level detailed programming. This problem is even more costly, when we think about maintenance such as bug-fixing and adding new features to the model. We'll see how this looks like for this model.
The underlying economic model is often called a Ramsey growth model, after Frank Plumpton Ramsey [1].
Tuesday, December 9, 2025
Crack the passcode
In this puzzle [1,2], we need to determine what the 3-digit passcode is, using a few hints. Each digit is an integer between 0 and 9. The hints are:
Let's see if we can shoehorn this into a MIP model.
Monday, December 1, 2025
Sorting: minimize number of swaps
In this post, I want to delve further into sorting. In a question on or.stackexchange.com [1], the subject was minimizing the number of swaps in sorting algorithms. A swap, i.e., an interchange of two items, is a basic operation in sorting. We usually don't pay much attention to this. First, we assume swaps are cheap. If they are not, we can sort not the real data (which can be complex, and thus more complicated and expensive to swap), but rather pointers to the data or keys. But what if we really have to reorder bulky physical things? Then the number of swaps is a more meaningful concept. Can we minimize the work to reorder say \(n\) boxes (or containers to make it more dramatic) by minimizing the number of swaps (assuming interchanging the position of two boxes is the way reordering works).
Labels:
Mixed-Integer Programming,
Shortest Path,
Sorting
Subscribe to:
Posts (Atom)