ich bin aktuell noch sehr frisch in der Matlab-Szene unterwegs und versuchen nun schon seit geraumer Zeit eine Lösung für folgendes (Optimierungs-) Problem zu finden.
Da ich aber leider offensichtlich irgendwie auf dem Schlauch stehe, hoffe ich, dass ihr mir weiterhelfen könnt.
Vereinfacht gesagt, geht es um einen Speicher, welcher zu jeder Periode einen Speicherstand X hat (Dieser ergibt sich aus externen Parametern , die maximale Speichergröße ist natürlich begrenzt).
Die (ggf.) freie Kapazität soll nun auf dem Markt angeboten und gewinnmaximal belegt werden.
(Man kann sich am besten vorstellen, dass man sozusagen Erlöse erzielt, indem man irgendwelche Produkte einspeichert).
Folgende Produkte stehen hierfür zur Verfügung (EH=Einheiten).
0 <= Produkt 1 <= 100 EH (zu Preis 1)
0 <= Produkt 2 <=50 EH (zu Preis 1)
0 <= Produkt 3 <=50 EH (zu Preis 2)
Nun möchte ich gerne z.B. mithilfe der Funktion fmincon versuchen in jeder Periode die freie Kapazität gewinnmaximal zu belegen, leider finde ich aber irgendwie keine Möglichkeit Werte von extern an die fmincon Funktion zu übergeben. Dies ist deshalb nötig, da sich in jeder Periode der Speicherstand, die Preise als auch die verfügbaren Produktmengen (in den oben aufgezeigten Grenzen) ändern können.
Es müsste also die Optimierung für jede Periode anhand der aktuellen Input-Parametern neu durchgeführt werden.
Oder gibt es evtl. sogar eine bessere/einfachere Lösung?
Ich hatte zuerst damit begonnen die beiden zusätzlichen Variablen global zu machen, sodass ich auf diese auch in meiner Zielfunktion zugreifen kann. Leider scheint das nicht ohne weiteres möglich zu sein.
Meine (funktionierende) Zielfunktion für fmincon lautet:
Soweit funktioniert auch alles, leider ändern sich aber die Werte in meiner Zielfunktion in jeder Periode (sowohl x1,x2,x3 als auch die Zahlenwerte 0.21,0.21,0.5 welche eig. durch Variablen repräsentiert werden sollen und somit innerhalb jeder Periode aktualisiert werden müssen.
Auch bei Anwendung der anonymous function, war ich bisher nicht erfolgreich.
Ist sowas für meinen Fall denn möglich? (globale Variablen funktionieren ja scheinbar auch nicht).
Ich hatte zuerst damit begonnen die beiden zusätzlichen Variablen global zu machen, sodass ich auf diese auch in meiner Zielfunktion zugreifen kann. Leider scheint das nicht ohne weiteres möglich zu sein.
Das ist schon möglich, allerdings nicht der empfohlene Weg.
Bitte poste immer das, was nicht funktioniert, damit man dafür Verbesserungsvorschläge machen kann.
Bevorzugter Weg ist wie gesagt Anonymous Functions:
vielen Dank für deine Rückmeldung. Funktioniert soweit prima. Ich habe analog auch noch eine Anonymous Function anstelle der Constraints Function eingefügt. Klappt ebenfalls hervorragend
Allerdings bin ich noch etwas unsicher, was die Startwerte der Optimierung (bei mir x0) angeht. Sobald ich diese verändere, erhalte ich auch eine andere Aufteilung der Produktionskapazitäten (zwar durchaus jeweils gewinnmaximierend, aber die Verteilung zwischen den Kapazitäten ist bei jedem Durchlauf anders - evtl. ist das aber auch dem internen Algorithmus geschuldet).
Gibt es eine Möglichkeit diese zu gewichten, sodass bspw. erst die erste Kapazität voll ausgeschöpft wird, bevor die zweite herangezogen wird?
Gibt es zudem eine Möglichkeit den Rückgabewert (des optimierten Ergebnisses, bei mir y) abzurufen und in einer externen Variablen zu speichern? Habe leider in der fmindoc keinen passenden Rückgabewert finden können
Vielen Dank schonmal bis hierhin, du hast mir sehr geholfen
Gibt es eine Möglichkeit diese zu gewichten, sodass bspw. erst die erste Kapazität voll ausgeschöpft wird, bevor die zweite herangezogen wird?
Man könnte das über einen zusätzlichen Term in der Zielfunktion regeln.
Zitat:
Gibt es zudem eine Möglichkeit den Rückgabewert (des optimierten Ergebnisses, bei mir y) abzurufen und in einer externen Variablen zu speichern?
Das klingt nach dem zweiten Rückgabeargument fval.
Grüße,
Harald
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.