for i in range(NB_RESOURCES): lops = [] for k, j in enumerate(TASKS): if j["rnd"] == i: lops.append(tasks[k]) mdl.add(mdl.no_overlap(lops)) # Учтём матрицу активности for i in LINKED_TASKS: for k, j in enumerate(TASKS): if k == i["task_num"]: mdl.add(mdl.forbid_start(tasks[k], RND_CALENDAR[i["linked_rnd"]])) mdl.add(mdl.forbid_end(tasks[k], RND_CALENDAR[i["linked_rnd"]])) for k, j in enumerate(TASKS): mdl.add(mdl.forbid_extent(tasks[k], RND_CALENDAR[j["rnd"]])) for k, j in enumerate(TASKS): mdl.add( mdl.forbid_extent(tasks[k], get_deadline_area(TASKS[k]["deadline"]))) # Минимизируем время завершения последней задачи mdl.add(mdl.minimize(mdl.max([mdl.end_of(t) for t in tasks]))) # ----------------------------------------------------------------------------- # Решение solver'ом и вывод # ----------------------------------------------------------------------------- print("Solving model....") msol = mdl.solve(FailLimit=100000, TimeLimit=10) print("Solution: ")
vx = [ mdl.interval_var(size=WEIGHT_SIZE_A[i], name="X" + str(i), end=(0, SIZE_SHELF["x"] * SHELF_COUNT)) for i in range(NB_WEIGHTS) ] vy = [ mdl.interval_var(size=WEIGHT_SIZE_B[i], name="Y" + str(i), end=(0, SIZE_SHELF["y"] * 1)) for i in range(NB_WEIGHTS) ] # Запретим пересекать границы полок и учтём температуры for i in range(NB_WEIGHTS): mdl.add( mdl.forbid_extent(vx[i], get_allowable_area(SHELVES, 'x', PRODUCT_T[i]))) # Запретим пересечение продуктов for i in range(NB_WEIGHTS): for j in range(i): mdl.add((mdl.end_of(vx[i]) <= mdl.start_of(vx[j])) | (mdl.end_of(vx[j]) <= mdl.start_of(vx[i])) | (mdl.end_of(vy[i]) <= mdl.start_of(vy[j])) | (mdl.end_of(vy[j]) <= mdl.start_of(vy[i]))) # Соберём списки продуктов, которые не могут быть рядом for i in range(NB_WEIGHTS): for j in range(i): if ((PRODUCT_CATS[i], PRODUCT_CATS[j]) in INCOMPATIBLE_GROUPS) or ( (PRODUCT_CATS[j], PRODUCT_CATS[i]) in INCOMPATIBLE_GROUPS): print("Find incompatible group ({}, {})".format(