我已经使用OptaPlanner 6.2实现了一个传感器调度问题,它有1个硬约束,1个中等约束和1个软约束。我遇到的麻烦是要么在30秒左右之后能够满足一些困难的约束,然后求解器在满足约束的情况下几乎没有进展,并需要额外的几分钟终止。我认为这个问题没有过度束缚,我也不知道如何帮助本地搜索过程显着提高分数。难以满足与Optaplanner同时硬和中等约束条件
我的问题是一个调度问题,其中我预先计算了传感器在解决问题之前可以观察对象的所有可能时间(间隔)。无间隔可以重叠
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类别中的特性/值
A:实体规划类;
答:实体规划类;每个实例都是对特定对象的赋值(即具有与Interval类中的对象相对应的成员objectid)
时间间隔:计划变量类,传感器和对象的所有可能间隔(开始时间,停止时间)
在A中,我将对B实例(间隔)的访问限制为与那个赋值关联的对象的访问。对于我的测试案例,有40000左右的间隔,但每个对象只有几十个。 A有大约1100个实例(每个实例有数十个可能的间隔)。
@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的一个培训邮编实验室处理这个问题,请参阅optaplanner.org - >学习 - >培训。 –