簡體   English   中英

CPLEX 約束的邏輯值

[英]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]不在這些鍵中,對於某些imodel是不可行的,結果我們得到false ,如果滿足 constr 則事件。

有時這就是我們想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM