Azzera filtri
Azzera filtri

How to add constraint with condtions using fmincon?

2 visualizzazioni (ultimi 30 giorni)
I have am optimization problem with two variables x and y where x and y are vectors.
I would like to add the foollowing constraint to fmincon :
if a<b then x<y
where a and b are known values.
I would like also to add in general x<y for every value of both vectors.
Many thanks!

Risposta accettata

xi
xi il 10 Ott 2019
Your constraint could be written as:
x-y < 1/(a<b)-1
when a<b, a<b=1, so, 1/(a<b)-1=0
when a>=b, a<b=0, so, 1/(a<b)-1=Inf, it is equivalent to not having constraint.
  5 Commenti
xi
xi il 10 Ott 2019
Assuming your x and y array length is n, you have 2n variables, not 2. So
X= (x1,x2,...xn,y1,y2...yn)
The constraint should be written in the vectorized format of AX-b<0;
for example, x1<y1 and x2<y2,... should be written as
A= [ 1,0,0...-1,0,0,...;
0,1,0...0,-1,0,...;
...]
b= [0,0,...]
I don't quite understand what in {1,length(x)} means. You can either use the trick I described and write A in an (n by 2n) matrix, or find out how many total contraints (=m) you have, and write A in an (m by 2n) matrix, where m<n.
wiem abd
wiem abd il 13 Ott 2019
Modificato: wiem abd il 13 Ott 2019
Thank you ! That was exactly what I needed.
Now let us consider that I have a vector L of lenght N where the known values are the elements of L.
I want to check for the vector X of lenght N that
for i=1:N
for j=1:N
if L(i)<L(j) then X(i)<=X(j) or X(i)-X(j)<1/(L(i)<L(j))-1
end
end
How to translate this into Matrix because I need to insert it as a constraint in fmincon

Accedi per commentare.

Più risposte (3)

xi
xi il 13 Ott 2019
Ask yourself 3 question: How many vairable? how many constraints? and then how to write A and b.
Now you are saying L is a known vector, then, your vairables are just X of length N. you can write your constraint in this way:
-----------------------------
A=zeros(N^2, N);
b=ones(N^2,1);
count=0;
for i=1:N
for j=1:N
count=count+1;
A(count,i)=1;
A(count,j)=-1;
b(count)= 1/(L(i)<L(j))-1;
end
end
---------------------------------
or using N(N-1)/2 constraints instead of N^2
for i=1:N-1
for j=i:N
................
end
end
---------------------------------------
A better way is to sort L first, and get the ordering index using [~,index] = sort(L)
So you define your new variable X'=X(index); and solve X' instead.
then, you only need to write N-1 constraints:
X'(1)<X'(2), X'(2)<X'(3), ... X'(N-1)<X'(N)
b is simply b=zeros(N-1,1); You can figure out A. This should be much faster.
  6 Commenti
xi
xi il 13 Ott 2019
no longer need count, just A(i, index(i)), or you need count++
wiem abd
wiem abd il 14 Ott 2019
Thank you very much.
It is working correctly now.

Accedi per commentare.


wiem abd
wiem abd il 14 Ott 2019
Now let us consider that my variable X is of length 2*N and my known values are in a vector L of lenght N.
I want that :
for i=1:N
for j=1:N
if L(i)<L(j) then X(i)<=X(j) and X(N+i)<X(N+j)
end
end
How can I find A such that A*X<zeros(N-1,1).
  2 Commenti
xi
xi il 14 Ott 2019
Modificato: xi il 14 Ott 2019
Now you have 2N variables, and 2*(N-1) constraints, only need small modifications of the above code
A=zeros(2*(N-1), 2*N);
[~,index] = sort(L)
for i=1:N-1 % write two constraints for each i
A(i,index(i))=1;
A(i,index(i+1))=-1;
% ******* just add two lines here, I leave it to you to figure out what the index of A should be.
end
b=zeros(N-1,1);
wiem abd
wiem abd il 15 Ott 2019
Modificato: wiem abd il 15 Ott 2019
I think these should be the lines to add :
A(i+N,N+index(i))=1;
A(i+N,N+index(i+1))=-1;
b size should also be modified as follows :
b=zeros(2*N-1,1);
It is working and giving correct results .
Many thanks !

Accedi per commentare.


wiem abd
wiem abd il 22 Ott 2019
Is there a way to formulate this anlytically using equations ?

Prodotti


Release

R2018b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by