Jetzt möchte ich vorgeben, dass für jedes Wertepaar von x jeweils ein Wert gleich Null sein muss. D.h. Entweder ist x1 oder x2 gleich Null, x3 oder x4 gleich Null, x5 oder x6 gleich Null .... x17519 oder x17520 gleich Null. Der jeweils andere Wert ist entweder positiv oder negativ.
Um diese Constraint zu definieren, muss ich entweder eine Ungleichheits- oder eine Gleichheitsbedingung formulieren:
a) Aineq*x <= bineq
b) Aeq*x = beq
Ich muss also entweder Aineq oder Aeq sowie bineq oder beq formulieren.
Eine Lösung, an die ich gedacht habe, wäre:
Wenn ich eine Funktion hätte, die für alle Werte ungleich Null 1 zurückgibt und für alle Werte gleich Null Null ausgibt, dann könnte ich Aeq und beq wie folgt formulieren:
Die Frage lautet also: Kann ich Funktionen als Constraint definieren? Und wenn ja, wie setze ich das um und mit welcher Funktion? Oder bin ich auf dem Holzweg und es gibt eine viel elegantere Lösung?
Ich freue mich auf Eure Ideen und ggf. anschließende Diskussionen.
das Problem ist nur, dass die (Un-)Gleichungsnebenbedingungen keine Funktionen enthalten dürfen.
Allgemein sehe ich keine andere Möglichkeit als das als ein binary programming-Problem anzugehen, vermutlich mit ga.
Wenn es besondere Infos über p gibt (z.B. verändert sich von einer zur nächsten Position wenig) oder bekannte Strategien für x (z.B. oft abwechseln oder nicht), wäre das hilfreich. Und natürlich auch die sonstigen Nebenbedingungen, denn sonst ist die Problemstellung ja irgendwo sinnfrei.
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 ;)
vielen Dank für die schnelle Rückmeldung!
Hier ist mein aktuelles, nicht-lineares Problem. Bitte berücksichtige, dass die Vorgabe für x (wie eingangs bemerkt) in diesem Falle nicht gilt; denn das war lediglich mein Ansatz, das Problem in ein lineares zu wandeln:
Code:
% General Definitions
p = Data.RAW.Marginal_Prices; % price vector
Smax = 13.5; % capacity
Pmax = 5; % maximal charging/discharging power
eta = 0.92; % battery efficiency beta = 0.1; % in case penalty term is applied
%% Wholesale Arbitrage
% Cost function (minimize for arbitrage (negative))
fun = @(x) x(:).'*p(:);
%Constraints
a1 = eye(length(p));
a2 = a1*-1;
A = [a1; a2]; % Linear inequality constraint: A*x <= b. (maximal power constraint)
b(1:2*length(p),1) = Pmax;
E = sqrt(eta)*x;
E(x<0) = (1/sqrt(eta))*x(x<0); % efficiency depends on charging/discharging
E(1) = Smax/2 + E(1);
S = cumsum(E);
c1 = -S;
c2 = S - Smax;
c = [c1; c2]; % Nonlinear inequality constraint: c(x) <= 0 for all entries of c.
Dieses möchte ich nun gern für CPLEX umwandeln. CPLEX kann mit integer-programming umgehen, darum gefällt mir die Idee einer binary Variablen. Allerdings finde ich keinen Ansatz, wie sich meine nicht-lineare Bedingung durch Einführung einer binären Variable in eine lineare Bedingung umformen ließe.
Leider gibt es keine Infos über p (verändert sich stark und unregelmäßig) und x kann sich genauso frei ändern.
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 ;)
den Ansatz finde ich gut, aber ich wüsste nicht, wie ich den in die Syntax der Matlab Optimierung bringe?
Ich kann ja nur Constraints formulieren und nicht dazwischen eine Hilfsvariable E, die wiederum von den jeweiligen Ergebnissen von x abhängig ist, oder? Falls doch, wie würde ich das in dem Kontext meines geposteten Codes machen?
ich kenne die Anforderungen von CPLEX nicht, kann da also wenig dazu sagen.
Unten ist lediglich ein Vorschlag, wie man das binär umformulieren kann. Der Rest der Nebenbedingungsfunktion würde gleich bleiben.
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 ;)
das ist m.E. recht unabhängig von CPLEX, die Syntax ist abgesehen von der nicht-linearen Bedingung identisch zum fmincon.
Wo und wie würde ich beim fmincon denn das "b" definieren?
Wenn ich das so (wie von dir formuliert) einfach in den Code hineinschreibe, dann wird das b doch nicht bei jeder Optimierungsschleife neu definiert, oder etwa doch?
Wenn ich das so (wie von dir formuliert) einfach in den Code hineinschreibe, dann wird das b doch nicht bei jeder Optimierungsschleife neu definiert
Stimmt, das ist eben der Unterschied: du sagst, CPLEX unterstützt binäre Variablen in den nichtlinearen NB. Dann muss es eine leicht andere Schnittstelle geben als bei fmincon.
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 ;)
Ich bin mir sicher, dass sich die Syntax kaum unterscheidet, kann dies mangels Erfahrung aber nicht umsetzen. Reicht deine Erfahrung in diesem Bereich, um daraus eine potentielle Lösung zu ersehen?
Kann ich beim fmincon eine Hilfsvariable defnieren, die von x abhängig ist ohne das in der nonlincon zu formulieren?
Generell schon, so wie du eta und Smax verwendest. Die werden dann aber eben nicht in jedem Durchlauf aktualisiert.
Was den Link angeht: da lobe ich mir ehrlich gesagt die MATLAB-Doku. Ich habe jetzt ein paar Mal in deinem Link hin- und hergeklickt und finde nichts, was irgendwie weiterhelfen würde.
Gibt es denn ein CPLEX-Forum? Da wäre die Frage vielleicht besser aufgehoben.
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 ;)
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.