我使用OPL进行线性规划,使用IBM ILOG Cplex优化工作室编写了一个模型。但现在我需要使用Concert c ++编写相同的模型。但我无法转换我的约束。
我的一个限制如下:
forall(i in Nodes)
edgeSum[i]:
if(i==0)
sum (j in Ein[0])x[<j,i>] - sum (j in Eout[0])x[<i,j>] == -1;
else if (i>=1 && i<n/2)
sum (j in Ein[i])x[<j,i>] - sum (j in Eout[i])x[<i,j>] == 0;
else
sum (j in Ein[i])x[<j,i>] <= 1;
特别是我需要知道如何编写条件约束。 谢谢你的进步。
答案 0 :(得分:1)
尝试类似
的内容for (i=0; i<numNodes; i++)
{
if (i == 0)
{
IloExpr expr1(env);
for (j=0; j<numIn[0]; j++)
expr1 += x[EInIndex[0][j]];
IloExpr expr2(env);
expr2 += x[EOutIndex[0][j]];
model.add(expr1 - expr2 == -1);
}
else if ((i >= 1) && (i < n/2))
{
// etc
}
else
{
// etc
}
}
我只是从记忆中做到了这一点,所以语法可能会受到一些损害,而且我还没有填写所有案例的所有细节 - 他们应该可以使用类似的结构。我也可能破坏了你的索引 - 不确定你是如何在你的C ++代码中重新构建切片方法的,所以我根据之前的做法猜测了一下。此外,我没有命名约束 - 也可以轻松添加。查看CPLEX提供的一些C ++示例。
希望这有点帮助