我正在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)。
我应该如何为这种条件约束或条件函数编写代码。
答案 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