python - 如何使用 docplex.cp(约束编程)对可中断任务的调度问题进行建模?
问题描述
我想使用约束编程(CPLEX 的 Python API:docplex.cp)对调度问题进行建模,其中我有机器要分配给活动。活动是在轮班期间进行的,有些任务最多可以分为三个部分,但也不能分成几个部分。我使用区间变量对活动进行建模,并使用可选区间变量(带有“替代”约束)对设备分配进行建模。给定任务的不同部分可以使用不同的设备或相同的设备来执行。
一种天真的方法可能是强制划分长期活动,但我想确保模型仅在必要时选择划分。
提前感谢您的想法和帮助!
解决方案
最好的方法是创建一个间隔链,并在需要少于全部段数时使用逻辑原语来使用较低索引的那些。这是一个代码:
from docplex.cp.model import CpoModel
cp = CpoModel()
n = 3
total_duration = 100
itvs = [ cp.interval_var(optional=True, name="I_{}".format(i)) for i in range(n) ]
for i in range(1, n):
cp.add(cp.end_before_start(itvs[i-1], itvs[i]))
#cp.add(cp.presence_of(itvs[i-1]) >= cp.presence_of(itvs[i]))
cp.add(cp.if_then(cp.presence_of(itvs[i]), cp.presence_of(itvs[i-1])))
cp.add(cp.sum(cp.length_of(itvs[i]) for i in range(n)) == total_duration)
cp.export_as_cpo("chain.cpo")
然后,您将在 chain.cpo 文件中包含以下内容:
#line 11 "chain.py"
I_1 = intervalVar(optional);
I_0 = intervalVar(optional);
I_2 = intervalVar(optional);
//--- Expressions ---
#line 11 "chain.py"
endBeforeStart(I_0, I_1);
#line 13
presenceOf(I_1) => presenceOf(I_0);
#line 11
endBeforeStart(I_1, I_2);
#line 13
presenceOf(I_2) => presenceOf(I_1);
#line 15
sum([lengthOf(I_0), lengthOf(I_1), lengthOf(I_2)]) == 100;
推荐阅读
- c - 为什么我的二叉树搜索函数不返回根地址?
- outlook-addin - Item_Load 事件:Outlook.ActiveExplorer().Selection 不为 null 但不能强制转换为 Selection(抛出异常)为什么?
- express - 在 Redis 中存储 JWT 令牌的标准做法是什么?
- android - ViewModel 不会触发 mutablelivedata 的观察者
- html - 使用 XMLHttpRequest 读取文本文件?
- python - Pytest:查找每个测试的开始和结束时间
- swagger - 对于 post 请求产生关键字类型不会成为响应标头内容类型
- shell - Angular 8 中的代码编辑器(ace 编辑器)(文本/JavaScript/sh/sh 等编辑器)
- c++ - 如何使用块更改 matrixXd 特征中的值?
- batch-file - VLC 命令行转换并不总是有效