Zuordnung und Reihenfolge verständlich erklärt
Ein Koch stellt seine Zutaten ins Regal und plant, in welcher Reihenfolge er die Handgriffe erledigt. Jede Frage für sich lässt sich bei kleinen Aufgaben lösen, doch beide hängen zusammen. Wer abwechselnd das Regal und die Reihenfolge verbessert, bleibt an einem Punkt stehen, an dem keiner der beiden Schritte mehr hilft, obwohl es besser ginge. Die Seite zeigt, warum, und was sich dagegen tun lässt.
Zuletzt aktualisiert:
Ein Wort unbekannt? Das Begriffsverzeichnis erklärt es in wenigen Sätzen.
Zwei Fragen, die zusammenhängen
Ein Koch bereitet viele Gerichte vor. Für jeden Handgriff holt er eine Zutat aus dem Regal und trägt sie zur Arbeitsfläche. Wie weit er dabei läuft, hängt an zwei Entscheidungen: Welche Zutat steht in welchem Fach, und in welcher Reihenfolge erledigt er die Handgriffe? Steht nahe an der Arbeitsfläche, was er am meisten braucht, und läuft er kaum hin und her, spart er Schritte.
Dasselbe gilt in der Elektronikfertigung. Ein Bestückautomat setzt kleine Bauteile auf eine Leiterplatte. Sein Kopf holt jedes Bauteil an einem Zuführplatz ab, einem Band mit lauter gleichen Bauteilen, und setzt es an seine Stelle auf der Platte. Die Zuführplätze sind das Regal, die Stellen auf der Platte die Handgriffe. Gesucht ist die Fahrt des Kopfes mit der kürzesten Strecke.
Jede Frage für sich lässt sich lösen
Steht die Reihenfolge fest, lässt sich das beste Regal berechnen. Der Koch weiß dann für jeden Handgriff, wo er vorher stand und wohin er danach muss. So lässt sich für jede Zutat und jedes Fach ausrechnen, wie viel Strecke sie dort insgesamt verursacht; man wählt die Belegung mit der kleinsten Summe. Steht umgekehrt das Regal fest, lässt sich auch die beste Reihenfolge sicher finden, solange die Aufgabe klein bleibt, denn die Zahl der Reihenfolgen wächst mit jedem Handgriff rasch.
Abwechselnd verbessern und hängen bleiben
Naheliegend ist, abwechselnd vorzugehen; gleich zeigt sich, wo das scheitert. Der Koch legt eine Reihenfolge fest, räumt sein Regal passend dazu um, plant die Reihenfolge passend zum neuen Regal neu, räumt wieder um, und so weiter. Er führt einen Schritt nur aus, wenn er die Strecke kürzer macht oder gleich lässt. Irgendwann bringt weder Umräumen noch Umplanen etwas.
Sein Regal passt nun zur Reihenfolge und seine Reihenfolge zum Regal. Räumt er nur sein Regal um, wird die Strecke nicht kürzer; ändert er nur die Reihenfolge, ebenso wenig. Ein ganz anderes Regal mit ganz anderer Reihenfolge wäre vielleicht kürzer, aber dorthin führt kein einzelner Schritt.
Was das Ausprobieren zeigt
Zu dieser Seite gehört ein Programm zum Ausprobieren im Browser, die Demo. Es spielt die Bestückung mit erfundenen Platten durch und vergleicht mehrere Verfahren, Zuführplätze und Reihenfolge zu bestimmen. Zum Verstehen brauchen Sie es nicht.
Die kleinste Beispielrechnung ist von Hand nachvollziehbar: Links auf der Platte liegen zwei Stellen für eine Bauteilart, rechts zwei für die andere; je ein Zuführplatz liegt links und rechts. Liegt jede Art am Platz ihrer Seite, fährt der Kopf kurz. Beginnt das abwechselnde Verfahren mit vertauschten Plätzen, passt die beste Reihenfolge zur Vertauschung, und dazu passt die Vertauschung wieder am besten. Es bleibt bei einer Fahrt stehen, die länger ist als die beste.
In den Beispielen des Programms blieb das abwechselnde Verfahren in der Mehrzahl der Fälle hängen, wenn es mit einer angenommenen Regel begann: Die häufigsten Bauteile kommen auf die Zuführplätze nahe der Ruheposition des Kopfes, dem Platz, an dem er vor und nach der Fahrt steht. Probierte man in jedem Beispiel alle Anfangsbelegungen durch, führte beim mittleren Beispiel (geordnet nach dem Anteil guter Anfänge) nur ein Viertel der Anfänge zur besten Fahrt.
Ein anderes Vorgehen schnitt besser ab. Man lässt die Reihenfolge zunächst weg und fragt nur: Welche Bauteilart gehört in welches Fach? Dafür zählt, wie weit das Fach von den Stellen entfernt ist, an denen die Art gebraucht wird; das hängt nicht von der Reihenfolge ab. Für jede Art und jedes Fach addiert man diese Entfernungen und wählt die Belegung mit der kleinsten Summe: eine einzige Rechnung. Zu ihr sucht man dann die beste Reihenfolge. Fachleute nennen das Weglassen Relaxieren, die Rückkehr zum vollständigen Plan Runden. Bis auf eine erfundene Platte fand dieser Weg die beste Fahrt; bei der einen war seine Fahrt länger.
Die vereinfachte Rechnung liefert auch eine Untergrenze, eine Strecke, unter die keine Fahrt fallen kann. Denken Sie an eine Zahlengerade: links die Untergrenze, rechts die gefundene Fahrt, irgendwo dazwischen die beste. Ist der Abstand klein, ist die gefundene Fahrt fast die beste. In den Beispielen war die Untergrenze aber schwach: Sie lag unter dem besten Ergebnis, und der Abstand verrät nicht, ob er dem Plan fehlt oder der Untergrenze.
Häufige Missverständnisse
- „Wenn nichts mehr hilft, ist die Fahrt die kürzeste.“ Nein: Die Beispielrechnung von Hand endete trotzdem bei einer längeren Fahrt.
- „Die Belegung aus der vereinfachten Rechnung ist überall die beste.“ Nein: Sie traf bei den erfundenen Platten des Programms; für echte Platten zeigt das Programm nichts.
Woran Sie das im Betrieb erkennen
- Zwei Planer arbeiten nacheinander am selben Auftrag, einer an der Belegung der Zuführplätze, der andere an der Reihenfolge. Jeder passt sich dem anderen an, und nach einigen Runden ändert sich nichts mehr. Das ist das Erkennungszeichen.
- Gegenprobe: Starten Sie beide noch einmal von einer ganz anderen Belegung. Endet es bei einer anderen Fahrtlänge, war der erste Stillstand nicht das Beste. Endet es wieder gleich, spricht das für das Ergebnis, beweist es aber nicht.
Wie ernst sind die Rechnungen zu nehmen?
Die Rechnungen nehmen erfundene Platten, einen Kopf, der nur ein Bauteil auf einmal trägt, und für die Maschinenpraxis eine ausgedachte Regel. Sie zeigen, wie sich die Verfahren zueinander verhalten, nicht, wie Sie Ihre Anlage belegen.
Was Sie mitnehmen
- Zwei einzeln lösbare Entscheidungen können zusammen schwer sein, weil jede von der anderen abhängt.
- Prüfen Sie ein Ergebnis mit einem ganz anderen Anfang, und lassen Sie eine vereinfachte Rechnung einen Plan vorschlagen.
Hinweis: Alle Demos rechnen mit synthetischen oder frei verfügbaren Beispieldaten und laufen auf einem externen Anbieter (Datenschutz). Bitte geben Sie darin keine vertraulichen oder personenbezogenen Daten ein. Die Ergebnisse gelten für die jeweilige Demo-Instanz und lassen sich nicht ungeprüft auf reale Fälle übertragen; für darauf gestützte Entscheidungen übernehme ich keine Gewähr.
Modell und Annahmen
Ein Bestückkopf, der in der Rechnung ein Bauteil auf einmal trägt, holt es an einem Zuführplatz (Gurt) ab und setzt es auf seine Platzierung. Gegeben sind \(P\) Platzierungen \(p_1, \dots, p_P\) mit Ort und Typ \(\tau(i) \in \{1, \dots, T\}\), \(T\) Zuführplätze \(s_1, \dots, s_T\), eine Ruheposition \(h\) und der Tschebyscheff-Abstand \(d(a, b) = \max(|a_x - b_x|, |a_y - b_y|)\), also \(x\) und \(y\) gleichzeitig. Zu entscheiden sind eine bijektive Zuordnung \(\sigma\) (Typ \(\to\) Zuführplatz) und eine Reihenfolge \(o\) der Platzierungen; die Kosten sind die Länge der ganzen Fahrt. Das Modell ist eigen (wie der Abschnitt „Bestückung“ der Leiterplatte-Demo, hier mit einer Düse); die Literatur dazu ist nicht eingesehen.
- Maschine: Brett [0, 10] × [0, 6], die \(T\) Zuführplätze auf der Geraden \(y = -2\) zwischen \(x = 1\) und \(x = 9\), Ruheposition (5, −2). Jeder Typ kommt mindestens einmal vor.
- Instanzen: vier erfundene Familien (zufällig; Cluster je Typ; schief: ein Typ mit gut einem Drittel (30 bis 42 %) der Platzierungen; verschränkt: Typen im Schachbrett), \(P\) = 6, 8, 10, 12 und \(T\) = 3, 4, 5. Der Zufall ist SplitMix64.
- Feste Reihen: Seeds ab 100000, drei Größen \((P, T)\) = (8, 4), (10, 5), (12, 4), vier Familien, je 20 Seeds: 240 Instanzen. Alle Zahlen unten stammen aus diesen 240 Instanzen, sofern nicht anders vermerkt; Lücken sind Mittel über die Instanzen, Zählungen ganzzahlig.
- Messlatte: das gemeinsame Optimum, also alle \(T!\) Zuordnungen, je mit Held–Karp über die Reihenfolge (\(P \le 12\)). Die Lücke ist (Kosten − Optimum) / Optimum in Prozent; „hängt“ heißt: Kosten um mehr als 10⁻⁶ über dem Optimum.
Die Formeln
Die Kosten einer Fahrt mit der Reihenfolge \(o = (o_1, \dots, o_P)\) bei Zuordnung \(\sigma\): Ruheposition, Zuführplatz, Platzierung, Zuführplatz, Platzierung und so weiter, zuletzt zurück zur Ruheposition.
\[\mathrm{cost}(\sigma, o) = d(h, s_{\sigma(\tau(o_1))}) + d(s_{\sigma(\tau(o_1))}, p_{o_1}) + \sum_{k=2}^{P} \big[ d(p_{o_{k-1}}, s_{\sigma(\tau(o_k))}) + d(s_{\sigma(\tau(o_k))}, p_{o_k}) \big] + d(p_{o_P}, h)\]
Feste Reihenfolge: Jeder Typ \(t\) an Platz \(m\) kostet
\[c_{tm}(o) = \sum_{k : \tau(o_k) = t} \big[ d(\text{Vorgänger}_k, s_m) + d(s_m, p_{o_k}) \big]\]
Der Vorgänger ist \(h\) oder \(p_{o_{k-1}}\). Die Kosten sind \(\sum_t c_{t\sigma(t)}(o)\) plus ein fester Rest (der Rückweg): ein lineares Zuordnungsproblem, exakt mit der Ungarischen Methode. Feste Zuordnung: Jede Platzierung hat feste Eintrittskosten (Vorgänger \(\to\) ihr Zuführplatz \(\to\) \(p_i\)). Die Reihenfolge ist dann ein asymmetrisches Rundreiseproblem über die \(P\) Platzierungen mit Start und Ende \(h\), exakt mit Held–Karp in \(O(2^P P^2)\). Das gemeinsame Optimum ist \(\min_\sigma \min_o \mathrm{cost}(\sigma, o)\): alle \(T!\) Zuordnungen mit je einer Held–Karp-Rechnung.
Wechselweise Optimierung: Von einer Startzuordnung \(\sigma_0\) aus wird abwechselnd die Reihenfolge und die Zuordnung exakt neu bestimmt,
\[o_0 = \arg\min_o \mathrm{cost}(\sigma_0, o)\]
\[\sigma_1 = \arg\min_\sigma \mathrm{cost}(\sigma, o_0)\]
und so weiter mit \(o_1 = \arg\min_o \mathrm{cost}(\sigma_1, o)\). Die Kosten steigen dabei nicht; sie bleiben bei einem Fixpunkt stehen, der ein lokales Optimum beider Schritte ist, aber nicht notwendig der Gesamtaufgabe. Bei Gleichstand wird nur bei echter Verbesserung (mehr als 10⁻⁹) weitergerechnet.
Relaxation und Rundung: Ohne die Reihenfolge zählt von jeder Platzierung nur das Bein Zuführplatz \(\to\) Platzierung, mit
\[c_{tm} = \sum_{i : \tau(i) = t} d(s_m, p_i)\]
Das lineare Zuordnungsproblem \(\min_\sigma \sum_t c_{t\sigma(t)}\) liefert die Schwerpunkt-Zuordnung, die gerundete Lösung; danach wird die beste Reihenfolge bestimmt. Aus der Kostenformel folgt: Die Summe der Beine Zuführplatz \(\to\) Platzierung hängt nicht von der Reihenfolge ab, und die Schwerpunkt-Zuordnung minimiert sie über alle Zuordnungen (ein Test der Demo prüft das). Ob sie damit auch den von der Reihenfolge abhängigen Rest klein hält, ist nicht untersucht. Die untere Schranke des gemeinsamen Optimums besteht aus dem Zuordnungsproblem dieser Beine, dem kürzesten Weg von und zur Ruheposition und je dem kürzesten Anfahrtsweg für alle Platzierungen bis auf eine.
Die Verfahren
Die Demo vergleicht acht Verfahren an derselben Instanz:
- Maschinenpraxis, dann Reihenfolge: die häufigsten Typen auf die Zuführplätze nahe der Ruheposition, danach die beste Reihenfolge. Das ist eine Stand-in-Regel, keine Messung an einer Maschine.
- Schwerpunkt-Zuordnung, dann Reihenfolge: die gerundete Relaxation (siehe oben), danach die beste Reihenfolge.
- Erst die Reihenfolge, dann die Zuordnung: kürzeste Fahrt durch die Platzierungen ohne Zuführplätze, danach die beste Zuordnung dazu.
- Wechselweise Optimierung (Reihenfolge exakt, dann \(\sigma\) exakt, solange die Kosten sinken) aus der Maschinenpraxis, aus den Schwerpunkten, aus einem Zufallsstart, als beste von drei Zufallsstarts und im Anschluss an „erst die Reihenfolge“.
- Fangbecken: Von jeder der \(T!\) Startzuordnungen läuft die wechselweise Optimierung zu einem Fixpunkt; gezählt wird, wie viele Starts bei welchen Endkosten enden.
Warum ein Fixpunkt nicht das Optimum sein muss
Beide Schritte sind exakt, aber jeder sieht nur seine Nachbarschaft: die beste Reihenfolge bei fester Zuordnung, die beste Zuordnung bei fester Reihenfolge. Ein Paar \((\sigma, o)\), das in beiden Richtungen nichts mehr verbessert, kann dennoch schlechter sein als ein Paar, das sich nur durch gleichzeitiges Ändern beider erreichen lässt.
Das Handbeispiel der Demo zeigt es von Hand: zwei Typen, vier Platzierungen A (0, 0) und B (4, 4) vom Typ 0, C (10, 0) und D (9, 3) vom Typ 1, Zuführplätze bei \(x = 1\) und \(x = 9\). Das Optimum ist 34 mit \(\sigma = (0, 1)\) und der Reihenfolge ABCD (Wege 4, 2, 2, 6, 6, 2, 2, 5, 5). Startet die wechselweise Optimierung bei \(\sigma = (1, 0)\), endet sie nach 2 Runden bei 51 mit der Reihenfolge DACB (Wege 4, 8, 5, 9, 2, 9, 2, 6, 6): ein Fixpunkt, 50 % über dem Optimum, den weder die Reihenfolge noch die Zuordnung verbessert.
Befunde
Die Zahlen stammen aus der README der Demo und ihren Tests (tests/test_claims.py: Zählungen genau, Prozentwerte auf drei Stellen). Alles ist Messung an den vier erfundenen Familien und den drei Größen, 240 feste Instanzen. Gemessene Zeiten stehen in keiner Anzeige und in keinem Test.
| Frage | Befund und Voraussetzung |
|---|---|
| Wie oft hängt die wechselweise Optimierung? | Aus der Maschinenpraxis bleibt sie in 176 von 240 Instanzen über dem Optimum (Lücke im Mittel 2,14 %, größte 12,25 %), aus einem Zufallsstart in 151 von 240 (1,58 %, größte 11,75 %), als beste von drei Zufallsstarts noch in 90 von 240 (0,57 %, größte 8,59 %). |
| Wohin laufen die Startzuordnungen? (Fangbecken) | Von den \(T!\) Startzuordnungen führt im Median nur ein Viertel zum Optimum (kleinster Anteil 2 %); die Starts laufen im Median zu 7 verschiedenen Endkosten (größte Zahl 38). Nur in 7 von 240 Instanzen führen alle zum Optimum. |
| Wie gut ist die gerundete Relaxation? | Die Schwerpunkt-Zuordnung mit der besten Reihenfolge ist in 239 von 240 Instanzen optimal (Lücke im Mittel 0,003 %). Die eine Ausnahme (Familie „zufällig“, Seed 100006) liegt 0,62 % darüber. Die wechselweise Optimierung aus den Schwerpunkten ändert in keiner Instanz etwas. |
| Und die Maschinenpraxis dagegen? | 3,93 % im Mittel (213 von 240 über dem Optimum, größte 15,42 %). Die Schwerpunkt-Zuordnung ist in allen 240 Instanzen höchstens so teuer; gemessen für diese Regel der Maschinenpraxis, kein Satz. |
| Wie stark ist die untere Schranke? | Schwach: im Mittel 4,62 % unter dem Optimum (Median 4,51 %, größte 8,74 %). Sie liegt in keiner der 240 Instanzen über dem Optimum. Nützlich ist die Rundung, nicht die Schranke. |
| Ist „erst die Reihenfolge, dann die Zuordnung“ eine Abkürzung? | Nein: 189 von 240 über dem Optimum, im Mittel 3,16 % (größte 15,21 %); besser als die Maschinenpraxis in 130 Instanzen. Schließt man wechselweise an, sinkt die Lücke auf 0,47 % (102 von 240, größte 4,90 %), etwa auf das Niveau von drei Zufallsstarts. |
| Unterscheiden sich die Familien? | Ja. Wechselweise aus der Maschinenpraxis, mittlere Lücke: Cluster 0,46 %, zufällig 1,47 %, schief 2,03 %, verschränkt 4,61 %. Bei den verschränkten Typen ändert die wechselweise Optimierung die Maschinenpraxis in 59 von 60 Instanzen gar nicht (sie ist schon ein Fixpunkt); „erst die Reihenfolge“ ist dort mit 7,37 % im Mittel am schlechtesten. |
| Spielt die Größe eine Rolle? | Maschinenpraxis im Mittel 3,36 % / 5,23 % / 3,19 % bei \((P, T)\) = (8, 4) / (10, 5) / (12, 4). Der Anteil der Starts, die zum Optimum führen, liegt im Median bei 33 % / 18 % / 25 % (mit 5 / 13 / 6 verschiedenen Endkosten im Median). Bei fünf Typen (120 Startzuordnungen) gibt es mehr verschiedene Endkosten und weniger Starts zum Optimum; (10, 5) unterscheidet sich aber auch in \(P\). |
| Gegenprobe des linearen Schritts | Die beste Zuordnung bei der optimalen Reihenfolge ist in 240 von 240 Instanzen das Optimum. Das folgt aus der Definition des Optimums und ist kein Befund; es prüft nur, dass der lineare Schritt nichts verschenkt. |
Lücke zum gemeinsamen Optimum, Mittel (in Klammern die Zahl der Instanzen über dem Optimum), nach Größe \((P, T)\):
| Verfahren | alle 240 | (8, 4) | (10, 5) | (12, 4) |
|---|---|---|---|---|
| Maschinenpraxis, dann Reihenfolge | 3,93 % (213) | 3,36 % (66) | 5,23 % (74) | 3,19 % (73) |
| Schwerpunkt-Zuordnung, dann Reihenfolge | 0,00 % (1) | 0,01 % (1) | 0,00 % (0) | 0,00 % (0) |
| Erst die Reihenfolge, dann die Zuordnung | 3,16 % (189) | 3,02 % (61) | 2,96 % (62) | 3,51 % (66) |
| Wechselweise aus der Maschinenpraxis | 2,14 % (176) | 1,26 % (50) | 3,56 % (63) | 1,61 % (63) |
| Wechselweise, beste von 3 Zufallsstarts | 0,57 % (90) | 0,41 % (26) | 0,86 % (36) | 0,45 % (28) |
| Erst die Reihenfolge, dann wechselweise | 0,47 % (102) | 0,46 % (22) | 0,59 % (46) | 0,36 % (34) |
Grenzen
- Eine Düse: Mit mehreren Düsen oder Köpfen (Sammeln und Setzen, Revolverkopf) entscheiden Bündelung und Wechselzeiten mit; \(\sigma\) und \(o\) sind dann nicht mehr die ganze Entscheidung.
- Geometrie: Tschebyscheff-Abstand und Zuführplätze auf einer Geraden. Echte Köpfe haben Beschleunigungsprofile, Drehungen der Bauteile und getrennte Achsen; Wagen und mehrere Reihen ändern die Geometrie.
- Die Maschinenpraxis ist ein Stand-in: „Häufigste Typen in die Mitte“ ist eine Annahme, keine Messung an einer Maschine. Der Befund „die Schwerpunkt-Zuordnung schlägt sie“ gilt für diese Regel.
- Exakt nur klein: Das gemeinsame Optimum rechnet alle \(T!\) Zuordnungen mit Held–Karp (\(2^P\) Teilmengen), also nur bis \(P = 12\), \(T = 5\). Für große Platinen gibt es die Messlatte nicht; die Lücken der Verfahren dort sind nicht gemessen.
- Gleichstände: Gibt es mehrere gleich gute Reihenfolgen oder Zuordnungen (bei Tschebyscheff-Abständen häufig), hängt der Fixpunkt der wechselweisen Optimierung davon ab, welche gewählt wird. Held–Karp nimmt den ersten Index innerhalb von 10⁻⁹ des Minimums, die Zuordnungsmatrix ist auf neun Stellen gerundet. Eine erste Fassung ohne diese Regel ergab auf Linux andere Fixpunkte als auf Windows (170 statt 172 hängende Instanzen von 240); mit der Regel stimmen die Zahlen überein, aber die Zählungen sind für diese Auflösung gemessen, nicht für jede mögliche.
- Nur ein Fixpunktverfahren: Nachbarschaftssuche, Annealing und Mehrfachstarts sind nur als „beste von 3 Zufallsstarts“ geprüft.
- Erfundene Familien, 240 Instanzen, drei Größen: Die Typenverteilung echter Platinen ist eine andere; ein Befund über diese Familien ist keiner über Platinen. Instanzen aus der Literatur gibt es nicht. Die Lücken streuen: Bei der Maschinenpraxis liegt der Median bei 2,38 % gegen das Mittel 3,93 %.
- Zeit: ist implementierungsabhängig (Python-Fassung); in Tests stehen nie Zeiten. Die Zahlen der Tabellen stammen aus dem Windows-Lauf. Ein Mutationstest fehlt.
- Warum die Rundung so gut trifft: Die README nennt keine Erklärung für 239 von 240; sie ist in dieser Messreihe nicht untersucht.
Erweiterungen und Verweise
Bewusst nicht umgesetzt sind mehrere Düsen, Köpfe oder Zuführer samt Rüstzeiten, Beschleunigungsprofile, große Platinen (dafür bräuchte man schärfere Schranken oder Metaheuristiken), die Messung der Maschinenpraxis an einer echten Maschine und Instanzen aus der Literatur. Verwandte Teile derselben Linie:
- Die Aufgabe stammt aus dem Abschnitt „Bestückung“ der Leiterplatte-Demo.
- Relaxieren und Runden einer Zuordnung zeigt die Birkhoff-Relaxation; die weiteren Stücke der Linie stehen auf der Seite Anordnen: relaxieren und runden.
Quellen
- Quelltext, Dokumentation und Tests der Demo: github.com/sebastian-hanisch/zuordnung-reihenfolge-demo.
- Literatur zur Bestückreihenfolge, zur Zuführplatz-Zuordnung und zu alternierenden Minimierungsverfahren: Die README nennt keine einzelnen Werke und vermerkt, dass ihr Autor dazu nur Namen aus der Fachliteratur kennt und nichts nachgelesen hat.
Für diese Seite wurde keine Literatur nachgeschlagen. Held–Karp und die Ungarische Methode sind als Verfahren genannt, wie die Demo sie einsetzt, ohne Quellenangabe. Alle Zahlen stammen aus der README der Demo; die Folgerung zur Summe der Beine in den Formeln ist eine Rechnung dieser Seite aus der Kostenformel, keine Messung.