Advertisement
Guest User

Untitled

a guest
Nov 16th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.43 KB | None | 0 0
  1. import random, itertools, numpy, math, copy
  2. from operator import itemgetter
  3.  
  4. H = 0.8
  5.  
  6.  
  7. def count_deadline(tasks):
  8.     deadline = 0
  9.     for task in tasks:
  10.         deadline += task[2] * H
  11.     return int(deadline)
  12.  
  13.  
  14. def count_sum(tasks):
  15.     sum = 0
  16.     for task in tasks:
  17.         sum += task[2]
  18.     return sum
  19.  
  20.  
  21. def calculate_score(p, deadline):
  22.     time = 0
  23.     score = 0
  24.     for task in p:
  25.         time += task[2]
  26.         if time < deadline:
  27.             score += (deadline - time) * task[0]
  28.         else:
  29.             score += (time - deadline) * task[1]
  30.     return score
  31.  
  32.  
  33. def brute_force(tasks):
  34.     global MINI
  35.     mini = MINI
  36.     perm = list(itertools.permutations(tasks))
  37.     deadline = count_deadline(tasks)
  38.     for p in perm:
  39.         score = calculate_score(p, deadline)
  40.         if score < mini:
  41.             mini = score
  42.             line = (p, deadline, score)
  43.     return line
  44.  
  45.  
  46.  
  47. def order_tasks(tasks, n):
  48.     ordered_tasks = sorted(tasks, key=lambda task: 1.0 * task[2] / task[n])
  49.     return ordered_tasks
  50.  
  51. def find_place(task_to_insert, tasks_after):
  52.     for i in range(len(tasks_after)):
  53.         if tasks_after[i][2] / tasks_after[i][1] <= task_to_insert[2]/task_to_insert[1]:
  54.             return i
  55.     return len(tasks_after)
  56.  
  57. def compute_result(tasks_before, tasks_after):
  58.     return 10
  59.  
  60. def get_best_candidate(tasks_before, tasks_after):
  61.     maxi = -111111111
  62.     best_option = None
  63.     for task in tasks_before:
  64.         j = find_place(task, tasks_after)
  65.         i = tasks_before.index(task)
  66.         result = compute_result(tasks_before, tasks_after, i, j)
  67.         if result > maxi:
  68.             maxi = result
  69.             best_option = (task, i ,j)
  70.     if result < 0:
  71.         return None
  72.     return best_option
  73.  
  74. def own_algorithm(tasks):
  75.     score = 10000000000
  76.     # for i in range(10):
  77.     tasks = order_tasks(tasks,0)
  78.     tasks_before = tasks
  79.     tasks_after = []
  80.  
  81.     best_option = get_best_candidate(tasks_before)[0]
  82.     while best_option is not None:
  83.         tasks_after.insert(best_option[0],best_option[1])
  84.         tasks_before.remove(best_option[0])
  85.     tasks = tasks_before+tasks_after
  86.  
  87.     return calculate_score(tasks, count_deadline(tasks))
  88.  
  89.  
  90.  
  91.  
  92. # n=10
  93. # results = [1936, 1042, 1586, 2139, 1187, 1521, 2170, 1720, 1574, 1869]   #0.2 1.75 6.8 16.12 11
  94. # results = [1025, 615, 917, 1230, 630, 908, 1374, 1020, 876, 1136]    #0.4  1.02 10.34
  95. # results = [841, 615, 793, 815, 521, 755, 1101, 610, 582, 710]   #0.6 8.3
  96. # results = [818, 615, 793, 803, 521, 755, 1083, 540, 554, 671]   #0.8 36.6
  97.  
  98. # n=200
  99. # results = [526666, 566643, 529919, 603709, 547953, 502276, 479651, 530896, 575353, 572866] #-3.7
  100. # results = [301499, 355714, 308278, 360852, 322268, 292453, 279576, 288746, 331107,332808] #-3.5
  101. # results = [254268, 266028, 254647, 297269, 260455, 236160, 247555, 225572, 255029, 269236] # 3.19 #2.61
  102. # results = [254268, 266028, 254647, 297269, 260455, 236160, 247555, 225572, 255029, 269236] #43.4 46.5
  103. # n=1000
  104. # results = [15190371, 13356727, 12919259,12705290,13276868,12236080,14160773,13314723,12433821,13395234]
  105. # results = [8570154,7592040,7313736,7300217,7738367,7144491,8426024,7508507,7299271,7617658]
  106. # results = [6411581, 6112598, 5985538, 6096729, 6348242, 6082142, 6575879, 6069658, 6188416, 6147295]
  107. # results = [6411581, 6112598, 5985538, 6096729, 6348242, 6082142, 6575879, 6069658, 6188416, 6147295]
  108.  
  109.  
  110. data = open('inputs_sprawko.txt', 'r').readlines()
  111. result = 0
  112. for line in data:
  113.     line = line.split('\t')
  114.     n = int(line[0])
  115.     k = int(line[1])
  116.     H = float(line[2])
  117.     score = int(line[3])
  118.     file_dt = 'tests' + str(n) + '.txt'
  119.     file_dt = open(file_dt, 'r').readlines()
  120.     li = []
  121.     for i in range(1 + (k - 1) * (n + 1) + 1, 1 + k * (n + 1)):
  122.         line = file_dt[i]
  123.         # print(line)
  124.         task = ''.join(line)
  125.         task = task.split(' ')
  126.         task = (int(task[1]), int(task[2]), int(task[0]))
  127.         # print('Line ', i-(1+(k-1)*(n+1)+1), ': ', task[1], task[2], task[0])
  128.         li.append(task)
  129.     tasks = tuple(li)
  130.     print('Test ', n, ' ', k, ' ', 100 * (own_algorithm(tasks) - score) / score, own_algorithm(tasks), score)
  131.     result += 100 * (own_algorithm(tasks) - score) / score
  132. print('Result: ', result / 28.0)
  133.  
  134. # tasks = generate_tasks()
  135. # tasks = ((6, 15, 7), (10, 12, 5), (9, 13, 4), (9, 12, 8), (5, 2, 2), (5, 4, 9), (3, 1, 4))
  136. # print(type(tasks))
  137. # print(brute_force(tasks))
  138. # print(own_algorithm(tasks))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement