Benutzerhandbuch
Vorwort
ermöglicht wirtschaftliche Abläufe zu organisieren, abzustimmen und zu optimieren. Die involvierten Prozesse werden dafür in ein mathematisches Modell überführt, das sich durch ein gemischt-ganzzahliges System von (linearen) Gleichungen, Ungleichungen und geeigneter Zielfunktionen (GGL-S) darstellen lässt.
bestimmt (optimale) Lösungen für dieses modellierte System. Die Lösungen lassen sich auf die ursprünglichen Prozesse zurücktransformieren und liefern schließlich optimierte Strategien für deren Ablauf.
Es werden Ihnen nun verschiedene Problemstellungen vorgestellt, die in GGL-Systemen resultieren und Sie werden kurz in die mathematische Modellbildung entführt. Nach diesem Exkurs werden Sie die vielfältigen Optionen von kennenlernen und bekommen in einfachen Tutorials das für die Anwendung erforderliche Wissen vermittelt.
Problemstellungen
Die nachfolgenden (exemplarischen) Probleme sollen die Herangehensweise verdeutlichen, wie sie ihre tatsächlichen, realen Prozesse in eine Form bringen können, so dass sie mit gelöst werden können. Wenn Sie in der nachfolgenden Auflistung ein Problem gefunden haben, das ihrem Prozess (mehr oder weniger) in analoger Weise entspricht, dann sollten Sie dieses als Basis für die Formulierung Ihres eigene Szenarios verwenden.
Kompositionsprobleme
Ladeproblem
Es seien n Objekte mit Nutzwerten c1,c2,,cn und ihren jeweiligen Gewichten g1,g2,,gn gegeben. In einen Container mit der Kapazität K sollen derart Objekte gepackt werden, dass bei gleichzeitiger Einhaltung dessen Fassungsvermögens, die Summe über die Nutzwerte aller verstauten Objekte maximal wird.
Die mathematische Formulierung hierzu lautet:
Demnach landet das i-te Objekt genau dann im Container, wenn der Lösungsvektor an der i-ten Position eine 1 enthält, bzw. bleibt im Falle eines Eintrags gleich 0 unberücksichtigt.
In der Literatur wird das Ladeproblem auch als Rucksackproblem bezeichnet, weil sich die geschilderte Fragestellung insbesondere beim Packen eines Rucksacks bzw. Koffers stellt.
Mischungsproblem
Das Mischungsproblem ergibt sich aus Fragestellungen der Zusammensetzung von Baustoffen, Diätplänen oder Futtermitteln.
Betrachten Sie beispielsweise folgendes Problem:
Ein Futtermittelkonzern hat mehrere Nährstoffpräparate für die Zusammensetzung eines neuartigen Spezialfutters zur Auswahl. Das Spezialfutter soll ein vorgegebenes Mindestmaß an Nährstoffen bereitstellen und dabei möglichst preisgünstig sein.
Die Zusammensetzung der Nährstoffpräparate und die geforderten Mindestwerte für das Spezialfutter in tabellenhafter Darstellung:
|
Kohlenhydrate |
Proteine |
Vitamine |
Kosten |
|
Kraftfutter |
20 |
15 |
5 |
12 € |
Pflanzenteile |
10 |
3 |
10 |
7 € |
Getreidepräparat |
12 |
2 |
3 |
9 € |
Mastfutter |
30 |
15 |
5 |
18 € |
|
Mindestmenge |
50 |
30 |
40 |
|
Es soll nun entschieden werden, welche Präparate für die Produktion des Spezialfutters zu verwenden sind, um kostenminimal und bedarfsgerecht zu produzieren.
Die Antwort liefert wiederum ein lineares Gleichungssystem, dessen Lösungsvektor (x1,x2,x3,x4) die Anteile an Kraftfutter, Pflanzenteilen, Getreidepräparaten und Mastfutter enthält, die eine kostenminimale Produktion des Futtermix, bei gleichzeitiger Einhaltung der Mindestmengen, sicherstellen.
In dieser Form verlangt das System noch keine Ganzzahligkeit des Lösungsvektors - um allerdings zu berücksichtigen, das (beispielsweise) Mastfutter nur in kompletten Einheiten verarbeiten werden darf, ist ein GGL-System unabdinglich:
Minimiere 12x17x29x318x4
so dass 20x110x212x330x450,
15x13x22x315x430,
5x110x23x35x440,
0x1K1, 0x2K2,
0x3K3, 0x4K4
und x1,x2,x3, x4
( Ki bezeichnet für i=1,2,3,4 den Vorrat an Nährstoffpräparaten )
Einkaufsprobleme
Bundleproblem
Für die Produktion von Elektrogeräten benötigt eine Firma täglich eine gewisse Anzahl von Kondensatoren, Widerständen und Platinen. Die Materialien können dabei nur in vorgegebenen Stückzahlen (Bundles) vom Großhandel eingekauft werden. Das Ziel der Elektrogerätefirma besteht darin, die Angebote so zu kombinieren, dass einerseits der Bedarf gestillt ist, andererseits aber nicht unnötig viel Geld ausgegeben wird.
Die Bundle-Angebote der Großhändler:
|
Kondensatoren |
Widerstände |
Platinen |
Preis |
|
Großhändler A |
20000 |
15000 |
5000 |
1000 € |
Großhändler B |
16000 |
3000 |
10000 |
800 € |
Großhändler C |
16000 |
10000 |
8000 |
750 € |
Großhändler A |
20000 |
0 |
0 |
450 € |
Großhändler B |
10000 |
0 |
4000 |
300 € |
Großhändler C |
0 |
3000 |
0 |
200 € |
Großhändler C |
0 |
0 |
4000 |
100 € |
|
Mindestbedarf |
40000 |
30000 |
20000 |
|
Damit ergibt sich die mathematische Formulierung:
Minimiere 1000x1800x2750x3450x4300x5200x6100x7
so dass 20000x116000x216000x320000x410000x540000,
15000x13000x210000x33000x630000,
5000x110000x28000x34000x54000x720000,
0x14, 0x210,
0x33, 0x42, 0x55,
0x610, 0x75,
xi für i=1,2,,7
Zur Ermittlung der preiswertesten Angebotskombination müssten bereits in diesem einfachem Beispiel 261360 verschiedene Varianten überprüft werden, um mit absoluter Sicherheit sagen zu können, dass es sich dabei um die beste aller möglichen Kombinationen handelt.
Lagerhaltungsproblem
Ein Einzelhändler hat Bedarf an n verschiedenen Gütern und hat für jedes Gut ein maximale Lagerkapazität. Er kann die benötigten Gütern von m Großhändlern kaufen, die die Güter jeweils mit einer Mindest- und Maximalabgabe (mi,j, Mi,j) zu einem vorgegebenen Preis pi,j abgeben. Ziel des Einzelhändlers ist es, den Bedarf bj für jedes Gut zu stillen, die jeweilige Lagerkapazität lj nicht zu überschreiten und dabei letztendlich die Gesamtkosten für die zu kaufenden Güter zu minimieren.
Die gesuchte Variable xi,j repräsentiert die Anzahl der Einheiten vom Gut i, die der Einzehlhändler vom Großhändler j kaufen sollte, um seine Kosten zu minimieren.
Verkaufsproblem
Eine Elektrogeräte produzierende Firma möchte Ihre Produkte gewinnbringend auf dem freien Markt verkaufen. Sie hat verschiedene Angebote diverser Elektroverbrauchermärkte vorliegen. Welche Angebote sollten mit der vorhandenen Menge an Geräten befriedigt werden, um den maximal möglichen Verkaufsgewinn zu erzielen?
Die Angebotsdaten der Verbrauchermärkte:
|
Computer |
Fernseher |
Tablet-PC |
Kaufangebot |
|
Verbrauchermarkt A |
200 |
150 |
50 |
100000 € |
Verbrauchermarkt B |
160 |
30 |
100 |
80000 € |
Verbrauchermarkt C |
160 |
100 |
80 |
75000 € |
Verbrauchermarkt A |
200 |
0 |
0 |
45000 € |
Verbrauchermarkt B |
100 |
0 |
40 |
30000 € |
Verbrauchermarkt C |
0 |
30 |
0 |
20000 € |
Verbrauchermarkt C |
0 |
0 |
40 |
10000 € |
|
Produktionsmenge |
400 |
300 |
200 |
|
Die mathematische Modellierung lautet folgendermaßen:
Maximiere 100000x180000x275000x345000x430000x520000x610000x7
so dass 200x1160x2160x3200x4100x5400,
150x130x2100x330x6300,
50x1100x280x340x540x7200,
0x12, 0x22,
0x32, 0x42, 0x54,
0x610, 0x75,
xi für i=1,2,,7
Auslastungsproblem
Ein Betrieb setzt m Maschinen zur Herstellung von n verschiedenen Bauteilen Bj ein.
Die Maschinen sind für die Herstellung der Bauteile unterschiedlich gut geeignet, was sich in der Herstellungszeit ti,j niederschlägt, die von der i-ten Maschine benötigt wird, um das
j-te Bauteil zu produzieren.
Es soll nun von jedem Bauteil Bj eine vorgegebene Anzahl
bj produziert werden,
und zwar derart, dass die Zeit, die für die Produktion aller Bauteile benötigt wird, minimiert wird - was
mit einer optimalen
Auslastung der Maschinen einhergeht.
Es wird also eine Matrix
xmn gesucht, die nachstehendes Problem löst:
Sollte die i-te Maschine für die Produktion des j-ten Bauteils nicht geeignet sein, ist in dem Modell die entsprechende Variable xi,j durch eine 0 zu ersetzen.
In der nachfolgenden Tabellen werden beispielhaft die Herstellungszeiten einiger Bauteile auf verschiedenene Maschinen gelistet. Der eigentliche Bedarf findet sich schließlich am Ende der Tabelle:
|
Radlager (B1) |
Zahnrad (B2) |
Rahmenteil (B3) |
Kurbelwelle (B4) |
Zylinder (B5) |
|
Fräsmaschine M1 |
45 |
15 |
30 |
35 |
90 |
Fräsmaschine M2 |
20 |
10 |
15 |
40 |
- |
Fräsmaschine M3 |
- |
5 |
20 |
- |
45 |
Fräsmaschine M4 |
20 |
- |
- |
30 |
- |
Fräsmaschine M5 |
- |
10 |
40 |
- |
- |
Fräsmaschine M6 |
30 |
20 |
60 |
45 |
120 |
|
Bedarf |
40 |
100 |
20 |
50 |
30 |
|
Man erhält in diesem speziellen Fall:
Minimiere 45x1,115x1,230x1,335x1,490x1,520x2,110x2,215x2,340x2,45x3,220x3,345x3,520x4,130x4,410x5,240x5,330x6,120x6,260x6,345x6,4120x6,5
so dass x1,1x2,1x4,1x6,1=40,
x1,2x2,2x3,2x5,2x6,2=100,
x1,3x2,3x3,3x5,3x6,3=20,
x1,4x2,4x4,4x6,4=50,
x1,5x3,5x6,5=30,
x2,5=0,
x3,1=0,
x3,4=0,
x4,2=0,
x4,3=0,
x4,5=0,
x5,1=0,
x5,4=0,
x5,5=0,
0xi,140,
0xi,2100,
0xi,320,
0xi,450,
0xi,530 für i=1,2,,6
xi,j für 1i6 und 1j5
Produktionsproblem
Ein Hersteller produziert m unterschiedliche Produkte, wobei für die Produktion eines Produktes Pi diverse Bauteile Bj (1jn) benötigt werden. Welche und wieviele Produkte sind mit dem Vorrat an Bauteilen zu produzieren, damit der Gewinn maximiert, die Mindest- und Höchstproduktionsmengen eingehalten und außerdem keine Ressourceneinschränkung verletzt wird?
Der Verkaufspreis von Pi wird mit pi und die Herstellungskosten mit hi bezeichnet. Der Vorrat an Bauteilen des Typs Bj wird abgekürzt mit bj, die maximale Produktionsmenge eines Produkts mit ui und die Mindestproduktionsmenge mit li. Die Kosten eines Bauteils Bj betragen cj und die Anzahl der benötigten Bauteile Bj zur Produktion von Pi wird deklariert mit bi,j.
Demnach wird ein Vektor xm gesucht, der das folgende Problem löst:
Mit diesem einfachem und flexiblem Modell kann in Echtzeit auf Änderungen bei Bauteilpreisen oder Herstellungskosten reagiert werden.
Transportproblem
Das klassische Transportproblem wird auch als das "Problem des Handlungsreisenden" bezeichnet und lautet:
Ein Reisender möchte ausgehend von einer vorgegebenen Stadt eine Rundreise durch n Städte machen und zwar derart, das der Weg, den er dabei zurücklegen muss, minimal wird.
Rundreise bedeutet dabei, das die Reise in derselben Stadt endet, wo sie begonnen wurde.
Wenn di,j die Entfernung zwischen der i-ten und j-ten Stadt bezeichnet, lässt sich dieses Problem in folgender Weise mathematisieren:
Die Variable xi,j ist dabei gleich 1 wenn die Rundreise direkt von der i-ten in die j-te Stadt führt und gleich 0 wenn nicht. Die zusätzlichen Variable ui spiegelt wider, an welcher Position der Rundreise sich die i-te Stadt befindet.
Die ersten beiden Gleichungssysteme für die
xi,j gewährleisten, das die gesuchte Rundreise in jede Stadt nur einmal hinein- und auch nur einmal hinausführt. Die Ungleichungen, die sich mit
ui befassen, stellen sicher, dass die Rundreise zusammenhängend ist. Eine genauere Beschreibung der mathematischen Hintergründe ist hier zu finden:
Logistikproblem
Eine im Logistik-Bereich immer wieder anzutreffende Variante des Transportproblems, bei der als zusätzlicher Parameter das Ladungsgewicht der transportierten Gütern mitberücksichtigt wird, lautet:
Ein LKW ist mit n Gütern beladen und startet in einer vorgegebenen Stadt. Jedes Gut ist für eine spezifische Stadt i bestimmt und hat ein Ladungsgewicht gi in Kilogramm. Es wird eine Rundreise gesucht, die den Treibstoffverbrauch des LKWs minimiert.
Den Treibstoffverbrauch des unbeladenen LKW pro 100 km beinhaltet die Konstante L. Der zusätzliche Treibstoffverbrauch je Tonne Ladung pro 100 km wird durch die Konstante T widergespiegelt.
Das Problem lässt sich damit nun in ähnlicher Weise wie das "Problem des Handlungsreisenden" formulieren – es kommmen nun allerdings noch Variable yi,j hinzu, die repräsentieren wieviel Kilogramm Ladung von Stadt i nach Stadt j transportiert wird.
In der Literatur bezeichnet man ein Logistik-Problem dieser Art auch als Green Vehicle Routing Problem.
Marktaufteilungsproblem
Marktaufteilungsprobleme ergeben sich, wenn ein Unternehmen Sitze in mehreren Ländern hat und aufgrund unterschiedlich hoher Steuersätze in den betreffenden Ländern, das Vertriebsgeschäft so aufteilen möchte, das in Ländern mit geringerer Steuerlast die Vertriebsmenge entsprechend größer ausfällt.
Ein Unternehmen umfasst zwei Abteilungen, D1 und D2, die mehrere Vertriebspartner mit unterschiedlichen Produkten versorgen. Das Marktaufteilungsproblem besteht darin, jedem Vertriebspartner genau einer Abteilung zuzuordnen (d.h. entweder D1 oder D2), so dass D1 ein p-tel des Marktes für jedes Produkt des Unternehmens kontrolliert und D2 die restlichen 100(1p) Prozent.
Bezeichnet m die Anzahl der Vertriebspartner, n die Anzahl der verschiedenen Produkte und ai,j den Bedarf von Vertriebspartner i am Produkt j, ergibt sich die mathematische Formulierung:
Die rechte Seite
ergibt sich aus dem gewünschten Market-Split zwischen D1 und D2.
Die Komponenten des (binären) Lösungsvektors x ordnen jeden Vertriebspartner einer der beiden Divisionen zu und enthalten eine 0 für Division D1 und eine 1 für Division D2.
Der Wert von si reflektiert, inwiefern es möglich war, den Market-Split für das i-te Produkt zu realisieren. Ist si=0, dann war der exakte Split möglich.
Wenn ein exakter Split nicht möglich ist, dann garantiert die in der Formulierung enthaltene Minimierungsfunktion, das nach einer Lösung gesucht wird, bei der die Abweichung am geringsten ausfällt.
Mathematische Beschreibung
Eine abstrakte, mathematische Beschreibung, die alle diese gemischt-ganzzahligen, linearen Systeme erfasst, lässt sich in folgender Weise formulieren:
Die linearen Zielfunktionen seien repräsentiert durch eine Zielfunktionsmatrix Ctn und einen Vektor d∞,∞t⋃t.
Die Zeilen von C enthalten die Koeffizienten der Zielfunktionen, während die Einträge von d die Zielfunktionswerte definieren.
Des weiteren sei A eine Matrix qn und b ein Vektor q. Sie repräsentieren das lineare Gleichungssystem, das eine Lösung erfüllen muss.
Das Ungleichungssystem sei beschrieben durch eine Matrix Hrn und Vektoren v,wr, deren Einträge Intervalle definieren, innerhalb derer die Ungleichungsresultate einer Optimallösung liegen müssen.
Zwei zusätzliche Vektoren l und u enthalten die Intervallgrenzen, innerhalb derer sich die Komponenten eines Vektors xn bewegen müssen, um als Lösung in Frage zu kommen.
Das resultierende allgemeine, lineare Optimierungsproblem (GGL-S) lautet dann:
Finde ein
xn mit:
Ax=b, vHxw und lxu
so dass für
y:=Cx die Zielfunktionssumme
minimal wird.
Die Teilsumme
wird auch als
Schlupfabweichung bezeichnet.
Die Lösung eines solchen GGL-Systems lässt sich in polynomialer Rechenzeit bis hin zur Optimalität bestimmen. Fordert man allerdings, dass einzelne Komponenten des Lösungsvektors x ganzzahlig sein sollen, sind exponentiell viele Rechenschritte nötig.
Die Notwendigkeit einer Ganzzahligkeitsbedingung resultiert aus praktischen Überlegungen, etwa weil nur ganze Stückzahlen produziert werden können, oder - im Falle von Entscheidungsprozessen - nur zwei verschiedene Zustände erlaubt sind.
Um derlei Ganzzahligkeitsforderungen abzubilden, sei nun noch ein Vektor p0n gegeben, der für die Komponenten von x, die jeweilige maximale Anzahl von Nachkommastellen enthält.
Man erhält damit als letzte Forderung für die Anzahl der Nachkommastellen f von x:
f:n0n,xf(x)p
Programmpaket
Der Inhalt des Pakets
besteht neben dem Hauptprogramm aus diversen Zusatztools und kann auf Rechnern mit Intel-Prozessor(en) unter den Betriebssystemen FreeBSD, Linux, macOS und Windows benutzt werden. Die Programme werden von der Kommandozeile aus bedient und setzen demnach etwas Anwenderwissen bezüglich der Handhabung von Windows-Konsolen bzw. UNIX-Shells voraus. Eine graphische (per Browser bedienbare) Benutzeroberfläche befindet sich gegenwärtig noch im Entwicklungsstadium.
Im Paket befinden sich folgende Programmdateien:
0ptX |
(Hauptprogramm) |
opt2lp, lp2opt |
(Konverter) |
sol |
(Verifizierer) |
Exemplarische Problemdateien im
lp bzw.
opt-Format befinden sich in entsprechend bezeichneten Unterordnern.
Kurzbeschreibung
Das Hauptprogramm liest Dateien im opt-Format ein, welche die zu lösenden Gleichungssysteme beinhalten, und übersetzt diese Daten zunächst in ein äquivalentes Gitterproblem, das in einer Datei mit der Endung lat zwischengespeichert wird.
Bei mehrfachen Aufrufen des Hauptprogramms mit derselben opt-Datei wird direkt mit der einfacher zu verarbeitenden lat-Datei gestartet, was eine gesteigerte Performance zur Folge hat.
Damit mit dem Konkurrenzprodukt IBM ILOG CPLEX verglichen werden kann, muss dessen lp-Format ins opt-Format überführt werden. Dies wird von lp2opt bewerkstelligt. Die entgegengesetzte Konvertierung übernimmt opt2lp.
Nachdem das Hauptprogramm gestartet wurde, wird eine Datei mit der Endung sol im Verzeichnis der zugehörigen opt bzw. lat-Datei angelegt, in der alle bisher gefundenen Lösungsvektoren und (heuristisch) kürzesten Gittervektoren gespeichert werden.
Die
sol-Dateien werden in verschlüsselter Form abgespeichert. Die Entschlüsselung und Übersetzung in entsprechende Lösungen des ursprünglichen Systems, übernimmt das Hilfsprogramm
sol, das Sie in Verbindung mit einem
Entschlüsselungskontingent nutzen können.
Damit Sie sich auch
ohne Entschlüsselungskontingent einen
vollumfänglichen Eindruck von
verschaffen können, werden die Lösungen zu Problemen, deren Dimension
n10 ist, nicht verschlüsselt und können demnach uneingeschränkt begutachtet werden.
Das opt-Format fungiert als das Standardformat zur Speicherung eines allgemeinen linearen Optimierungs-Problems, wie es im zweiten Kapitel dargestellt wurde.
Die Auszeichnung eines Vektors v erfolgt derart, das die Einträge durch Leerzeichen voneinander getrennt, innerhalb eines eckigen Klammerpaares, angegeben werden:
[v1v2vn]
Analog lässt sich eine Matrix A=(ai,j) darstellen:
[
[a1,1a1,2a1,n]
[a2,1a2,2a2,n]
⋮
[am,1am,2am,n]
]
Die Speicherung der Problemdaten als Datei im opt-Format, geschieht damit in der folgenden Art und Weise:
/*ZielfunktionsSektion:d,C*/
[d1d2dt]
[
[c1,1c1,2c1,n]
[c2,1c2,2c2,n]
⋮
[ct,1ct,2ct,n]
]
/*GleichungsSektion:A,b*/
[
[a1,1a1,2a1,n]
[a2,1a2,2a2,n]
⋮
[aq,1aq,2aq,n]
]
[b1b2bq]
/*UngleichungsSektion:H,v,w*/
[
[h1,1h1,2h1,n]
[h2,1h2,2h2,n]
⋮
[hr,1hr,2hr,n]
]
[v1v2vr]
[w1w2wr]
/*LösungsvektorSektion:p,l,u*/
[p1p2pn]
[l1l2ln]
[u1u2un]
Um die praktische Verwendung des Dateiformats zu demonstrieren, folgen nun einige exemplarische Beispiele:
Beispiel (ohne Zielfunktion)
Finde ein x4 mit (1,0,0,1)Tx(2,3,4,5)T,
so dass: 2x24x3=16, 3x17x4=31,
0x15x421, 2x2x37
Man erhält daraus:
Demgemäß hat die zugehörige Datei „beispiel.opt” den folgenden Inhalt:
[ ]
[
]
[
[ 0 2 4 0 ]
[ 3 0 0 7 ]
]
[ 16 31 ]
[
[ 1 0 0 5 ]
[ 0 1 1 0 ]
]
[ 0 2 ]
[ 21 7 ]
[ 0 0 0 0 ]
[ 1 0 0 1 ]
[ 2 3 4 5 ]
Beispiel (mit einer Zielfunktion)
Finde einx4mit
(1,0,0,1)Tx(2,3,4,5)T,
so dass: 2x24x3=16,
3x17x4=31
0x15x421, 2x2x37
wobei5x1x22x36x4 maximal wird.
Hieraus erhält man:
Der Inhalt der zugehörigen opt-Datei lautet damit:
[ inf ]
[
[ 5 1 -2 6 ]
]
[
[ 0 2 4 0 ]
[ 3 0 0 7 ]
]
[ 16 31 ]
[
[ 1 0 0 5 ]
[ 0 1 1 0 ]
]
[ 0 2 ]
[ 21 7 ]
[ 0 0 0 0 ]
[ 1 0 0 1 ]
[ 2 3 4 5 ]
Beispiel (mit zwei Zielfunktionen)
Finde ein x4
mit (1,0,0,1)Tx(2,3,4,5)T,
so dass: 2x24x3=16,
3x17x4=31
0x15x421, 2x2x37
wobei x13x2x3x4 minimal,
und 5x1x22x36x4 maximal wird.
Es ergeben sich die Daten:
Und der Inhalt der zugehörigen opt-Datei lautet:
[ -inf inf ]
[
[ 1 -3 1 1 ]
[ 5 1 -2 6 ]
]
[
[ 0 2 4 0 ]
[ 3 0 0 7 ]
]
[ 16 31 ]
[
[ 1 0 0 5 ]
[ 0 1 1 0 ]
]
[ 0 2 ]
[ 21 7 ]
[ 0 0 0 0 ]
[ 1 0 0 1 ]
[ 2 3 4 5 ]
Beispiel (mit drei Zielfunktionen)
Finde ein
x4 mit
(1,0,0,1)Tx(2,3,4,5)T,
so dass:
2x24x3=16,
3x17x4=31 0x15x421,
2x2x37
wobei
x13x2x3x4 minimal
5x1x22x36x4 maximal,
und
9x1x22x38x410 minimiert wird.
Dies liefert:
Und in Form einer opt-Datei:
[ -inf inf 10 ]
[
[ 1 -3 1 1 ]
[ 5 1 -2 6 ]
[ 9 -1 2 -8 ]
]
[
[ 0 2 4 0 ]
[ 3 0 0 7 ]
]
[ 16 31 ]
[
[ 1 0 0 5 ]
[ 0 1 1 0 ]
]
[ 0 2 ]
[ 21 7 ]
[ 0 0 0 0 ]
[ 1 0 0 1 ]
[ 2 3 4 5 ]
Das nun folgende, letzte Beispiel, wird sämtliche Möglichkeiten des opt-Dateiformats ausschöpfen und insbesondere für einige Komponenten des Lösungsvektors keine Ganzzahligkeit mehr fordern, es muss dann allerdings angegeben werden, wieviele Nachkommastellen maximal erlaubt sind.
Beispiel (mit gemischt-ganzzahligen Lösungen)
Finde ein
x mit
(1,0,0,1)Tx(2,3,4,5)T,
und höchstens
4 bzw.
1 Nachkommastelle(n)
in der zweiten bzw. dritten Komponente,
so dass:
2x24x3=16,
3x17x4=31 0x15x421,
2x2x37
wobei
x13x2x3x4 minimal,
5x1x22x36x4 maximal
und
9x1x22x38x410 minimiert wird.
[ -inf inf 10 ]
[
[ 1 -3 1 1 ]
[ 5 1 -2 6 ]
[ 9 -1 2 -8 ]
]
[
[ 0 2 4 0 ]
[ 3 0 0 7 ]
]
[ 16 31 ]
[
[ 1 0 0 5 ]
[ 0 1 1 0 ]
]
[ 0 2 ]
[ 21 7 ]
[ 0 4 1 0 ]
[ 1 0 0 1 ]
[ 2 3 4 5 ]
lp opt
Um ein lineares Problem im CPLEX lp-Format einzulesen, wird das Programm lp2opt benötigt, mit dessen Hilfe man das Problem ins opt-Format umwandeln kann.
Die einzulesende Datei „beispiel.lp” besitze den folgenden Inhalt:
Minimize
obj: 2x1 - 4x2 + 5x3
Subject To
1x1 + 5x4 <= 21
1x1 + 5x4 >= 0
2x2 + 4x3 = 16
3x1 + 7x4 = 31
Bounds
0 <= x1 <= 2
0 <= x2 <= 3
0 <= x3 <= 4
0 <= x4 <= 5
General
x1 x2 x3 x4
End
Durch den folgenden Kommandoaufruf wird die Datei ins opt-Format konvertiert und unter dem Namen „beispiel.opt” abgespeichert:
# ./lp2opt beispiel.lp
Die resutierende Datei „beispiel.opt” besitzt den Inhalt:
[ -inf ]
[
[ 2 -4 5 0 ]
]
[
[ 0 2 4 0 ]
[ 3 0 0 7 ]
]
[ 16 31 ]
[
[ 1 0 0 5 ]
]
[ 0 ]
[ 21 ]
[ 0 0 0 0 ]
[ 0 0 0 0 ]
[ 2 3 4 5 ]
Falls der entgegengesetzte Weg gewünscht ist, d.h. eine Konvertierung vom opt-Format ins CPLEX lp-Format ist das Hilfsprogramm
opt2lp zu verwenden.
Der Konverter lp2opt wird in den meisten Fällen gute Dienste leisten. Allerdings versagt er, wenn nicht sämtliche Variable innerhalb der lp-Datei mit x bezeichnet sind. Demnach sollten Sie dies sicherstellen, wenn Sie den Konverter nutzen möchten. Es ist allerdings empfehlenswert, direkt das opt-Format zu verwenden, da dieses vielfältigere Möglichkeiten für die Formulierung von Problemstellungen bietet.
Programmaufruf
Verwendungsweise
Sobald das eigentliche Problem in Form einer opt-Datei vorliegt, kann es durch einen Aufruf von gelöst werden. Hierzu werden einige exemplarische Verwendungsweisen aufgeführt.
Bei der ersten Variante wird das Programm mit Default-Optionen gestartet und durch die Angabe von --verb=2 dazu veranlasst, möglichst viele Statusmeldungen auf der Konsole auszugeben:
# ./0ptX --verb=2 beispiel.opt
Die nächste Kommandozeile erhöht die Enumerations-Blockweite auf 25 und aktiviert ein Skalierungsverfahren. Sobald 4 unterschiedliche Lösungen vorliegen, terminiert das Programm:
# ./0ptX --beta=25 --scale=1 --sol=4 beispiel.opt
Mit den Parametern snorm bzw. tnorm kann eingestellt werden, inwieweit die Vorgaben des Zielfunktionsystems erfüllt sein müssen. Die damit zutage geförderten Lösungen genügen dann neben dem Gleichungs- und Ungleichungsanteil des linearen Systems auch den gewünschten Zielfunktionsvorgaben.
# ./0ptX --tnorm=13 --sol=1 beispiel.opt
Bei dieser Kommandozeile wird der Programmlauf abgebrochen, sobald eine Lösung x gefunden wird, für die gilt:
Wenn die Abbruchbedingung nur Zielfunktionen mit Zielfunktionswerten di berücksichtigen soll, verwenden Sie stattdessen den Parameter snorm. Es wird dann lediglich der Wert der dritten Summe herangezogen.
Die Nützlichkeit von snorm wird an folgendem Beispiel deutlich werden: Es soll das lineare Gleichungssystem
gelöst werden.
Die resultierende opt-Datei besitzt also den Inhalt:
[ ]
[
]
[
[ 1 2 3 ]
[ 4 5 6 ]
[ 7 8 9 ]
]
[ 10 20 30 ]
[
]
[ ]
[ ]
[ 0 0 0 ]
[ 0 0 0 ]
[ 40 50 60 ]
Wenn Sie jetzt mit keine Lösung finden, so hat dies einen einfachen Grund - das System ist unlösbar. Um dennoch zu einem befriedigenden Ergebnis zu gelangen, könnte man an einer Lösung interessiert sein, die das Gleichungssystem „fast” erfüllt.
Um dies zu bewerkstelligen, muss das Gleichungssystem als ein System von Zielfunktionen mit Zielwertvorgabe formuliert werden:
Die entsprechende opt-Datei sieht demnach wie folgt aus:
[ 10 20 30 ]
[
[ 1 2 3 ]
[ 4 5 6 ]
[ 7 8 9 ]
]
[
]
[ ]
[
]
[ ]
[ ]
[ 0 0 0 ]
[ 0 0 0 ]
[ 40 50 60 ]
Der nächste Aufruf soll nun nach einer Lösung, mit einer summierten Zielwert-Abweichung 4 suchen. Demnach wird also abgebrochen, sobald eine Lösung x gefunden wird, für die gilt:
Der folgende Aufruf, liefert dann als Ausgabe:
# ./0ptX --snorm=4 opt/showcases/simple.opt
<< 0ptX v2.1.3 +++ (c) BirdWorX Solutions 2023 +++ PID: 3648 >>
[ Registered standard license for: xxx@yyy.zz ]
Got signal: Terminated: 15
************************** Terminated **************************
T(bestTarget) = 4, S(bestTarget) = 4 -- { 0 sec(s) }
{ The first solution/s was/were found after: 0 sec(s) }
The following file contains the results:
opt/showcases/simple.sol
Total iterations: 11
Total running time: 0 sec(s) -- Program end
Die gefundenen Lösungen (mit Schlupf) können mit dem Hilfsprogramm sol entschlüsselt und angezeigt werden:
# ./sol opt/showcases/simple.sol
x = [ 2 0 2 ]
Target values: [ 8→10 20→20 32→30 ]
Target Norm: 4
Slack Norm: 4
Found after: 1 sec(s)
---
x = [ 1 2 1 ]
Target values: [ 8→10 20→20 32→30 ]
Target Norm: 4
Slack Norm: 4
Found after: 1 sec(s)
---
x = [ 0 4 0 ]
Target values: [ 8→10 20→20 32→30 ]
Target Norm: 4
Slack Norm: 4
Found after: 3 sec(s)
Kommandozeilenparameter
In diesem Abschnitt erhalten Sie einen Überblick über die Kommandozeilenparameter von . Sie können damit einerseits das Abbruchverhalten steuern, aber auch verschiedene Algorithmen (de-)aktivieren, um die Lösungsfindung zu begünstigen.
Nachfolgend werden Name, Typ, mögliche Werte, Defaultwert und die Wirkungsweise aufgelistet:
help |
ganzzahlig |
0, 1 |
0 |
Listet sämtliche Kommamdozeilenparameter auf und beschreibt deren Wirkungsweise. |
verb |
ganzzahlig |
0, 1, 2 |
0 |
Normalerweise werden zur Laufzeit keine Statusmeldungen ausgegeben. Um nach jedem Hauptschleifendurchlauf statistische Informationen zu erhalten, ist die Einstellung 1 zu wählen. Bevorzugt man Informationen, die auch den Status der unterschiedlichen Programmfunktionen reflektieren, ist der Wert gleich 2 zu setzen. |
Zur Begegnung von Programmabbrüchen wegen Genauigkeitsproblemen, dient die nächste Einstellmöglichkeit:
consistency |
ganzzahlig |
0, 1 |
0 |
Hiermit wird an verschiedenen Stellen innerhalb des Programms überprüft, ob das aktuelle Gitter mit der Transformation des ursprünglichen Gitters übereinstimmt. Sollte es zu Rechen-, bzw. Präzisionsfehler kommen, empfielt es sich diesen Parameter gleich 1 zu setzen. Damit werden Inkonsistenzen im Berechnungsverlauf frühzeitig erkannt und eliminiert. Da dies allerdings auch Einfluss auf die Laufzeit des Programms hat, sind diese Checks defaultmässig deaktiviert. |
Das Kernstück zur Ermittlung kurzer Gittervektoren ist ein Abzählverfahren, das innerhalb von Blöcken von Basivektoren operiert, um darin kürzeste Gittervektoren aufzuspüren. Die nachfolgenden Parameter ermöglichen eine Steuerung dieser Abzählmethodik.
eenum |
ganzzahlig |
0, 1 |
1 |
Die Verwendung eines Enumerations-Verfahrens zur Auffindung kurzer Gittervektoren ist per Default aktiv. Diesen Parameter sollten Sie im Normalfall nicht deaktivieren. Wenn Sie die Laufzeit des Enumerationsschritts beeinflussen möchten, sollten Sie stattdessen mit den nächsten vier Parametern experimentieren. |
eprune |
ganzzahlig |
1, 2, 3 |
3 |
Wenn es wahrscheinlich ist, das im weiteren Verlauf der Enumeration keine Verbesserung mehr eintritt, lässt sich mit diesem Parameter festlegen, wie stark Enumerationsbäume abgeschnitten werden. Je größer dieser Wert, desto mehr bzw. öfters wird abgeschnitten. |
btime |
ganzzahlig |
≥ 0 |
0 |
Diese Einflußgröße entscheidet, wie viele Sekunden die Enumeration eines Blocks maximal dauern darf. Ist das Sekundenlimit erreicht, wird das Enumerations-Verfahren beendet und eine abschließende LLL-Reduktion durchgeführt. Das Programm wird allerdings nicht abgebrochen, lediglich der Laufzeitanteil der Enumeration wird geregelt. |
deep |
ganzzahlig |
≥ 0 |
0 |
Ein Wert 0 bedeutet, dass die LLL-Variante mit Tiefeneinfügungen verwendet wird. Der Wert von deep gibt dabei an, auf wieviele Vektoren der Lovász-Schritt ausgedehnt wird. |
Ergänzend zum Abzählverfahren, das implizit nur nach kurzen Gittervektoren suchen kann, kommen auch heuristische Prozeduren zum Einsatz, mit denen sich die eigentlich geforderten Anforderungen an eine Lösung genauer abbilden lassen.
collectLimit |
ganzzahlig |
≥ 0 |
1000 |
Im Programmverlauf werden heuristisch gut bewertete Gittervektoren gesammelt. Die Größe dieser Sammlung lässt sich mit diesem Parameter festlegen. Die nachfolgenden heuristischen Methoden bedienen sich im Rahmen ihrer Auswahlprozesse dann aus dieser Sammlung. |
pair |
ganzzahlig |
0, 1 |
1 |
Aktiviert eine Routine, die Paare heuristisch gut bewerteter Gittervektoren miteinander kombiniert und prüft, ob der daraus resultierende Vektor eine bessere Bewertung hat, als einer der Ausgangsvektoren. Ist dies der Fall, wird das Resultat in die Sammlung der heuristisch gut bewerteten Gittervektoren aufgenommen. Paarweise Reduktionen werden defaultmässig immer durchgeführt und können mit dem Wert 0 deaktiviert werden. |
sieve |
ganzzahlig |
0, 1 |
0 |
Zur Auffindung heuristisch gut bewerter Gittervektoren wird die Sammlung der heuristisch gut bewerteten Gittervektoren einem Sieb-Verfahren unterzogen. Das Resultat wird dann mit der Sammlung vereint und diese danach wieder auf die maximal erlaubte Größe reduziert. Mit dem Wert 1 können Sie dieses Verfahren aktivieren. |
Die nächsten beiden Parameter regeln einen Mechanismus zur zufälligen Erzeugung von Gittervektoren.
sampleLimit |
ganzzahlig |
≥ 0 |
1000 |
Die Anzahl der Vektoren, die pro Sampling - Aufruf maximal erzeugt werden. |
Die beiden folgenden Parameter begünstigen das Auffinden von zulässigen Gittervektoren, allerdings hat dies aber auch zur Folge, das sich die Wahrscheinlichkeit verringert, das sich die bisherige Zielfunktionssumme verbessert. Die Effektivität der paarweisen Reduktion und des heuristischen Siebverfahrens, kann damit aber wiederum gesteigert werden. Per Default sind die Parameter nicht gesetzt.
scale |
ganzzahlig |
0, 1 |
0 |
Ist dieser Parameter gesetzt, werden diejenigen Komponenten von Gittervektoren skaliert, die sich am stärksten auf die Zulässigkeitsbedingung auswirken. |
translate |
ganzzahlig |
0, 1 |
0 |
Ist dieser Parameter gesetzt, wird das gesamte Gitter verschoben und zwar derart, das bevorzugt, diejenigen Komponenten von Gittervektoren reduziert werden, die die Zulässigkeitsbedingung am stärksten verletzten. |
In der Praxis zeigt sich, das sich die bisher vorgestellten Routinen nach einer gewissen Zeit "festfahren" können und aus lokalen Minima nicht mehr herausfinden. Es ist deshalb ab und an notwendig für etwas "Abwechslung" zu sorgen. Die nachfolgenden Parameter sind per Default aktiv, können aber mit dem Wert 0 deaktiviert werden.
reinsert |
ganzzahlig |
0, 1 |
1 |
Diese Routine fügt nach jeder Iteration die bisher gefundenen besten Gittervektoren in die Gitterbasis ein. |
variate |
ganzzahlig |
0, 1 |
1 |
Diese Routine wird aktiv, wenn sich nach einer gewissen Anzahl von Iterationen kein Fortschritt bei der Zielfunktionssummen-Minimierung erzielen lässt. Es werden sodann die Basisvektoren zunächst der Größe nach aufsteigend anordnet und danach zufällig durchmischt. Die Anzahl der Mischvorgänge richtet sich dabei nach der Anzahl der erfolglosen Iterationen. Je mehr erfolglose Iterationen, desto mehr Mischvorgänge. |
Die nächsten drei Parameter sind relevant für das Abbruchverhalten von .
rtime |
ganzzahlig |
≥ 0 |
0 |
Hiermit wird festgelegt, nach wie vielen Sekunden Laufzeit das Programm beendet wird. Standardmäßig ist der Parameter mit 0 initialisiert, was unendlich langer Laufzeit entspricht. |
iters |
ganzzahlig |
≥ 0 |
0 |
Hiermit lässt sich spezifizieren nach wievielen Iterationen das Programm beendet wird. Defaultmässig ist dieses Limit nicht gesetzt. |
sol |
ganzzahlig |
≥ 0 |
1 |
Bevorzugt man einen Programmabbruch aufgrund der Anzahl der gefundenen Lösungen, dann ist dieses Kriterium zu verwenden. Defaultmäßig terminiert das Programm, sobald eine Lösung gefunden wurde. Wird kein Limit gewünscht, ist der Wert gleich 0 zu setzen. |
Die Qualität von aufgefunden Lösungen lässt sich mit den nächsten zwei Parameter festlegen.
snorm |
reellwertig |
≥ 0 |
-1 |
Welche Schlupfabweichung darf ein zulässiger Gittervektor maximal haben, um als Lösung gelistet zu werden. |
tnorm |
reellwertig |
≥ 0 |
-∞ |
Welche Zielfunktionssumme darf ein zulässiger Gittervektor maximal haben, um als Lösung gelistet zu werden. |
Der letzte Parameter ist für Benchmarks und Laufzeitvergleiche gedacht:
bench |
ganzzahlig |
0, 1 |
0 |
Wenn dieser Parameter gesetzt wird, dann wird auf das Einlesen einer eventuell existierenden lat bzw. sol-Datei verzichtet. Die Resultate eignen sich damit um die Wirksamkeit unterschiedlicher Parametersätze vergleichen zu können. |
Empfohlene Parametersätze
Den Abschluss bildet eine Liste mit Parameterkombination, die sich in der Praxis als durchschlagskräftig erwiesen haben.
- --eenum=1 --sieve=0 --sample=0 --scale=0 --translate=0 (das Default-Setting)
- --eenum=1 --sieve=1 --sample=0 --scale=1 --translate=0
- --eenum=0 --sieve=0 --sample=1 --scale=1 --translate=0
- --eenum=0 --sieve=0 --sample=1 --scale=0 --translate=1
- --eenum=1 --sieve=1 --sample=0 --scale=1 --translate=1
- --eenum=1 --sieve=0 --sample=0 --scale=1 --translate=1
Gegenwärtig befindet sich eine KI-unterstützte Parameter-Empfehlung in Entwicklung, die als Eingabe eine opt-Datei entgegennimmt und für diese die vielversprechendste Parameterkombination zurückgibt.
Videos
Die Videos werden von
YouTube bereitgestellt und erst nach Ihrer Zustimmung geladen. Sie erteilen Ihre Zustimmung durch einen Klick auf den folgenden Knopf.