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())
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
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
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
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
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
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()