当前位置: 首页 > 知识库问答 >
问题:

依赖于计划变量的值范围提供程序

子车高超
2023-03-14

问题

是否可以创建一个动态ValueRangeProvider,其值范围取决于规划变量的当前值?或者有什么其他的方法可以达到这种想要的效果?

  • 轮班需要分配员工,以便尽可能多地覆盖轮班的持续时间
  • 员工只能在每个轮班和每个员工唯一的特定时间内开始
  • 员工和他们的开始时间都需要作为严格的硬约束进行优化(员工不能被安排到没有可用时间的班次,而且开始时间也不能超出该员工在该班次的可用时间)
  • 员工工作的持续时间被贪婪地选择,以填充尽可能多的轮班时间(当开始时间改变时,由阴影变量控制)。
  • 班次的间隔不是均匀的,也不是相同的持续时间。它们可以有任何开始/结束时间,并且可能会重叠(员工无法在不同的班次之间轻松地互换)
  • 员工仍然可以被分配到多个班次,甚至可以在不同时间被分配到同一班次,只要该员工的分配时间与其他分配时间的重叠程度不超过为该员工定义的固定最大值。大多数员工将有固定的最大值1(即在重叠时间内不能工作两个重叠的班次)。

规划实体的数量是可变的,但这是一个不同的问题。当前的解决办法是生成与每次轮班的持续时间一样多的计划实体,但这将快速创建数百万个实体,而这些实体大多以空分配结束。

尝试

我试图在ShiftAssignment(PlanningEntity)上设置一个ValueRangeProvider,它基于当前分配的员工的可用时间返回一个可数值范围,但对于第一个被分配的员工来说,这似乎是静态的。我的下一个尝试是让ValueRangeProvider返回一个@CustomShadowVariable的实例,该实例将在设置新员工时更改可用性,但这似乎与第一种方法没有任何不同的效果。

另一个想法是创建一个自定义移动工厂,它只生成当前员工可以开始的有效时间,但这仍然不会阻止员工的更改打破其时间无效的硬限制。这种方法似乎更像是需要一个额外的自定义移动工厂来更改员工,在员工更改时显式地将startTime变量更改为该员工的有效时间。

现在,我忽略了无法在ValueRangeProvider中强制执行约束,只返回一个由shift的开始/结束时间设置的ValueRange(对于每个不同的shift都是固定的)。这增加了搜索空间,并且在员工被更改后无法在选择的时间开始时,生成许多硬约束断裂的解决方案。它似乎永远找不到更好的解决方案,因为它没有机会改进开始时间变量。通过更改求解器参数(我不是很擅长),这可能会部分缓解,但搜索空间仍然会比必要的大很多。

任何帮助或在正确的方向上的一个点将非常感谢。谢谢!

共有1个答案

太叔正文
2023-03-14

最后,我为每个Employee和Employee可用于的每个时间范围创建了一个ShiftAssignment实体的新实例,这样每个实体上的ValueRangeProvider将是静态的,这似乎符合我的目的。不是让员工和开始时间都是计划变量,而是现在只有开始时间是一个变量,但可以为null,以指示特定的员工/轮班/可用性实体没有分配给轮班。

 类似资料:
  • 在为android项目添加新的依赖项时,特别是在中,在中,有三个作用域选项compile/provide/apk。

  • 根据Maven完整参考中的图像,当直接依赖关系范围为“编译”并且传递依赖关系的范围为“提供”时,传递依赖关系将被忽略。 我的问题是,如果直接依赖类从我的项目的传递依赖编译中扩展一个类将失败,因为在编译时'javac'将从传递依赖中寻找由直接依赖扩展的类,并且不会在编译时类路径中找到它,因为maven忽略了它。 基本上这就是编译直接依赖时编译传递依赖范围而不是运行时的原因,为什么提供传递依赖范围时不

  • 我已经将maven依赖项的范围更改为提供并手动复制到tomcat/lib(以减小war文件的大小)。 在我的启动脚本中设置CATALINA_OPTS可以解决这个问题,为什么?

  • 本章介绍当模板在访问变量时发生了什么事情,还有变量是如何存储的。 当调用 Template.process 方法时,它会在方法内部创建一个 Environment 对象,在 process 返回之前一直使用。 该对象存储模板执行时的运行状态信息。除了这些,它还存储由模板中指令,如 assign, macro, local 或 global 创建的变量。 它不会尝试修改传递给 process 的数据

  • 问题内容: 我知道变量作用域由块的开始和块的结尾包围。如果在块内声明了相同的变量,则会发生编译错误。但是,请看以下示例。 在这里,可以在方法中重新声明,尽管它已经在类中声明了。但是在块中,无法重新声明。 为什么类范围变量的重新声明不产生错误,而方法范围变量的重新声明却产生错误? 问题答案: 这是因为不是变量,而是实例字段。允许局部变量与字段具有相同的名称。为了区分变量和具有相同名称的字段,我们在实

  • 问题内容: 我知道变量作用域由块的开始和块的结尾包围。如果在块内声明了相同的变量,则会发生编译错误。但是,请看以下示例。 在这里,可以在方法中重新声明,尽管它已经在类中声明了。但是在块中,无法重新声明。 为什么类范围变量的重新声明不产生错误,而方法范围变量的重新声明却产生错误? 问题答案: 这是因为不是变量,而是实例字段。允许局部变量与字段具有相同的名称。为了区分变量和具有相同名称的字段,我们在实