Python 使用混合浓度作为线性优化的约束
我有下表,a必须从中创建一个含有蛋白质和碳水化合物特定值的配方 使用或工具来解决这个问题,到目前为止,我有: 格式化数据Python 使用混合浓度作为线性优化的约束,python,optimization,linear-programming,or-tools,Python,Optimization,Linear Programming,Or Tools,我有下表,a必须从中创建一个含有蛋白质和碳水化合物特定值的配方 使用或工具来解决这个问题,到目前为止,我有: 格式化数据 data = [ ['f1', 10, 15, 17, 10], ['f2', 2, 11, 12, 14], ['f3', 6.5, 17, 16, 13], ['f4', 8, 12, 8, 16] ] 营养素的约束条件: 营养素=[ [“蛋白质”,15.5], [“碳水化合物”,12.3]] 目标函数,其中上界“数据”是该特定元素的存量 food = [[]] *
data = [
['f1', 10, 15, 17, 10],
['f2', 2, 11, 12, 14],
['f3', 6.5, 17, 16, 13],
['f4', 8, 12, 8, 16]
]
营养素的约束条件:
营养素=[
[“蛋白质”,15.5],
[“碳水化合物”,12.3]]
目标函数,其中上界“数据”是该特定元素的存量
food = [[]] * len(data)
# Objective: minimize the sum of (price-normalized) foods.
objective = solver.Objective()
for i in range(0, len(data)):
food[i] = solver.NumVar(0.0, data[i][1], data[i][0])
objective.SetCoefficient(food[i], 4)
objective.SetMinimization()
我还对每种营养素的要求值进行了限制:
constraints = [0] * (len(nutrients))
for i in range(0, len(nutrients)):
constraints[i] = solver.Constraint(nutrients[i][1], solver.infinity())
for j in range(0, len(data)):
constraints[i].SetCoefficient(food[j], data[j][i+3])
最后是解算器:
status=solver.Solve()
这部分工作正常,我得到的结果如下:
f1 = 0.077049
f3 = 0.886885
Optimal price: $0.96
我知道我还需要添加我将要制造多少kg的约束,这些约束也必须满足前面的约束
我的第一个猜测是给营养素需求增加一个乘数
factor = 10
nutrients = [
["protein",15.5*factor],
["carbohydrates",12.3*factor]]
Tjis让我的食物多了10倍,但后来我意识到这是不对的,因为我需要的是集中注意力
我需要10公斤,每公斤15.5蛋白质和12.3碳水化合物
我需要的约束是这样的:
(f1*W + f2*X + f3*Y + f4*Z)/(W+X+Y+Z) = 10kg with 15.5 protein/kg and 12.3 carbohydrates/kg
Where W, X, Y and Z are the kg of each food
如何将此约束添加到解算器
(f1*W + f2*X + f3*Y + f4*Z)/(W+X+Y+Z) = 10
与
f1*W + f2*X + f3*Y + f4*Z = 10*(W+X+Y+Z)
这是线性的
如果我们错过了一些数学课,我们可以将其作为标准LP约束:
(f1-10)*W + (f2-10)*X + (f3-10)*Y + (f4-10)*Z = 0
与
f1*W + f2*X + f3*Y + f4*Z = 10*(W+X+Y+Z)
这是线性的
如果我们错过了一些数学课,我们可以将其作为标准LP约束:
(f1-10)*W + (f2-10)*X + (f3-10)*Y + (f4-10)*Z = 0
您可以查看文档中的stiedler饮食示例,我们已经实现了一个类似于此的问题。您可以查看文档中的stiedler饮食示例,我们已经实现了一个类似于此的问题