1 Cutting Stock Problem

1.1 问题引入及模型建立

以切割下料问题(Cutting Stock Problem)为例介绍Cplex求解优化模型,并引出列生成算法。

假设工厂有标准长度为218cm的钢管,现有客户需要44个长度为81cm的钢管,3个长度为70cm的钢卷,48个长度为68cm的钢卷。请问如何将标准长度为218cm的钢管进行切割,才能保证所使用标准长度钢管的数目最小?

切法1:将1个标准长度的钢管切成1个81cm的钢管;
切法2:将1个标准长度的钢管切成1个70cm的钢管;
切法3:将1个标准长度的钢管切成1个68cm的钢管;
……
切法n:……

上述3种切法虽然浪费材料,但这么切一定能满足要求,所以可以作为求解该问题时的初始解
还可以有好多种切法,最后会对该问题进行求解。

切割下料问题经典的数学模型如下所示:

假设标准钢卷长度为WWW,mmm个顾客想要nin_ini​个长度为wiw_iwi​的钢卷(i=1,…,m)(i=1,\dots,m)(i=1,…,m),且(wi≤W)(w_i\le W)(wi​≤W)。

符号定义:
KKK:可用标准钢卷的集合;
yky_kyk​:如果标准钢卷kkk被切割,yk=1y_k=1yk​=1.否则yk=0y_k=0yk​=0;
xikx_i^kxik​:在标准钢卷kkk上将切割出长度为wiw_iwi​的钢卷的数目。

则数学模型(P1P_1P1​)如下:

min⁡∑k∈Kyks.t.∑k∈Kxik≥ni,i=1,…,m(需求长度约束)∑i=1mwixik≤Wykk∈K(长度限制约束)xik∈Z+,yk∈{0,1}\min\quad \sum_{k\in K}y_k\\ \text{s.t.}\quad \sum_{k\in K}x_{i}^{k}\ge n_{i},\quad i=1,\dots,m\quad\text{(需求长度约束)}\\ \sum_{i=1}^{m}w_{i}x_{i}^k\leq W{y_{k}}\quad k\in K\quad\text{(长度限制约束)}\\ x_i^k\in \mathbb{Z}_+,y_k\in\{0,1\} mink∈K∑​yk​s.t.k∈K∑​xik​≥ni​,i=1,…,m(需求长度约束)i=1∑m​wi​xik​≤Wyk​k∈K(长度限制约束)xik​∈Z+​,yk​∈{0,1}

但是这个数学模型从计算角度和理论角度而言效率不高。

主要原因是这个数学模型的线性松弛问题LP很差(即LP问题的解与原问题的解相差很大)。事实上,松弛问题LP的界为∑i=1mwiniW\frac{\sum_{i=1}^mw_in_i}{W}W∑i=1m​wi​ni​​:

∑k∈Kyk=∑k∈K∑i=1mwixikW=∑i=1mwi∑k∈KxikW=∑i=1mwiniW\sum_{k\in K}y_k=\sum_{k\in K}\sum_{i=1}^m\frac{w_ix_i^k}{W}=\sum^m_{i=1}w_i\sum_{k\in K}\frac{x_i^k}{W}=\sum_{i=1}^m \frac{w_in_i}{W} k∈K∑​yk​=k∈K∑​i=1∑m​Wwi​xik​​=i=1∑m​wi​k∈K∑​Wxik​​=i=1∑m​Wwi​ni​​

1.2 模型P1P_1P1​的Cplex直接求解

