python实现生产计划和调度问题

问题描述 投票:1回答:1

我正在尝试使用纸浆包装进行生产计划。我有不同型号的订单。不同的工厂以不同的速度制造不同的模型。我应该计划所有订单,但我的目标是仅在接下来的几天(即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])

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

python pulp
1个回答
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。

© www.soinside.com 2019 - 2024. All rights reserved.