Exemplo n.º 1
0
def carlier(tg, UB):
    global _counter
    _counter += 1
    print(_counter)
    piZG = 0

    UCmax, Upi = schrage(tg) #U i pi ze schrage
    if UCmax < UB: #if U < UB
        UB = UCmax #UB = U
        piZG = Upi #pi* = pi

    b = tg.find_b()
    a = tg.find_a(b)
    c = tg.find_c(a, b)

    if len(c) == 0:
        return piZG

    key_c = list(c.keys())[0]
    key_list = list(tg.group.keys())
    value_list = list(tg.group.values())
    index_c = key_list.index(key_c)

    r_prim, p_prim, q_prim = tg.find_K_params(b, c)
    value_list[index_c].r = max(value_list[index_c].r, r_prim + p_prim)

    new_tg = make_tg_from_lists(key_list, value_list) #experimental

    LB = schrage_pmtn(new_tg)
    r_prim_with_c, p_prim_with_c, q_prim_with_c = new_tg.find_K_params_with_C(b, c)
    LB = max(max(r_prim + q_prim + p_prim, r_prim_with_c+p_prim_with_c+q_prim_with_c), LB)

    if LB < UB:
        carlier(Upi, UB)

    value_list.clear()
    value_list = list(tg.group.values())
    value_list[index_c].q = max(value_list[index_c].q, q_prim + p_prim)
    new_tg = make_tg_from_lists(key_list, value_list)

    LB = schrage_pmtn(new_tg)
    LB = max(max(r_prim + q_prim + p_prim, r_prim_with_c + p_prim_with_c + q_prim_with_c), LB)

    if LB < UB:
        carlier(Upi, UB)

    value_list.clear()
    value_list = list(tg.group.values())
Exemplo n.º 2
0
def carlier2(tg, UB):
    tg_copy = copy.deepcopy(tg)
    U, pi = schrage(tg)
    pi_g = 0
    if U < UB:
        UB = U
        pi_g = pi

    b = pi.find_b(pi.cmax())
    a = pi.find_a2(b,pi.cmax())
    c = pi.find_c(a, b)

    if len(c) == 0:
        return pi_g

    key_c = list(c.keys())[0]

    rK, pK, qK = pi.find_K_params(b, c)
    _tmp = pi[key_c].r
    pi[key_c].r = max(pi[key_c].r, rK+pK)
    LB = schrage_pmtn(tg) #później do testów
    hK = rK + pK + qK
    rK_c, pK_c, qK_c = pi.find_K_params_with_C(b, c)
    hK_c = rK_c + pK_c + qK_c
    LB = max(hK, hK_c, LB)
    if LB < UB:
      pi1 = carlier2(pi, UB)
    pi[key_c].r = _tmp
    _tmp = pi[key_c].q
    pi[key_c].q = max(pi[key_c].q, qK + pK)
    LB = schrage_pmtn(tg)
    rK_c, pK_c, qK_c = pi.find_K_params_with_C(b, c)
    hK_c = rK_c + pK_c + qK_c
    LB = max(hK, hK_c, LB)
    if LB < UB:
      pi1 = carlier2(pi, UB)
    pi[key_c].q = _tmp

    return pi1
Exemplo n.º 3
0
def carlier(data):
    tasks = deepcopy(data)
    order, u, b = schrage(tasks)
    try:
        if u < ub:
            ub = u
            end = order
    except UnboundLocalError:
        ub = u
        end = order
    path = critical(tasks, order, b)

    a = path[0]
    c = get_c(tasks, path)
    if c is None:
        return end
    idxc = path.index(c)
    k = path[idxc + 1:]

    rk, qk, pk = parameters(tasks, k)

    rpc = tasks[c][0]
    tasks[c][0] = max(rpc, rk + pk)

    lb = schrage_ptm(tasks)
    lb = max(sum([rk, qk, pk]), sum(parameters(tasks, path[idxc:])), lb)
    if lb < ub:
        return carlier(tasks)
    tasks[c][0] = rpc

    qpc = tasks[c][2]
    tasks[c][2] = max(qpc, qk + pk)

    lb = schrage_ptm(tasks)
    lb = max(sum([rk, qk, pk]), sum(parameters(tasks, path[idxc:])), lb)
    if lb < ub:
        return carlier(tasks)
    tasks[c][2] = qpc
    return end
