Hi,
I am working on a model likes:
expression a(N);
variable p(N);
variable b(N)
obj = obj + b * Constant;
min(obj);
subject to
for i = 1:N
b(i)>= a(i);
b(i)<= a(i);
end
where the value of expression a depends on a step function of the variable p :
a(i) = 0, if p(i)=0
a(i) = 1, if p(i)>0
I have studied the materials on the website of CVX, but still have no idea how to implement a constraint like the above equation. Is it possible to implement such constraints in cvx?
Thank you!
You need to use Big M logic modeling. You will need to declare a
as a binary variable rather than an expression.
I presume p
is nonnegative, although you haven’t declared it as such or specified such a constraint. The constraint below will enforce nonnegativity of p
. Assume U
is an upper bound for p
(U
could be a scalar or a vector).
Let non-zero_threshold
be a small positive number, such as 1e-5, for what constitutes the smallest value of p
which is practically speaking positive (keep in mind solver tolerances might allow a variable value of 1e-8 when it is really essentially zero).
non-zero_threshold*a <= p <= U.*a
Hi Mark,
Thanks for the quick response! The big M modeling does work, but seems a will be set to a small number because of p might get small compared to its upper bound. I specify it as binary and use Mosek to solve the problem. I am also considering using Taylor Series Approximation and penalized the objective function to make it an binary variable.
Is there any better approach to address this problem?
Thank you!
As I wrote, declare a
as binary. Then use a solver, such as Mosek, which can handle binary variables. That should be better than trying to create a penalty term or use a Taylor series approximation. I think Mosek or Gurobi will do a better job of handling binary variables than any "home-brew’ approach you might create.
Got that! Thank you so much, Mark!