|
|
Optimierungsproblem (Alternativ für Excel Solver) |
|
SM6789 |

Forum-Anfänger
|
 |
Beiträge: 29
|
 |
|
 |
Anmeldedatum: 30.05.17
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 30.05.2017, 12:04
Titel: Optimierungsproblem (Alternativ für Excel Solver)
|
 |
|
 |
|
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.
|
|
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.499
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 30.05.2017, 22:16
Titel:
|
 |
|
|
SM6789 |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 29
|
 |
|
 |
Anmeldedatum: 30.05.17
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 31.05.2017, 11:49
Titel:
|
 |
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.
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!]
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.499
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 31.05.2017, 20:20
Titel:
|
 |
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
|
|
|
SM6789 |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 29
|
 |
|
 |
Anmeldedatum: 30.05.17
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 07.06.2017, 10:19
Titel:
|
 |
Die Zielfunktion ist die Summer aller Beträge (zu jedem Zeitpunkt). Danke für den Tipp. Ich versuche mal voranzukommen.
|
|
|
SM6789 |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 29
|
 |
|
 |
Anmeldedatum: 30.05.17
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 07.06.2017, 14:19
Titel:
|
 |
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.
Beschreibung: |
|
 Download |
Dateiname: |
2.JPG |
Dateigröße: |
72.03 KB |
Heruntergeladen: |
381 mal |
Beschreibung: |
|
 Download |
Dateiname: |
1.JPG |
Dateigröße: |
26.51 KB |
Heruntergeladen: |
385 mal |
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.499
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 07.06.2017, 19:29
Titel:
|
 |
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
|
|
|
SM6789 |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 29
|
 |
|
 |
Anmeldedatum: 30.05.17
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 08.06.2017, 10:03
Titel:
|
 |
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.
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.499
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 08.06.2017, 19:12
Titel:
|
 |
Hallo,
schau dir die Formulierung der Zielfunktion in der Doku an. Wenn C ein Spaltenvektor ist:
Grüße,
Harald
|
|
|
SM6789 |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 29
|
 |
|
 |
Anmeldedatum: 30.05.17
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 13.06.2017, 10:17
Titel:
|
 |
|
 |
|
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.
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!]
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.499
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 13.06.2017, 20:02
Titel:
|
 |
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.
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
|
|
|
SM6789 |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 29
|
 |
|
 |
Anmeldedatum: 30.05.17
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 14.06.2017, 11:51
Titel:
|
 |
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?
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.499
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 15.06.2017, 10:37
Titel:
|
 |
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
|
|
|
SM6789 |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 29
|
 |
|
 |
Anmeldedatum: 30.05.17
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 20.06.2017, 12:19
Titel:
|
 |
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.
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.499
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 20.06.2017, 13:07
Titel:
|
 |
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
|
|
|
|
Gehe zu Seite 1, 2, 3, 4 Weiter
|
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
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2025
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.
|
|