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

Speicherbefüllung i.V.m. Erlösmaximierung (fmincon?)

 

keks19
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 04.06.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.06.2017, 14:30     Titel: Speicherbefüllung i.V.m. Erlösmaximierung (fmincon?)
  Antworten mit Zitat      
Hallo zusammen,

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?

Vielen Dank vorab Wink
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: 09.06.2017, 20:18     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
leider finde ich aber irgendwie keine Möglichkeit Werte von extern an die fmincon Funktion zu übergeben.

Folgendes ist aus der Doku von fmincon verlinkt:
https://www.mathworks.com/help/opti.....ing-extra-parameters.html
Mein bevorzugter Weg sind anonymous functions.

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

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 04.06.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.06.2017, 08:52     Titel:
  Antworten mit Zitat      
Hallo Harald,
danke für den Link.


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:
Code:
function y = myFitness(x)

y = -x(1)*0.21 - x(2)*0.21 - x(3)*0.5;

end


Die Constraints sind
Code:
function [c, c_eq] = myConstraints(x)


c = [x(1) + x(2) + x(3) - 100];

c_eq = [];

end


Der Aufruf erfolgt innerhalb meiner Hauptfunktion
Code:

ObjFcn = @myFitness;
x0 = [10, 50, 41.75];  
LB = [0 0 0];          
UB = [50 100 50];      

ConsFcn = @myConstraints;

x = fmincon(ObjFcn(x), x0, [],[],[], [], LB, UB, ConsFcn,[]);
 


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

VG
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: 10.06.2017, 10:46     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
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:
Code:
function y = myFitness(x, a)

y = -x(1)*a(1)- x(2)*a(2) - x(3)*a(3);
% oder - sum(x .* a)


und dann
Code:
a = [0.21,0.21,0.5]
x = fmincon(@(x) myFitness(x, a), ...


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

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 04.06.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.06.2017, 09:55     Titel:
  Antworten mit Zitat      
Hallo Harald,

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 Smile

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 Sad

Vielen Dank schonmal bis hierhin, du hast mir sehr geholfen Wink Idea
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: 11.06.2017, 10:02     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
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
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.