Advertisement
Guest User

Untitled

a guest
Feb 6th, 2022
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.01 KB | None | 0 0
  1. from ortools.sat.python import cp_model
  2. from dataclasses import dataclass
  3.  
  4.  
  5. def flatten(container):
  6.     for i in container:
  7.         if isinstance(i, (list,tuple)):
  8.             for j in flatten(i):
  9.                 yield j
  10.         else:
  11.             yield i
  12.  
  13.  
  14. model = cp_model.CpModel()
  15.  
  16.  
  17. horizon = 15
  18. workers = [1, 2, 3, 4]       # worker id
  19. workers_job_num = [3, 1, 1, 2]  # how much jobs every worker have
  20. job_types = [1, 2, 3, 4, 5]     # job type id
  21. job_type_num = [2, 1, 2, 1, 1]  #how much jobs every type have
  22. jobs = [(1, 1, 1, 3, 1),           # job id, job type, start, length, worker id
  23.         (2, 1, 6, 3, 1),
  24.         (3, 2, 1, 1, 1),
  25.         (4, 3, 4, 2, 2),
  26.         (5, 3, 10, 2, 3),
  27.         (6, 4, 7, 4, 4),
  28.         (7, 5, 9, 1, 4)]
  29.  
  30. intervals_by_hour = []
  31. bools_by_hour = []
  32. start_by_hour = []
  33. end_by_hour = []
  34. for h in range(horizon):
  35.     intervals_by_worker = []
  36.     bools_by_worker = []
  37.     start_by_worker = []
  38.     end_by_worker = []
  39.     for w in workers:
  40.         intervals_by_type = []
  41.         bools_by_type = []
  42.         start_by_type = []
  43.         end_by_type = []
  44.         for jt in job_types:
  45.             intervals_by_job_by_type = []       # all the jobs of some type for a worker
  46.             bools_by_job_by_type = []
  47.             start_by_job_by_type = []
  48.             end_by_job_by_type = []
  49.             for job in jobs:                    
  50.                 if (jt == job[1]) and (w == job[4]):        # if jobType == current type of job and worker assigned to the job
  51.                     performed_at = model.NewBoolVar("performed by %dh %dw %dj %dt" % (h, w, job[0], jt))
  52.                     start = model.NewIntVar(h, h, "start of %dh %dw %dj %dt" % (h, w, job[0], jt))
  53.                     end = model.NewIntVar(0, horizon, "end of %dh %dw %dj %dt" % (h, w, job[0], jt))
  54.                     optint = model.NewOptionalIntervalVar(start, job[3], end, performed_at, "interval of %dh %dw %dj %dt" % (h, w, job[0], jt))
  55.                     bools_by_job_by_type.append(performed_at)
  56.                     intervals_by_job_by_type.append(optint)
  57.                     start_by_job_by_type.append(start)
  58.                     end_by_job_by_type.append(end)
  59.             intervals_by_type.append(intervals_by_job_by_type)
  60.             bools_by_type.append(bools_by_job_by_type)
  61.             start_by_type.append(start_by_job_by_type)
  62.             end_by_type.append(end_by_job_by_type)
  63.         intervals_by_worker.append(intervals_by_type)
  64.         bools_by_worker.append(bools_by_type)
  65.         start_by_worker.append(start_by_type)
  66.         end_by_worker.append(end_by_type)
  67.     intervals_by_hour.append(intervals_by_worker)
  68.     bools_by_hour.append(bools_by_worker)
  69.     start_by_hour.append(start_by_worker)
  70.     end_by_hour.append(end_by_worker)
  71.  
  72. print("eereer")
  73.  
  74. ########################################################
  75. # разделяем работы по рабочему
  76. jobIntervals_by_worker = []
  77. for w in workers:
  78.     jobIntervals_by_worker.append([])
  79.  
  80. s = 4
  81. l = 1
  82. f = s+1
  83. sleep_interval = model.NewIntervalVar(s, l, f, "test sleep interval for every worker")
  84. # sleep_interval = model.NewIntervalVar(1, 1, 2, "test sleep interval for every worker")
  85.  
  86. for ih in intervals_by_hour:
  87.     for iw in range(len(ih)):
  88.         jobIntervals_by_worker[iw] += flatten(ih[iw])
  89.  
  90.  
  91.  
  92.  
  93. # jobs of worker
  94. for ji in jobIntervals_by_worker:
  95.     ji += [sleep_interval]      # append test sleep interval
  96.     model.AddNoOverlap(ji)
  97.  
  98. ########################################################
  99. # jobs by job type
  100. jobIntervals_by_type = []
  101.  
  102. for t in job_types:
  103.     jobIntervals_by_type.append([])
  104.  
  105. for i_hour in intervals_by_hour:
  106.     for i_worker in i_hour:
  107.         for i_type in range(len(i_worker)):
  108.             jobIntervals_by_type[i_type] += flatten(i_worker[i_type])
  109.  
  110. # jobs of one type dont overlap
  111. for ji in jobIntervals_by_type:
  112.     model.AddNoOverlap(ji)
  113.  
  114. ########################################################
  115. # performed_at by job type
  116. performedAt_by_type = []
  117. for t in job_types:
  118.     performedAt_by_type.append([])
  119.  
  120. for b_hour in bools_by_hour:
  121.     for b_worker in b_hour:
  122.         for b_type in range(len(b_worker)):
  123.             performedAt_by_type[b_type] += flatten(b_worker[b_type])
  124.  
  125. # performed_at (and their intervals) <= needed amount of jobs
  126. for i in range(len(performedAt_by_type)):
  127.     model.Add(cp_model.LinearExpr.Sum(performedAt_by_type[i]) <= job_type_num[i])
  128.  
  129. ########################################################
  130. # performed_at by workers
  131. performedAt_by_worker = []
  132. for t in workers:
  133.     performedAt_by_worker.append([])
  134.  
  135. for b_hour in bools_by_hour:
  136.     for b_w in range(len(b_hour)):
  137.         performedAt_by_worker[b_w] += flatten(b_hour[b_w])
  138.  
  139. # performed_at (and their intervals) <= needed amount of jobs
  140. for i in range(len(performedAt_by_worker)):
  141.     model.Add(cp_model.LinearExpr.Sum(performedAt_by_worker[i]) <= workers_job_num[i])
  142. ########################################################
  143.  
  144. model.Maximize(cp_model.LinearExpr.Sum(flatten(bools_by_hour)))
  145.  
  146.  
  147.  
  148. solver = cp_model.CpSolver()
  149. solver.parameters.log_search_progress = True
  150. status = solver.Solve(model)
  151.  
  152. print("##################################")
  153. print("Amount of jobs: ", len(jobs))
  154. print("Jobs scheduled: ", solver.ObjectiveValue())
  155. print("##################################")
  156. if status == cp_model.FEASIBLE or status == cp_model.OPTIMAL or status == cp_model.UNKNOWN:
  157.     for h in range(len(bools_by_hour)):
  158.         for w in range(len(bools_by_hour[h])):
  159.             for jt in range(len(bools_by_hour[h][w])):
  160.                 for job in range(len(bools_by_hour[h][w][jt])):                  # jobs of one type
  161.                     # print(solver.Value(bools_by_hour[h][w][jt][job]))
  162.                     if solver.Value(bools_by_hour[h][w][jt][job]) == 1:
  163.                         print(bools_by_hour[h][w][jt][job].Name())
  164.                         print(solver.Value(start_by_hour[h][w][jt][job]), solver.Value(end_by_hour[h][w][jt][job]))
  165.                     #     print("qwqwqw")
  166. else:
  167.     print("Unfeasible")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement