如何将条件约束应用于 Python Pulp 函数



我正在使用Python中的Pulp设置线性优化。我想为该问题设置一个条件约束。

比如,我想最大化工厂的利润。对于材料的成本,前 1000 个单位的成本为 5 美元,任何更多的单位成本为 3 美元。例如,如果工厂订购 1100 个单位,则总成本将为 1000*5+100*3。我有一个材料列表:material_list,材料基准字典:benchmark_dic={material_a: 1000, material_b:2000 ....},订单损失比基准:p rice_A_dic的价格字典,如果你订购超过benchark:price_B_dic,还有一个价格字典。

这是我的代码:

x=pulp.LpVariable.dicts('x',material_list,lowBound=0 , cat='Integer')  
New_cost_dic=pd.Series(0,index=dat.index).to_dict()
for seg in material_list:
if x[seg]>benchmark_dic[seg]:
New_cost_dic[seg]=(x[seg]-benchmark_dic[seg])*price_b_dic[seg]+benchmark[seg]*price_A_dic[seg]
else:
New_cost_DIC[seg]=x[seg]*price_A_dic[seg]

我对销售额也有类似的计算。我可以从中得到结果,但我不知道我做得是否正确。当我得到每种材料有多少单位的最终结果时,我试图使用相同的计算来获得总成本和总销售额,但我得到的利润(总销售额 - 总成本(不等于我从 pulp.value(prob.objective( 获得的最大利润。

我应该如何为此条件约束或条件函数编码。

我不认为条件约束会起作用。

相反,对于这样的条件约束,您需要重新表述问题以使用指示变量,指示符变量是跟踪您感兴趣的条件(真或假(的二进制变量。

对于您的具体问题,我会建议如下,有一组变量,例如跟踪No.的每个材料x1[seg],然后是另一组变量,例如跟踪No.的x2[seg]。 在基准之上买入,最后是一组二元变量,比如跟踪我们是否达到价格突破点的z[seg]

然后,每个成本条款将是:

x1[seg]*price_A_dic[seg] + x2[seg]*price_B_dic[seg]

然后,我们需要添加约束,强制变量采用适当的值。我认为以下内容应该有效:

x1[seg] >= 0
x1[seg] >= benchmark_dic[seg] * z[seg]
x2[seg] >= 0
x2[seg] <= z[seg]*MAX_POSSIBLE_ORDER

MAX_POSSIBLE_ORDER是我们在购买数量方面永远不会超过的上限。您可以看到,为了使z[seg]具有价值1我们首先必须以更高的价格订购benchmark_dic[seg]数量。同样,我们只能以较低的价格订购任何价值z[seg]taknes 价值1.

可能有一种更整洁/更有效的方法可以做到这一点,但上述方法应该有效。

我认为上面的答案需要修改第二个约束:

x1[seg] >= 0
x1[seg] <= benchmark_dic[seg]
x2[seg] >= 0
x2[seg] <= z[seg]*MAX_POSSIBLE_ORDER

否则,如果z[seg]无论x1[seg]的价值如何,都可以始终0. 例如,如果benchmark_disc[1]1000并且x1[1]可以1500并且z[1]0但仍满足约束:

1500 >= 1000 * 0

最新更新