/*cplex header file*/
#include <ilcplex/ilocplex.h>/*using name space for cplex program*/
ILOSTLBEGINtypedef IloArray<IloNumVarArray> NumVarMatrix2; // 2-d float variables containerstatic void readData(const char* filename, IloNum& rollWidth, IloInt& N, IloNumArray& size, IloNumArray& amount){ifstream in(filename);if(in){in >> rollWidth;//input the standard width of the steel rollin >> N;//input the costs of rollsin >> size;//input the size demand of cilentsin >> amount;//input the amount demand of cilents}else{//in case file dose not existcerr << "No such file: " << filename << endl;exit(0);}/*check out the input data*//*cout << rollWidth << endl;cout << N << endl;for (int i = 0; i < size.getSize(); i++) {cout << size[i] << "\t";}cout << endl;for (int i = 0; i < amount.getSize(); i++) {cout << amount[i] << "\t";}cout << endl;*/
}int main(){IloEnv env;//declare the cplex environment/*try to establish the model and slove it*/try{IloInt i, j;IloNum rollWidth;//the width of rollsIloInt N;//the maximum number of rollsIloNumArray amount(env);//the wanted amount of cilentsIloNumArray size(env);//the wanted size of cilentsreadData("ncutstock.dat", rollWidth, N, size, amount);//input the data of the problem instance//system("pause");//check out the data input process/*cutting stock problem*/IloModel cutOpt(env);//declare the model for cutting stock problem/*declare and create variables*/IloBoolVarArray y(env, N);//y_iNumVarMatrix2 x(env, N);//x_{ij}for (i = 0; i < N; i++) {y[i] = IloBoolVar(env);}for (i = 0; i < N; i++) {x[i] = IloNumVarArray(env, size.getSize());for (j = 0; j < size.getSize(); j++) {x[i][j] = IloNumVar(env, 0.0, IloInfinity, ILOINT);}}//construct objective functionIloExpr obj(env);for (i = 0; i < N; i++) {obj += y[i];}//add the objective function to the solving model//IloObjective obj = IloMinimize(env, sum);cutOpt.add(IloMinimize(env, obj));//declare and construct the constraintsIloRangeArray cons(env);IloExprArray con1(env);con1 = IloExprArray(env, size.getSize());for (j = 0; j < size.getSize(); j++) {con1[j] = IloExpr(env);}for (j = 0; j < size.getSize(); j++) {for (i = 0; i < N; i++) {con1[j] += x[i][j];}cons.add(con1[j] >= amount[j]);}IloExprArray con2(env);con2 = IloExprArray(env, N);for (i = 0; i < N; i++) {con2[i] = IloExpr(env);}IloExprArray con3(env);con3 = IloExprArray(env, N);for (i = 0; i < N; i++) {con3[i] = IloExpr(env);}for (i = 0; i < N; i++) {for (j = 0; j < size.getSize(); j++) {con2[i] += size[j] * x[i][j];}}for (i = 0; i < N; i++) {con3[i] = rollWidth * y[i];}for (i = 0; i < N; i++) {cons.add(con3[i] - con2[i] >= 0);}/*add the constraints to the solving model*/cutOpt.add(cons);/*sovle the model and refer to the results*/IloCplex cutSolver(cutOpt);cutSolver.solve();//solve the master problecutSolver.exportModel("cuttingstock.lp");//export the model as lp fileif (cutSolver.getStatus() == IloAlgorithm::Infeasible) {env.out() << "No Solution" << endl;}else {cout << endl;cout << "The total costs of used rolls: " << cutSolver.getObjValue() << endl; //output the total costs of used rollscout << endl;}}catch(IloException& ex){cerr << "Error: " << ex << endl;}catch(...){cerr << "Error" << endl;}env.end();return 0;
}

假设钢管长度为120米,总共有240根,现在有10个顾客,顾客的要求随机生成如下:
demands = [10, 11, 11, 12, 12, 12, 10, 11, 12, 10]
lengths = [92, 59, 97, 32, 38, 55, 80, 75, 108, 57]
求解结果如下:


Reference

  1. 运筹学(最优化理论)学习笔记 | 列生成法
  2. 【学界/编码】从下料问题看整数规划中的列生成方法(附Gurobi求解器源代码)

