[英]Logical value of CPLEX constraint
我擁有的 C++ CPLEX model 很長,我在函數內部構建約束。 假設我有一個返回約束的 function:
IloConstraint f(IloInt i, IloInt j, IloNumVarArray x)
{
IloConstraint constr;
constr = (x[j]-x[i] >= 15) && (x[j]-x[i] <= 20);
return constr;
}
是否有可能傳遞一個常量數組而不是變量數組x ,並獲得約束的邏輯值,即做類似的事情。
IloNumArray a(env, 5, 1, 1, 1, 1, 1);
IloConstraint c = f(1,2,a);
cout<<c.logicalValue();
你可以使用 IloAnd
在 CPLEX 文檔中,您可以閱讀
For example, you may write:
IloAnd and(env);
and.add(constraint1);
and.add(constraint2);
and.add(constraint3);
Those lines are equivalent to :
IloAnd and = constraint1 && constraint2 && constraint3;
我找不到真正的解決方案,但我有一些解決方法。 假設我們已經有一個約束c ,我們創建一個新的 model 以c作為它的約束,並為變量添加新的邊界。
bool constraintLogicalValue(IloConstraint const& constr, IloNumVarArray const& x, IloNumArray const& a, unsigned int const n)
{
IloEnv env;
IloModel model(env);
IloCplex cplex_model(model);
cplex_model.setOut(env.getNullStream());
for(int i=0; i<n; ++i)
model.add(x[i]==a[i]);
model.add(constr);
return(cplex_model.solve());
}
現在我們可以通過以下方式使用它:
int n;
IloEnv env;
IloModel model(env);
IloNumVarArray x (env);
...
IloNumArray a(env);
for(int i=0; i<n; ++i)
a.add(1);
IloConstraint c = f(1,2,x);
cout<<constraintLogicalValue(c, env, x, a, n);
編輯:問題可能是x的現有邊界,它被傳遞到constraintLogicalValue() 。 如果x[i]==a[i]不在這些鍵中,對於某些i , model是不可行的,結果我們得到false ,如果滿足 constr 則事件。
有時這就是我們想要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.