Exemplo n.º 1
0
def schrage_pmtn(tasks: List[Task]):
    ready = set()
    Cmax = 0
    not_ready = set(tasks)
    l = Task(0, 0, sys.maxsize, -1)
    t = min(task.get_r() for task in not_ready)
    while ready or not_ready:
        while not_ready and min(task.get_r() for task in not_ready) <= t:
            e = min(not_ready, key=Task.get_r)
            ready.add(e)
            not_ready.remove(e)
            if e.get_q() > l.get_q():
                l = l.copy().change_p(t - e.get_r()) ##tutaj byla zmiana na z kopia
                t = e.r
                if l.p > 0:
                    ready.add(l)

        if not ready:
            t = min(task.get_r() for task in not_ready)
        else:
            e = max(ready, key=Task.get_q)
            ready.remove(e)
            l = e
            t += e.p
            Cmax = max(Cmax, t + e.q)
    return Cmax
Exemplo n.º 2
0
def schrage_pmtn_heapq(tasks: List[Task]):
    ready = Heapq(key="q", reverse=True)
    Cmax = 0
    l = Task(0, 0, sys.maxsize, 0)
    not_ready = Heapq(tasks=tasks, key="r", reverse=False)
    t = not_ready.top.r
    while ready or not_ready:
        while not_ready and not_ready.top.r <= t:
            e = not_ready.pop()
            ready.insert(e)
            if e.q > l.q:
                l = l.copy().change_p(t - e.get_r())
                t = e.r
                if l.p > 0:
                    ready.insert(l)
        if not ready:
            t = not_ready.top.r
        else:
            e = ready.pop()
            l = e
            t += e.p
            Cmax = max(Cmax, t + e.q)

    return Cmax