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

Optimierungsproblem (Alternativ für Excel Solver)

 

SM6789
Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 30.05.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.05.2017, 12:04     Titel: Optimierungsproblem (Alternativ für Excel Solver)
  Antworten mit Zitat      
Hallo zusammen,

bin auf der Suche nach meinem Problem auf dieses Forum gestoßen. Ich hoffe, ich kann das Problem erläutern und jemand kann mir behilflich sein.

- Es geht um eine Gewinnmaximierung.

- In einer Excel-Tabelle ist der Preis aufgelistet (ändert sich zeitabhängig in jeder Zeile).

-Und es gibt 2 Variablen (x für Beladen, y für Entladen)

- Je nachdem ob Beladen oder Entladen wird (also x=1 oder y=1) wird ein Betrag für jede Spalte mit einer Formel berechnet . (Beim Beladen also negativ und beim Entladen positiv)

- Der Gewinn ist die Summe aller Beträge

- Nebenbedingung: Der Speicher darf nicht einen bestimmten Wert überschreiten

- Mithilfe von verschieden Excel-Solvern lässt sich das Problem zwar lösen (entscheidet je nach Preis ob Beladen und Entladen wird), aber leider habe ich über 35000 Spalten. Mein Rechner würde ewig dafür brauchen.

- Info: Ich bin ein Matlab-Anfänger. Die Grundlagen habe ich mir selber angeeignet. Ein mathematisches Modell habe ich schon aufgestellt. Weiß aber leider nicht wie ich vorgehen soll. Ich freue mich über jede Hilfe oder Tipps.
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: 30.05.2017, 22:16     Titel:
  Antworten mit Zitat      
Hallo,

in der Optimization Toolbox gibt es verschiedene Löser.
https://www.mathworks.com/help/opti.....ation-decision-table.html
Dann gäbe es auch noch die Global Optimization Toolbox.

Wenn du uns das mathematische Modell verrätst, können wir dir bei der Wahl helfen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
SM6789
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 30.05.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.05.2017, 11:49     Titel:
  Antworten mit Zitat      
Vielen Dank für die Antwort. Ja auf diese beiden Optimizer bin ich schon aufmerksam geworden, aber wie gesagt bin leider noch ein Anfänger. Bisher habe ich es soweit geschafft.
Code:

%%Einlesen der Informationen (Preise)
A=xlsread('Preis.xlsx');

% x und y als unbekannte Variablen definieren und Bedingungen aufstellen
x=sym('x');
x>=0;
x<=1;
y=sym('y');
y>=0;
y<=1;

%Gleichung für die einzelnen Beträge
B=(((x*A)/(0.95*2))*(-1)+y*A)/4;

%G muss maximal werden in dem der Solver selber entscheidet ob zu einem
%bestimmten Zeitpunkt Beladen oder Entladen wird (oder keine Aktion)
G=sum(B);


Ich erhalte z.B für B(3)= (959*y)/400 - (959*x)/760

wenn ich für x=1 und y=0 einsetze, erhalte ich das gleiche Ergebnis wie bei Excel zum Zeitpunkt 3. Soweit ist das Modell "in Ordnung" denke ich. Aber hab keine Idee wie ich weiter vorgehe und leider bin ich auch nicht fündig geworden. Ich hoffe Sie können mir weiterhelfen oder ausreichende Tipps geben. Vielen Dank schonmal für Ihre Bemühungen. Kann auch gerne ein Beispiel aus Excel posten und zeigen wie es dort funktioniert.

[EDITED, Jan, Bitte Code-Umgebung verwenden - Danke!]
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: 31.05.2017, 20:20     Titel:
  Antworten mit Zitat      
Hallo,

was ist nun die Zielfunktion? Die Summe der B? Das wäre linear, und dann kannst du es über intlinprog lösen.
Bitte dort nachlesen, wie Zielfunktion und Nebenbedingungen formuliert werden müssen. syms sollte man hier auf jeden Fall weglassen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
SM6789
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 30.05.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.06.2017, 10:19     Titel:
  Antworten mit Zitat      
Die Zielfunktion ist die Summer aller Beträge (zu jedem Zeitpunkt). Danke für den Tipp. Ich versuche mal voranzukommen.
Private Nachricht senden Benutzer-Profile anzeigen
 
