一、写在前面

在文章《Cplex入门教程(一)》的基础上,补充代码的部分

二、如何写代码

  • 代码头,请无脑直接抄。
#include <ilcplex/ilocplex.h>
#include <stdio.h>
using namespace std;ILOSTLBEGIN
  • 声明环境,建立模型。
IloEnv env;IloModel model(env);
  • 定义决策变量,使用ilocplex包含的数据类型,或自己定义新的变量。
IloInt
IloNumVarArray
IloNumArray
IloIntVarArray
IloIntArray
typedef IloArray<IloNumVarArray> IloNumVarArray2;
typedef IloArray<IloNumVarArray2> IloNumVarArray3;IloNumVarArray3 t(env, I);
for (int i = 0; i < I; i++)
{   t[i] = IloNumVarArray2(env, I);for (int j = 0; j < I; j++){  t[i][j] = IloNumVarArray(env, I, 0, 100000);}
}
  • 定义模型系数,可使用常用数据类型(int等)或ilocplex包含的数据类型。 可以直接赋值,也可以通过读取.txt/.dat文件输入
ifstream inn;
inn.open("data.txt");
if (inn)
{   inn >> b_1; inn >> b_2; inn >> b_3; inn >> b_4;   }
inn.close();

  • 使用以下网站查询各数据类型的用法:
    http://www-eio.upc.es/lceio/manuals/cplex-11/html/refcppcplex/html/index/index.html#I

  • 定义目标函数,可以直接写,也可以使用IloExpr定义一个表达式。

// 适用于简单表达
model.add(IloMaximize(env, vars[0] + 2 * vars[1] + 3 * vars[2]));
// 适用于求和等需要迭代的表达
IloExpr v3(env);
v3 += (x[i][j] * b[i][j]);
model.add(IloMinimize(env, v3));
  • 添加约束条件,同样有两种方法。
model.add(-vars[0] + vars[1] + vars[2] <= 20);
IloExpr v1(env);
for (i = 0; i < 4; i++)
{v1.clear();for (j = 0; j < 4; j++){  v1 += (x[i][j]);  }model.add(v1 == 1);
}
  • 求解,无脑直接抄+1。
IloCplex cplex(model);
if (!cplex.solve()) {env.error() << "Failed to optimize LP." << endl;throw(-1);
}
  • 输出结果,env.out() << 语句。
env.out() << "Solution status = " << cplex.getStatus() << endl;env.out() << "Solution value = " << cplex.getObjValue() << endl;env.out() << "Values = " << vars << endl;

三、Example 1

  • 问题:
    min x1 + 2 x2 + 3 x3
    s.t. -x1 + x2 + x3 ≤ 20
    x1 - 3 x2 + x3 ≤ 30
    0 ≤ x1 ≤ 40
    0 ≤ x2
    0 ≤ x3
#include <ilcplex/ilocplex.h>
#include <stdio.h>
using namespace std;ILOSTLBEGINint main( void * )
{IloEnv env;try {IloModel   model( env );IloNumVarArray vars( env );vars.add( IloNumVar( env, 0.0, 40.0 ) );                                /* 0 <= x1 <= 40 */vars.add( IloNumVar( env ) );                                           /* 0 <= x2 */vars.add( IloNumVar( env ) );                                           /* 0 <= x3 */model.add( IloMaximize( env, vars[0] + 2 * vars[1] + 3 * vars[2] ) );   /* maximize x1 + 2 x2 + 3 x3 */model.add( -vars[0] + vars[1] + vars[2] <= 20 );                        /* subject to -x1 + x2 + x3 <= 20 */model.add( vars[0] - 3 * vars[1] + vars[2] <= 30 );                     /* x1 - 3 x2 + x3 <=30 */IloCplex cplex( model );if ( !cplex.solve() ){env.error() << "Failed to optimize LP." << endl;throw(-1);}IloNumArray               vals( env );env.out() << "Solution status = " << cplex.getStatus() << endl;env.out() << "Solution value = " <<  cplex.getObjValue() << endl;cplex.getValues( vals, vars );env.out() << "Values = " << vals << endl;}catch ( IloException & e ) { cerr << "Concert exception caught: " << e << endl; }catch ( ... ) { cerr << "Unknown exception caught" << endl; }env.end();system( "pause" );return(0);
}

