Verfasst am: 15.04.2020, 14:21
Titel: Mit Indizes in Matrizen bei Optimierung rechnen
Hallo zusammen,
mein erster Beitrag in diesem Forum. Ich hoffe, Ihr könnt mir helfen, finde einfach keine Lösung
Ich berechne ein MILP (Mixed Interger Linear Programming) Transportproblem. Es wird mir also ausgegeben, welches Material an welchem Ort stehen soll, damit die Wege minimal sind.
x ist die OptimizationVariable Matrix 113x72 die mit Binärzahlen befüllt wird
1 wenn der Artikel auf dem Standort stehen soll, 0 wenn nicht
Zusätzlich dazu habe ich die Korrelation der Artikel untereinander berechnet und möchte diese in die Kalkulation mit einfließen lassen, damit Produkte, die oft zusammen gekauft werden, auch nahe zueinander stehen
Nur bei dem Weg dorthin komme ich nicht weiter, folgendermaßen möchte ich es lösen
Beispielhaft
x=
[0 0 1
1 0 0
0 1 0]
Matrix aus 113 Zeilen (Produkte) und 72 Spalten (Standorte)
Die erste Zeile, also das erste Produkt steht auf Platz 3 (Spalte 3)
Das zweite Produkt steht auf Platz 1
Also sind beide Platz 3 - Platz1 = 2 Plätze absolut voneinander entfernt
Das erste Produkt ist 0 Plätze von sich selbst entfernt (1 -1 = 0)
Das erste Produkt ist 2 Plätze von Produkt 2 entfernt (3. Spalte - 1.Spalte = 2)
Das erste Produkt ist 1 Platz von Produkt 3 entfernt (3.Spalte -2.Spalte =1)
Somit würde meine Abstandsmatrix wie folgt aussehen, wobei jede Zeile und jede Spalte ein Produkt darstellt
Wieder das Beispiel fortgeführt
[0 2 1
2 0 1
1 1 0]
Unter der Annahme, dass die Abstände immer gleich sind, hätte ich eine Abstandsmatrix
Diese könnte ich dann mit der Korrelationsmatrix multiplizieren
[1 0.15 0.34
-0.1 1 0.46
0 0.31 1]
Und könnte das dadurch in die Optimierungsfunktion mit einbringen, damit er Produkte mit einer großen positiven Korrelation auch nähe zueinander stellt
Wobei benötige ich Hilfe?
Aus der 113x72 binären Optimierungsmatrix eine 113x113 Abstandsmatrix erschaffen.
Hab schon mit value , row, find x==1 usw umprobiert, das Problem ist aber immer, dass das mit der Optimierungsmatrix nicht geht. Benutze Matlab 2018a
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Wenn ich Deinen Code bei mir ausführe, erhalte ich die Fehlermeldung:
Undefined function 'find' for input arguments of type 'optim.problemdef.OptimizationVariable'.
Hatte zuerst auch mit
[Spalte,~] = find(x == 1) ;
usw herumgespielt und dabei eben immer diese Fehlermeldung bekommen
Wenn ich allerdings mein Ergebnis in eine normale Matrix abspeichere
ErgebnisVergabe = sol.x;
und dann Deinen Code statt mit x (also der Optimierungsvariable) mit der normalen Matrix aufrufe:
[r, c] = find(ErgebnisVergabe);
...
funktioniert es einwandfrei Dafür schon mal vielen Dank!
Mein Problem ist aber dennoch noch vorhanden, da ich eher schlecht das Optimum berechnen lasse und dann dieses Optimum rekursiv wieder aufrufe, um es dann nochmal zu optimieren. Durch das Wegspeichern des x in eine normale Variable hängt meine Lösung immer von diesem Startpunkt ab und ich werde je nach Ausgangspunkt verschiedene Werte erhalten. Hatte das mal in einem anderen Problem auch so gelöst, nach 3 Durchgängen hat er sich dann in einer Lösung festgesetzt. Ist aber eigentlich mathematisch nicht sauber.
Daher die Frage: Gibt es eine andere Funktion, die find ersetzt aber mit der Optimierungsvariablen benutzt werden kann?
Wenn ich Deinen Code bei mir ausführe, erhalte ich die Fehlermeldung:
Undefined function 'find' for input arguments of type 'optim.problemdef.OptimizationVariable'.
Ich war auch davon ausgegangen, dass x so definiert ist, wie du es angegeben hast:
x=
[0 0 1
1 0 0
0 1 0]
Für weitere Unterstützung wäre eine klare Formulierung des Optimierungsproblems hilfreich. x.*WegematrixGesamt ist wenig hilfreich, wenn WegematrixGesamt ja anscheinend noch von x abhängt. Poste bitte auch deinen bisherigen Ansatz mit Optimierungsvariablen, damit man darauf aufbauen kann.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
% Bedingung 2 - Jedes Material muss und darf nur einem Stellplatz zugeteilt werden
BedingungVerteilung = sum(x,2) == ones(M,1);
Layout.Constraints.BedingungVerteilung = BedingungVerteilung;
% Schwere Artikel dürfen nicht ins unterste Fach
Gewichtsbedarf = x.*Gewicht;
BedingungGewicht = Gewichtsbedarf <= Gewichtsbegrenzer;
Layout.Constraints.BedingungGewicht = BedingungGewicht;
Optionen für Solver
opts = optimoptions('intlinprog','Display','off','PlotFcn',@optimplotmilp, 'IntegerTolerance',1.0000e-03, 'RelativeGapTolerance',0.035);
% Aufrufen des Solvers [sol,fval,exitflag,output] = solve(Layout,'Options',opts);
ifisempty(sol)% If the problem is infeasible or you stopped early with no solution disp('The solver did not return a solution.') return% Stop the script because there is nothing to examine end
% Welches Material steht auf welchem Stellplatz
ErgebnisMatNameStellplatz(:,:) = "";
ErgebnisMatNummerStellplatz(:,:) = "";
Zeilencounter(1,:) = 1;
for m = 1 : M
for s = 1: S
if ErgebnisVergabe(m,s) == 1
ErgebnisMatNameStellplatz(Zeilencounter(1,s),s) = Materialname(m,2);
ErgebnisMatNummerStellplatz(Zeilencounter(1,s),s) = Materialname(m,1);
Zeilencounter(1,s) = Zeilencounter(1,s)+1;
end end end
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Zuletzt bearbeitet von Harald am 16.04.2020, 10:42, insgesamt einmal bearbeitet
richtig die DistMat wird im vorliegenden Code noch nicht benutzt, weil ich diese zuerst richtig fertig machen wollte, bevor ich es in den Code einpflege
Ich multipliziere die Distanzen mit der Korrelation und addiere das zu der zu minimierenden Zielfunktion. Somit wird das Modell versuchen, starke positive Korrelationen so eng wie möglich und starke negative so weit wie möglich voneinader entfernt aufzustellen
ich habe starke Zweifel, dass distMat linear in x ist.
Falls es linear ist, muss man es in die Form A*x bringen können mit einem A, das unabhängig von x ist.
Falls das tatsächlich nichtlinear ist, wäre das Problem nicht mehr in intlinprog umsetzbar, sondern lediglich mit genetischen Algorithmen (ga). Dort hast du den Vorteil, dass du in der Zielfunktion mit einem Kandidaten x beliebig arbeiten kannst, also auch die Distanzmatrix berechnen kannst.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.