使用C++调用Cplex(二)——增加约束求解LP问题

使用C++调用Cplex(二)——增加约束求解LP问题

问题背景:这是个网络流模型
原始问题的模型为:

minimize  c*x
subject to  Hx = d
             l <= x <= u

现在需要增加约束

   AH=b   

到原模型中,构成一个新的模型。

 minimize  c*x
 subject to  Hx = d  (1)
             Ax = b  (2)
             l <= x <= u

其中模型中各参数的数值为


 H = (  0  0  0  0  0  0  0 -1 -1 -1  0  0 )  d = ( -1 )
     (  1  0  0  0  0  1  0  1  0  0  0  0 )      (  4 )
     (  0  1  0  1  0  0  1  0  1  0  0  0 )      (  1 )
     (  0  0  1  0  1  0  0  0  0  1  0  0 )      (  1 )
     (  0  0  0  0  0 -1 -1  0  0  0 -1  1 )      ( -2 )
     (  0  0  0 -1 -1  0  1  0  0  0  1  0 )      ( -2 )
     ( -1 -1 -1  0  0  0  0  0  0  0  0 -1 )      ( -1 )

  A = (  0  0  0  0  0  0  0  0  0  0  2  5 )  b = (  2 )
      (  1  0  1  0  0  1  0  0  0  0  0  0 )      (  3 )

 c = (  1  1  1  1  1  1  1  0  0  0  2  2 )
 l = (  0  0  0  0  0  0  0  0  0  0  0  0 )
 u = ( 50 50 50 50 50 50 50 50 50 50 50 50 )

C++代码如下

#include <ilcplex/ilocplex.h>
ILOSTLBEGIN

int
main()
{
   IloEnv   env;
   try {
      IloModel model(env, "chvatal");

      IloNumVarArray x(env, 12, 0.0, 50.0);
      model.add(IloMinimize(env, x[0] + x[1] + x[2] + x[3] + x[4] +
                                 x[5] + x[6] + 2*x[10] + 2*x[11] ));

      model.add(                                   -x[7]-x[8]-x[9]          
        == -1);
      model.add( x[0]                    +x[5]     +x[7]
         ==  4);
      model.add(      x[1]     +x[3]          +x[6]     +x[8]                 
         ==  1);
      model.add(           x[2]     +x[4]                    +x[9]            
         ==  1);
      model.add(                         -x[5]-x[6]               -x[10]+x[11]
         == -2);
      model.add(               -x[3]-x[4]                         +x[10]      
         == -2);
      model.add(-x[0]-x[1]-x[2]                                         -x[11]
         == -1);

      IloCplex cplex(model);
      cplex.setParam(IloCplex::Param::Simplex::Display, 2);
      cplex.setParam(IloCplex::Param::RootAlgorithm, IloCplex::Network);
      cplex.solve();
      cplex.out() << "After network optimization, objective is "
                  << cplex.getObjValue() << endl;

      model.add(2*x[10] + 5*x[11] == 2);
      model.add(  x[0] + x[2] + x[5] == 3);

      cplex.setParam(IloCplex::Param::RootAlgorithm, IloCplex::Dual);
      cplex.solve();

      IloNumArray vals(env);
      cplex.getValues(vals, x);
      cplex.out() << "Solution status " << cplex.getStatus() << endl;
      cplex.out() << "Objective value " << cplex.getObjValue() << endl;
      cplex.out() << "Solution is: " << vals << endl;

      cplex.exportModel("lpex3.lp");
   }
   catch (IloException& e) {
      cerr << "Concert exception caught: " << e << endl;
   }
   catch (...) {
      cerr << "Unknown exception caught" << endl;
   }

   env.end();
   return 0;

```bash

代码运行结果如下:
在这里插入图片描述
求得[x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11]=[0.6,0,0,1,1,2.4,0,1,0,0,0,0.4]

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TillerB

各位土豪赏点钱,帮我买条秋裤!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值