SM6789
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 30.05.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.06.2017, 14:19     Titel:
  Antworten mit Zitat      
Ich habe schon ähnliche Beispiele gefunden, wo aber nur 5-6 Variablen gelöst werden. Ich habe 35040*2 Variablen insgesamt. Wie soll ich denn da vorgehen? Ist das überhaupt möglich? Anbei nochmal die Gleichungen und wie ich es bei Excel löse.

2.JPG
 Beschreibung:

Download
 Dateiname:  2.JPG
 Dateigröße:  72.03 KB
 Heruntergeladen:  338 mal
1.JPG
 Beschreibung:

Download
 Dateiname:  1.JPG
 Dateigröße:  26.51 KB
 Heruntergeladen:  336 mal
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: 07.06.2017, 19:29     Titel:
  Antworten mit Zitat      
Hallo,

wie gesagt: intlinprog .

Ob die Anzahl der Variablen ein Problem machen wird, kann ich nicht beurteilen.
Falls ja, sehe ich jedoch schlicht und einfach keine andere Möglichkeit.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
SM6789
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 30.05.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.06.2017, 10:03     Titel:
  Antworten mit Zitat      
Ok vielen Dank.

Meine Zielfunktion ist ja eine endliche Summe mit 35040 Gliedern. Wie kann ich diese denn aufstellen?

G= x1*C1 + y1*C2 + x2*C1 + y2 * C2+........x35040*C1...

Damit habe ich mein größtes Problem. Mit sum(), summiert er zwar alles aber x und y sind dann nur 2 Variablen.
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: 08.06.2017, 19:12     Titel:
  Antworten mit Zitat      
Hallo,

schau dir die Formulierung der Zielfunktion in der Doku an. Wenn C ein Spaltenvektor ist:
Code:
f = repmat(C, 35040, 1);


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
SM6789
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 30.05.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.06.2017, 10:17     Titel:
  Antworten mit Zitat      
Vielen Dank, dass du versuchst immer wieder weiterzuhelfen. Nebenbei rechne ich es mit Excel weiter. Aber Matlab wäre echt sehr hilfreich, falls das ganze klappt. Also meine Zielfunktion habe ich jetzt aufstellen können. Habe als Test nur 6 Werte erstmal ausgewählt.

Code:
%%Einlesen der Informationen (Preise)
A=xlsread('Test1.xlsx');

% x und y als unbekannte Variablen definieren

X=sym('x',[1 6]);
Y=sym('y',[1 6]);

%Gleichung für die einzelnen Beträge
B=(((X*A)/(0.95*2))*(-1)+Y*A)/4;

%Bedingungen aufstellen
Y>=0,Y<=1;
X>=0,X<=1;

C=-B (da intlinprog das Minimum bestimmt.)
 

Ich erhalte dann:

C =

(751*x1)/190 + (101*x2)/38 + (959*x3)/760 + (763*x4)/760 + (3421*x5)/760 + (1141*x6)/760 - (751*y1)/100 - (101*y2)/20 - (959*y3)/400 - (763*y4)/400 - (3421*y5)/400 - (1141*y6)/400

Nun habe ich 12 Variable. Meine erste Frage, wie kann ich die Konstanten ausrechnen lassen? z.B. 751/190 bei x1? Die brauche ich ja um f =[...] im Beispiel für intlinprog anzuwenden.

Ich habe mir die Mühe gemacht und alle 12 mit dem Taschenrechner berechnet. f aufgestellt, intcon = 12, für A und b habe ich [] das hier benutzt, da ich erstmal ohne Nebenbedingung rechnen möchte. Leider hat das aber nicht funktioniert. Bekomme folgende Meldung:

Root LP problem is unbounded.
Intlinprog stopped because the root LP problem is unbounded.

[EDITED, Jan, Bitte Code-Umgebung verwenden- Danke!]
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: 13.06.2017, 20:02     Titel:
  Antworten mit Zitat      
Hallo,

mit anderen Worten, die Zielfunktion von 08.06.2017, 10:03 war inkorrekt, weil die C1 und C2 ja nicht gleich sind.

