4. 配料与混合问题建模实战

配料与混合问题是一类非常典型的线性规划应用:把若干种原料按一定比例混合,得到满足成分要求的产品,同时让总成本最低。饲料配方、合金熔炼、食品调配、肥料复配、汽油调和都属于这一类。它和前面章节的生产计划问题有一个关键区别——决策变量往往不是“生产多少件产品”,而是“每种原料用多少”,约束的重点也从产能转向成分比例与原料供应上限。

本节以饲料配方为例展开。设某饲料厂需要配制 1 吨(1000 kg)育肥猪配合饲料,可选原料有玉米、豆粕、麸皮、磷酸氢钙和预混料五种。每种原料都含有蛋白质、粗纤维、钙、磷等成分,且价格不同。目标是:在满足营养标准的前提下,使每吨饲料的原料成本最低。

一、把“配方”翻译成决策变量与参数

建模第一步是明确决策变量。设 x₁、x₂、x₃、x₄、x₅ 分别表示每吨饲料中玉米、豆粕、麸皮、磷酸氢钙、预混料的用量(单位:kg)。由于是配制 1 吨,五个变量之和必须等于 1000,这是一个等式约束。

接着整理参数。示例假设如下(数据为教学假设,非实测):玉米价格 2.6 元/kg、蛋白质含量 8.5%;豆粕价格 4.2 元/kg、蛋白质 43%;麸皮价格 1.8 元/kg、蛋白质 15%;磷酸氢钙价格 3.5 元/kg、钙 23%;预混料价格 12 元/kg。营养标准要求:蛋白质不低于 16%,粗纤维不高于 6%,钙含量在 0.6%~1.0% 之间。此外,受库存限制,豆粕每吨饲料最多用 250 kg,麸皮最多用 150 kg。

这里要特别注意单位统一。价格按元/kg,用量按 kg,则目标函数直接得到元/吨;成分比例若用百分比,需要把“含量百分比 × 用量”与“标准百分比 × 1000”对齐。建议统一把约束右端写成“每吨饲料中该成分的质量(kg)”,例如蛋白质不低于 160 kg、钙在 6~10 kg 之间,这样能避免百分比与质量混算。

二、写出完整模型

目标函数为成本最小化:

min Z = 2.6x₁ + 4.2x₂ + 1.8x₃ + 3.5x₄ + 12x₅

约束条件包括总量约束、蛋白质下限、粗纤维上限、钙区间、原料供应上限以及非负约束。以蛋白质为例,各原料蛋白质贡献之和应不低于 160 kg:

0.085x₁ + 0.43x₂ + 0.15x₃ ≥ 160
x₁ + x₂ + x₃ + x₄ + x₅ = 1000
x₂ ≤ 250
x₃ ≤ 150
6 ≤ 0.23x₄ ≤ 10
x₁, x₂, x₃, x₄, x₅ ≥ 0

粗纤维约束需要各原料的纤维系数,示例中假设玉米 2%、豆粕 6%、麸皮 10%,则 0.02x₁ + 0.06x₂ + 0.10x₃ ≤ 60。钙约束只由磷酸氢钙提供,因此直接写成 6 ≤ 0.23x₄ ≤ 10,即 x₄ 约在 26~43 kg 之间。这个区间约束在求解时通常拆成两条不等式。

饲料配方模型:原料—成分—约束—目标 原料(决策变量) 玉米 x₁ 豆粕 x₂ 麸皮 x₃ 磷酸氢钙 x₄ 预混料 x₅ 成分贡献 蛋白质 粗纤维 钙 总质量 1000 kg 约束与目标 蛋白质 ≥ 160 kg 粗纤维 ≤ 60 kg 钙 6~10 kg x₂≤250,x₃≤150 min 总成本 Z 求解后需检查:① 各原料用量是否落在供应上限内;② 蛋白质、钙是否恰好卡在边界(影子价格提示); ③ 是否存在“为降成本而过度使用廉价低蛋白原料”导致配方不可行或营养失衡。

三、求解与结果解读

把上述模型输入求解器(如 Excel 规划求解、Python 的 scipy.optimize.linprog 或 PuLP),可以得到一组示例最优解。假设求解结果为:玉米 620 kg、豆粕 250 kg、麸皮 90 kg、磷酸氢钙 30 kg、预混料 10 kg,总成本约 2.6×620 + 4.2×250 + 1.8×90 + 3.5×30 + 12×10 = 1612 + 1050 + 162 + 105 + 120 = 3049 元/吨。此时蛋白质为 0.085×620 + 0.43×250 + 0.15×90 = 52.7 + 107.5 + 13.5 = 173.7 kg,满足不低于 160 kg 的要求;钙为 0.23×30 = 6.9 kg,落在 6~10 kg 区间内。

这个结果说明:豆粕用满了 250 kg 的供应上限,因为它是蛋白质的主要来源;玉米作为能量原料承担了剩余的大部分质量;磷酸氢钙的用量由钙下限决定,接近区间下沿。若把豆粕上限放宽到 300 kg,成本可能进一步下降,因为可以少用价格较高的预混料或调整结构——这正是灵敏度分析要回答的问题。

四、解的有效性分析

线性规划给出的是“数学最优解”,但配料问题还必须做有效性检查,否则配方可能无法落地。常见检查点有四个。

第一,约束是否被正确表达。比例约束最容易出错:把“蛋白质不低于 16%”写成 0.085x₁ + 0.43x₂ + 0.15x₃ ≥ 16,而右端实际应为 160(因为总量是 1000 kg)。这类量纲错误会让解看起来合理却完全错误。建模后应回代验算每个约束的左右端数值。

第二,供应上限与总量约束是否冲突。如果所有原料的上限之和小于 1000 kg,模型必然不可行。本例中五种原料上限之和远大于 1000,因此可行。实际中还要检查某种关键原料是否被“卡死”,导致其他成分被迫超标。

第三,最优解是否过度依赖单一原料。若解中某原料占比极高,需评估其供应稳定性与价格波动风险。线性规划假设参数确定,但现实中豆粕价格波动很大,配方应留有一定弹性。

第四,影子价格的经济含义。求解器通常会给出约束的对偶值。若蛋白质约束的影子价格为正,说明每提高 1 kg 蛋白质下限,成本会增加相应金额;若某原料上限约束的影子价格为正,说明放宽该上限能降低成本。这些信息比单纯看“总成本”更有决策价值。

建模小技巧:把“区间约束”(如钙 6~10 kg)拆成两条不等式分别输入,求解器处理更稳定;对“不低于”类约束,可先求无该约束的最优解,再逐步加严,观察成本上升曲线,快速判断哪条营养标准是真正的成本瓶颈。

最后要强调,配料模型的价值不在于一次算出某个数字,而在于建立“原料—成分—约束—成本”的可计算关系。当原料价格、营养标准或库存发生变化时,只需修改参数重新求解,就能快速得到新配方。把模型做成参数化表格,配合回代验算与影子价格解读,才是配料与混合问题建模的完整闭环。