我正在尝试使用纸浆包装来进行生产调度。我有不同型号的订单。不同的工厂以不同的速度生产不同的型号。我应该计划所有的订单,但我的目标只是在接下来的几天(即6天)完成更多的产品。约束主要是交货期(到期日)和订单可以开始生产的时间(发布日期)。
我不确定我是否正确地使用了纸浆:我将LpVariables r设置为发布日期。和c表示完整的日期。像顺序一样,我将在时刻r开始于facory 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])我的问题是如何纠正它。也许使用不同的包?或者只是更改一些代码?
发布于 2020-04-04 03:59:25
您需要使用LpVariable.dicts而不是LpVariable。后者创建LpVariable对象的单个实例。前者创建了一个字典,其中的键基于indexs (第二个)参数,值是LpVariable对象,这正是您想要的。
我认为当您将(o,f)作为看似无关的参数传递时,LpVariable可能会抛出一个错误。
您可以通过使用LpVariable和LpVariable.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。
https://stackoverflow.com/questions/56273382
复制相似问题