Exemplo n.º 4
0
def carlier(permut_tasks, ub=10000000000):
    a = 0
    b = 0
    c = -1

    tasks = copy.deepcopy(permut_tasks)
    u, pi = schrage(tasks)  # line 2

    if u < ub:  # line 3
        ub = u  # line 4

    #count b line 6
    cpop = 0
    time_of_end_tasks = []
    for i in range(len(pi)):
        cpop = max(cpop, max(pi[i][0], cpop) + pi[i][1])
        time_of_end_tasks.append(cpop)
        if cpop + pi[i][2] == u:
            b = i

    #count a line 7
    sum_tasks = 0
    for i in range(b, -1, -1):
        sum_tasks += pi[i][1]
        if u == sum_tasks + pi[i][0] + pi[b][2] and time_of_end_tasks[
                i - 1] != pi[i][1]:
            a = i
            break

    #count c line 8
    for i in range(a, b + 1):
        if pi[i][2] < pi[b][2]:
            c = i

    print("A: " + str(a) + "\tB: " + str(b) + "\tC: " + str(c))
    if c < 0:  # line 9
        return ub  # line 10

    #count r_prim, q_prim i p_prim line 13
    p_prim = 0
    r_prim = pi[c + 1][0]
    q_prim = pi[c + 1][2]
    for i in range(c + 1, b + 1):  # line 12
        p_prim += pi[i][1]
        if r_prim > pi[i][0]:
            r_prim = pi[i][0]
        if q_prim > pi[i][2]:
            q_prim = pi[i][2]

    #Left child, change r time for critical task line 14
    old_pi_r_c = pi[c][0]
    pi[c][0] = max(pi[c][0], r_prim + p_prim)

    #set block of data with c line 14
    p_bis = 0
    r_bis = pi[c][0]
    q_bis = pi[c][2]
    for i in range(c, b + 1):
        p_bis += pi[i][1]
        if r_bis > pi[i][0]:
            r_bis = pi[i][0]
        if q_bis > pi[i][2]:
            q_bis = pi[i][2]

    lb, O = schrage_pmtn(pi)  # line 15
    lb = max(max(r_prim + q_prim + p_prim, r_bis + p_bis + q_bis),
             lb)  # line 16
    if lb < ub:  # line 17
        ub = carlier(pi, ub)  # line 18
    pi[c][0] = old_pi_r_c  # line 20

    #Right child, change q time for critical task
    old_pi_q_c = pi[c][2]  # line 20
    pi[c][2] = max(pi[c][2], q_prim + p_prim)  #line 21

    #Prepare new block with critical task
    p_bis = 0
    r_bis = pi[c][0]
    q_bis = pi[c][2]
    for i in range(c, b + 1):
        p_bis += pi[i][1]
        if r_bis > pi[i][0]:
            r_bis = pi[i][0]
        if q_bis > pi[i][2]:
            q_bis = pi[i][2]

    lb, O = schrage_pmtn(pi)  # line 22
    lb = max(max(r_prim + q_prim + p_prim, r_bis + p_bis + q_bis),
             lb)  # line 23
    if lb < ub:  # line 24
        ub = carlier(pi, ub)  # line 25
    pi[c][2] = old_pi_q_c  # line 27

    return ub
Exemplo n.º 5
0
def carlier_wideLeft(permut_tasks):
    lista_zadan = []
    lb = 0
    ub = 99999999

    u, pi = schrage(permut_tasks)
    if u < ub:
        ub = u

    lista_zadan.append([pi, lb])

    while len(lista_zadan) != 0:
        lb = lista_zadan[0][1]
        podzial, O = pmtn(lista_zadan[0][0])
        if podzial > ub:
            lista_zadan.pop(0)
            continue

        u, pi = schrage(lista_zadan[0][0])
        if u < ub:
            ub = u

        a = 0
        b = 0
        c = -1
        #  Wyznaczenie b
        cpop = 0
        czas_zakonczenia_operacji = []
        for i in range(len(pi)):
            cpop = max(cpop, max(pi[i][0], cpop) + pi[i][1])
            czas_zakonczenia_operacji.append(cpop)
            if cpop + pi[i][2] == u:
                b = i

        #  Wyznaczenie a
        sum_tasks = 0
        for i in range(b, -1, -1):
            sum_tasks += pi[i][1]
            if u == sum_tasks + pi[i][0] + pi[b][
                    2] and czas_zakonczenia_operacji[i - 1] != pi[i][1]:
                a = i
                break

        #  Wyznaczenie c
        for i in range(a, b + 1):
            if pi[i][2] < pi[b][2]:
                c = i
        if c < 0:
            return ub

        #  Wyznaczenie r', q' i p'
        pprim = 0
        rprim = pi[c + 1][0]
        qprim = pi[c + 1][2]
        for i in range(c + 1, b + 1):
            pprim += pi[i][1]
            if rprim > pi[i][0]:
                rprim = pi[i][0]
            if qprim > pi[i][2]:
                qprim = pi[i][2]

        #Lewy potomek
        old_pi_r_c = pi[c][0]
        pi[c][0] = max(pi[c][0], rprim + pprim)

        pbis = 0
        rbis = pi[c][0]
        qbis = pi[c][2]
        for i in range(c, b + 1):
            pbis += pi[i][1]
            if rbis > pi[i][0]:
                rbis = pi[i][0]
            if qbis > pi[i][2]:
                qbis = pi[i][2]

        lb, O = pmtn(pi)
        lb = max(max(rprim + qprim + pprim, rbis + pbis + qbis), lb)
        if lb < ub:
            kolejnosc_l = copy.deepcopy(pi)
            lista_zadan.append([kolejnosc_l, lb])
        pi[c][0] = old_pi_r_c

        #Prawy potomek
        old_pi_q_c = pi[c][2]
        pi[c][2] = max(pi[c][2], qprim + pprim)

        pbis = 0
        rbis = pi[c][0]
        qbis = pi[c][2]
        for i in range(c, b + 1):
            pbis += pi[i][1]
            if rbis > pi[i][0]:
                rbis = pi[i][0]
            if qbis > pi[i][2]:
                qbis = pi[i][2]
        lb, O = pmtn(pi)
        lb = max(max(rprim + qprim + pprim, rbis + pbis + qbis), lb)
        if lb < ub:
            kolejnosc_p = copy.deepcopy(pi)
            lista_zadan.append([kolejnosc_p, lb])
        pi[c][2] = old_pi_q_c

        lista_zadan.pop(0)  #Odrzuc sprawdzony wezel

    return ub
