Documents the GA-based seating solver's architecture, config file chain, and setup/usage for both AI assistants and human contributors. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
3.9 KiB
platz
A genetic-algorithm-based solver that assigns people to tables ("Tische") for an event, given group memberships, table sizes/neighbor relationships, and a configurable penalty scheme. It reads a guest list (XML) and a table layout (INI), searches for a good seating using a small custom GA framework, and writes the result to text/CSV output files.
This is Python 2 code (print statements, ConfigParser, sets.Set, UserList,
string.split, old-style raise Exception, "msg", xrange, dict.has_key,
dict.iteritems). It needs a Python 2 interpreter; there are no third-party dependencies
(standard library only).
Project structure
platz/
├── bin/ # launcher scripts (bash + Windows batch)
├── cfg/ # GA cycle definition and penalty scheme
├── libs/ # the two Python modules (ga.py, Strukturdaten.py, platz.py)
└── work/ # per-run input (table layout, guest list) and output
├── test1/
└── test2/
libs/platz.py— entry point; wires together config, input data, and the GA run.libs/ga.py— generic genetic-algorithm scaffolding (Loesung,Zyklus,Farm).libs/Strukturdaten.py— domain model for the seating problem (Person,Gruppe,Tisch,Strafliste,Sitzplatzverteilung,XMLConfig).
Setup
-
Install a Python 2 interpreter (2.4+; no
pip installneeded, standard library only). -
Edit the hardcoded paths at the top of the launcher script for your platform:
bin/run(bash):PLATZ=/Users/sm/develop/python/platzbin/run.bat(Windows):PLATZ=h:\develop\python\platzandPYTHONSHELL=l:\tools\i486_nt\python24
Point
PLATZat wherever you checked out this repository.
Running
From a shell:
# Linux/macOS
source bin/run
:: Windows
bin\run.bat
The launcher sets PLATZ_CFG, PLATZ_LIBS, PLATZ_WORK, adds PLATZ_LIBS to
PYTHONPATH, and runs libs/platz.py.
Configuring a run
cfg/platz.cfg selects which cycle/penalty config and which working directory
(work/<name>/) to use for a given run:
[Config]
Zyklusdatei=$PLATZ_CFG/zyklus.cfg
Zyklusart=Easy
Strafendatei=$PLATZ_CFG/strafen.cfg
Tischedatei=$PLATZ_WORK/test1/tische.ini
XMLdatei_Bestellung=$PLATZ_WORK/test1/bestellung.xml
AusgabeTischePersonen=$PLATZ_WORK/test1/TischePersonen.txt
AusgabePersonTisch=$PLATZ_WORK/test1/PersonenTische.csv
To run against a different dataset, point the Tischedatei/XMLdatei_Bestellung/output
entries at another work/<name>/ folder, or add a new one following the same layout:
tische.ini— one section per table:Nummer,Hof(venue/court),Plaetze(seat count),Nachbarliste(neighboring table ids),Koordinaten.bestellung.xml—<Gruppe>blocks, each with a<Person>template (Vorname/Nachname/optionalTitel) and an<Anzahl>(how many bookings to expand that template into). A<Gruppe>containing a<Tisch>tag is treated as a VIP group pinned to that table instead of being placed by the GA.
cfg/zyklus.cfg defines the GA run schedule ("Zyklus") as an Abfolge (sequence of
actions) and matching Anzahl (counts): e create, s select best, S select randomly,
m mutate, j keep parents, z advance generation.
cfg/strafen.cfg defines the penalty scheme: cost of splitting a group across tables (by
group size and number of splits), cost of a person sitting alone or without a group-mate at
a neighboring table, and per-table seat-utilization penalties.
Output
A run writes two files into the configured working directory:
TischePersonen.txt— table → seated people, with venue/table/seat numbers.PersonenTische.csv— person → table, sorted alphabetically by name.
Further details
See CLAUDE.md for a deeper architectural walkthrough of the GA framework and domain
model, intended for AI coding assistants but equally useful for human contributors.