Newer versions of GAMS allow UTF-8 encoded strings as labels. That is very welcome, as these labels may come from data sources that just use Unicode characters. However, when printing to the listing file, we miss proper Unicode support. At first, I thought, "OK, just a few misaligned tables. No big deal." Here is a constructed example showing this may be a bit more problematic.
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.
Monday, January 8, 2024
Thursday, January 4, 2024
String Art
In [1], a greyscale picture is approximated by strings (lines) between points around the image. Here, I will try something similar with a formal optimization model.
Sunday, November 19, 2023
Grouping items: a difficult combinatorial problem
- We have \(n\) items (or orders) with a certain width.
- We need to combine these items in groups (called patterns) with rather tight limits on the total width. The total length of a pattern (the sum of the lengths of the items assigned to this pattern) must be between 335 and 340.
- As a result, we may not be able to assign all items. The remaining items cannot be formed into valid patterns.
- The objective is to try to place as many items as possible into patterns.
- An indication of the size of the problem: \(n \approx 500\).
Data
---- 15 PARAMETER w item widths order1 76.000, order2 258.000, order3 179.000, order4 111.000, order5 109.000, order6 90.000 order7 124.000, order8 262.000, order9 48.000, order10 165.000, order11 300.000, order12 186.000 order13 298.000, order14 236.000, order15 65.000, order16 203.000, order17 73.000, order18 97.000 order19 211.000, order20 147.000, order21 127.000, order22 125.000, order23 65.000, order24 70.000 order25 189.000, order26 255.000, order27 92.000, order28 210.000, order29 240.000, order30 112.000 order31 59.000, order32 166.000, order33 73.000, order34 266.000, order35 101.000, order36 107.000 order37 190.000, order38 225.000, order39 200.000, order40 155.000, order41 142.000, order42 61.000 order43 115.000, order44 42.000, order45 121.000, order46 79.000, order47 204.000, order48 181.000 order49 238.000, order50 110.000
---- 29 PARAMETER maxj = 22.000 max number of patterns we can fill
Saturday, October 21, 2023
Scheduling Team Meetings
This is a simple problem from [1]:
I'm rusty on constraint optimization and am looking for help in this particularuse case. There are individuals who are each member to several teams. This is afixed many-to-many relationship and is determined a-priori. There are 3 timeslots where the teams can be scheduled to conduct a business meeting, but if anindividual is a member of more than one team which are both meeting at a giventime slot, they'll only be able to attend one. The objective is to schedule theteams into the time slots, minimizing the number of overlaps of individuals.
- Formulate a mathematical model (on a piece of paper)
- Implement the model in code
Friday, October 20, 2023
GAMS: SMAX and sparsity
This is a discussion about the SMAX function in GAMS and how it behaves for sparse data.
The data structure we were facing was something like:
seti 'cases' /case1*case100000/j 'attribute' /j1*j25/k 'attribute' /k1*k25/t 'type' /typ1*typ2/;parameter p(i,j,k,t) 'positive numbers';* note: for each i we have only one (j,k)
Thursday, October 19, 2023
Plotting NUTS-2 maps from GAMS
NUTS-2 regions are statistical subnational regions (often provinces), mainly for the EU and UK [1].
| NUTS hierarchy (from [1]) |
In [2] we can find mapping information in the form of Shapefiles[3] and related formats. I used the GeoJSON[4] format, and created a Python notebook script to extract a GAMS set from that file. The file is reproduced in the appendix below. The NUTS-2 codes form the set elements, and the name is stored as explanatory text. There is an option to generate Latin names instead of using the native alphabet. The Latin names are also inside the geojson file. E.g. we have:
EL65 'Πελοπόννησος'
which is in the Greek alphabet. Using the Latin name, this would look like:
EL65 'Peloponnisos'
Thursday, October 5, 2023
Wednesday, September 27, 2023
Math and ChatGPT
Performing symbolic math steps is often related to pattern recognition. In theory, ChatGPT could be doing a good job here. I wanted to find the inverse of \[f(x) = {\mathrm{sign}}(x) \log(1+|x|)\] This function is a form of a signed logarithmic scaling. So, let's see what ChatGPT is telling us:
Wednesday, September 20, 2023
Julia vs Python
![]() |
| Simulation with n=1000 |
Monday, September 4, 2023
Critiquing a GAMS Model
It is always interesting to read GAMS models written by someone else. There are probably three things one can observe:
- A nice formulation or concept that is useful to learn about.
- A bad implementation: something that really should not be done that way.
- A piece of code that is correct and defensible, but I would write it differently. This includes things like style, layout, formatting, etc.
