Gas mixture algorithm:从10种混合气中选最优子集及配比实现目标组分
嘿,这个问题本质是个**线性规划(Linear Programming, LP)**问题,核心是在满足组分约束的前提下,找到最贴合你需求的原料组合和配比。下面我给你拆解成可落地的实操步骤,结合你说的33-33-33目标来举例:
一、先把问题量化清楚
首先得把所有已知条件转化成数学变量,这样才好求解:
- 把10种原料气体记为 ( G_1 ) 到 ( G_{10} ),每种的组分占比写成三元组:( G_i = (N_i, O_i, C_i) )(比如 ( N_i ) 是第i种气体中氮气的百分比,且三种组分加起来是100%)
- 设每种原料的混合比例为 ( x_i )(( x_i \geq 0 ),不能用负的原料;同时所有 ( x_i ) 加起来等于1,代表总混合比例)
- 你的目标组分是 ( (T_N, T_O, T_C) ),比如33-33-33就是 ( T_N=33%, T_O=33%, T_C=33% )
核心约束条件就是:
N₁x₁ + N₂x₂ + ... + N₁₀x₁₀ = T_N O₁x₁ + O₂x₂ + ... + O₁₀x₁₀ = T_O C₁x₁ + C₂x₂ + ... + C₁₀x₁₀ = T_C ∑xᵢ = 1 xᵢ ≥ 0
二、先明确“最优”到底指什么
你说的“最优”得先定个方向,不同的优先级解法不一样:
- 最少原料种类:优先用最少的气体来混合,减少操作复杂度(比如能用2种就不用3种)
- 最小成本:如果每种气体采购/使用成本不同,优先选总成本最低的组合
- 最小组分偏差:如果没法完全达到目标,让三种组分的偏差平方和最小(近似最优)
三、实操步骤(以33-33-33目标为例)
1. 先筛选互补性强的原料
先扫一遍10种原料,挑出那些组分和目标互补的——比如有的原料氮气多但二氧化碳少,有的氧气多但氮气少,互补性强的更容易配出目标。
比如假设你手里有这三种:
- G1: 40%N, 50%O, 10%C(缺CO₂)
- G2: 20%N, 20%O, 60%C(缺N和O)
- G3: 35%N, 30%O, 35%C(接近目标)
这三个的互补性就很好,优先拿它们来试。
2. 尝试用最少原料求解
先试试2种原料能不能配出来:比如拿G2和G3,列方程组:
20x + 35(1-x) = 33 # 氮组分 20x + 30(1-x) = 33 # 氧组分 60x + 35(1-x) = 33 # 二氧化碳组分
解第一个方程得到x≈0.133,代入第二个方程算出来氧组分≈28.67%,和目标33%差太多,所以2种不行,得用3种。
用3种的话,解方程组:
40x + 20y + 35z = 33 50x + 20y + 30z = 33 10x + 60y + 35z = 33 x + y + z = 1
解出来x≈0.2,y≈0.2,z≈0.6,代入验证:
400.2 + 200.2 +35*0.6 = 8+4+21=33,完美符合目标!这就是一组可行的最优解(如果以最少原料为目标的话)。
3. 针对其他最优目标调整
如果你的最优目标是最小成本,就把每种原料的成本作为系数,把目标函数设为 minimize (Cost₁x₁ + Cost₂x₂ + ... + Cost₁₀x₁₀),再代入约束条件求解就行。
如果遇到无法精确匹配目标的情况(比如所有原料的氮气占比都低于30%,但目标要33%),那就求近似最优,用最小二乘法:把目标函数设为最小化三种组分的偏差平方和,同样带约束条件求解。
四、不用手算的工具推荐
不用自己啃方程组,这些工具能帮你快速求解:
- Excel的规划求解插件:在数据选项卡里启用,设置好变量、约束和目标函数,一键出结果,适合新手
- Python的
scipy.optimize.linprog库:写几行代码就能解线性规划问题,适合有编程基础的人 - 专业LP软件(比如Gurobi、CPLEX):适合大规模问题,但个人用前两个完全足够
给你个Python代码的小示例(针对33-33-33目标,假设你已经有了原料组分和成本数据):
from scipy.optimize import linprog # 假设你有5种原料的组分(这里简化举例) N = [40, 20, 35, 50, 10] O = [50, 20, 30, 30, 60] C = [10, 60, 35, 20, 30] costs = [10, 15, 8, 12, 9] # 每种原料的单位成本 # 约束矩阵:组分约束 + 总比例为1 A_eq = [N, O, C, [1]*5] b_eq = [33, 33, 33, 1] # 变量非负约束:每个x_i在0到1之间 bounds = [(0, 1) for _ in range(5)] # 求解最小成本的配比 res = linprog(costs, A_eq=A_eq, b_eq=b_eq, bounds=bounds, method='highs') print("最优配比(对应上面的5种原料):", res.x.round(4))
内容的提问来源于stack exchange,提问作者Lockless

