How to add constraint with condtions using fmincon?

조회 수: 3 (최근 30일)
wiem abd
wiem abd 2019년 10월 10일
답변: wiem abd 2019년 10월 22일
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!

채택된 답변

xi
xi 2019년 10월 10일
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
xi
xi 2019년 10월 10일
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 2019년 10월 13일
편집: wiem abd 2019년 10월 13일
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

댓글을 달려면 로그인하십시오.

추가 답변 (3개)

xi
xi 2019년 10월 13일
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
xi
xi 2019년 10월 13일
no longer need count, just A(i, index(i)), or you need count++
wiem abd
wiem abd 2019년 10월 14일
Thank you very much.
It is working correctly now.

댓글을 달려면 로그인하십시오.


wiem abd
wiem abd 2019년 10월 14일
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
xi
xi 2019년 10월 14일
편집: xi 2019년 10월 14일
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 2019년 10월 15일
편집: wiem abd 2019년 10월 15일
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 !

댓글을 달려면 로그인하십시오.


wiem abd
wiem abd 2019년 10월 22일
Is there a way to formulate this anlytically using equations ?

카테고리

Help CenterFile Exchange에서 Solver Outputs and Iterative Display에 대해 자세히 알아보기

태그

제품


릴리스

R2018b

Community Treasure Hunt

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

Start Hunting!

Translated by