装箱问题(Bin Packing Problem)

装箱问题即搬家公司问题。一个搬家公司有无限多的箱子,每个箱子的承重上限为W,当搬家公司进入一个房间时,所有物品都必须被装入箱子,每个物品的重量为wi (i=1,...,m),规划装箱方式,使得使用的箱子最少。此文及所有本博客中的博文均为原创,本博客不转发他人博文,特此声明。

实例

一个海运公司有若干货轮, 一个货轮的最大载重量4000吨, 客户货物的重量是 1020T, 1930T, 3575T, 2861T, 4221T, 1541T, 2348T, and 1170T, 问如何分配货物可以使总计需求的货轮数量(航次) 最小。

建模

假设搬家公司带来n个箱子,且n个箱子足够装入所有物品。设0-1变量x[i][j]表示第j个物品是否被安排装入第i个箱子,0表示不装入,1表示装入。根据题意,任何物品必须被装入某个箱子中,于是有约束:

sum{i=1,...,n} x[i][j] = 1 | j=1,...,m            // (1)

如果箱子i有任何物品被装入,则说该箱子被打开,并设0-1变量y[i]表示箱子i是否被打开(0-表示不打开,1-表示打开)。显然目标是极小化打开箱子的数目,即:

min sum{i=1,...,n} y[i]                              //(2)

装入箱子的物品重量和不能超过该箱子的承重,即:

sum{j=1,...,m} x[i][j] <= W*y[i] | i=1,...,n   //(3)

上式表示当聚焦第i个箱子时,如果y[i]=0则任何x[i][j]都必须为0,亦即如果第i个箱子没有被打开,则没有物品可以装入该箱子。反之,如果y[i]=1,则装入该箱子的物品的重量和必须小于箱子的最大承重W。

综合(1)-(3), 装箱问题模型的核心部分如下:

//-------------------------------------------------------

min sum{i=1,...,n} y[i]                                               //(2)

subject to

sum{i=1,...,n} x[i][j] = 1 | j=1,...,m                     // (1)

sum{j=1,...,m} x[i][j]w[i] <= W*y[i] | i=1,...,n    //(3)

//-------------------------------------------------------

添加where段对模型中常量符号和变量符号的说明

//-------------------------------------------------------

where

m,n are integers

W is a number

w is a set

x[i][j] is a variable of binary|i=1,...,n;j=1,...,m

y[i] is a variable of binary|i=1,...,n

//-------------------------------------------------------

E、添加数据段

//-------------------------------------------------------

data

W=4000

w={1020, 1930,3575,2861,4221,1541,2348, 1170}

data_relation

m=_$(w)        // <--  _\$(w) 函数给出集合w中的元素数。

n=m/2           // <-- 预备箱子数取为物体数的一半。

//-------------------------------------------------------

上面模型中,物品个数由求w中的元素数给出。预备箱子数给为物体数的一半。预备箱子数必须大于实际最优箱子数,否则问题无解。

CPLEX求解

求解模型,在Leapms环境中, 首先使用load命令调入并解析模型,  而后使用"cplex" 命令调用IBMC PLEX求解器完成求解.

