我有一个基本的调度任务,我试图在时间列表中安排活动。我正在创建一个初始解决方案,其中我分配的活动非常接近它们应该结束的时间段,例如:
activity a -> timeSlot 10
activity b -> timeSlot 50
activity c -> timeSlot 100
从这一点开始我想要的是OptaPlanner简单地向后移动那些活动,一次一次地移动,直到我的硬约束或软约束都没有被破坏。
我已经创建了一个自定义更改移动工厂,我正试着这样做:
public List<Move> createMoveList(ActivityScheduler activityScheduler) {
List<Move> moveList = new ArrayList<>();
List<TimeSlot> timeSlotList = activityScheduler.getTimeSlotList();
for (Activity activity : activityScheduler.getActivityList()) {
for (int n = activity.getStartingTimeSlot().getIndex(); n >= 0; n--) {
moveList.add(new TimeSlotChangeMove(activity, timeSlotList.get(n)));
}
}
return moveList;
}
我已在配置中将我的选择顺序设置为ORIGINAL:
<localSearch>
<moveListFactory>
<selectionOrder>ORIGINAL</selectionOrder>
<moveListFactoryClass>...TimeSlotChangeMoveFactory</moveListFactoryClass>
</moveListFactory>
...
我所希望的是,当它移动说活动c时,它会将它移动到时间段99,然后是98,97等,直到没有约束被打破。但这不是发生的事情;例如其中一个步骤显示:
2014-08-27 13:37:12.382 DEBUG 7401 --- [nio-8080-exec-8] o.o.c.i.l.DefaultLocalSearchSolverPhase :
Step index (1), time spend (326), score (-16hard/13soft), new best score (-16hard/13soft),
accepted/selected move count (1000/2242) for picked step (Do Homework #2 -> Required Slots: 2 Starting TimeSlot: TimeSlot 2035 => TimeSlot 1240).
它将活动方式移回太远(从插槽2035到1240)。我怎样才能让OptaPlanner在需要的时候尽可能地移动活动呢?
答案 0 :(得分:0)
听起来您想使用<constructionHeuristic>
,而不是<localSearch>
。看一下关于建构启发式的文档章节。
如果您坚持使用<localSearch>
,请配置<pickEarlyType>
。有关本地搜索的文档,请参阅pickEarlyType
。