Exemplo n.º 6
0
def carlier(permut_tasks, ub=999999999):
    tasks = copy.deepcopy(permut_tasks)
    u, pi = schrage(tasks)

    if u < ub:
        ub = u

    a = 0
    b = 0
    c = -1

    #  Wyznaczenie b
    cpop = 0
    czas_zakonczenia_operacji = []
    for i in range(len(pi)):
        cpop = max(cpop, max(pi[i][0], cpop) + pi[i][1])
        czas_zakonczenia_operacji.append(cpop)
        if cpop + pi[i][2] == u:
            b = i

    #  Wyznaczenie a
    sum_tasks = 0
    for i in range(b, -1, -1):
        sum_tasks += pi[i][1]
        if u == sum_tasks + pi[i][0] + pi[b][2] and czas_zakonczenia_operacji[
                i - 1] != pi[i][1]:
            a = i
            break

    #  Wyznaczenie c
    for i in range(a, b + 1):
        if pi[i][2] < pi[b][2]:
            c = i

    if c < 0:
        return ub

    #  Wyznaczenie r', q' i p'
    pprim = 0
    rprim = pi[c + 1][0]
    qprim = pi[c + 1][2]
    for i in range(c + 1, b + 1):
        pprim += pi[i][1]
        if rprim > pi[i][0]:
            rprim = pi[i][0]
        if qprim > pi[i][2]:
            qprim = pi[i][2]

    #Potomek po lewej stronie - zmiana czasu przygotowania zadania krytycznego
    old_pi_r_c = pi[c][0]
    pi[c][0] = max(pi[c][0], rprim + pprim)

    #Przygotowanie bloku z uwzględnieniem zadania c
    pbis = 0
    rbis = pi[c][0]
    qbis = pi[c][2]
    for i in range(c, b + 1):
        pbis += pi[i][1]
        if rbis > pi[i][0]:
            rbis = pi[i][0]
        if qbis > pi[i][2]:
            qbis = pi[i][2]

    lb, O = pmtn(pi)
    lb = max(max(rprim + qprim + pprim, rbis + pbis + qbis), lb)
    if lb < ub:
        ub = carlier(pi, ub)
    pi[c][0] = old_pi_r_c

    #Potomek po prawej stronie - zmiana czasu stygnięcia zadania krytycznego
    old_pi_q_c = pi[c][2]
    pi[c][2] = max(pi[c][2], qprim + pprim)

    #Przygotowanie bloku z uwzględnieniem zadania krytycznego
    pbis = 0
    rbis = pi[c][0]
    qbis = pi[c][2]
    for i in range(c, b + 1):
        pbis += pi[i][1]
        if rbis > pi[i][0]:
            rbis = pi[i][0]
        if qbis > pi[i][2]:
            qbis = pi[i][2]

    lb, O = pmtn(pi)
    lb = max(max(rprim + qprim + pprim, rbis + pbis + qbis), lb)
    if lb < ub:
        ub = carlier(pi, ub)
    pi[c][2] = old_pi_q_c

    return ub
Exemplo n.º 7
0
        pi[c][2] = old_pi_q_c

        lista_zadan.pop(0)  #Odrzuc sprawdzony wezel
        lista_zadan.sort(key=operator.itemgetter(1))
    return ub


#pliki = ["in50.txt", "in100.txt", "in200.txt", "data1.txt", "data2.txt", "data3.txt", "data4.txt", "data5.txt", "data6.txt"]

pliki = ["data7.txt", "data8.txt"]

for i in range(len(pliki)):
    print(pliki[i])
    plik = wczytaj_plik(pliki[i])

    Cmax, O = schrage(plik)
    print("Cmax Schrage = ", Cmax)
    Cmax, O = pmtn(plik)
    print("Cmax Schrage pmtn = ", Cmax)

    #t0 = time.time()
    #Cmax = carlier(plik)
    #t1 = time.time()
    #print("Cmax Carlier (Deep Left) = ", Cmax, " t = ", t1-t0)

    t0 = time.time()
    Cmax = carlier_wideLeft(plik)
    t1 = time.time()
    print("Cmax Carlier (Wide Left) = ", Cmax, " t = ", t1 - t0)

    t0 = time.time()