【问题标题】:docplex - set an interval_var's size as a function of another variabledocplex - 将 interval_var 的大小设置为另一个变量的函数
【发布时间】:2021-05-01 18:53:21
【问题描述】:

在 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",   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))

【问题讨论】:

    标签: optimization constraint-programming docplex cp-optimizer


    【解决方案1】:

    有两种可能:

    1- 通常,如果您必须处理具有不同技能的工人,您还必须处理调度问题中的任务分配给工人。在这种情况下,对于给定的任务(例如“masonry”),您将为每个可能的工人(或每个技能)创建一个可选的间隔变量,并且您将在此间隔变量上指定与技能相关的持续时间。例如,请参阅交付的 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')
    

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      相关资源
      最近更新 更多