微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

docplex - 将 interval_var 的大小设置为另一个变量的函数

如何解决docplex - 将 interval_var 的大小设置为另一个变量的函数

在 IBM 的 docplex 优化库中,您能否将 interval_var 的大小参数设置为另一个变量的函数?意思是,对于 this example 我想让任务大小取决于工人的技能水平。如果工人的技能等级为 2,而另一个工人的技能等级为 1,则第一个工人的任务完成速度是原来的两倍。因此,该任务的 interval_var 的大小参数应该是 task.duration / skill_level

通常根据文档将其设置为整数值,所以我想知道是否有解决方法可以实现这一点。

来自示例:

Task = (namedtuple("Task",["name","duration"]))
TASKS = {Task("masonry",35),Task("carpentry",15),Task("plumbing",40),Task("ceiling",Task("roofing",5),Task("painting",10),Task("windows",Task("facade",Task("garden",Task("moving",}

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- 在资源分配的情况下,上述方法是首选方法。但是你也可以使用整数表达式 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')

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。