问题描述
我正在努力最大化类似于 example provided in the PuLP documentation 的混合问题。但是,我想惩罚我的优化问题,因为我的一种成分与某些已知常数不同。通过这种方式,我想强制求解器更喜欢操纵其他决策变量,然后再从设置的常量值(我也将其用作热启动中的起始值)更改我的关键变量。我尝试修改目标函数,如下所示,但它似乎不起作用。我意识到我需要添加一些额外的约束来基本上取牛肉百分比和基线之间差异的绝对值,但我不确定这是问题所在。当我打印出问题时,基线与牛肉百分比不同。
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)])
解决方法
您的方法是有道理的,但在目标中,您需要使用差异的绝对值。为了线性化绝对值,引入一个连续变量 z
。然后使用以下两个约束:
z >= ingredient_vars[KEY_INGREDIENT] - KEY_INGREDIENT_BASELINE
z >= -(ingredient_vars[KEY_INGREDIENT] - KEY_INGREDIENT_BASELINE)
此外让 PENALTY
为正值(-0.5 表示差异大是好的)。
最后修改目标:
prob += lpSum([costs[i]*ingredient_vars[i] for i in Ingredients] + [PENALTY*z])