四、Example 2

  • 问题:

#ifndef abcde /* ifndef做预处理,进行条件编译 */
#include <ilcplex/ilocplex.h>
typedef IloArray<IloIntVarArray>  IntVarMatrix;
typedef IloArray<IloNumVarArray>  NumVarMatrix;
typedef IloArray<IloIntArray>     IntMatrix;
typedef IloArray<IloNumArray>     NumMatrix;
/* 定义各种数组 */
#endifILOSTLBEGINint main( int argc, char **argv )
{IloEnv env;IloModel model( env );IloExpr obj( env );IloInt i, j;IloInt c;IloExpr v1( env );IloExpr v2( env );IloExpr v3( env );IloNumArray b_1( env );IloNumArray b_2( env );IloNumArray b_3( env );IloNumArray b_4( env );/* 文件输入 */ifstream inn;inn.open( "data.txt" );if ( inn ){inn >> b_1; inn >> b_2; inn >> b_3; inn >> b_4;}inn.close();NumMatrix b( env, 4 );for ( i = 0; i < 4; i++ ){b[i] = IloNumArray( env, 4 );}b[0] = b_1; b[1] = b_2; b[2] = b_3; b[3] = b_4;IntVarMatrix x( env, 4 );for ( i = 0; i < 4; i++ ){x[i] = IloIntVarArray( env, 4, 0, 1 );}for ( i = 0; i < 4; i++ ){v1.clear();v2.clear();for ( j = 0; j < 4; j++ ){v1    += (x[i][j]);v2   += (x[j][i]);v3   += (x[i][j] * b[i][j]);}model.add( v1 == 1 );model.add( v2 == 1 );}model.add( IloMinimize( env, v3 ) );obj.end();/* 设置模型迭代结束条件 */IloCplex cplex( model );cplex.setParam( cplex.EpAGap, 0.001 );cplex.setParam( cplex.EpGap, 0.001 );/* 处理异常 */cout << "begin to solve." << endl;try{if ( !cplex.solve() ){if ( (cplex.getStatus() == IloAlgorithm::Infeasible) ||(cplex.getStatus() == IloAlgorithm::InfeasibleOrUnbounded) ){cout << endl << "No solution - starting Conflict refinement" << endl;}env.error() << "Failed to optimize LP." << endl;throw( -1 );}cout << "异常处理完毕" << endl;/* 输出结果及状态 */env.out() << "Solution status = " << cplex.getStatus() << endl;env.out() << "Solution value = " <<   cplex.getObjValue() << endl;env.out() << "obj = " << cplex.getValue( v3 ) << endl;}catch( IloException & e ){cerr << "Concert exception caught: " << e << endl;
/* save results */}catch( ... ){cerr << "Unknown exception caught" << endl;}/* 目标结果输出 */ofstream of;of.open( "result.txt" );of << cplex.getValue( v3 ) << "\n";of.close();
/* 决策变量输出 */ofstream xij;xij.open( "result_xij.txt" );if ( !xij ){cout << "dabuda" << endl;}else {for ( i = 0; i < 4; i++ ){for ( j = 0; j < 4; j++ ){c = cplex.getValue( x[i][j] );xij << c << ",";cout << c << ",";}xij << endl;cout << endl;}}xij.close();env.out() << endl;env.end();system( "pause" );return(0);
}

