Python 使用混合浓度作为线性优化的约束

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 = [[]] *

我有下表,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 = [[]] * 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饮食示例,我们已经实现了一个类似于此的问题