目录

1 绪论

1.1 Cplex简介

1.1.1 基本界面介绍

1.1.2 处理流程介绍

1.2 OPL语言

1.2.1 OPL的主要关键字

1.2.2 数据文件

1.3 如何调用Cplex

1.3.1 使用AMPL脚本语言调用

1.3.2 IBM CPLEX Studio IDE

1.3.3 Cplex with Concert Technology

2 官方gas示例演示

2.1 导入示例

2.2 gas示例解析

2.2.1 示例的通俗语言描述

2.2.2 数据文件与模型文件

2.2.3 结果展示

2.3 数据和模型同文件形式

2.4 带#与否的数据文件


1 绪论

1.1 Cplex简介

  • Cplex是IBM公司开发的一个优化工具引擎,可以用其求解线性规划、二次规划、整数规划等问题;能够快速解决一些行业难题。
  • 自带IBM ILOG Cplex Optimization Studio既能使用自带语言进行编程,也提供了众多流行语言的接口,具有广泛的应用前景

1.1.1 基本界面介绍

1.1.2 处理流程介绍

当我们面对一个问题时,先从给定的数据建立科学的数学模型,然后使用Cplex进行问题求解,输出我们想要的结果。

1.2 OPL语言

OPL语言是ILOG的优化语言,可以用来编制模型文件和数据文件。

包含的文件类型及作用:

  • 项目文件:组织模型和数据的文件,并提供一种方便的方法来维护相关文件和运行选择之间的关系
  • 模型文件:声明数据项目,但是不需要提供数据的初始化工作
  • 数据文件:包含了在模型中声明的数据初始化
  • 设置文件:当你决定一个或多个数学规划和其他的缺省值,该文件保存用户定义的值
  • 运行配置:为了运行的目的而根据项目进行的设置;在一个项目中,可以根据自己的需要定义多个运行配置

模型文件包含以下四个部分:数据、决策变量、目标函数、约束条件;这也是数学建模的四个必备要素。

1.2.1 OPL的主要关键字

数据类型 语法规则

代码示例

string {string} 变量名 = {"字符串1", "字符串2","字符串3",...}; {string} Products = {"gas", "chloride"};
{string} Components = {"nitrogen", "hydrogen", "chloride"};
float

用来定义浮点数据类型,也就是小数

float 变量名[对应字符串数组变量名] = [数值1, 数值2, ...];

//浮点数
float var = 3.13;
//数组
float Profit[Products] = [30,40];
//二维数组
float Demands[Products][Components] = [[1,3,0],[1,4,0]];

int

用来定义整型数据类型,也就是整数

int 变量名[对应关键字数组数组变量名] = [数值1, 数值2, ...];

//整型
int Fixed = 10;
range

一段连续的整型数据

range 变量名 = startInterge..endInterge

//Range类型
range Rows = 1..10;
int n=10;
range rows = (n+1)..2*(n+1);
dvar

定义决策变量

dvar 数据类型函数 变量名;

数据类型函数后可跟正负号来表示决策变量正负

dvar float+ Gas;
dvar float+ Chloride;
dvar float+ Production[Products];

Maximize

Minimize

maximize或minimize 目标函数的表达式; maximize 40 * Gas + 50 * Chloride;
maximize sum(p in Products) Profit[p] * Production[p];
subject to

subject to{

约束1名称:约束1;

...

约束n名称:约束n;

}

subject to{
ctMaxTotal: Gas + Chloride <= 50;
ctMaxTotal2: 3 * Gas + 4 * Chloride <= 180;
ctMaxChloride: Chloride <= 40;
}

1.2.2 数据文件

  • 以dat为后缀的文件
  • 数据文件与模型文件相对应
  • 模型文件中的...在数据文件中应该使用具体的数据
  • 若数据类型为字符串类型,各数据之间使用空格或逗号隔开
  • 数值型,各数据以逗号或空格隔开;如果不加#数据必须有变量名,否则数据必须是有序的。

示例代码:

Products = {"gas", "chloride"};
Fixed = 30;
Profit = #["chloride":40, "gas":30]#;

1.3 如何调用Cplex

1.3.1 使用AMPL脚本语言调用

