备用构造启发式和本地搜索阶段

时间:2017-05-29 12:07:07

标签: optaplanner

我有一个基于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>

1 个答案:

答案 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。

话虽如此,这可能是次优解决方案。正确的解决方案是重新加热(尚不支持)。