我正在尝试使用纸浆包装进行生产计划。我有不同型号的订单。不同的工厂以不同的速度制造不同的模型。 我应该计划所有订单,但我的目标是仅在接下来的几天(即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])
我的问题是如何使其正确。也许使用其他包装?还是只需更改一些代码?
答案 0 :(得分:0)
您需要使用LpVariable.dicts
而不是LpVariable
。后者创建LpVariable对象的单个实例。前者创建一个字典,其中的键基于索引(第二个)参数,而值是LpVariable对象,这就是您想要的。
我认为LpVariable
可能应该在传递(o,f)时抛出错误,因为这似乎是无关紧要的参数。
通过使用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。