参考文档

  • 优化模型与AMPL(中文)
  • AMPL_CPLEX 简介(注:台湾同胞写的,例子比较丰富)

  • AMPL CPLEX User's Guide

  • 官方给出的例子

1.3.2 IBM CPLEX Studio IDE

下载完成后的官方示例路径:你的路径\opl\examples\opl

示例运行方式在下文介绍

1.3.3 Cplex with Concert Technology

直接以编程语言的API建立模型并求解,此处可参见我之前的博客文章

运筹优化学习09:一个示例带你入门如何使用C++、C#、Java、Python、Matlab调用Cplex

2 官方gas示例演示

2.1 导入示例

导入之后,可以看到的文件结构如下:

2.2 gas示例解析

2.2.1 示例的通俗语言描述

  • 生产汽和氯化物两种产品,每种产品包含氮氢氯三种组分;
  • 生产天然气需要氮氢氯组分数为1、3、0;生成氯化物需要氮氢氯组分数为1、4、1;
  • 生产天然气和氯化物可以获得收益分别为30和40
  • 库存中包含这三种组分的数量为50、180和40
  • 求生产天然气和氯化物的最大化收益

2.2.2 数据文件与模型文件

数据文件(gas.dat)

Products = { "gas" "chloride" };
Components = { "nitrogen" "hydrogen" "chlorine" };

Demand = [ [1 3 0] [1 4 1] ];
Profit = [30 40];
Stock = [50 180 40];

模型文件(gas.mod)

{string} Products = ...;
{string} Components = ...;

float Demand[Products][Components] = ...;
float Profit[Products] = ...;
float Stock[Components] = ...;
dvar float+ Production[Products];

maximize
  sum( p in Products ) 
    Profit[p] * Production[p];
subject to {
  forall( c in Components )
    ct:
      sum( p in Products ) 
        Demand[p][c] * Production[p] <= Stock[c];
}

2.2.3 结果展示

约束展开:

2.3 数据和模型同文件形式

示例还提供了一个将数据在mod文件中直接进行赋值的模型文件,详情如下:

{string} Products = { "gas", "chloride" };
{string} Components = { "nitrogen", "hydrogen", "chlorine" };

float Demand[Products][Components] = [ [1, 3, 0], [1, 4, 1] ];
float Profit[Products] = [30, 40];
float Stock[Components] = [50, 180, 40];

dvar float+ Production[Products];

maximize
  sum( p in Products ) 
    Profit[p] * Production[p];
subject to {
  forall( c in Components )
    ct:
      sum( p in Products ) 
        Demand[p][c] * Production[p] <= Stock[c];
}

运行结果与之前的一致

2.4 带#与否的数据文件

gas.dat gasn.dat

Products = { "gas" "chloride" };
Components = { "nitrogen" "hydrogen" "chlorine" };

Demand = [ [1 3 0] [1 4 1] ];
Profit = [30 40];
Stock = [50 180 40];

Products = { "gas", "chloride" };
Components = { "nitrogen", "hydrogen", "chlorine" };

Profit = #["gas":30, "chloride":40]#;
Stock = #["nitrogen":50, "hydrogen":180, "chlorine":40]#;
Demand = #[
            "gas":      #[ "hydrogen":3 "nitrogen":1  "chlorine":0 ]#,
            "chloride": #[ "nitrogen":1 "hydrogen":4 "chlorine":1 ]#
          ]#;

gasn.dat的数据是带#的,因此其中的数据顺序是可以随意指定的,只要带上正确的变量名即可。

上述的gasn.dat文件我们对数据顺序进行了调整,变化如下图所示:

然后,将gas.mod拷贝一份,重命名为gasn.mod,使用默认配置运行;可以看到左下角的数据仍然是正确的数据。


更多精彩,欢迎关注个人公众账号

