难以与Optaplanner同时满足硬性和中度约束

时间:2015-10-20 18:03:06

标签: constraints scheduling optaplanner

我使用OptaPlanner 6.2实现了传感器调度问题,该问题具有1个硬约束,1个中等约束和1个软约束。我遇到的麻烦是,我可以在30秒左右之后满足一些硬约束,然后解算器在满足它们的约束时会有很少的进展,并且会有额外的终止时间。我不认为这个问题过于局限;我也不知道如何帮助本地搜索过程显着提高分数。

我的问题是调度问题,我预先计算传感器在解决之前可以观察物体的所有可能时间(间隔)。我已将问题建模如下:

  1. 硬约束 - 没有间隔可以重叠

     when
       $s1: A( interval!=null,$id: id, $doy : interval.doy, $interval: interval, $sensor: interval.getSensor())
      exists A( id > $id, interval!=null, $interval2: interval, $interval2.getSensor() == $sensor, $interval2.getDoy() == $doy, $interval.getStartSlot() <= $interval2.getEndSlot(), $interval.getEndSlot() >= $interval2.getStartSlot() )
     then
       scoreHolder.addHardConstraintMatch(kcontext,-10000);
    
  2. 中等约束 - 每个作业都应具有间隔

    when
      A(interval==null)
    then
      scoreHolder.addMediumConstraintMatch(kcontext,-100);
    
  3. 软约束 - 最大化Interval类中的属性/值

    when
      $s1: A( interval!=null)
    then
      scoreHolder.addSoftConstraintMatch(kcontext,-1 * $s1.getInterval().getSomeProperty())
    
  4. A:实体计划类;每个实例都是特定对象的赋值(即具有与Interval类中的一个对应的成员objectid)

    间隔:计划变量类,传感器和对象的所有可能间隔(开始时间,停止时间)

    在A中,我将对B实例(间隔)的访问限制为与该分配关联的对象的访问权限。对于我的测试用例,有40000个左右的间隔,但每个对象只有几十个。大概有1100个A的实例(每个实例有几十个可能的间隔)。

    @PlanningVariable(valueRangeProviderRefs = {"intervalRange"},strengthComparatorClass = IntervalStrengthComparator.class, nullable=true)
    public Interval getInterval() {
        return interval;
    }
    
    @ValueRangeProvider(id = "intervalRange")
    public List<Interval> getPossibleIntervalList() {
        return task.getAvailableIntervals();
    }
    

    在我的解决方案课程中:     //已尝试对此进行评论,因为整体间隔列表不适用于所有A     @ValueRangeProvider(id =“intervalRangeAll”)     public List getIntervalList(){         返回间隔;     }

    @PlanningEntityCollectionProperty
    public List<A> getAList() {
        return AList;
    }
    

    我查看了文档并尝试了很多东西。我的问题在于育儿和课程安排示例之间的交叉,我已经看过了。我正在使用FIRST_FIT_DECREASING构造启发式。

    我尝试过:

    1. 在A.getInterval()
    2. 的计划变量注释中打开和关闭nullable
    3. 迟到,Tabu,两者。
    4. 基准。我没有看到任何问题和平均
    5. 添加IntervalChangeFactory作为moveListFactory。将自定义ChangeMove限制为是否可以接受间隔(即强制执行或不强制IntervalChangeMove.isDoable中的硬约束)。
    6. 这是一个示例,其中大多数硬约束不满足,但中等约束是:

      [main] INFO org.optaplanner.core.impl.solver.DefaultSolver - Solving  started: time spent (202), best score (0hard/-112500medium/0soft), environment  mode (REPRODUCIBLE), random (WELL44497B with seed 987654321).
      [main] INFO org.optaplanner.core.impl.constructionheuristic.DefaultConstructionHeuristicPhase - Construction Heuristic phase (0) ended: step total (1125), time spent (2296), best score (-9100000hard/0medium/-72608soft).
      [main] INFO org.optaplanner.core.impl.localsearch.DefaultLocalSearchPhase - Local Search phase (1) ended: step total (92507), time spent (30000), best score (-8850000hard/0medium/-74721soft).
      [main] INFO org.optaplanner.core.impl.solver.DefaultSolver - Solving ended: time spent (30000), best score (-8850000hard/0medium/-74721soft), average calculate count per second (5643), environment mode (REPRODUCIBLE).
      

      所以我不明白为什么搜索过程无法处理硬约束。由于我所做的所有修补,我每秒的计算次数已降至10000以下。

1 个答案:

答案 0 :(得分:1)

如果不是由于得分陷阱(请参阅文档,这是第一个要修复的问题),可能是因为它陷入局部最优并且没有从1开始的移动除了那些没有太大变化的解决方案之外,另一个可行解决方有几种方法可以解决这个问题:

  • 添加粗粒度移动(但仍然保留精细粒度的移动,例如ChangeMove!)。您可以添加通用课程粒度移动(例如支柱移动)或添加自定义移动。不要开始制作更聪明的选择器,试图只选择可行的动作,这是一个坏主意(因为它会杀死你的ACC或限制你的搜索空间)。只需混合粒度移动(=多样化)来补充细粒度移动(=强化)。
  • 更好的域模型也可能有所帮助。项目作业调度和廉价时间调度示例具有域模型,该模型自然会导致较小的搜索空间,同时仍然允许所有可行的解决方案。
  • 增加禁忌列表大小,LA大小或在SA起始温度中使用硬约束。但我认为你已经尝试过使用基准测试程序了。
  • 启用TRACE日志以查看optaplanner的决策。只有在达到局部最佳值后才能看到它。
  • 将来,我还会添加Ruin&amp; Recreate移动,这将远远少于自定义移动或更好的域模型(但效率会降低)。