OptaPlanner按原始顺序迭代自定义移动



我有一个基本的日程安排任务,我试图在一系列时间段中安排活动。我正在创建一个初始解决方案,在该解决方案中,我将活动分配到非常接近它们应该结束的时间段,例如:

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;
}

我已经在我的配置中将我的选择顺序设置为原始:

<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只将活动向后移动到需要的位置,而不进一步移动?

听起来您想要使用<constructionHeuristic>,而不是<localSearch>。看看文档中关于构造启发式的章节。

如果您坚持使用<localSearch>,请配置一个<pickEarlyType>。请参阅pickEarlyType上的"本地搜索"部分的文档。

相关内容

  • 没有找到相关文章

最新更新