全部版块 我的主页
论坛 提问 悬赏 求职 新闻 读书 功能一区 经管百科 爱问频道
4721 2
2013-01-22
大家好,
我用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取值不可行,接着进行下一次循环
   }

  }

现在运行结果是所有区间均不可行,但实际上部分区间是可行的,我实在不知道错哪里了,希望大家帮帮忙。
或者告诉我应该怎么找错误也可以。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2013-1-23 10:37:55
我现在发现我的问题在于
  model.remove(bound_point[record[m][n]-1][i][j]<=Tran_qua[i][j][t]<=bound_point[record[m][n]][i][j]);
没有起作用。
但是应该怎么处理呢?怎样才能有效的将这个约束移除呢?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2018-6-29 14:42:08
是不是得先add,再remove
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群