0
点赞
收藏
分享

微信扫一扫

整数规划,优化问题:两辆平板车装货

Alex富贵 2022-04-24 阅读 16
python

有七种规格的包装箱要装到两辆平板车上,包装箱的宽和高是一样的,但厚度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=1020i=17tixi
第一辆车剩余空间 Z 2 = 1020 − ∑ i = 1 7 t i ⋅ x i Z_{2}=1020-\sum_{i=1}^{7} t_{i} \cdot x_{i} Z2=1020i=17tixi
总剩余空间最小为目标,则目标函数为:
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+yini 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=17wixi40000,i=17wiyi40000

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=17tixi1020,i=17tiyi1020

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=(1020i=17tixi)+(1020i=17tiyi) s.t. i=17tixi1020i=17tiyi1020xi+yinii=1,2,,7i=17wixi40000i=17wiyi40000i=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)
举报

相关推荐

0 条评论