问题描述与数学建模
有以下原料
设第i个原料属性可用向量si=<甜度,浓度,浓稠度, 1>
表示,其中第四分量的单位1后续可用于约束原材料投放的最大数量限制。
- 提纯浮羊奶: s1=(2,2,0,1)
- 椒椒博士: s2=(1,−1,0,1)
- 冰点苏乐达: s3=(1,−2,0,1)
- 安神气泡饮: s4=(−1,−1,0,1)
- 怪味浓汁: s5=(−2,1,0,1)
- 激梦果酱: s6=(0,2,1,1)
- 极致糖浆: s7=(0,1,2,1)
- 苏花清露: s8=(0,1,−1,1)
- 夕红果沙司: s9=(0,−1,1,1)
- 魔血能量: s10=(0,−1,0,1)
记做矩阵S
S=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡211−1−2000002−1−2−11211−1−10000012−1101111111111⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
设最终选用xi个第i个原料的个数,故xi>=0,并满足约束∑i=110xi=4。记x=(x1,x2,...,x10)。
记b=x⋅S=(b1,b2,b3,b4)
由题意需要满足b1=−1,b2=1,b3<=−2,b4=4
求所有满足条件的向量x。
代码求解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| import numpy as np from pulp import *
x = list(map(lambda i: LpVariable(f'x{i+1}', 0, None, LpInteger), range(10)))
problem = LpProblem('lp', LpMinimize)
A_ub = [[0,0,0,0,0,1,2,-1,1,0]] b_ub = [-2] for i in range(0, len(A_ub)): tmp = A_ub[i][0]*x[0] for j in range(1, len(A_ub[i])): tmp = tmp + A_ub[i][j]*x[j] problem += tmp <= b_ub[i]
A_eq = [ [2,1,1,-1,-2,0,0,0,0,0], [2,-1,-2,-1,1,2,1,1,-1,-1], [1,1,1,1,1,1,1,1,1,1], ] b_eq = [-1,1,4] for i in range(0, len(A_eq)): tmp = A_eq[i][0]*x[0] for j in range(1, len(A_eq[i])): tmp = tmp + A_eq[i][j]*x[j] problem += tmp == b_eq[i]
c = [1,1,1,1,1,1,1,1,1,1]
tmp = c[0]*x[0] for j in range(1, len(c)): tmp = tmp + c[j]*x[j] problem += tmp
problem.solve()
problem.writeLP('tmp.lp')
for v in problem.variables(): print(f'{v.name}={v.varValue}')
|
运行结果如下:
1 2 3 4 5 6 7 8 9 10
| x1=0.0 x10=0.0 x2=0.0 x3=1.0 x4=0.0 x5=1.0 x6=0.0 x7=0.0 x8=2.0 x9=0.0
|
即满足条件的一种搭配如下:
实际操作结果
结果证实该方案确实可行。
另一个问题
若b=(1,−1,−1,4),则问题实际上转化为了求解线性方程组的解集问题。
⎣⎢⎢⎡22011−1011−201−1−101−21010211012101−110−1110−101⎦⎥⎥⎤⋅x=⎣⎢⎢⎡1−1−14⎦⎥⎥⎤
且x>=0