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

Drools OptaPlanner按原始顺序迭代自定义移动,drools,optaplanner,Drools,Optaplanner,我有一个基本的日程安排任务,我试图在一个时间段列表中安排活动。我正在创建一个初始解决方案,在该解决方案中,我将活动分配到最接近其结束时间的位置,例如: activity a -> timeSlot 10 activity b -> timeSlot 50 activity c -> timeSlot 100 从这一点上说,我想要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;
}

它将活动向后移动太远(从插槽2035移到1240)。如何让OptaPlanner将活动移动到需要的最远位置,而不是更远的位置?

听起来您想使用
,而不是
。请看文档中关于构造启发式的一章


如果您坚持使用
,请配置
。请参阅本地搜索文档,关于
pickEarlyType

啊…感谢您的回复,但我仍然需要一些帮助。我使用了一个简单的first fit构造启发式(没有局部搜索),但这仍然没有按照我想要的方式安排事情。如果我有一个从插槽100开始的活动,我希望它向后移动到插槽99,而不是插槽1,这就是正在发生的事情。阅读文档并不能说明我如何做到这一点;你能提供进一步的见解吗?看看文档中的计划值强度和最弱拟合。
<localSearch>
    <moveListFactory>
        <selectionOrder>ORIGINAL</selectionOrder>
        <moveListFactoryClass>...TimeSlotChangeMoveFactory</moveListFactoryClass>
    </moveListFactory>
    ...
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).