![](/img/trans.png)
[英]How to initiate the interval variable bounds in docplex (python)?
[英]docplex - set an interval_var's size as a function of another variable
在 IBM 的 docplex 優化庫中,您可以將interval_var
的大小參數設置為另一個變量的 function 嗎? 意思是說,對於這個例子,我想讓任務大小取決於工人的技能水平。 如果工人的技能等級為 2,而另一個工人的技能等級為 1,則第一個工人完成任務的速度是前者的兩倍。 因此,該任務的interval_var
的大小參數應該是task.duration / skill_level
。
它通常根據文檔設置為 integer 值,所以我想知道是否有解決方法可以實現這一點。
從例子:
Task = (namedtuple("Task", ["name", "duration"]))
TASKS = {Task("masonry", 35),
Task("carpentry", 15),
Task("plumbing", 40),
Task("ceiling", 15),
Task("roofing", 5),
Task("painting", 10),
Task("windows", 5),
Task("facade", 10),
Task("garden", 5),
Task("moving", 5),
}
tasks = {} # dict of interval variable for each house and task
for house in HOUSES:
for task in TASKS:
tasks[(house, task)] = mdl.interval_var(start=period_domain,
end=period_domain,
size=task.duration,
name="house {} task {}".format(house, task))
有兩種可能:
1- 通常,如果您必須處理具有不同技能的工人,您還必須在調度問題中處理分配給工人的任務。 在這種情況下,對於給定的任務(例如“砌體”),您將為每個可能的工人(或每個技能)創建一個可選的間隔變量,並且您將在此間隔變量上指定與技能相關的持續時間。 例如,請參閱交付的 Python 示例“house_building_optional.py”(盡管在此示例中,我們假設持續時間與工人無關)。 所以你最終會得到一個像這樣的模式:
tasks = [ interval_var(name='Task{}'.format(i)) for i in ... ]
tasksOnWorkers = [ [ interval_var(optional=True, size=DURATION[i,j], name='Task{}_Worker{}'.format(i,j)) for j in ...] for i in ... ]
model.add(alternative(tasks[i], [tasksOnWorkers[i][j] for j in ...]) for i in ...)
另有說明,在您提到的示例中,您不會在此處指定大小:
tasks[(house, task)] = mdl.interval_var(start=period_domain,
end=period_domain,
size=task.duration,
name="house {} task {}".format(house, task))
但是,在這里:
for house in HOUSES:
for skill in SKILLS:
iv = mdl.interval_var(name='H' + str(house) + '-' + skill.task + '(' + skill.worker + ')')
iv.set_optional()
wtasks[(house, skill)] = iv
2- 在資源分配的情況下,上述方法是首選方法。 但您也可以使用 integer 表達式 length_of length_of(intervalVar)
來約束間隔的長度:
x = interval_var() # By default length is unconstrained in [0,INTERVAL_MAX)
model.add(length_of(x) == 'Whatever integer expression or variable in the model')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.