WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Mit Indizes in Matrizen bei Optimierung rechnen

 

Cosmos
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 15.04.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.04.2020, 15:21     Titel: Mit Indizes in Matrizen bei Optimierung rechnen
  Antworten mit Zitat      
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.


Meine Zielfunktion
Zielfunktion = sum(sum(x.*WegematrixGesamt,2),1)/1000;

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

Wäre für Hilfe sehr dankbar!
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.04.2020, 18:44     Titel:
  Antworten mit Zitat      
Hallo,

Vorschlag:
Code:
[r, c] = find(x);
rcSorted = sortrows([r,c]);
place = rcSorted(:,2);
distMat = abs(place - place')


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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Cosmos
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 15.04.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.04.2020, 19:26     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für Deine schnelle Antwort.

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 Smile 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?

Danke für die Hilfe
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.04.2020, 19:35     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.04.2020, 20:46     Titel:
  Antworten mit Zitat      

_________________

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Cosmos
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 15.04.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.04.2020, 11:33     Titel:
  Antworten mit Zitat      
WegeMatrixGesamt ist Matrix mit Anzahl der Verbräuche * Weg zu jedem möglichen Fach, da gibts keine Abhängigkeit von x

Mein gesamter Code sieht wie folgt aus:

Code:
% Optimierungsvariable x, Binärvariable
x = optimvar('x',M,S,'Type','integer','LowerBound',0,'UpperBound',1);
x.Type = 'integer';

Layout = optimproblem;

% Funktion
Zielfunktion = 0;

WegematrixGesamt = MatzuTisch*Wegematrix.';

Zielfunktion = sum(sum(x.*WegematrixGesamt,2),1)/1000;
Layout.Objective = Zielfunktion;

% u.d.Nb
Volumenbedarf = x.'* Materialvolumen;
BedingungVolumen = Volumenbedarf  <= Stellflaechenplatz;
Layout.Constraints.BedingungVolumen = BedingungVolumen;

% 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;

% Maximal 3 Artikel pro Boden
BedingungArtikelbegrenzung = sum(x,1) <= 3;
Layout.Constraints.BedingungArtikelbegrenzung = BedingungArtikelbegrenzung;

% Artikel 4 gleicher Platz wie Artikel 74
BedingungPistolePumpe = x(4,:) == x(74,:);
Layout.Constraints.BedingungPistolePumpe = BedingungPistolePumpe;

% Gewicht Fachboden unter 100 Kg
Gesamtgewichtsbedarf =sum(x.*GewichtGesamtkartons);
BedingungBodenGewicht = Gesamtgewichtsbedarf <=GewichtsbegrenzerBoden;
Layout.Constraints.BedingungBodenGewicht = BedingungBodenGewicht;

% Breitenbegrenzung Fachboden
BedingungBreiteBoden = sum(x.*BreiteGesamtStapel) <= 248;
Layout.Constraints.BedingungBreiteBoden = BedingungBreiteBoden;



% Abstandsmatrix

[r, c] = find(x);
rcSorted = sortrows([r,c]);
place = rcSorted(:,2);
distMat = abs(place - place')



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);

if isempty(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

exitflag
sol.x = round(sol.x); %exakte binäre Rundung
AnzahlMataufStellplatz = sum(sol.x,1)
ErgebnisVergabe = sol.x;
ErgebnisVolumenbedarf =sol.x.'* Materialvolumen;
ErgebnisGewichtsbedarf = sol.x.*Gewicht;
ErgebnisGesamtgewichtsbedarf = sum(sol.x.*GewichtGesamtkartons);
ErgebnisBreiteBoden = sum(sol.x.*BreiteKarton);
ErgebnisBedingungBreiteBoden = sum(sol.x.*BreiteGesamtStapel);
disp('Flächenverbrauch')
sum(sol.x.'* Materialvolumen)
infeas1 = max(infeasibility(BedingungVolumen,sol))
infeas2 = max(infeasibility(BedingungVerteilung,sol))
infeas3 = max(infeasibility(BedingungGewicht,sol))
infeas4 = max(infeasibility(BedingungArtikelbegrenzung,sol))

% 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
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.04.2020, 11:39     Titel:
  Antworten mit Zitat      
Hallo,

dann brauchst du doch distMat für die Optimierung gar nicht? Sie wird auch sonst nicht verwendet. Warum berechnest du sie dann?

Hier noch der zerschossene Beitrag von gestern

Harald hat Folgendes geschrieben:
Hallo,

in der Doku ist ein zwar deutlich komplexeres Beispiel, das du aber vielleicht anpassen kannst:
https://www.mathworks.com/help/opti.....xample-problem-based.html


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 ;)

Zuletzt bearbeitet von Harald am 16.04.2020, 11:42, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Cosmos
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 15.04.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.04.2020, 12:17     Titel:
  Antworten mit Zitat      
Hallo Harald,

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

Es wird später ungefähr so eingebaut werden:

Code:
Zielfunktion = sum(sum(x.*WegematrixGesamt,2),1)/1000 + distMat.*KorrelMat;


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

Bis dahin brauche ich aber eben die distMat
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.04.2020, 14:08     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.