运筹优化学习19:Cplex中文教程与实例详解相关推荐

  1. 入门学习Linux常用必会命令实例详解

    Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作.文件存取.目录操作.进程管理.文件权限设定等.所以,在Linux系统上工作离不开使用系统提供的命令.要想真正理解Linux系统, ...

  2. 运筹优化学习21:Java调用Cplex实现求解Cuting Stock Porblem的列生成算法详解

    目录 1 CSP问题与模型 1.1 问题描述 1.2 模型构建 2 列生成方法理论 2.1 引子 2.2 单纯形法到列生成 2.3 subproblem 2.3.1 对偶理论 2.3.2 影子价格 2 ...

  3. Python+cplex运筹优化学习笔记(三)-营养膳食选择

    Python+cplex运筹优化学习笔记(三)-营养膳食选择 前言 首先呢,说明一下,本文只是自己在学习过程中运用到的例子,然后规整总结一下,随便写写自己所做的一些笔记.小白学习,有不对的地方还望大家 ...

  4. 运筹优化学习24:Gurobi902注册、下载、安装教程【保姆级手把手教学】

    目录 1 Gurobi的注册与下载 1.1 注册 1.2 下载 2 获取权限文件 3 安装后查看自己的grbgetkey 介绍Gurobi的下载及安装全部流程: 注意安装过程中,请保持网络环境通畅,特 ...

  5. wxpython使用实例_wxPython中文教程入门实例

    wxPython中文教程入门实例 wx.Window 是一个基类,许多构件从它继承.包括 wx.Frame 构件. 可以在所有的子类中使用 wx.Window 的方法. wxPython的几种方法: ...

  6. wxPython中文教程入门实例

    这篇文章主要为大家分享下python编程中有关wxPython的中文教程,分享一些wxPython入门实例,有需要的朋友参考下 wxPython中文教程入门实例 wx.Window 是一个基类,许多构 ...

  7. (best!)JAVA中文字符编码问题详解

    转载自:http://blog.csdn.net/youyue/article/details/4580402 JAVA中文字符编码问题详解 JAVA的中文字符乱码问题一直很让人头疼.特别是在WEB应 ...

  8. [Pytorch系列-61]:循环神经网络 - 中文新闻文本分类详解-3-CNN网络训练与评估代码详解

    作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...

  9. 官网实例详解-目录和实例简介-keras学习笔记四

    https://github.com/keras-team/keras/tree/master/examples Keras examples directory Keras实例目录 (点击跳转) 官 ...

  10. Elasticsearch 多语言及中文分词与检索详解

    文章目录 1. 自然语言与查询 Recall 2. 混合多语言的挑战 3. 分词的挑战 4. 中文分词方法的演变 - 字典法 5. 中文分词方法的演变 - 基于统计法的机器学习算法 6. 中文分词器现 ...

最新文章

  1. Python常用模块之subprocess模块
  2. 一文彻底了解Logstash
  3. hdu 4560 拆点最大流 ***
  4. 口罩热销卖断货,有的商家却坐地涨价,中国青年报:电商不该借机发疫情财...
  5. 摄像头训练的吃豆人,我还是没活几集 | TensorFlow.js
  6. PyQt5 电报实时聊天软件 BB-Telegram Pt.0
  7. C语言入门的三个简易程序
  8. Android apk下载与安装
  9. FPGA驱动步进电机
  10. 安卓外置SD卡linux,Android获取机身存储、内置SD卡与外置TF卡路径
  11. HSC-1th 2022 Writeup
  12. c++ 字母降落小游戏
  13. 支持M1芯片AE2022已发布,After Effects 2022 for MAC中文安装教程,支持Monterey系统不闪退
  14. 【推荐算法 学习与复现】-- 深度学习系列 -- NFM
  15. vue-js实现日期加减,年月日,及单位换算。
  16. CHAR与TCHAR处理函数
  17. PageRank算法
  18. 小兵大乱斗服务器维修吗,这个游戏有点意思《小兵大乱斗》最新评测来袭
  19. matlab 使用定时器画连续正弦波信号
  20. python调用cplex_如何用python结合cplex求解混合整数规划问题

热门文章

  1. CMM3上的集成软件管理
  2. 模式识别 - 名词解释整理
  3. 中兴v5max android5.1,中兴V5Max
  4. 小米路由器mini 刷潘多拉固件教程
  5. python入门教程汇总
  6. 论如何高速下载磁力链接、电驴链接、种子文件里的资源
  7. 菜鸟程序猿的工作心态
  8. 集体智慧编程_第十章寻找独立特征
  9. 38个敏感词_敏感词运营体系搭建手册—正则关键词
  10. 通信原理-通信系统的组成