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

如何修复Optaplanner中的构造启发式?

太叔志尚
2023-03-14

求解器必须处理一个规划实体和两个规划变量。它为会议分配一个时间间隔和一个房间。由于构造启发式的搜索空间很大,我不得不实现顺序移动选择。

<constructionHeuristic>
    <constructionHeuristicType>FIRST_FIT</constructionHeuristicType>
    <changeMoveSelector>
      <valueSelector variableName="startingTimeGrain"/>
    </changeMoveSelector>
    <changeMoveSelector>
      <valueSelector variableName="room"/>
    </changeMoveSelector>
</constructionHeuristic>

这样做的问题是,求解器有时会指定一个没有可用房间的时间序列,所以当要分配房间时,求解器无法找到一个不打破硬约束的房间。

然后,局部搜索阶段能够找到一个解决方案,不打破任何硬约束,但我必须运行它很长时间,以获得一个好的解决方案质量。例如,求解器将返回远程会议分配,即使我有一个旨在尽快返回分配的软限制。

我如何修改或优化我的构造启发式,使它不会选择一个没有任何可用空间的时间序列?

共有1个答案

谭玉泽
2023-03-14

通常约束如下所示:

when
    MyEntity(myFirstVar != null, mySecondVar != null, ...)
    ...
then ...

现在,当第一个var已经被顺序分配,而第二个则不是时,这个规则将永远不匹配实体。所以第一步只做:

when
    MyEntity(myFirstVar != null, ...)
    ...
then ...

接下来,您可能可以添加一个约束,专门执行这样的操作来影响Ch:

when
    accumulate(
         MyEntity(myFirstVar != null, mySecondVar == null, ...)
         sum(roomUsage) > capacity
then ...
 类似资料:
  • 在Optaplanner中,我注意到每个动作都有变量变化侦听器。和 SolverEventListener for bestSolutionChanged 在每个阶段后计算。但是,我找不到每个步骤末尾的变化。有什么建议可以听取施工启发式阶段的步骤变化吗?提前谢谢。

  • 我正在学习OptaPlanner库。我非常简单的测试似乎工作得很好。正如我在XML配置中指定的,计划运行在20秒后终止。 然后我添加 计划几乎立即终止,结果非常糟糕,甚至打破了硬约束。 在手册中我看到: 构造启发式自动终止,因此通常不需要在构造启发式阶段专门配置终止。 这与整个规划运行有关吗?如果是,那么为什么它需要终止?我认为构造启发式的重点是构造好的初始位置,然后开始规划。我观察到的情况不是这

  • 我创建了一个用于解决运动方程问题的交互式类(在用户输入循环中的另一个类中访问:mathiverse),它工作得很好,但是在给出答案后,它抛出一个。 线程“main”java.util.NoSuChelementException:在mathiverse.main(mathiverse.java:53)的java.base/java.util.scanner.nextline(scanner.jav

  • 使用npm start启动React应用程序时发生此错误。。。 我试过以下方法: > 卸下node_模块包并重新安装 使用纱线代替npm 使用npm3.updatefsevent库 仍然得到这个错误吗 注意:如果我们创建反应应用程序新鲜/新纱线启动将工作,但我们关闭终端,并使用以下相同的东西重新启动错误发生 返回(新事件(路径))。打开('fsevent',回调)。start()^ TypeErr

  • 有没有一种方法可以将自定义移动放入构建启发式中?我正在从事一个项目,该项目接近optaplanner中的护士名册问题,但除了将员工分配到轮班任务之外,我还需要将员工分配到轮班中所需的小任务。所以当我将员工安排在轮班中时,我需要将员工安排在所有他可以完成的小任务中(有技能)。我不希望这是第二个计划实体,员工是计划变量,我只是希望当我将员工分配到一个班次时,循环处理该班次内的所有小任务(在班次的开始和