Für die Berechnung der Werte kannst du eval verwenden, aber warum überhaupt so kompliziert?

Du kannst die Koeffizienten doch direkt ausrechnen.
Code:
f = -[-A/(0.95*2)/4, A/4]';
f = f(:);


Zitat:
Leider hat das aber nicht funktioniert. Bekomme folgende Meldung:
Root LP problem is unbounded.

Das ist auch nicht verwunderlich. Wenn es keine Nebenbedingungen gibt, dann kann man ja beliebig viel kaufen und damit beliebig viel Gewinn machen.

Zitat:
%Bedingungen aufstellen
Y>=0,Y<=1;
X>=0,X<=1;

Das sollen jetzt nicht die Nebenbedingungen sein? Lies bitte die Doku und die Beispiele darin. Dann siehst du, dass die unteren und oberen Schranken als Vektoren definiert und an intlinprog übergeben werden müssen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
SM6789
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 30.05.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.06.2017, 11:51     Titel:
  Antworten mit Zitat      
Vielen Dank. Das mit den Konstanten einlesen bzw ausrechnen klappt wunderbar. Ich hatte die eigentliche Nebenbedingung nicht aufgestellt, weil ich erst ohne rechnen wollte um zu testen. Da ich die Schranken aber falsch aufgestellt habe, hat das logischerweise nicht geklappt. Habe das Beispiel nochmal angeguckt.
Ich müsste am Ende das hier nehmen denke ich:

x = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)

lb und ub sind meine Schranken für X und Y. Aeq habe ich nicht. Meine Nebenbedingung müsste ich jetzt in diese Form bringen:

A⋅x≤b >>> das habe ich auch verstanden, jedoch habe ich dabei mein größtes Problem. Habe schon vieles versucht, aber bekomme es nicht hin.

Füllstand: F(n) = F(n-1) + X/2 - Y mit F(0)=0

Die Werte vor dem X und Y sind also mein A [ 0.5 , -1] und mein b ist dann 4.

Aber wie kann ich denn solch eine Funktion aufstellen?
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.06.2017, 10:37     Titel:
  Antworten mit Zitat      
Hallo,

bitte immer auf eine sorgfältige Problemformulierung achten.
Bei der jetzigen Formel fehlen nicht nur die Indizes bei X und Y, sie stimmt auch sonst nicht mit der Formel aus dem Link überein (im Link ist ein Faktor 1/2 bei F_n). Was stimmt denn nun?

Grundsätzlich würde ich die Matrix A Zeile für Zeile erzeugen.
1. Zeile: [-0.5 1 0 0 ...]
k-te Zeile: (k-1)-te Zeile, ggf. mit Faktor 1/2, + [... 0 0 -0.5 1 0 0 ...]

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
SM6789
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 30.05.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.06.2017, 12:19     Titel:
  Antworten mit Zitat      
Oh Sorry. Die Formel in der Datei war fehlerhaft.

Füllstand: F(n) = F(n-1) + X/2 - Y mit F(0)=0

Die Faktoren ändern sich ja nicht. 1; 0.5; -1 bleiben immer erhalten.
Aber wie kann ich das so einstellen, dass sich F(n-1) immer ändert?

z.B. für den Zeitpunkt 3: F(3) = F(2) + X(3)/2 -Y(3)

Ich habe Probleme ein Formel aufzustellen, in dem er den Füllstand vom Zeitpunkt 2 mitberechnet, was ja am Anfang des Problems auch unbekannt ist.
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: 20.06.2017, 13:07     Titel:
  Antworten mit Zitat      
Hallo,

jede Ungleichung entspricht einer Zeile der Matrix.
Wenn die k-te Zeile der Bedingung F_k >= 0 entspricht, dann kannst du also wie zuvor beschrieben die k-te Zeile aus der (k-1)-ten ermitteln.

Allerdings sehe ich ein Problem auf dich zu kommen: bei 70000 Variablen und 70000Ungleichungen (oder auch 140000, wenn du noch eine obere Schranke hast), wird die Matrix 39 bzw. 78 GB groß. Das wird nicht in den Speicher passen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2, 3, 4  Weiter

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.