装箱问题(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