楼主: cswfpp
4780 2

[学术与投稿] 求救:c++调用cplex程序 [推广有奖]

  • 0关注
  • 0粉丝

已卖:12份资源

小学生

42%

还不是VIP/贵宾

-

威望
0
论坛币
19 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
979 点
帖子
4
精华
0
在线时间
6 小时
注册时间
2009-5-9
最后登录
2022-4-23

楼主
cswfpp 发表于 2013-1-22 16:39:04 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
大家好,
我用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取值不可行,接着进行下一次循环
   }

  }

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

扫码加我 拉你入群

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

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

关键词:CPLEX Lex PLE 分段函数 函数求解 程序

沙发
cswfpp 发表于 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]);
没有起作用。
但是应该怎么处理呢?怎样才能有效的将这个约束移除呢?

藤椅
ban_yue 发表于 2018-6-29 14:42:08
是不是得先add,再remove

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
jg-xs1
拉您进交流群
GMT+8, 2025-12-25 00:58