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

Lineare Optimierung - Eine von zwei Variablen muss 0 sein!

 

MatlabMathias
Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 18.07.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.09.2018, 14:47     Titel: Lineare Optimierung - Eine von zwei Variablen muss 0 sein!
  Antworten mit Zitat      
Liebe Community,

ich bin bei der Formulierung meiner Constraints für eine lineare Optimierung auf folgendes Problem gestoßen:

Meine Zielfunktion lautet wie folgt, mit der Entscheidungsvariablen x und einem gegebenen Vektor p in den Dimensionen von [2*8760 x 1]:

Code:
fun = @(x) x(:).'*p(:);


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:

Aeq:
(func func 0 0 0 0 ...
0 0 func func 0 0 ...
0 0 0 0 func func ...
...)


beq:
(1
1
1
1)


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.

Lieben Gruß,
Mathias
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.434
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.09.2018, 18:21     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
MatlabMathias
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 18.07.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.09.2018, 19:04     Titel: Anderer Problemansatz - MILP?
  Antworten mit Zitat      
Hallo Harald, Liebe Community,

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;

x0(1:length(p),1) = 1; % Starting solution
xcount = cumsum(x0);
idx = mod(xcount,2)==1;
x0(idx)=-1; %

Aeq = []; % Linear Equality constraint: Aeq*x = beq
beq = [];
lb = []; % Lower and upper bounds
ub = [];
nonlcon = @(x) capacity_fmincon(x, eta, Smax) ;

% Solver - fmincon
options = optimoptions('fmincon','Display','iter','Algorithm','interior-point','MaxIterations',10000,'MaxFunctionEvaluations',1000000);
[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options);


Code:
function [c,ceq] = capacity_fmincon(x,eta,Smax)

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.

Ganz lieben Dank für Deine/Eure Hilfe.
Mathias
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.434
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.09.2018, 21:15     Titel:
  Antworten mit Zitat      
Hallo,

die ersten beiden Zeilen
E = sqrt(eta)*x;
E(x<0) = (1/sqrt(eta))*x(x<0);

kann man mit b = x < 0 sehen als
Code:
E = (1-b) .* sqrt(eta)*x + b .*  (1/sqrt(eta))*x;


Ansonsten habe ich da auch keine Ideen.

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
MatlabMathias
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 18.07.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.09.2018, 12:07     Titel:
  Antworten mit Zitat      
Hallo Harald,

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?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.434
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.09.2018, 12:21     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
MatlabMathias
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 18.07.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.09.2018, 12:42     Titel:
  Antworten mit Zitat      
Hallo Harald,

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?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.434
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.09.2018, 13:13     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
MatlabMathias
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 18.07.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.09.2018, 13:18     Titel:
  Antworten mit Zitat      
Durch die binäre Variable ist es doch eben nicht mehr nichtlinear sondern integer.

Dann formuliere ich es nochmal anders:

Kann ich beim fmincon eine Hilfsvariable defnieren, die von x abhängig ist ohne das in der nonlincon zu formulieren?

Und vielleicht in Bezug zu CPLEX: Dort gibt es sogenannte SOSs: (https://www.ibm.com/support/knowled.....1_SOS_title_synopsis.html)

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?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.434
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.09.2018, 17:24     Titel:
  Antworten mit Zitat      
Hallo,

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