def simulatedAnnealing(tasks): RNG = RandomNumberGenerator(123) t = copy.deepcopy(tasks) T = 1550.0 #temperatura zarzenia na bialo rozgrzanej stali :) Tend = 1E-10 # cokolwiek większe od zera it = 0 L = 10 pi = [] pi_new = [] pi_best = [] #natural perm for perm in range(1, t.size + 1): pi.append(perm) pi_best.append(perm) while T > Tend: for k in range(L): i = RNG.nextInt(0, t.size) - 1 j = RNG.nextInt(0, t.size) - 1 pi_new = copy.deepcopy(pi) swap_value = pi_new[i] pi_new[i] = pi_new[j] pi_new[j] = swap_value cmax_new = t.calculate_Cmax(pi_new) cmax_old = t.calculate_Cmax(pi) if cmax_new > cmax_old: r = RNG.nextFloat(0, 1) dCmax = cmax_old - cmax_new if r >= math.exp(dCmax / T): pi_new = copy.deepcopy(pi) pi = copy.deepcopy(pi_new) if t.calculate_Cmax(pi_best) > t.calculate_Cmax(pi): pi_best = copy.deepcopy(pi) it += 1 T = T / math.log(it + 1) #ln(it+1) return pi_best