Optaplanner。根据PlanningSolution属性动态定义约束条件。

问题描述 投票:0回答:1

假设我有 这个 实施一项 ConstraintProvider.

package com.example.solver;

import com.example.domain.Lesson;
import org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScore;
import org.optaplanner.core.api.score.stream.Constraint;
import org.optaplanner.core.api.score.stream.ConstraintFactory;
import org.optaplanner.core.api.score.stream.ConstraintProvider;
import org.optaplanner.core.api.score.stream.Joiners;

public class TimeTableConstraintProvider implements ConstraintProvider {

    @Override
    public Constraint[] defineConstraints(ConstraintFactory constraintFactory) {
        return new Constraint[] {
                roomConflict(constraintFactory),
                teacherConflict(constraintFactory),
        };
    }

    private Constraint roomConflict(ConstraintFactory constraintFactory) {
        return constraintFactory.from(Lesson.class)
                .join(Lesson.class,
                        Joiners.equal(Lesson::getTimeslot),
                        Joiners.equal(Lesson::getRoom),
                        Joiners.lessThan(Lesson::getId))
                .penalize("Room conflict", HardSoftScore.ONE_HARD);
    }

    private Constraint teacherConflict(ConstraintFactory constraintFactory) {
        return constraintFactory.from(Lesson.class)
                .join(Lesson.class,
                        Joiners.equal(Lesson::getTimeslot),
                        Joiners.equal(Lesson::getTeacher),
                        Joiners.lessThan(Lesson::getId))
                .penalize("Teacher conflict", HardSoftScore.ONE_HARD);
    }

假设我只想用以下方法来约束。roomConflict 以防 PlanningSolution 具有布尔属性 considerRoomConflict. 同样地,我只想使用 roomConflict 以防 PlanningSolution 具有布尔属性 considerTeacherConflict.

假设我有5个这样的条件。什么是一个好的实现呢?

optaplanner
1个回答
1
投票

使用 @ConstraintConfiguration@ConstraintWeight. 一些optaplanner-example使用它。

@ConstraintWeight("Teacher conflict")
// To disable, change to HardSoftScore.ZERO
private HardSoftScore teacherConflict = HardSoftScore.ONE_HARD;

然后使用 penalizeConfigurable() 而不是 penalize():

constraintFactory.from(Lesson.class)
.join(...)
.penalizeConfigurable("Teacher conflict")
© www.soinside.com 2019 - 2024. All rights reserved.