如何为任务优先级建模?

pazitos10

我正在尝试模拟所有一起属于同一个通用项目的任务。
任务具有持续时间和优先级(由在当前任务之前必须完成的任务列表表示)。

例如:

      /--->A --->B\
Start ---->C------->End
      \--->D---->E/

这意味着任务A,C和D可以同时执行,但是任务B应该在任务A之后执行,任务E应该在任务D之后执行。

我写了这段代码:

#!/usr/bin/python2.7
# -*- coding: utf-8 -*-
import simpy


class Task(object):
    """ 
        Has an id i.e.: 'E',
        duration i.e.: 5
        a list with Task that precede the current
    """
    def __init__(self, idTask, duration, env, previousTasks=None):
        self.idTask = idTask
        self.duration = duration
        self.env = envs
        self.completed = env.event()
        self.action = env.process(self.run())
        if previousTasks is None:
            self.previousTasks = []
        else:
            self.previousTasks = previousTasks

    def run(self):
        while self.can_execute() and not self.completed.triggered:
            print "Starting task %s at time %s" % (self.idTask, self.env.now)
            yield self.env.timeout(self.duration)
            print "Completed task %s in time %s" % (self.idTask, self.env.now)
            self.completed.succeed(True)

    def can_execute(self):
        result = True
        for task in self.previousTasks:
            if not task.completed.triggered:
                result = False
                break
        return result

if __name__ == "__main__":
    env = simpy.Environment()
    taskA = Task('A', 4, env)
    taskB = Task('B', 5, env, [taskA])
    env.run(until=20)

Task对象中的Completed属性用于了解当前任务是完成还是完成。(我尝试使用没有不同结果的布尔值来做到这一点。)

taskB将taskA作为优先任务。这意味着taskB应该在taskA完成之前开始,但这是我运行它时的输出:

% python tasks.py
Starting task A at time 0
Completed task A at time 4
%

我不明白为什么taskB无法运行。

-------------------------------------------------- -------------------------

解决了

我使用了“ start_delayed”方法,该方法在Simpy的simpy.util模块中可用。根据当前任务是否要执行以前的任务,每个任务的“操作”是简单过程还是延迟过程。
每个任务的延迟都在add_precedences和estimate_delays中计算,但是对于将先前任务的持续时间与当前任务的持续时间求和是必需的。
这是最终代码:

#!/usr/bin/python2.7
# -*- coding: utf-8 -*-
import simpy
from simpy.util import start_delayed

delays = {}
completed = []


class Task(object):
    """ Has an id i.e.: 'E',
        duration i.e.: 5
        a list with Task that precede the current
    """
    def __init__(self, id, duration, env, previousTasks=None):
        self.id = id
        self.duration = duration
        self.env = env
        if previousTasks is None:
            self.previousTasks = []
        else:
            self.previousTasks = previousTasks
        self.action = None

    def run(self):
        while True:
            if delays[self.id] == self.env.now:
                print "Start task: %s at time: %s" % (self.id, self.env.now)
                yield self.env.timeout(self.duration)
                completed.append(self.id)
                print "Finish task: %s at time: %s" % (self.id, self.env.now)
            else:
                if self.id in completed:
                    self.env.exit()


def add_precedences(prevTask, durations):
    if len(prevTask) == 0:
        return 0
    else:
        durations.extend(map(lambda x: x.duration, prevTask))
        for prev in prevTask:
            add_precedences(prev.previousTasks, durations)
        return sum(durations)


def estimate_delays(tasks):
    result = {}
    for task in tasks:
        durations = []
        total = (add_precedences(task.previousTasks, durations))
        result.update({task.id: total})
    return result


def set_action(tasks):
    for task in tasks:
        if delays[task.id] > 0:
            task.action = start_delayed(task.env, task.run(), delays[task.id])
        else:
            task.action = env.process(task.run())

if __name__ == '__main__':
    env = simpy.Environment()
    taskA = Task('A', 4, env)
    taskB = Task('B', 5, env, previousTasks=[taskA])
    taskC = Task('C', 2, env, previousTasks=[taskB])
    tasks = [taskA, taskB, taskC]
    delays.update(estimate_delays(tasks))
    set_action(tasks)
    env.run(until=20)

在这种情况下,项目有3个任务(“ A”,“ B”,“ C”),这是树:

Start --->A--->B--->C--->End 

B必须在时间4开始(因为这是A的持续时间)。C必须在时间9开始(因为这是B + A的持续时间)。
为了知道哪个任务已经完成,我创建了一个列表,每个任务都添加了自己的ID。如果其自己的ID在该列表中,则将每个任务从环境中删除。

pbc1303

我应该以此作为评论,但我没有这样做的声誉。不过,我认为这可能会帮助您解决问题。

我不熟悉simpy,但是您可能会混淆触发处理,这使任务B无法执行;检查此链接:http : //simpy.readthedocs.org/en/latest/api_reference/simpy.events.html#module-simpy.events

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何为Parallel.Async后台任务设置更高的任务优先级?

来自分类Dev

如何为规则设定优先级?

来自分类Dev

ScheduledThreadPoolExecutor:如何确定任务的优先级?

来自分类Dev

如何按优先级排序任务?

来自分类Dev

如何为应用程序设置MIME优先级?

来自分类Dev

如何从高优先级ISR唤醒FreeRtos任务?

来自分类Dev

Scrapyd:如何设置scrapyd任务优先级?

来自分类Dev

空闲任务的优先级是什么?

来自分类Dev

在Google App Engine上使用任务队列时,如何确定任务的优先级?

来自分类Dev

任务管理器中的优先级-硬盘写入优先级还是CPU优先级?

来自分类Dev

如何为某些HTML页面部件的屏幕阅读器设置优先级?

来自分类Dev

如何为每个分配的优先级选择最重要的行?

来自分类Dev

如何为2个以上的案例确定隐式优先级

来自分类Dev

如何为MediaElement播放器指定后备优先级

来自分类Dev

如何为高优先级处理保留纱线容器-养猪工作

来自分类Dev

如何为我的下拉选项设置自定义优先级

来自分类Dev

VS Code 扩展:如何为扩展的设置/配置设置顺序/优先级?

来自分类Dev

如何提高AsyncTask的优先级?

来自分类Dev

如何完成优先级较低的中断?

来自分类Dev

如何设置Android服务的优先级?

来自分类Dev

优先级上限协议如何工作

来自分类Dev

.enforceQoS标志如何增加优先级?

来自分类Dev

Java优先级队列如何工作?

来自分类Dev

HUD如何确定命令的优先级?

来自分类Dev

如何完成优先级较低的中断?

来自分类Dev

如何删除STXXL优先级队列?

来自分类Dev

如何确保SetWindowsHookEx优先级

来自分类Dev

如何查看进程的IO优先级?

来自分类Dev

此优先级队列如何工作?

Related 相关文章

热门标签

归档