机器约束下的作业车间调度



我正在研究一个作业车间调度问题,并试图集成一个约束,该约束只允许将某些作业分配给某些机器。我想我可以通过创建一组不同类型的机器(A,B),然后创建一个约束,只允许在机器上处理这种特定类型的作业来实现这一点。

数据:

dict_jobs = {
10 : {'dur' : 45, 'type' : 'A', 'JobDeadline' : '31/05/2022'},
20 : {'dur' : 45, 'type' : 'A', 'JobDeadline' : '31/05/2022'},    
30 : {'dur' : 70, 'type' : 'A', 'JobDeadline' : '27/05/2022'},
100 : {'dur' : 55, 'type' : 'B', 'JobDeadline' : '25/05/2022'},
110 : {'dur' : 75, 'type' : 'B', 'JobDeadline' : '30/05/2022'},
120 : {'dur' : 45, 'type' : 'B', 'JobDeadline' : '30/05/2022'}}

dict_machine = {
111 : {'duration' : 500, 'end' : '16:00:00', 'start' : '08:30:00', 'type' : 'A', 'date' : '30/05/2022'},
222 : {'duration' : 800, 'end' : '17:00:00', 'start' : '08:00:00', 'type' : 'A', 'date' : '25/05/2022'},
333 : {'duration' : 800, 'end' : '17:00:00', 'start' : '08:00:00', 'type' : 'B', 'date' : '30/05/2022'},
444 : {'duration' : 800, 'end' : '17:00:00', 'start' : '08:00:00', 'type' : 'B', 'date' : '25/05/2022'}}

model = ConcreteModel()
model.JOBS= Set(initialize = dict_jobs.keys(), dimen=1)
model.MACHINES = Set(initialize = dict_machines.keys(), dimen=1)
model.TYPES = Set(initialize = ['A', 'B'])
model.TASKS = Set(initialize = model.JOBS * model.MACHINES, dimen=2)

model.MACHINE_ASSIGNED = Var(model.TASKS, domain = Binary)

model.TYPE_JOBS = Set(initialize = [(10 , 'A'), (20 , 'A'), (30, 'A'), (100, 'B'), (110, 'B'), (120, 'B')], dimen = 2)
model.JOB_TYPE = Var(model.TPYE_JOBS, domain = Binary)
model.TYPE_MACHINE= Set(initialize = [(111, 'A'), (222, 'A'), (333, 'B'), (444, 'B')], dimen = 2)
model.MACHINE_TYPE= Var(model.TYPE_MACHINE, domain = Binary)

约束

def type_condition(model, type, machine):
return (model.MACHINE_ASSIGNED[job, machine] * model.JOB_TYPE[job, type] <=(model.MACHINE_TYPE[machine, type]) for type in model.TYPES)
model.APPLY_SPEC = Constraint(model.TASKS, rule=type_condition)
<<p>目标/strong>
def objective_function(model):
return summation(model.UTILIZATION)
model.OBJECTIVE = Objective(rule = objective_function, sense = maximize)

当我试图解决这个问题时,我得到了这个错误:"KeyError: "Index '(10, 'B')'对索引组件'JOB_TYPE'"无效。

有什么想法我可以修改约束吗?

以下几件事会有所帮助…

首先,您可以对J-M配对使用一个稀疏集,该集仅限于兼容的配对。这将防止"非法"。分配并减小模型的大小。(参见代码)

其次,您可能需要基于机器类型或其他类型的几种类型的子集。你可以&应该制作具有集合理解等的内容,并根据需要将其放入模型中。

最后,您可能会发现索引集的用途,例如由包含一组兼容作业的机器索引的集合。作业集由机器集索引。(参见代码)

# job-shop setup
import pyomo.environ as pyo
jobs = {
10: {"dur": 45, "type": ["A",], "JobDeadline": "31/05/2022"},
20: {"dur": 45, "type": ["B",], "JobDeadline": "31/05/2022"},
30: {"dur": 70, "type": ["A", "B"], "JobDeadline": "27/05/2022"},
}

machines = {
111: {
"duration": 500,
"end": "16:00:00",
"start": "08:30:00",
"type": "A",
"date": "30/05/2022",
},
222: {
"duration": 800,
"end": "17:00:00",
"start": "08:00:00",
"type": "A",
"date": "25/05/2022",
},
333: {
"duration": 800,
"end": "17:00:00",
"start": "08:00:00",
"type": "B",
"date": "30/05/2022",
}
}
compatible_assignments = {(j, m) for j in jobs.keys() 
for m in machines.keys() 
if machines[m]['type'] in jobs[j]['type']}
jobs_by_machine = {m: 
[j for j in jobs.keys() if machines[m]['type'] in jobs[j]['type']]
for m in machines.keys()}
print(compatible_assignments)
print(jobs_by_machine)
model = pyo.ConcreteModel()
#SETS
model.J = pyo.Set(initialize=jobs.keys())
model.M = pyo.Set(initialize=machines.keys())
model.JM = pyo.Set(within=model.J*model.M, initialize=compatible_assignments)
model.J_by_M = pyo.Set(model.M, within=model.J, initialize=jobs_by_machine)
model.pprint()

最新更新