如果你的leapms版本不支持cplex命令,可用savemps或者savelp保存成mps或lp模型,然后再用cplex求解(https://www.cnblogs.com/leapms/p/11846039.html)。

Leapms>load
Current directory is "ROOT".
.........
binpacking.leap
.........
lease input the filename:binpacking
===============================================================
: //-------------------------------------------------------
:
: min sum{i=1,...,n} y[i] //(2)
: subject to
: sum{i=1,...,n} x[i][j] = 1 | j=1,...,m // (1)
: sum{j=1,...,m} x[i][j]w[i] <= W*y[i] | i=1,...,n //(3)
: where
: m,n are integers
: W is a number
0: w is a set
1: x[i][j] is a variable of binary|i=1,...,n;j=1,...,m
2: y[i] is a variable of binary|i=1,...,n
3: data
4: W=4000
5: w={1020M, 1930M, 3575M, 2861M, 4221M, 1541M, 2348M, 1170}
6: //w={1020, 1930,3575,2861,4221,1541,2348, 1170}
7: data_relation
8: m=_$(w)
9: n=m
0: //-------------------------------------------------------
===============================================================
>end of the file.
arsing model:
D
R
V
O
C
S
End.
.................................
umber of variables=72
umber of constraints=16
.................................
Leapms>cplex
You must have licience for Ilo Cplex, otherwise you will violate
corresponding copyrights, continue(Y/N)?
你必须有Ilo Cplex软件的授权才能使用此功能,否则会侵犯相应版权,
是否继续(Y/N)?y Tried aggregator 1 time.
MIP Presolve eliminated 1 rows and 9 columns.
MIP Presolve modified 61 coefficients.
Reduced MIP has 15 rows, 63 columns, and 119 nonzeros.
Reduced MIP has 63 binaries, 0 generals, 0 SOSs, and 0 indicators.
Presolve time = 0.02 sec. (0.14 ticks)
Found incumbent of value 7.000000 after 0.08 sec. (0.32 ticks)
Probing time = 0.00 sec. (0.06 ticks)
Tried aggregator 1 time.
Reduced MIP has 15 rows, 63 columns, and 119 nonzeros.
Reduced MIP has 63 binaries, 0 generals, 0 SOSs, and 0 indicators.
Presolve time = 0.02 sec. (0.08 ticks)
Probing time = 0.00 sec. (0.06 ticks)
Clique table members: 43.
MIP emphasis: balance optimality and feasibility.
MIP search method: dynamic search.
Parallel mode: deterministic, using up to 4 threads.
Root relaxation solution time = 0.00 sec. (0.05 ticks) Nodes Cuts/
Node Left Objective IInf Best Integer Best Bound ItCnt Gap * 0+ 0 7.0000 0.0000 100.00%
* 0+ 0 4.0000 0.0000 100.00%
0 0 2.2824 5 4.0000 2.2824 8 42.94%
* 0+ 0 3.0000 2.2824 23.92%
0 0 cutoff 3.0000 2.2824 8 23.92%
Elapsed time = 0.20 sec. (0.72 ticks, tree = 0.00 MB, solutions = 3) Root node processing (before b&c):
Real time = 0.22 sec. (0.72 ticks)
Parallel b&c, 4 threads:
Real time = 0.00 sec. (0.00 ticks)
Sync time (average) = 0.00 sec.
Wait time (average) = 0.00 sec.
------------
Total (root+branch&cut) = 0.22 sec. (0.72 ticks)
Solution status = Optimal
Solution value = 3
x1_1=1
x1_5=1
x1_8=1
x6_2=1
x6_7=1
x8_3=1
x8_4=1
x8_6=1
y1=1
y6=1
y8=1

求解结果为:文件分配方案是:第一航次运送1、5、8货物;第二航次2、7货物;第三航次3、4、6货物。总计使用三个航次或三艘货轮。

装箱问题的CPLEX求解的更多相关文章

  1. C#使用cplex求解简单线性规划问题(Cplex系列-教程二)

    若还未在项目中添加cplex的引用,可以参阅上一篇文章.本文主要介绍利用C#求解线性规划的步骤,对线性规划模型进行数据填充的两种方法,以及一些cplex函数的功能和用法.包括以下几个步骤: 描述 先花 ...

  2. 【CPLEX教程03】java调用cplex求解一个TSP问题模型

    00 前言 前面我们已经搭建好cplex的java环境了,相信大家已经跃跃欲试,想动手写几个模型了.今天就来拿一个TSP的问题模型来给大家演示一下吧~ CPLEX系列教程可以关注我们的公众号哦!获取更 ...

  3. 『实践』Yalmip建模+Cplex类求解

    Yalmip建模+Cplex类求解 一.缘由 Yalmip只能设置部分Cplex的参数,所以需要调用Cplex类.而且optimize是Yalmip提供的常用函数,但此函数的返回结果参数有限. 图1 ...

  4. 二维剪板机下料问题(2-D Guillotine Cutting Stock Problem) 的混合整数规划精确求解——数学规划的计算智能特征

    二维剪板机下料问题(2-D Guillotine Cutting Stock Problem) 的混合整数规划精确求解——数学规划的计算智能特征 二维剪板机下料(2D-GCSP) 的混合整数规划是最优 ...

  5. 『实践』Yalmip+Ipopt+Cplex使用手册

    Yalmip+Ipopt+Cplex使用手册 1.软件版本 Cplex 12.6.2,Matlab R2014a,Ipopt 3.12.9,Yalmip 2.Cplex添加方法 官方下载地址: htt ...

  6. yalmip + lpsolve + matlab 求解混合整数线性规划问题(MIP/MILP)

    最近建立了一个网络流模型,是一个混合整数线性规划问题(模型中既有连续变量,又有整型变量).当要求解此模型的时候,发现matlab优化工具箱竟没有自带的可以求解这类问题的算法(只有bintprog求解器 ...

  7. MIP求解方法总结

    *本文主要记录和分享学习到的知识,算不上原创 *参考文献见链接 本文主要简述了求解MIP问题的两大类(精确求解和近似求解),或者更细致地,三大类方法(精确算法,ε-近似算法和启发式算法).由于暂时不太 ...

  8. 干货 | 10分钟教你用column generation求解vehicle routing problems

    OUTLINE 前言 VRPTW description column generation Illustration code reference 00 前言 此前向大家介绍了列生成算法的详细过程, ...

  9. 协同ADMM求解考虑碳排放约束直流潮流问题的对偶问题(A Distributed Dual Consensus ADMM Based on Partition for DC-DOPF with Carbon Emission Trading)

    协同ADMM求解考虑碳排放约束直流潮流问题的对偶问题 (A Distributed Dual Consensus ADMM Based on Partition for DC-DOPF with Ca ...

随机推荐

  1. b2OJ_1565_[NOI2009]植物大战僵尸_拓扑排序+最大权闭合子图

    b2OJ_1565_[NOI2009]植物大战僵尸_拓扑排序+最大权闭合子 题意:n*m个植物,每个植物有分数(可正可负),和能保护植物的位置.只能从右往左吃,并且不能吃正被保护着的,可以一个不吃,求 ...

  2. 实时监听input输入框value的变化:

    HTML5 标准事件 oninput 和 IE 专属事件 onpropertychange 事件实时监听输入框value的变化 oninput 事件在用户输入时触发. 该事件在 <input&g ...

  3. JAVA使用POI获取Excel的列数与行数

    Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能. 下面这篇文章给大家介 ...

  4. 经典Hash函数的实现

    Hash函数是指把一个大范围映射到一个小范围.把大范围映射到一个小范围的目的往往是为了节省空间,使得数据容易保存. 除此以外,Hash函数往往应用于查找上.所以,在考虑使用Hash函数之前,需要明白它 ...

  5. Visio打开或取消箭头的自动吸附和自动连接

    在用Visio画图时Visio的自动对齐.自动连接.自动吸附功能确实能带了很多便利.但在画连接线时,Visio总是自动连接箭头与图形的固定节点,想要微调一下连接位置,就显得很不方便,需要关闭自动连接功 ...

  6. 【重学计算机】操作系统D4章:设备管理

    1. IO的控制方式 演进过程:轮询 --> 中断 --> DMA --> IO通道 经典布局:南北桥 PS:详见<计算机组成原理> 2. IO的实现 软件实现层次:硬件 ...

  7. 深入理解pandas读取excel,txt,csv文件等命令

    pandas读取文件官方提供的文档 在使用pandas读取文件之前,必备的内容,必然属于官方文档,官方文档查阅地址 http://pandas.pydata.org/pandas-docs/versi ...

  8. KnockoutJS-与服务端交互

    几乎所有Web应用程序都要和服务器端交换数据,交换数据时最方便的就是使用JSON格式.Knockout可以实现很复杂的客户端交互,对于前后端交互使用的技术最为基本且常用的是Ajax,本次利用Ajax和 ...

  9. 【Python3爬虫】常见反爬虫措施及解决办法(二)

    这一篇博客,还是接着说那些常见的反爬虫措施以及我们的解决办法.同样的,如果对你有帮助的话,麻烦点一下推荐啦. 一.防盗链 这次我遇到的防盗链,除了前面说的Referer防盗链,还有Cookie防盗链和 ...

  10. 强化学习(十八) 基于模拟的搜索与蒙特卡罗树搜索(MCTS)

    在强化学习(十七) 基于模型的强化学习与Dyna算法框架中,我们讨论基于模型的强化学习方法的基本思路,以及集合基于模型与不基于模型的强化学习框架Dyna.本文我们讨论另一种非常流行的集合基于模型与不基 ...