大家好,
我用C++调用cplex对一个分段函数求解,不同区间段都是线性函数,分别求解。但是我的程序为什么运行结果是所有区间都木有可行解。不知道该怎么找错误。
希望了解相关情况的帮我看看,以下是部分代码:
for(m=0;m<total_num;m++){ //m表示不同的方案,每个方案区间段取法不同
IloExpr expr2(env);
for(t=1;t<=nTime;t++){
n=0;
for(i=1;i<=nPlant;i++){
for(j=1;j<=nCustm;j++){
expr2+=(Y[record[m][n]][i][j][1]+Y[record[m][n]][i][j][2]*Tran_qua[i][j][t]);
model.add(bound_point[record[m][n]-1][i][j]<=Tran_qua[i][j][t]<=bound_point[record[m][n]][i][j]);
//主要问题应该就是这个约束的添加,对于每个区间都要加入相应的约束,进行下一次计算前还要将这次的清空,后面有的remove
cout<<"区间:("<<bound_point[record[m][n]-1][i][j]<<","<<bound_point[record[m][n]][i][j]<<")"<<endl;
n++; //这里是记录方案M时某个区间的具体取值
}
}
}
//目标函数
IloObjective obj(env,expr1+expr2+expr5,IloObjective::Minimize); //其他的几个表达式省略没有写
model.add(obj);
expr2.end();
IloCplex cplex(model);
//Calling cplex.solve returns a Boolean indicating whether or not a feasible solution has been found.
if(cplex.solve()){
cout<<"可行"<<endl;
total_cost[m+1]=cplex.getObjValue();
env.out() << "total_cost[" <<m+1<<"]="<<total_cost[m+1]<<endl; //cout<<"test3"<<endl;
//进行下一次方案之前要将运输量约束和目标函数去掉,下次重新建立
model.remove(obj);
for(t=1;t<=nTime;t++){
n=0;
for(i=1;i<=nPlant;i++){
for(j=1;j<=nCustm;j++){
model.remove(bound_point[record[m][n]-1][i][j]<=Tran_qua[i][j][t]<=bound_point[record[m][n]][i][j]);
n++;
}
}
}
}
else{
cout<<"不可行"<<endl;
total_cost[m+1]=Infin;
//进行下一次方案之前要将运输量约束和目标函数去掉,下次重新建立
model.remove(obj);
for(t=1;t<=nTime;t++){
n=0;
for(i=1;i<=nPlant;i++){
for(j=1;j<=nCustm;j++){
model.remove(bound_point[record[m][n]-1][i][j]<=Tran_qua[i][j][t]<=bound_point[record[m][n]][i][j]);
n++;
}
}
}
continue; //本次m取值不可行,接着进行下一次循环
}
}
现在运行结果是所有区间均不可行,但实际上部分区间是可行的,我实在不知道错哪里了,希望大家帮帮忙。
或者告诉我应该怎么找错误也可以。