使用scipy.optimize.linprog求解沙拉营养约束下的最小卡路里线性规划问题
线性规划约束问题修正建议
核心问题梳理
你的linprog约束设置存在多处符号错误、缺失约束、系数错误以及约束逻辑错误,以下是逐条修正说明:
1. 约束方向与符号错误
scipy.optimize.linprog默认约束形式为 A_ub @ x ≤ b_ub,所有"至少/≥"类约束需要转换为负系数形式:
- 约束(A):蛋白质≥15克:当前设置为
蛋白质总和 ≤15,完全反向,需改为-蛋白质总和 ≤-15 - 约束(C):碳水≥4克:同理,当前设置为
碳水总和 ≤4,需改为-碳水总和 ≤-4 - 约束(B):脂肪介于2-6克:仅设置了
脂肪≤2,既反向又缺失上限约束,需拆分为两个约束:脂肪≤6和-脂肪 ≤-2
2. 关键营养系数错误
所有约束中油的脂肪系数设为0,完全不符合实际——每100克油的脂肪含量接近100克,必须修正该系数(可根据配图调整准确数值)。
3. 绿叶菜占比约束逻辑错误
约束(E)要求绿叶菜(生菜x1、菠菜x2)占总质量≤50%,需转换为比例约束:x1 + x2 ≤ 0.5*(x0+x1+x2+x3+x4)
整理后为:-0.5x0 + 0.5x1 + 0.5x2 -0.5x3 -0.5x4 ≤ 0
当前设置的[0,0,0,0,0]等于无约束,且b_ub=50无意义(占比是比例,不是绝对质量)。
4. 目标函数合理性疑问
给出的卡路里系数[21,16,371,346,884]中,菠菜、胡萝卜的卡路里远高于常识(实际每100克菠菜约23大卡、胡萝卜约41大卡),大概率是把营养成分(如碳水/蛋白质)的数值误填为卡路里了,请对照配图修正。
修正后的代码示例
from scipy.optimize import linprog # x0=番茄, x1=生菜, x2=菠菜, x3=胡萝卜, x4=油(单位:100克份数) # 目标函数:最小化总卡路里(请根据配图修正卡路里系数) c = [21, 16, 23, 41, 884] # 修正了菠菜、胡萝卜的卡路里,需按实际调整 # A_ub每行对应一个约束:A_ub @ x <= b_ub A_ub = [ # 约束(A):-蛋白质总和 <= -15 [-0.85, -0.162, -12.78, -8.39, 0], # 约束(B):脂肪总和 <=6 [0.33, 0.02, 1.58, 1.39, 100], # 修正油的脂肪系数为100 # 约束(B):-脂肪总和 <= -2 [-0.33, -0.02, -1.58, -1.39, -100], # 约束(C):-碳水总和 <= -4 [-4.64, -2.37, -74.69, -80.70, 0], # 约束(D):钠总和 <=100 [9, 8, 7, 508, 0], # 约束(E):绿叶菜占比<=50% [-0.5, 0.5, 0.5, -0.5, -0.5] ] b_ub = [-15, 6, -2, -4, 100, 0] # 变量非负约束 bounds = [(0, None)] * 5 # 求解 result = linprog(c=c, A_ub=A_ub, b_ub=b_ub, bounds=bounds, method='highs') print(result)
内容的提问来源于stack exchange,提问作者s528060
相关产品推荐
相关产品推荐

