有七种规格的包装箱要装到两辆平板车上,包装箱的宽和高是一样的,但厚度t(厘米)和重量w(公斤)是不同的。表一给出了每种包装箱的厚度,重量以及数量。
每辆平板车有10.2米的地方可以用来装包装箱(像面包片那样),载重为40吨。由于地区货运的限制,对C5,C6,C7类包装箱的总数有一个特别的限制:这三类包装箱所占空间(厚度)不能超过302.7厘米。
问题要求:设计一种装车方案,使剩余的空间最小。
分析与解答:
这是美国大学生数学建模竞赛1988年B题。题中所有包装箱共重89t,而两辆平板车一共只能载重80t,因此不可能全装下。究竟在两辆车上各装哪些种类箱子且各为多少才合适,必须有评价的标准。这标准就是遵守题中说明的重量、厚度、件数等方面的约束条件,目标是使剩余的空间最小。
设
C
i
C_{i}
Ci类包装箱厚度
t
i
t_{i}
ti厘米,重量
w
i
w_{i}
wi公斤,件数为
n
i
n_{i}
ni,设第一辆车装载
C
i
C_{i}
Ci类包装箱
x
i
x_{i}
xi,第二辆车装载
C
i
C_{i}
Ci类包装箱
y
i
y_{i}
yi
(
i
=
1
,
2
,
⋯
,
7
)
(i=1,2,\cdots,7)
(i=1,2,⋯,7)。
第一辆车剩余空间
Z
1
=
1020
−
∑
i
=
1
7
t
i
⋅
x
i
Z_{1}=1020-\sum_{i=1}^{7} t_{i} \cdot x_{i}
Z1=1020−∑i=17ti⋅xi
第一辆车剩余空间
Z
2
=
1020
−
∑
i
=
1
7
t
i
⋅
x
i
Z_{2}=1020-\sum_{i=1}^{7} t_{i} \cdot x_{i}
Z2=1020−∑i=17ti⋅xi
总剩余空间最小为目标,则目标函数为:
m
i
n
Z
=
Z
1
+
Z
2
min Z = Z_{1} + Z_{2}
minZ=Z1+Z2
约束条件满足:
1)件数满足
x
i
+
y
i
⩽
n
i
x_{i}+y_{i}\leqslant n_{i}
xi+yi⩽ni
i
=
1
,
2
,
⋯
,
7
,
且
x
i
,
y
i
为
整
数
i=1,2,\cdots,7,且x_{i},y_{i}为整数
i=1,2,⋯,7,且xi,yi为整数。
2)各辆车载重量不超过40吨,有
∑
i
=
1
7
w
i
⋅
x
i
≤
40000
,
∑
i
=
1
7
w
i
⋅
y
i
≤
40000
\sum_{i=1}^{7} w_{i} \cdot x_{i} \leq 40000, \quad \sum_{i=1}^{7} w_{i} \cdot y_{i} \leq 40000
∑i=17wi⋅xi≤40000,∑i=17wi⋅yi≤40000
3). 各辆车载长度不超过 1020 厘米, 有:
∑ i = 1 7 t i ⋅ x i ≤ 1020 , ∑ i = 1 7 t i ⋅ y i ≤ 1020 \sum_{i=1}^{7} t_{i} \cdot x_{i} \leq 1020, \quad \sum_{i=1}^{7} t_{i} \cdot y_{i} \leq 1020 ∑i=17ti⋅xi≤1020,∑i=17ti⋅yi≤1020
4) C 5 , C 6 , C 7 C_{5}, C_{6}, C_{7} C5,C6,C7 类包装箱的厚度不能超过 302.7 厘米,
∑
i
=
5
7
t
i
⋅
(
x
i
+
y
i
)
≤
302.7
\sum_{i=5}^{7} t_{i} \cdot\left(x_{i}+y_{i}\right) \leq 302.7
∑i=57ti⋅(xi+yi)≤302.7
总的线性规划模型:
min
Z
=
(
1020
−
∑
i
=
1
7
t
i
⋅
x
i
)
+
(
1020
−
∑
i
=
1
7
t
i
⋅
y
i
)
s.t.
{
∑
i
=
1
7
t
i
⋅
x
i
≤
1020
∑
i
=
1
7
t
i
⋅
y
i
≤
1020
x
i
+
y
i
≤
n
i
i
=
1
,
2
,
⋯
,
7
∑
i
=
1
7
w
i
⋅
x
i
≤
40000
∑
i
=
1
7
w
i
⋅
y
i
≤
40000
∑
i
=
5
7
t
i
⋅
(
x
i
+
y
i
)
≤
302.7
x
i
,
y
i
为非负整数
\begin{array}{l} \min Z=\left(1020-\sum_{i=1}^{7} t_{i} \cdot x_{i}\right)+\left(1020-\sum_{i=1}^{7} t_{i} \cdot y_{i}\right) \\ \text { s.t. }\left\{\begin{array}{c} \sum_{i=1}^{7} t_{i} \cdot x_{i} \leq 1020 \\ \sum_{i=1}^{7} t_{i} \cdot y_{i} \leq 1020 \\ x_{i}+y_{i} \leq n_{i} \quad i=1,2, \cdots, 7 \\ \sum_{i=1}^{7} w_{i} \cdot x_{i} \leq 40000 \\ \sum_{i=1}^{7} w_{i} \cdot y_{i} \leq 40000 \\ \sum_{i=5}^{7} t_{i} \cdot\left(x_{i}+y_{i}\right) \leq 302.7 \\ x_{i}, y_{i} \text { 为非负整数 } \end{array}\right. \end{array}
minZ=(1020−∑i=17ti⋅xi)+(1020−∑i=17ti⋅yi) s.t. ⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧∑i=17ti⋅xi≤1020∑i=17ti⋅yi≤1020xi+yi≤nii=1,2,⋯,7∑i=17wi⋅xi≤40000∑i=17wi⋅yi≤40000∑i=57ti⋅(xi+yi)≤302.7xi,yi 为非负整数
import cvxpy as cp
from numpy import array
t1 = 48.7; t2 = 52.0; t3 = 61.3; t4 = 72.0; t5 = 48.7; t6 = 52.0; t7 = 64.0;
w1 = 2000; w2 = 3000; w3 = 1000; w4 = 500; w5 = 4000; w6 = 2000; w7 = 1000;
c = array([-t1,-t2,-t3,-t4,-t5,-t6,-t7,-t1,-t2,-t3,-t4,-t5,-t6,-t7])
A = array([[t1,t2,t3,t4,t5,t6,t7,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,t1,t2,t3,t4,t5,t6,t7],
[w1, w2, w3, w4, w5, w6, w7,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,w1, w2, w3, w4, w5, w6, w7],
[0,0,0,0,t5,t6,t7,0,0,0,0,t5,t6,t7],
[1,0,0,0,0,0,0,1,0,0,0,0,0,0],
[0,1,0,0,0,0,0,0,1,0,0,0,0,0],
[0,0,1,0,0,0,0,0,0,1,0,0,0,0],
[0,0,0,1,0,0,0,0,0,0,1,0,0,0],
[0,0,0,0,1,0,0,0,0,0,0,1,0,0],
[0,0,0,0,0,1,0,0,0,0,0,0,1,0],
[0,0,0,0,0,0,1,0,0,0,0,0,0,1]])
b = array([1020,1020,40000,40000,302.7,8,7,9,6,6,4,8])
x = cp.Variable(14, integer=True)
obj = cp.Minimize(c*x)
cons = [A*x<=b,x>=0]
prob = cp.Problem(obj, cons)
prob.solve(solver = 'GLPK_MI', verbose = True)
print("最优解为:\n", prob.value + 2040)
print("最优解为:", x.value)