You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 02:25:14