예제 #1
0
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: ")
예제 #2
0
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(