Inequality Indexing using Optimization Toolbox

조회 수: 4 (최근 30일)
Samuel L. Polk
Samuel L. Polk 2020년 10월 8일
편집: Matt J 2020년 10월 8일
I would like to optimize an objective function with a constraint that is based on logical indexing. However, it seems like I can't just treat the optimization variable as I would a regular double. I was hoping for some advice about how to structure the constraint.
The code I have is written below. The variables A and B are n x 1 doubles and c is a scalar. So, I want to sum the values in A corresponding to indices for which the optimization variable x is greater than B.
x = optimvar('x',n); % Creates optimization variable
objfun = sum(x); % Creates objective function
constraint = sum(A(x>=B))>=c; % Constraint based on logical indexing
Thank you!
  댓글 수: 1
Abdolkarim Mohammadi
Abdolkarim Mohammadi 2020년 10월 8일
The error says all about it:
Unable to use a value of type optim.problemdef.OptimizationInequality as an index.
You cannot use OptimizationVariable objects for indexing. Such constraints should be defined using extra binary integer variables, so that when x>=B then the constraint is effective, and otherwise the constraint becomes redundant.

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

채택된 답변

Matt J
Matt J 2020년 10월 8일
편집: Matt J 2020년 10월 8일
What Abdolkarim is getting it is the following, I believe. It requires known upper bounds U (vector or scalar) and lower bounds L on x.
x = optimvar('x',n,'Lower',L,'Upper',U);
e = optimvar('e',n,'Lower',0,'Upper',1,'type','integer');
Con.constr1 = e>=(x-B)./(U-B)/2; % x>B ==> e=1
Con.constr2 = e<=1-(B-x)./(B-L)/2; % x<B ==> e=0
Con.constr3 = A(:).'*e>=c;
prob=optimproblem('Objective',sum(x),'Constraints', Con)

추가 답변 (0개)

Community Treasure Hunt

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

Start Hunting!

Translated by