C++用户的Cplex使用指南(三)——Cutting stock problem求解相关推荐

  1. 【Column Generation思考-02】|从对偶的角度理解Cutting Stock Problem【更新版本】

    [Column Generation思考-01]|从对偶的角度理解 Cutting Stock Problem简介 Cutting Stock Problem的Column generation re ...

  2. [ISUX译]iOS 9人机界面指南(三):iOS 技术

    [ISUX译]iOS 9人机界面指南(三):iOS 技术 UI规范 summer 2015-11-29 3247浏览 0评论 专为0基础小白量身打造的UI设计入门课程(ps,ai软件+图标技巧),在线 ...

  3. Linux文件命令精通指南(三)(转)

    Linux文件命令精通指南(三)(转) 查看和查找文件 文件过滤器 用来读取文件内容和在文件内容上执行操作的命令有时被称为 1y滤器.sed 和 awk 命令是两个滤波器的例子,因为在以前的 OTN ...

  4. 上传文件转换html异常,JS 文件互转、10 个 HTML 文件上传技巧、Web 用户体验设计提升指南、奇怪的知识——位掩码 | 思否技术周刊...

    上传文件功能可以说是项目经常出现的需求.从在社交媒体上上传照片到在求职网站上发布简历,文件上传无处不在.在本文中,我们将讨论 HTML文件上传支持的10种用法,希望对你有用. 1. 单文件上传 我们可 ...

  5. 知乎用户和龙鹏-言有三:计算机视觉应该怎样入门?

    本文来源与知乎网,版权归作者知乎用户和龙鹏-言有三所有~~~ 知乎用户: 自学了一段时间计算机视觉(Computer Vision),下文简称:CV.内容以基本概念为主,形式以看书为主,跟着敲代码为辅 ...

  6. linux用户管理最常用的三个文件说明(不完整版)

    涉及到三个文本文件:/etc/passwd /etc/shadow /etc/group 文件相关: /etc/passwd和用户名相关 /etc/shadow和密码相关 /etc/group和用户所 ...

  7. 麒麟linux创建用户组,麒麟Linux系统用户和组管理指南(21页)-原创力文档

    中标麒麟Linux服务器操作系统培训系列 中标麒麟Linux系统用户和组管理指南 技术创新,变革未来 本章目标 •熟悉中标麒麟Linux服务器操作系统中用户和组的 基本操作命令和方法: •了解用户和用 ...

  8. 深信服何朝曦:托管云为用户上云提供第三种选择

    9月17日,以"万物皆可云"为主题的信服云创新峰会成功举办.会上,深信服科技股份有限公司CEO何朝曦分享了运用云计算技术帮助用户进行数字化转型的观点.他认为兼具公有云和私有云优势的 ...

  9. C++11 并发指南三(Lock 详解)

    在 <C++11 并发指南三(std::mutex 详解)>一文中我们主要介绍了 C++11 标准中的互斥量(Mutex),并简单介绍了一下两种锁类型.本节将详细介绍一下 C++11 标准 ...

  10. python输入错误提示再次输入_Python实现用户登录并且输入错误三次后锁定该用户...

    实现用户登录并且输入错误三次后锁定该用户 我的测试环境,win7,python3.5.1 提示输入用户名,和密码 判断是否被锁定 判断用户名和密码是否匹配 输入错误三次,账号被锁定 思路 代码块 na ...

最新文章

  1. 服务器无响应 错误691,错误 691:由于域上的用户名和/密码无效而拒绝访问的原因及解决办法...
  2. 3.MATLAB界面介绍
  3. AviSynth——强大的视频文件后期处理工具
  4. redis常用命令(基础篇)
  5. 在react里写原生js_从零开始使用react+antd搭建项目
  6. for循环如果先--_如果再写for循环,我就锤自己!
  7. 项目的数据存储c语言,《C语言及程序设计》实践项目——数值型数据的存储原理...
  8. Reflector.exe + ilDasm.exe + ilasm.exe 破解DundasWebChart(VS2005) 5.5 成功
  9. 国产达梦数据库安装教程(DM7,Windows)
  10. Joey Logano 嘉年华正式开始,和 Joey Logano 一起竞赛吧
  11. 2022 Gartner新兴技术成熟曲线
  12. mysql 64 免安装_MYSQL 免安装版(windows 7/64)
  13. html5 上标,HTML5 Canvas +下标和上标
  14. 学历学籍系统-Web服务开发实验(REST API)
  15. 区块链电子合同铸就数字经济信任基石
  16. 信息量理解、信息熵公式的推导
  17. 十万评论告诉你谁在给《流浪地球》打 1 星
  18. 关于启动nginx时报错:error while loading shared libraries: libpcre.so.1
  19. 医疗信息化与医院评审
  20. 博客系统视频_视频博客| 视频博客

热门文章

  1. 跨端框架 RAX 初体验
  2. 凡客的面试:Web前端开发
  3. 洛伦茨曲线_洛伦兹曲线
  4. 压缩包文件密码忘记了文件怎么办?
  5. 已知树节点获取树的节点路径(js树节点路径)
  6. OSChina 周日乱弹 —— 十大人艰不拆的网络真相!
  7. 李开复创办创新工场的发言稿及访谈
  8. arduino 超声波测距原理_基础教程10 Arduino 超声波测距
  9. 计算机英语单词怎么巧背,怎么快速背记英语单词
  10. Python爬虫:无头浏览器爬虫