Cplex入门教程(二)相关推荐

  1. python elasticsearch 入门教程(二) ---全文搜索

    python elasticsearch 入门教程(二) ---全文搜索 截止目前的搜索相对都很简单:单个姓名,通过年龄过滤.现在尝试下稍微高级点儿的全文搜索--一项 传统数据库确实很难搞定的任务. ...

  2. R语言七天入门教程二:认识变量与运算符

    R语言七天入门教程二:认识变量与运算符 一.什么是变量 1.变量 顾名思义,我们可以将变量理解为"可以改变的量",是计算机语言中能储存计算结果或能表示值的抽象概念.这里的值可以是数 ...

  3. (转)tensorflow入门教程(二十六)人脸识别(上)

    https://blog.csdn.net/rookie_wei/article/details/81676177 1.概述 查看全文 http://www.taodudu.cc/news/show- ...

  4. Android WebRTC 入门教程(二) -- 模拟p2p本地视频传输

    Android WebRTC 入门教程(一) – 使用相机 Android WebRTC 入门教程(二) – 模拟p2p本地视频传输 源码工程: https://github.com/LillteZh ...

  5. LittleVGL (LVGL)干货入门教程二之LVGL的输入设备(indev)API对接。

    LittleVGL (LVGL)干货入门教程二之LVGL的输入设备(indev)API对接 前言: 阅读前,请确保你拥有以下条件: 你已经完成"显示API"的移植. 你已经实现了一 ...

  6. c语言类似于 n的标识符,C语言快速入门教程(二)

    C语言快速入门教程(二) C语言的基本语法 本节学习路线图: 引言: C语言,顾名思义就是一门语言,可以类比一下英语; 你要说出一个英语的句子需要: 单词 + 语法! 将单词按照一定的语法拼凑起来就成 ...

  7. 微信小程序云开发 初学者入门教程二

    微信小程序云开发 初学者入门教程二-前端操作数据库模块 如何操作数据库,作为一名前端,如果对数据的知识不够熟悉也没关系,从现在开始好好学习就行,数据库的操作内容差不多涉及增删改查四大模块,花一些业余的 ...

  8. python爬虫入门教程(二):开始一个简单的爬虫

    2019/10/28更新 使用Python3,而不再是Python2 转载请注明出处:https://blog.csdn.net/aaronjny/article/details/77945329 爬 ...

  9. quarkus 入门教程(二) -项目开发模式热更新及项目断点调试方法

    quarkus 入门教程(二) -项目断点调试方法 1.项目热更新 quarkus:dev runs 方式启动,项目会以开发者模式启动,当修改了java文件或者resource文件后,项目会在后台编译 ...

  10. Apollo Control——超详细入门教程(二):连续状态空间方程离散化与离散LQR公式推导

    专栏文章列表 Apollo Control--超详细入门教程(一):基于道路误差的车辆动力学模型 Apollo Control--超详细入门教程(二):连续状态空间方程离散化与离散LQR公式推导 Ap ...

最新文章

  1. HTML5 Canvas爱心时钟代码
  2. 使用Eclipse连接SAP云平台上的HANA数据库实例
  3. xilinx芯片管脚使用限制_修复焊接BGA芯片过程
  4. 百度优化有感,原创内容只是个传说
  5. 杰控组态软件MODBUS寄存器地址的设置
  6. Conficker蠕虫病毒只是愚人节玩笑吗
  7. 传感器实验——无源蜂鸣器
  8. c语言哈夫曼运行时错误,游戏运行错误 提示Unhandled exception caught 怎么解决 救命呀!...
  9. 支付宝 客户端 Android 集成流程
  10. 特殊符号大全复制_王者荣耀名字特殊符号2019 稀有漂亮最新热门符号大全
  11. 计算机基础 华师在线,华师在线计算机基础试题答案.doc
  12. 基于SpringCloud的enum枚举值国际化处理实践
  13. 实现网页原路返回:从哪个页面跳转过来就返回哪个页面
  14. 钉钉入局在线文档市场,阿里和腾讯再次对决?
  15. vue 路由跳转返回上一级
  16. 微信小程序——API promise化,全局数据共享,MobX,将Stroe中的成员绑定到页面中,在页面上使用Strore中的成员
  17. 计算机系单身率排行榜,单身率最高的专业排行!脱不了单的原因找到了
  18. LightningChart® JS BS端结合框架模拟心电图实例
  19. /storage/emulated/0 (Permission denied) 权限已开,写入sd卡仍报错的解决办法
  20. Delphi2010启动报错:Cannot create file “C:\Users\asun\AppData\Local\Temp\EditorLineEnds.ttr“. 另一个程序正在使用此文

热门文章

  1. 如何在Apache官网下载Apache shiro
  2. JMeter录制脚本和参数化
  3. Unity3D Shader系列之护盾效果
  4. 一个喜爱电影的人能利用什么工具?
  5. 实验:学习GET注入
  6. 单图像超分辨率重建总结
  7. 机器人产业进入“快车道”, 细分领域深耕细作成趋势。...
  8. 自动驾驶操作系统现状与发展趋势
  9. 卸载symantec endpoint protection
  10. 超硬核十万字!全网最全 数据结构 代码,随便秒杀老师/面试官,我说的