我使用OptaPlanner 6.2实现了传感器调度问题,该问题具有1个硬约束,1个中等约束和1个软约束。我遇到的麻烦是,我可以在30秒左右之后满足一些硬约束,然后解算器在满足它们的约束时会有很少的进展,并且会有额外的终止时间。我不认为这个问题过于局限;我也不知道如何帮助本地搜索过程显着提高分数。
我的问题是调度问题,我预先计算传感器在解决之前可以观察物体的所有可能时间(间隔)。我已将问题建模如下:
硬约束 - 没有间隔可以重叠
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);
中等约束 - 每个作业都应具有间隔
when
A(interval==null)
then
scoreHolder.addMediumConstraintMatch(kcontext,-100);
软约束 - 最大化Interval类中的属性/值
when
$s1: A( interval!=null)
then
scoreHolder.addSoftConstraintMatch(kcontext,-1 * $s1.getInterval().getSomeProperty())
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构造启发式。
我尝试过:
这是一个示例,其中大多数硬约束不满足,但中等约束是:
[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以下。
答案 0 :(得分:1)
如果不是由于得分陷阱(请参阅文档,这是第一个要修复的问题),可能是因为它陷入局部最优并且没有从1开始的移动除了那些没有太大变化的解决方案之外,另一个可行解决方有几种方法可以解决这个问题:
TRACE
日志以查看optaplanner的决策。只有在达到局部最佳值后才能看到它。