gpt4 book ai didi

c++ - CPLEX-添加具有不同类型的变量的惰性约束会导致InvalidCutException

转载 作者:行者123 更新时间:2023-12-02 10:19:25 26 4
gpt4 key购买 nike

我正在求解一个具有两种类型的变量的模型,x [i] [j]是ILOBOOL,而u [i]是ILOFLOAT。我正在尝试向此模型添加惰性约束。我设法以以下方式正确添加了惰性约束:

std::stringstream name;
IloNumVar** x = new IloNumVar*[ins.n+1];
for(int i = 0; i < ins.n+1; ++i){
x[i] = new IloNumVar[ins.n];
for(int j = 0; j < ins.n; ++j){
if(ins.has_edge(i,j) || i == ins.n){
name << "x_" << i << "_" << j;
x[i][j] = IloNumVar(env,0,1,ILOBOOL, name.str().c_str());
name.str("");
}
}
}

IloNumVar* u = new IloNumVar[ins.n+1];
for(int i = 0; i < ins.n+1; ++i){
name << "u_" << i;
u[i] = IloNumVar(env,(i < ins.n) ? 1 : 0,ins.L+1,ILOFLOAT,name.str().c_str());
name.str("");
}
/*Objective function and some other non-lazy Constraints
*/
cplex.extract(model);
for(int i = 0; i < ins.n; ++i){
for(int j = 0; j < ins.n; ++j){
if(ins.has_edge(i,j)){
IloConstraint edge_con(x[i][j] + x[j][i]<= 1);
name << "edge_" <<i << "_" << j;
edge_con.setName(name.str().c_str());
name.str("");
try{
cplex.addLazyConstraint(edge_con);
}catch(IloCplex::InvalidCutException& ex){
auto con = ex.getCut();
std::cout << ex.getMessage() << " " << ex.getStatus();
std::cout << con << "\n";
}
}
}
}

这段代码可以正常工作,当我打印.lp时,就出现了惰性约束。但是,当我将 IloConstraint edge_con(x[i][j] + x[j][i]<= 1);更改为 IloConstraint edge_con(x[i][j] + x[j][i] + u[j] <= 1);时,会收到 InvalidCutException: invalid cut -1消息。为什么会引发此异常?

最佳答案

将我的评论变成答案:
问题在于,CPLEX不了解惰性约束中引用的u变量。

如果添加常规约束,那么约束中的所有变量都会自动提取到CPLEX中。对于惰性约束,情况有所不同:变量不会自动提取。因此,如果惰性约束引用的变量未在常规约束或之前的目标中使用,则CPLEX将不知道该变量。这将导致添加剪切失败,并且您将得到观察到的异常。

要解决此问题,请使用明确将u变量添加到问题中

for (i = 0; i < ins.n+1; ++i)
model.add(u[i]);

(也许对 x变量也做同样的事情)

关于c++ - CPLEX-添加具有不同类型的变量的惰性约束会导致InvalidCutException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60894280/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com