Hallo zusammen,
ich arbeite aktuell an meiner Masterarbeit und muss hierfür 100.000 lineare Optimierungsprobleme per Simplex-Verfahren lösen. Die Struktur aller Probleme ist identisch (22 Variablen, 22 Nebenbedingungen/Restriktionen). Jede Zeile unterscheidet sich jedoch durch zuvor bestimmte Parameter und Obergrenzenrestriktionen.
Zur Lösung der Ansätze nutze ich das Excel-Add-In Solver. Für eine einzige Wiederholung ist das Tool gut geeignet. Für die oben angegebene Anzahl an Wiederholungen wird es performance-technisch leider schwierig. Pro Minute schafft es mit Hilfe des VBA-Codes knapp 6 Lösungen zu berechnen obwohl mein PC mit der folgenden Technik ausgestattet ist:
intel i5-2500 CPU / 3,3 GHz / 8 GB RAM / 220 GB SSD / Windows 10 64 bit / Office 365 (Student/Enteprise) 64 bit
Seitdem ich eine Testversion des Solver-Entwicklers "FrontlineSolver" mit beworbenen besseren/mehr Leistungen heruntergeladen habe, mittlerweile aber deinstalliert habe, läuft die Berechnung aus irgendeinem grund noch langsamer... (etwa eine Lösung pro Minute).
Hier ist der Code, der ursprünglich auf einer Makroaufzeichnung beruht und entsprechend angepasst wurde, um die vielen Zeilen zu durchzugehen und zu berechnen (Es handelt sich im Übrigen um ein Maximierungsproblem - im Code habe ich es zunächst auf 10.000 Zeilen beschränkt. Die Berechnung dafür hat etwa 30 Stunden gedauert....)
Sub Solver_Unsecurity_Basis()
Dim i As Integer
ActiveWorkbook.ActiveSheet.Activate
For i = 10325 To 10326
SolverReset
SolverOk SetCell:="$AW$" & i, MaxMinVal:=1, ValueOf:=0, ByChange:="$C$" & i & ",$D$" & i & ",$E$" & i & ",$F$" & i & ",$G$" & i & ",$H$" & i & ",$I$" & i & ",$J$" & i & ",$K$" & i & ",$L$" & i & ",$M$" & i & ",$N$" & i & ",$O$" & i & ",$P$" & i & ",$Q$" & i & ",$R$" & i & ",$S$" & i & ",$T$" & i & ",$U$" & i & ",$V$" & i & ",$W$" & i & ",$X$" & i, Engine:=2, EngineDesc:="Simplex LP" 'hier prüfen, ob "ByChange" die gewünschten Spalten erkennt...
SolverAdd CellRef:="$BU$" & i, Relation:=1, FormulaText:="$BW$" & i
SolverAdd CellRef:="$CU$" & i, Relation:=1, FormulaText:="$CW$" & i
SolverAdd CellRef:="$DU$" & i, Relation:=1, FormulaText:="$DW$" & i
SolverAdd CellRef:="$EU$" & i, Relation:=1, FormulaText:="$EW$" & i
SolverAdd CellRef:="$FU$" & i, Relation:=1, FormulaText:="$FW$" & i
SolverAdd CellRef:="$GU$" & i, Relation:=1, FormulaText:="$GW$" & i
SolverAdd CellRef:="$HU$" & i, Relation:=1, FormulaText:="$HW$" & i
SolverAdd CellRef:="$IU$" & i, Relation:=1, FormulaText:="$IW$" & i
SolverAdd CellRef:="$JU$" & i, Relation:=1, FormulaText:="$JW$" & i
SolverAdd CellRef:="$KU$" & i, Relation:=1, FormulaText:="$KW$" & i
SolverAdd CellRef:="$LU$" & i, Relation:=1, FormulaText:="$LW$" & i
SolverAdd CellRef:="$MU$" & i, Relation:=1, FormulaText:="$MW$" & i
SolverAdd CellRef:="$NU$" & i, Relation:=1, FormulaText:="$NW$" & i
SolverAdd CellRef:="$OU$" & i, Relation:=1, FormulaText:="$OW$" & i
SolverAdd CellRef:="$PU$" & i, Relation:=1, FormulaText:="$PW$" & i
SolverAdd CellRef:="$QU$" & i, Relation:=1, FormulaText:="$QW$" & i
SolverAdd CellRef:="$RU$" & i, Relation:=1, FormulaText:="$RW$" & i
SolverAdd CellRef:="$SU$" & i, Relation:=1, FormulaText:="$SW$" & i
SolverAdd CellRef:="$TU$" & i, Relation:=1, FormulaText:="$TW$" & i
SolverAdd CellRef:="$UU$" & i, Relation:=1, FormulaText:="$UW$" & i
SolverAdd CellRef:="$VU$" & i, Relation:=1, FormulaText:="$VW$" & i
SolverAdd CellRef:="$WU$" & i, Relation:=1, FormulaText:="$WW$" & i
SolverSolve True
Next i
End Sub
Ich bedanke mich im Voraus für jede Unterstützung und hilfreiche Tipps!
Viele Grüße
C.
|