当前位置: 首页 > 知识库问答 >
问题:

OptaPlanner:基于PlanningSolution属性动态定义约束

奚昌胤
2023-03-14

假设我有一个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);
    }

共有1个答案

桓深
2023-03-14

@constraintconfiguration@constraintweight一起使用。一些OptaPlanner示例使用了它。

@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")
 类似资料:
  • 我正试图用OptaPlanner解决时间表问题,但我面临的问题可能与克隆问题有关。为什么我的计划实体收集方法看起来像这样 我犯错了 但是,当方法看起来像 一切都还好。有什么理由呢?为什么我会出现这个错误?谢谢你的帮助。

  • 本文向大家介绍python基于property()函数定义属性,包括了python基于property()函数定义属性的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了python基于property()函数定义属性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 正常情况下,类包含的属性应该是隐藏的,只允许通过类提供的方法来间接的实现对

  • 我正在评估OptaPlanner的一个规划问题。我已经看到了几个关于这个话题的回应,但没有一个完全像我正在寻找的。 似乎OptaPlanner在求解时需要静态数量的实体/变量。 如有任何指示,将不胜感激。

  • 我发现约束流无论如何都不适合我的目的,因为我无法在使用奖励或惩罚函数时控制基于匹配实体的分数级别。我将继续使用drools语法。

  • 我正在编写一个定制的spring starter,其中需要根据应用程序中定义的属性注册一个相同类型的bean列表。属性 我在应用程序中有以下属性。属性 自动配置类的当前实现如下 我想简单地在spring boot应用程序中用qualifer自动连接我的bean,如下所示 如何更改autoconfigure类以创建多个具有属性文件中定义的不同名称的bean(在本例中,如何创建bean mybean2

  • 我需要创建一个插件,提供一个交互式任务,调用方式如下: 在这里,参数应该是用于分析的项目中的配置的名称。 然而,这种分析需要从配置中计算一些数据,这可能很昂贵。因此,我想缓存这些数据,但是,很自然,在配置内容发生变化(例如用户添加了依赖项)的情况下,缓存会失效。理想情况下,我会利用内置的Gradle任务依赖机制,它将跟踪任务依赖关系,并允许不运行计算,除非其输入发生变化。 这是我想出的解决方案,但