AW: Solver gibt nicht die optimale Lösung aus
11.10.2007 11:56:00
ingUR
Hallo, Sebastian,
eigentlich ist der VBA-Code bestimmt mit rudimentären Kenntnissen zu erstellen, wenn erst einmal die Logik des Algoritmus beschreiben ist.
nL := Anzahl der Lieferanten; l1, l2, l := Laufindex über die anzahl der Lieferanten
nP := Anzahl der Klassen der Paketkontingente eines Lieferantens, p1, p2, p := Laufindex über die Anzahl der Pakete
pA := Anzahl der Pakte in einem Kontingent
pC := Kosten für eine Paketanzahl-Klasse
Basis ist ein Feld A' mit nL x nP, mit den Zeilenindex l und dem Spaltenindex p. Das Element A[l,p] ist entweder 0 oder 1, jenachdem, ob der Lieferant l für die Rubrik p ausgewählt ist oder nicht. In diesem Feld darf es nur eine 1 geben (Summe aller Elemente gleich 0 oder 1).
Dieses zweidimensionale Feld A' wird nL mal hintereinander angeordnet, so dass ein dreidimensionales Feld A[nL; nP; nL] entsteht, mit den Laufindices l1, p und l2. Wieder gilt für jede A-Ebene A[nL; nP, l2], das Diesumme der Elemente dieser Ebene entweder 0 oder 1 sein kann.
Wählt man nun eine Ebene l2 als "Basis" heraus, so ist für jedes Element A[l1, p1, l2] = 1 (die übrigen Elemente sind Null) zu untersuchen, welche Ebenen mit welchen Paketzahlen zusätzlich dazugestellt werden können, ohne dass eine der Bedingungen verletzt wird:
- Die Summe der Elemente in einer Ebene A darf 1 nicht übersteigen
- die Summe der Pakete SUM(pA) für die ausgewählte Paketantahl-Klasse muß für ein gültiges Ergebnis gleich 100 sein.
Hier muß also die zum Lieferanten l gehörige Paketanzahl, die zum Index p, gehört bekannt sein.
Wenn diese generell einen funktionrllrn Aufbau folgt der zudem für alle Lieferanten gleich ist, kann über den Index p ein entsprechender Funktionszusammenhang genutzt werden.
Andernfalls, und für die weitere Beschreibung genutzt, kann die bewerteten Leistung eines Lieferanten in einen eigenen Datentyp ("Karteikarte" der Datenerfassung) erfaßt werden:
Type Supp
pakete(5) as integer
preis(5) as double
End Type
So kann für jeden Lieferanten eine "Karteikarte" angelegt werden, von der die beiden Kennwerte abglesen werden können.
Dim Supps(10) as Supp
Hier sind also zehn "Karteikarte" angelegt (Array Supps(10) vom Datentyp Supp). Auf jeder sind jeweils fünf Felder für die Paketmengen und die zugehörigen Preis des Liferantenn eingetragen.
Supp(3).pakete(2) = 40
Supp(3).preis(2) = 1,23
Wenn alle Einträge (Zuweisungen) vorgenommen sind, dann kann analog zur Zweisung auch das Auslesen eines "Karteikartenwertes" erfolgen:
pA = Supps(4).pakete(3) liefert z.B. 60 mit einem Preis von pC = Supps(4).preis(3), hier z.B. 1,48.
Nun sind also in einer Variationsuntersuchung für die Laufindexwerte l2 und p2, bei gesetzten Indexwerten l1 und p1, sämtlich Kombinationen nach oben genannter Beschreibung zusammen zustellen sein. ergibt sich dabei für Sum(pA) der Wert 100, wird der Preis dieser Kombination festgestellt und mit dem bisherigen gültigen Minimum verglichen, ggf. wird dieses Minimum ersetzt, wenn ein kleiners gefunden wurde.
Soweit ein erster und unvollständiger Gedankenentwurf, denn es ist klar, dass bei dieser einfachen Vorgehensweise die Anzahl der Variationsuntersuchungen bei einem dreidimendionalen Feld A(5;5;5) infolge der Zusammenstellung enorm ansteigen:
pA = 100 := 5 Schritte, für jeden Lieferanten eine Untersuchung
pA = 20 :{80.80.80.80.80} := 5 Schritte für L1 und L{2.i.5} mit 20:80
pA = 80 :{20.20.20.20.20} := 5 Schritte für L1 und L{2.i.5} mit 80:20
pA = 20 :{20:60.20:60.20.60,20:60} := 12 Schritte für L1 und {L{2.i.5}:L{2.k.5}} i <> k _
mit 20:{20:60}
usw.
Vielleicht ist Deine studentischer Ergeiz dahin gelengt, die Anzahl der Kombinationen zu ermitteln. Ggf. kannst Du auch den Kontakt, der auf Internetseite dangegeben ist, auf den meine Grafiken hochgeladen sind, dazu nutzen, um einen problemorientierten Gedankenaustausch und Einstieg zum Thema zu starten, denn mit es werden wohl weitere theoretische Erörterungen den Forumsrahmen nicht gerecht, was nicht bedeutet, dass man den gefundenen Algorithmus dann für Verbesserungshinweise hier vorstellt.
Gruß,
Uwe