Inequality Indexing using Optimization Toolbox
3 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
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 commentaire
Abdolkarim Mohammadi
le 8 Oct 2020
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.
Réponse acceptée
Matt J
le 8 Oct 2020
Modifié(e) : Matt J
le 8 Oct 2020
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 commentaires
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur Get Started with Optimization Toolbox dans Help Center et File Exchange
Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!