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

时间:2019-09-16 00:36:15

标签: python constraints conditional-statements mathematical-optimization pulp

我正在Python中使用Pulp设置线性优化。我想对这个问题设置条件约束。

就像,我想最大化工厂的利润。对于材料成本,前1000个单位每个价格为$ 5,再增加一个单位为$ 3。例如,如果工厂定购1100个单位,则总成本将为1000 * 5 + 100 * 3。我有一个物料清单:material_list,一个物料基准字典:benchmark_dic={material_a: 1000, material_b:2000 ....},如果订单损失比基准基准价格字典:price_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)。

我应该如何为这种条件约束或条件函数编写代码。

2 个答案:

答案 0 :(得分:0)

我认为以条件方式实现它们的条件约束不会起作用。

对于像这样的条件约束,您将需要重新构造问题以使用指标变量,这些指标变量是跟踪您感兴趣的条件(真或假)的二进制变量。

对于您的特定问题,我建议使用类似以下的内容,为每个跟踪基准购买数量的材料,设置一组变量,x1[seg],然后再设置一组变量,{ {1}}跟踪高于基准的购买数量,最后跟踪一组二进制变量,说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],我们只能以较低的价格订购任何商品。

也许有一种更整洁/更有效的方法来执行此操作,但是以上方法应该可以工作。

答案 1 :(得分:0)

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

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

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

1500 >= 1000 * 0