惩罚 Python PuLP 优化函数作为决策变量偏离特定常量

Penalize Python PuLP Optimization function as decision variable diverges from a specific constant

我正在努力最大化类似于 example provided in the PuLP documentation 的混合问题。但是,我想对我的优化问题进行惩罚,因为我的一个成分与某个已知常量不同。通过这种方式,我想强制求解器在求助于从设置的常量值(我也将其用作热启动中的起始值)更改我的关键变量之前更喜欢操纵其他决策变量。我试过如下所示修改 objective 函数,但它似乎不起作用。我意识到我需要添加一些额外的约束,以基本上获取牛肉百分比和基线之间差异的绝对值,但我不确定这就是问题所在。当我打印出问题时,基线与牛肉百分比不在同一期限内。

PENALTY = -0.5
KEY_INGREDIENT='BEEF'
KEY_INGREDIENT_BASELINE=20
prob += lpSum([costs[i]*ingredient_vars[i] for i in Ingredients] +[PENALTY*(ingredient_vars[KEY_INGREDIENT] - KEY_INGREDIENT_BASELINE)])

您的方法是有道理的,但在 objective 中您将需要使用差值的绝对值。为了线性化绝对值引入连续变量z。然后使用以下两个约束:

z >= ingredient_vars[KEY_INGREDIENT] - KEY_INGREDIENT_BASELINE
z >= -(ingredient_vars[KEY_INGREDIENT] - KEY_INGREDIENT_BASELINE)

此外,让 PENALTY 为正值(-0.5 表示高差异是好的)。

最后修改objective:

prob += lpSum([costs[i]*ingredient_vars[i] for i in Ingredients] + [PENALTY*z])