某车间有两台机床甲和乙,可用于加工3种工件。假定这两台机床的可用台时数分别为700和800,3种工件的数量分别为300,500和400,且已知用两台不同机床加工单位数量的不同工件所需的台时数和加工费用(如表18-1所示)。问怎样分配机床的加工任务,才能既满足加工工件的要求,又使总加工费用最低。
表2-1 机床加工情况表
| 机床类型 | 单位工作所需加工台时数 | 单位工作所需加工台时数 | 单位工作所需加工台时数 | 单位工件的加工费用 | 单位工件的加工费用 | 单位工件的加工费用 | 可用 台时数 |
|---|---|---|---|---|---|---|---|
| 机床类型 | 工件1 | 工件2 | 工件3 | 工件1 | 工件2 | 工件3 | 可用 台时数 |
| 甲 | 0.4 | 1.1 | 1.0 | 13 | 9 | 10 | 700 |
| 乙 | 0.5 | 1.2 | 1.3 | 11 | 12 | 8 | 800 |
设在甲机床上加工工件1,2和3的数量分别为x1,x2和x3,在乙机床上加工工件1,2和3的数量分别为x4,x5和x6。根据3种工件的数量限制,有
x1+x4=300 (对工件1)
x2+x5=500 (对工件2)
x3+x6=400 (对工件3)
再根据机床甲和乙的可用总台时限制,可以得到其他约束条件。以总加工费用最少为目标函数,组合约束条件,可以得到下面的数学模型:
\[\left\{ \begin{matrix} \begin{matrix} \begin{matrix} min z=13{x}_{1}+9{x}_{2}+10{x}_{3}+11{x}_{4}+12{x}_{5}+8{x}_{6} \\ {x}_{1}+{x}_{4}=300 \\ {x}_{2}+{x}_{5}=500 \end{matrix} \\ {x}_{3}+{x}_{6}=400 \\ 0.4{x}_{1}+1.1{x}_{2}+{x}_{3}\leq700 \end{matrix} \\ 0.5{x}_{4}+1.2{x}_{5}+1.3{x}_{6}\leq800 \\ {x}_{j}\geq0,j=1,2,...,6 \end{matrix} \right.\]
在Python IDLE Shell窗口键入下面的命令行:
code.python
>>> from 400">scipy.optimize import linprog
>>> c=[13,9,10,11,class="text-muted">12,8] #目标函数
>>> A=[[0.4,1.1,1,0,0,0],[0,0,0,0.5,1.2,class="text-muted">1.3]] #不等式约束系数矩阵
>>> b=[700class="text-muted">,800] #不等式约束右端项
>>> Aeq=[[1,0,0,1,0,0],[0,1,0,0,1,0],[0,0,1,0,class="text-muted">0,1]] #等式约束系数矩阵
>>> beq=[300,500class="text-muted">,400] #等式约束右端项
>>> x1=x2=x3=x4=x5=x6=(0,class="text-muted">class="text-secondary">None) #变量下界
>>> linprog(c,A_ub=A,b_ub=b,A_eq=Aeq,b_eq=beq,bounds=[x1,x2,x3,x4,x5,x6])
con: array([9.09767550e-09, 1.51902668e-08, 1.21495987e-08])
fun: 10999.999999672584
message: class="text-primary">'Optimization terminated successfully.'
nit: 6
slack: array([150.00000002, 130.00000002])
status: 0
success: class="text-secondary">True
x: array([2.99006889e-09, 5.00000000e+02, 2.72538271e-10, 3.00000000e+02,
1.41237420e-11, 4.00000000e+02])
可见,在甲机床上加工500个工件2,在乙机床上加工300个工件1、加工400个工件3可在满足条件的情况下使总加工费最小。最小费用为11000元。收敛成功。