[英]Dynamic worker constraint in CPLEX python
我一直在使用 python 中的 docplex 解決 rcpsp 問題。 我考慮了 10 個具有指示性成本的任務,以及一個必須在 10 個時間范圍內(可以是幾周、幾天等)完成這些任務的工人。
我的一個限制是工人可以在每個時間范圍內執行一組特定的任務(worker_availability 列表)。 如果我考慮下面鏈接中的示例,可以將工作人員的可用性限制為不超過特定點,即 mdl.sum(resources) <= capacity,其中容量是一個固定數字。
我想使用服從worker_availability的動態約束,即在點0我的工人可以處理2個任務,在1 0個任務等。
有誰知道如何在 python 中使用 docplex?
鏈接: http://ibmdecisionoptimization.github.io/docplex-doc/cp/visu.rcpsp.py.html?highlight
import numpy as np
import pandas as pd
import sys
import time
from docplex.cp.model import *
# Tasks to be planned
Tasks= ["task1",
"task2",
"task3",
"task4",
"task5",
"task6",
"task7",
"task8",
"task9",
"task10"]
# Duration of Tasks
Task_Duration = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
# Cost of tasks
Cost= {"task1": 700,
"task2": 1200,
"task3": 189,
"task4": 296,
"task5": 562,
"task6": 584,
"task7": -100,
"task8": -200,
"task9": - 189,
"task10": -296
}
# Define time interval, worker availability
time_interval = number_of_week - ReleaseDate
worker_availability = [2,0,2,0,2,0,2,1,1,1]
timespan = 10
# Create model
model = CpoModel()
# Create interval variables
itvs = {}
for i,t in enumerate(Tasks):
_name = '_'+str(t)
itvs[t] = model.interval_var(start=(0, INTERVAL_MAX), end = (INTERVAL_MIN,10), size = Duration[i], name = _name)
# case of static constraints - this is where we need to get it to dynamic
tasks = [model.pulse(itvs[t], 1) for t in Tasks]
model.add(model.sum(tasks) <= 2)
# Solve the model
tmp = 0
time_interval = number_of_week - ReleaseDate
for task in Tasks:
tmp += Cost[task] + Cost[task] * model.max([time_interval - model.start_of(itvs[task]),0])
model.add(model.minimize(tmp))
msol = model.solve(FailLimit=300000)
# Print output
for t in Tasks:
wt = msol.get_var_solution(itvs[t])
print(t,'start at:',wt.get_start())
print('Cost: ', msol.get_objective_values()[0])
print('worker availability: ',worker_availability)
你可以依靠always_in
讓我舉一個OPL的例子。
using CP;
range r=1..2;
dvar interval itvs[r] size 3;
cumulFunction simultaneousJobs=sum(i in r) pulse(itvs[i],1);
minimize max(i in r) endOf(itvs[i]);
subject to
{
simultaneousJobs<=2;
//alwaysIn(simultaneousJobs,0,1,0,1);
}
給出 3 作為最佳目標,對於我們看到的同時工作
如果我們取消注釋 alwaysIn,我們得到 4 作為目標,然后我們看到 cumul
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.