基于Python的多约束牛饲料配方成本优化求解
求解牛饲料最低成本配料组合(全约束整合实现)
我们用pulp库实现完整的线性规划求解,以下是整合所有约束的完整代码,假设你已通过pandas加载好df1和df2:
1. 导入依赖库
import pulp import pandas as pd
2. 初始化规划问题
我们的目标是最小化总成本,因此定义最小化类型的规划问题:
prob = pulp.LpProblem("Livestock_Feed_Min_Cost", pulp.LpMinimize)
3. 定义决策变量
每个配料的用量作为决策变量,取值范围严格对应df1中的上下限:
# 提取所有配料名称 ingredients = df1["Ingredient"].tolist() # 创建决策变量:每个配料的用量,绑定df1中的上下限约束 ing_vars = pulp.LpVariable.dicts( "Ingredient", ingredients, lowBound=lambda x: df1.loc[df1["Ingredient"] == x, "Ingredients_constraints_Min"].values[0], upBound=lambda x: df1.loc[df1["Ingredient"] == x, "Ingredients_constraints_Max"].values[0], cat="Continuous" )
4. 添加所有约束条件
约束1:配料总用量固定为100
prob += pulp.lpSum([ing_vars[i] for i in ingredients]) == 100, "Total_Usage_Constraint"
约束2:混合后营养参数符合df2的限值
遍历df2中的每一项营养指标,计算混合后的加权值,确保落在指定区间内:
# 遍历所有营养指标,添加上下限约束 for _, row in df2.iterrows(): nutrient = row["Nutrient"] min_val = row["Min"] max_val = row["Max"] # 计算混合后的营养总值:各配料用量 × 对应营养参数的加权和 nutrient_total = pulp.lpSum([ ing_vars[i] * df1.loc[df1["Ingredient"] == i, nutrient].values[0] for i in ingredients ]) # 添加营养指标下限约束 prob += nutrient_total >= min_val, f"{nutrient}_Min_Constraint" # 添加营养指标上限约束 prob += nutrient_total <= max_val, f"{nutrient}_Max_Constraint"
5. 定义目标函数(最小化总成本)
prob += pulp.lpSum([ ing_vars[i] * df1.loc[df1["Ingredient"] == i, "Cost"].values[0] for i in ingredients ]), "Total_Cost"
6. 求解并输出结果
# 执行求解 prob.solve() # 输出求解状态 print(f"求解状态: {pulp.LpStatus[prob.status]}") # 输出最优配料组合 print("\n最优配料用量:") for v in prob.variables(): print(f"{v.name.replace('Ingredient_', '')}: {v.varValue:.2f}") # 输出最低总成本 print(f"\n最低总成本: {pulp.value(prob.objective):.2f}")
关键注意事项
- 确保
df1中的营养参数列名与df2的Nutrient列值完全一致,否则会出现索引匹配错误 - 若配料用量需要整数解,可将
cat="Continuous"改为cat="Integer" - 若求解状态显示
Infeasible,说明约束条件存在冲突,需检查df1和df2的限值设置是否合理
内容的提问来源于stack exchange,提问作者Abhilash Singh Chauhan
相关产品推荐
相关产品推荐

