【发布时间】:2015-10-20 18:03:06
【问题描述】:
我使用 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:实体规划类;每个实例都是对特定对象的赋值(即有一个成员 objectid 与 Interval 类中的一个对应)
间隔:规划变量类,传感器和对象的所有可能间隔(开始时间,停止时间)
在 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") 公共列表 getIntervalList() { 返回间隔; }
@PlanningEntityCollectionProperty
public List<A> getAList() {
return AList;
}
我查看了文档并尝试了很多方法。我的问题有点像我看过的看护和课程安排示例之间的交叉。我正在使用 FIRST_FIT_DECREASING 构造启发式。
我尝试过的:
- 在 A.getInterval() 的计划变量注释中打开和关闭可为空
- 延迟接受,禁忌,两者都有。
- 基准测试。我没有看到任何问题和平均水平
- 将 IntervalChangeFactory 添加为 moveListFactory。将自定义 ChangeMove 限制为是否可以接受间隔(即是否强制执行 IntervalChangeMove.isDoable 中的硬约束)。
这是一个示例,其中大多数硬约束不满足,但中等的有:
[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 以下。
【问题讨论】:
-
请参阅文档中的“分数陷阱”:硬约束可能会惩罚重叠时间,而不是固定权重(无论它们重叠很多还是很少)。
-
我将硬约束惩罚更改为 -10,但这并没有什么不同。也许我误解了您所说的“惩罚重叠时间,而不是固定权重”的意思。在文档中描述的 3 种方法中,我已经在做第一种了。我尝试了第二个,将重叠惩罚约束规则用作媒介,然后是软约束(同时保持硬约束),但这并没有什么不同。第三种方式涉及更多,但除非您有其他建议,否则我会看看。
-
将其更改为 -10 仍使其成为固定权重,无论重叠多少时间。不知道如何改进文档。 IIRC 培训 zip 实验室之一处理此问题,请参阅 optaplanner.org -> 学习 -> 培训。
-
固定重量的替代品是什么?
-
我误解了你原来的括号。我相信“惩罚重叠”时间是指通过有多少重叠时间来衡量硬约束惩罚。
标签: constraints scheduling optaplanner