我正在建模的系统具有需要维护的一系列任务形式的对象。当前,在此模型中,他们要求一个“工作地点”,然后,他们抓住这一点,便要求他们完成第一项任务所需的必要“工人”资源。任务是列表中的对象,是对其进行维护的对象的属性,并且某些任务网络允许并行完成多个任务。
按现状,我在一个for循环中迭代任务列表,其中一个嵌套的for循环然后请求并抓住必要的“工人”,然后在所有“工人”都超时的情况下超时被抓住了。
with self.location.request() as loc_req: # request work location
yield loc_req # wait for work location
for task in self.tasks[:]:
t_duration = task.calc_duration(self)
if t_duration == 0: # skip tasks where probability sets duration to 0
continue
needs = task.resources[:]
## check if available workers are useful; if not,release them
task_cur_resources = []
for res,req in self.resources['available'].copy():
if res.worker_id in needs:
self.resources['busy'].add((res,req))
task_cur_resources.append((res,req))
needs.remove(res.worker_id)
else:
res.release(req)
self.resources['available'].remove((res,req))
## acquire all resources needed for task
for need in needs[:]:
priority = len(needs) # prioritize tasks closer to meeting needs
res = self.location.workers[need] # set resource to worker of type need
req = res.request(priority) # save the request object
yield req # wait for resource
## stash resource and request in order to release later
task_cur_resources.append((res,req))
self.resources['busy'].add((res,req))
needs.remove(res.worker_id)
## perform task with task duration timeout
yield self.env.process(task.perform(self,t_duration))
## make resources available
for worker in task_cur_resources:
self.resources['busy'].remove(worker)
self.resources['available'].add(worker)
for res,req in self.resources['available']:
res.release(req)
self.resources['available'] = set()
问题在于这不允许并发任务完成。任务根据输入参数以正态分布的持续时间顺序执行。我如何更改此设置以允许在他们的前任完成并有工人可用时执行任务?我尝试了一个while循环,该循环遍历了任务列表和已完成其前任任务的计划任务,但是由于明显滥用SimPy和收益,我一直以无限循环告终。有什么想法吗?