Add constraint
AnsweredI have the following code:
GRBLinExpr lhs = 0.0;
for (int ti = 0; ti < alltask_CountVars.Count; ti++)
{
int taskProVal = GetTaskPropertyVal();
for (int diffidx = 0; diffidx < 3; diffidx++)
{
lhs.AddTerm(taskProVal, alltask_CountVars[ti][diffidx]); //
}
}
model.AddConstr(lhs == goal , "constraint1");
Here "alltask_CountVars" is GRB variable.
I have "goal" as a array of value and the constraint is if lhs is equals to any value in the "goal" array.
How do I set this constraint?
thank you.
-
Official comment
This post is more than three years old. Some information may not be up to date. For current information, please check the Gurobi Documentation or Knowledge Base. If you need more help, please create a new post in the community forum, or try Gurobot, our chatbot interface offering instant, expert-level support. -
You would have to introduce an additional binary variable for every entry of your \(\texttt{goal}\) array. The binary variables would be used to check whether the equality holds as described in the stackexchange post In an integer program, how I can force a binary vairable to equal 1 if some condition holds. Then you can use the addGenConstrOr method to check whether at least one of the equality constraints is fulfilled.
Best regards,
Jaromił0 -
Thank you for answering my question.
I still have questions about introducing an additional binary variable for every entry of my goal array. I forget to say my goal array is some random integer value(e.g.,[1,41,5,37]) the post you provide assume the input variable x is binary or continuous. This might be an issue?
0 -
I forget to say my goal array is some random integer value(e.g.,[1,41,5,37]) the post you provide assume the input variable x is binary or continuous. This might be an issue?
Integer values should work the same as continuous but without the "numerical inaccuracy" part. So, since all your \(\texttt{goal}\) values are integer, you could use \(\delta=0.5\).
0 -
Hello Jaromil,
According to the link, how do I code these two formulation in Gurobi
Mz1 >= x-b+ sigma (1)
M(1-z1)> b-x-sigma(2)
As far as I understand, M and sigma is some constant value, z1 is a GRB binary VAR, X and b is GRB VAR.
Could you give me an example?
0 -
mip.R is a good example to start with.
The two inequalities would be constructed via
model$A <- matrix(c(1,-1,-M,-1,1,M), nrow=2, ncol=3, byrow=T)
model$rhs <- c(0.5,M+0.5)
model$sense <- c('<', '<')The above constructs
\[\begin{align}
x - b - Mz_1 &\leq 0.5\\
-x + b + Mz_1 &\leq M + 0.5
\end{align}\]Best regards,
Jaromił0 -
Thank you for giving me the example in R!
I have tried to code the relationship without matrix( because my original code is in C#)
x−b−Mz1≤0.5
−x+b+Mz1≤M+0.5
I follow your suggest and introduce an additional binary variable for every entry of my goal array. Then I encode these two inequalities by using "AddGenConstrIndicator" method.
GRBLinExpr fixedLhs = 0.0;
for (int ti = 0; ti < alltask_CountVars.Count; ti++)
{
int taskProVal = GetTaskPropertyVal();
for (int diffidx = 0; diffidx < 3; diffidx++)
{
fixedLhs.AddTerm(taskProVal, alltask_CountVars[ti][diffidx]); //
}
}for (int i = 0; i < goals.Count; i++)
{
//if x>b−sigma, then forces z1=1 , where x is lhs, b is goal[i], z1 is binary var
model.AddGenConstrIndicator(z1[i], 1, fixedLhs, GRB.GREATER_EQUAL, goals[i] -0.5, "");
//If x<b−sigma , then (2) forces z1=0
model.AddGenConstrIndicator(z1[i], 0, fixedLhs, GRB.LESS_EQUAL, goals[i] - 0.5, "");
//skip z2 here
}
//in the end check min_z1+min_z2 -1 >=1
model.AddConstr(min_z1+min_z2 -1, GRB.GREATER_EQUAL, 1.0, "min_z1+min_z2 -1 >= 1");The optimization result seems fine, except it only gives solutions that satisfied one goal. (I also set pool search mode = 2. ) I expect the optimizer will give me all solutions that satisfy the constraint " if lhs is equals to any value in the "goal" array."
Thank you in advance!
0 -
It seems like you implemented only constraints (1) and (2) from In an integer program, how I can force a binary vairable to equal 1 if some condition holds. Note that you also need constraints (3) and (4). Alternatively, you could use the formulation posted in the last comment of the stackexchange thread.
I expect the optimizer will give me all solutions that satisfy the constraint " if lhs is equals to any value in the "goal" array."
You have exactly one \(\texttt{fixedLhs}\) object. So as long as there are not 2 same \(\texttt{goal}\) values, it is not possible that more that one \(\texttt{goal}\) entry equals \(\texttt{fixedLhs}\) at the same time.
Best regards,
Jaromił0
Post is closed for comments.
Comments
8 comments