我有一个基于MeetingScheduling示例的案例。 结果很好。 调度从构造启发阶段开始。 然后是本地搜索阶段。 CH阶段减少了硬约束和中等约束惩罚,而LS似乎减少了软限制惩罚。
我发现当我重新运行调度时,CH阶段再次减少了硬和中等约束惩罚。 那么,我们可以将求解器配置为多次交替CH et LS阶段吗?
当前解算器配置:
<?xml version="1.0" encoding="UTF-8"?>
<solver>
<solutionClass>org.optaplanner.examples.meetings.domain.MeetingSchedule</solutionClass>
<entityClass>org.optaplanner.examples.meetings.domain.Meeting</entityClass>
<scoreDirectorFactory>
<scoreDrl>org/optaplanner/examples/meetings/solver/meetingsScoreRules.drl</scoreDrl>
</scoreDirectorFactory>
<termination>
<minutesSpentLimit>20</minutesSpentLimit>
</termination>
</solver>
答案 0 :(得分:0)
这应该有效:
static <T, U extends T, A, R> Collector<T, ?, R> instanceOf(Class<U> type
, Collector<U, A, R> downstream) {
return filtering(type::isInstance, Collectors.mapping(type::cast, downstream));
}
static <T, A, R>
Collector<T, ?, R> filtering(Predicate<? super T> predicate
, Collector<T, A, R> downstream) {
return new Collector<T, A, R>() {
@Override
public Supplier<A> supplier() {
return downstream.supplier();
}
@Override
public BiConsumer<A, T> accumulator() {
BiConsumer<A, T> target = downstream.accumulator();
return (result, it) -> {
if (predicate.test(it)) {
target.accept(result, it);
}
};
}
@Override
public BinaryOperator<A> combiner() {
return downstream.combiner();
}
@Override
public Function<A, R> finisher() {
return downstream.finisher();
}
@Override
public Set<Characteristics> characteristics() {
return downstream.characteristics();
}
};
}
使用程序化API,您可以将其动态化为n。
话虽如此,这可能是次优解决方案。正确的解决方案是重新加热(尚不支持)。