纸浆:目标函数中的if陈述

时间:2019-05-23 10:37:37

标签: python pulp

我正在尝试使用纸浆包装进行生产计划。我有不同型号的订单。不同的工厂以不同的速度制造不同的模型。 我应该计划所有订单,但我的目标是仅在接下来的几天(即6天)内完成更多产品。 约束主要是提前期(到期日)和订单可以开始产生的时间(下达日期)。

我不确定我是否以正确的方式使用纸浆: 我将LpVariables r设置为发布日期。和c作为完整的日子。像订单一样,我将从时间r的第j个坐标开始,并在周期c之后完成。

r=LpVariable('release date',(o,f),0)
c=LpVariable('complete days',(o,f),0)
d=LpVariable('due date',(o,f),0)

我认为目标函数应该是:

prob=lpProblem('aps',LpMaximize)
prob+=LpSum([c[o][f]*speed[o][f] for o in orders for f in factories if d[o][f]<=6])+lpSum([(6-r[o][f])*speed[o][f] for o in orders for f in factories if d[o][f]>=6 and r[o][f]<=6])

我的问题是如何使其正确。也许使用其他包装?还是只需更改一些代码?

1 个答案:

答案 0 :(得分:0)

您需要使用LpVariable.dicts而不是LpVariable。后者创建LpVariable对象的单个实例。前者创建一个字典,其中的键基于索引(第二个)参数,而值是LpVariable对象,这就是您想要的。

我认为LpVariable可能应该在传递(o,f)时抛出错误,因为这似乎是无关紧要的参数。

通过使用LpVariableLpVariable.dicts打印r,c和d,可以看到两者之间的区别。

o = [1, 2, 3]
f = ['a', 'b', 'c']

r = LpVariable('release date',(o,f),0)
c = LpVariable('complete days',(o,f),0)
d = LpVariable('due date',(o,f),0)

>>>print(r, c, d)
release_date complete_days due_date

# this error occurs because c is an object, not a dictionary where the values are objects.
>>>prob += lpSum([c[o][f]*speed[o][f] for o in orders ...])
TypeError: 'LpVariable' object is not subscriptable 

# correct approach
r = LpVariable.dicts('release date',(o,f),0)
c = LpVariable.dicts('complete days',(o,f),0)
d = LpVariable.dicts('due date',(o,f),0)

>>>print(r, c, d)
{1: {'a': release_date_1_a, 'b': release_date_1_b, 'c': release_date_1_c},
  2: {'a': release_date_2_a, 'b': release_date_2_b, 'c': release_date_2_c},
  3: {'a': release_date_3_a, 'b': release_date_3_b, 'c': release_date_3_c}},
 {1: {'a': complete_days_1_a, 'b': complete_days_1_b, 'c': complete_days_1_c},
  2: {'a': complete_days_2_a, 'b': complete_days_2_b, 'c': complete_days_2_c},
  3: {'a': complete_days_3_a, 'b': complete_days_3_b, 'c': complete_days_3_c}},
 {1: {'a': due_date_1_a, 'b': due_date_1_b, 'c': due_date_1_c},
  2: {'a': due_date_2_a, 'b': due_date_2_b, 'c': due_date_2_c},
  3: {'a': due_date_3_a, 'b': due_date_3_b, 'c': due_date_3_c}}]

>>>print(r[1]['b'])
release_date_1_b

还请注意,您有一些大写错误。您的代码应读取LpProblem而不是lpProblem和lpSum而不是LpSum。