首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Optaplanner约束流在列表属性上联接

OptaPlanner 约束流在列表属性上联接

基础概念

OptaPlanner 是一个开源的约束求解器,用于解决优化问题。它通过定义约束来确保解决方案满足特定的业务规则。约束流(Constraint Streams)是 OptaPlanner 6.0 引入的一种新的约束定义方式,它允许开发者使用流式 API 来定义约束,这种方式更加直观和灵活。

相关优势

  1. 声明式编程:约束流使用声明式编程风格,使得约束的定义更加直观和易于理解。
  2. 性能优化:OptaPlanner 的内部优化器可以对约束流进行优化,提高求解效率。
  3. 灵活性:约束流支持复杂的逻辑组合和条件判断,能够处理各种复杂的约束场景。

类型

OptaPlanner 约束流主要分为以下几种类型:

  • Filter:过滤操作,用于筛选出符合条件的实体。
  • Map:映射操作,用于将实体转换为其他形式。
  • FlatMap:扁平化映射操作,用于将嵌套结构展开。
  • Collect:收集操作,用于将流中的元素收集到一个集合中。
  • Join:联接操作,用于将两个流中的元素进行匹配和组合。

应用场景

约束流在列表属性上联接的应用场景包括但不限于:

  • 资源分配:在多个项目和资源之间进行分配,确保每个项目都有足够的资源。
  • 排班系统:在员工和班次之间进行匹配,确保每个班次都有足够的员工,并且员工的休息时间得到保障。
  • 车辆路径规划:在多个客户和车辆之间进行路径规划,确保每个客户都能被访问到,并且总行驶距离最短。

问题与解决

假设我们在使用 OptaPlanner 进行排班时,遇到了一个问题:如何确保每个员工的排班不会超过其最大工作小时数?

问题原因: 这个问题通常是由于没有正确地定义约束流来检查每个员工的总工作时间。

解决方法: 我们可以使用约束流来定义这个约束。以下是一个示例代码:

代码语言:txt
复制
import org.optaplanner.core.api.score.stream.Constraint;
import org.optaplanner.core.api.score.stream.ConstraintFactory;
import org.optaplanner.core.api.score.stream.Joiners;
import org.optaplanner.core.api.score.stream.tri.TriConstraintCollectors;

public class ShiftSchedulingConstraintProvider implements ConstraintProvider {

    @Override
    public Constraint[] defineConstraints(ConstraintFactory constraintFactory) {
        return new Constraint[] {
            constraintFactory.from(Schedule.class)
                .join(Schedule.class, Joiners.equal(Schedule::getEmployee))
                .join(Schedule.class, Joiners.equal(Schedule::getEmployee))
                .filter((schedule1, schedule2, schedule3) -> 
                    schedule1.getEndTime().isBefore(schedule2.getStartTime()) ||
                    schedule2.getEndTime().isBefore(schedule3.getStartTime())
                )
                .penalize("Employee worked too many hours",
                    HardSoftScore.ofHard(1),
                    TriConstraintCollectors.sumLong(
                        (schedule1, schedule2, schedule3) -> 
                            Duration.between(schedule1.getStartTime(), schedule3.getEndTime()).toHours()
                    )
                )
        };
    }
}

在这个示例中,我们使用了 join 操作来联接同一个 Schedule 实体的不同实例,然后通过 filter 操作来确保这些实例不会重叠。最后,我们使用 penalize 操作来惩罚超过最大工作小时数的情况。

参考链接

通过这种方式,我们可以有效地解决在列表属性上联接时遇到的问题,并确保解决方案满足业务规则。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

OptaPlanner规划引擎的工作原理及简单示例(2)

,特别是关于将约束应用于业务规则的理解。...要理清这些问题,需要对业务模型有深入的理解,并能很准确地对这些因素进行归纳,把它们抽象成约束条件。为了简化问题,在本例中,成本反映在机台的启用成本。...这是对的,只要我们有明确的软硬约束要求,理论是可以写出对应的程序,通过强大的CPU算法,甚至可以将程序写成并发运算,集成数量庞大的GPU算力,兴许能找最终方案的。...它具有固定的特性要求: 必须被注解为@PlanningSolution;本例中,它至少有三个属性: machineList - 机台列表,就是可以用于分配任务的机台,本例中指的就是上述那6个机台;taskList...还有一个是score属性,它用于在规划过程中对各种约束的违反情况进行打分,因为本例中存在了硬约束与软约束。因此我们使用的Score为 HardSoftScore.

3.7K11

OptaPlanner笔记3

2.2.6 定义约束并计算得分 *score(分数)*表示特定解决方案的质量,越高越好。OptaPlanner通过在可用时间寻找最高得分的解决方案的方式来寻找最优方案,它也可能是最佳方案。...由于此用例具有硬约束和软约束, 可以使用HardSoftScore类来表示分数: 不能打破硬约束。例如:一个房间最多可以同时一节课。 不应打破软约束。例如:教师更喜欢在相同的房间里教学。...硬约束与其他硬约束进行加权。 软约束也会与其他软约束进行加权。无论每种约束的权重如何,硬约束的权重总是超过软约束。...// 规划方案类 @PlanningSolution public class TimeTable { // 值域提供器 @ValueRangeProvider // 问题事实集合属性...问题事实和规划实体属性 此外,OptaPlanner 还需要知道它可以更改哪些 Lesson 实例以及如何通过 TimeTableConstraintProvider 获取用于计算得分的 Timeslot

40121
  • OptaPlanner的新约束表达方式 Constraint Streams

    关于OptraPlanner的约束详细用法,可以参考官方资料: https://docs.optaplanner.org/7.41.0.Final/optaplanner-docs/html_single...对OptaPlanner有初步认识都清楚,我们使用OptaPlanner规划建模时,需要在模型中表达一系列约束,以描述各个业务实体的约束和规划的优化目标。...其逻辑是:从班次列表中找出所有分配给了Ann的班次,对每一个满足这个条件的班次进行扣分,并把分数加总作为方法的返回值。...我向Geoffrey查询过,他表示这些版本更多的情况是在实现一些引擎内部的优化和一些新的内部运算功能,但这些功能不一定反映到API,因此对于我们使用者来说,并没有太大的变化。...可是如果大家也跟进将OptaPlanner的程序包也更新到最新版本,就会发现,很多一些常用的接口、方法,都已经被标准为将为放弃,从Javadocs可以看到一些当前版本被标识为@Deprecated的方法

    1.3K30

    【译】OptaPlanner开发手册本地化: (0) - 前言及概念

    我认为应该在理解了作者原意的基础,再进一步以中文方式的表达,才算是真的的本地化。...OptaPlanner可以帮助Java程序员有效地解决约束满足问题, 在OptaPlanner引擎中,对每个有效的约束分数计算中,组合了启发式和元启发式算法。...事实,如果任何人只需证明是这种解法的存在与否,即可获得100万美元的奖励。   ...1.2.2 规划问题存在约束(包括硬约束与软件约束)   通常来说,一个规划问题至少包括两个层次的约束: (负面)硬约束,不可被违反。例如:一个教师在同节的时间内不能同时两门课。...(负面)软件约束,若可避免,它不应该被违反。例如:教师都不太喜欢在周五下午上课。   也有些问题存在一些正面的约束: 正面分数在可能情况下应该实现。例如:教师B喜欢在周一上午果。

    1.9K00

    OptaPlanner逐步学习(0) :基本概念 - 规划问题,约束与方案

    没错,它就是结合Drools(一个开源规则引擎)一起应用的(也可以单独使用),Drools在这里的作用主要是用来作编写计分脚本,事实完全可以抛开Drools,直接使用OptaPlanner自己的API...而我对OptaPlanner的理解,它是一个Planning Engine - 规划引擎,针对各行各业的业务需求,开发人员需要将一些业务规则翻译成约束,并对业务场景中的实体进行抽象建模,规划引擎根据上述约束和模型对象进行规划...上述第3点所做的工作就是一个规划的过程,也就是引擎会根据约束的限制和规划实体的特性,对这些规划实体进行时间或/和空间的规划;这个就是规划过程。...约束(硬约束与软约束)   而我们把业务规则定义为约束,其实目前针对排程方面的规划问题,主要是通过约束进行评分机制的寻优方法。...所以,如果对于所有规则问题,都是使用这些暴力枚举的办法,以现有世界的计算机的算力,很多问题是没办法找到最优解的。

    1.6K00

    OptaPlanner规划引擎的工作原理及简单示例(1)

    ,并在这个小程序的基础OptaPlanner中更多的概念,功能,及使用方法进行讲解。...在理解OptaPalnner是如何实现之前,我们先复习并展开一下一篇提到的概念 - 约束。...若出现种情况,即表示违反了硬约束,这种方案称作不可行方案。...体现在软约束,就是后面的排产表,其软约束上会比前一个排班表更好,违反的软约束更少。   上述讲述的是两种常见约束,那么这些约束OptaPlanner里是如何生效的呢?...因此,硬约束对应的扣除硬的分数有多有少就不难理解了。就是我们的方案如果出现了违反硬约束、被扣除了硬分数的,它在OptaPlanner就是一个不可行方案了。

    1.8K00

    OptaPlanner笔记1

    1.1 什么是OptaPlanner 每个组织都面临规划问题:为产品或服务提供有限的受约束的资源(员工、资产、时间和金钱)。OptaPlanner用来优化这种规划,以实现用更少的资源来做更多的业务。...OptaPlanner 是一个轻量级、可嵌入的约束满足问题求解引擎,可优化规划问题。它适用的场景例如: 员工轮班排班:为护士、修理工等排班。 议程安排:安排会议,约会,维护工作,广告等。...OptaPlanner可以帮助Java程序员有效地解决约束满足问题。它使用非常有效的得分计算,将优化启发式和元启发式算法结合在一起。...(至少,世界最聪明的计算机科学家还没有发现这样的灵丹妙药。 但是,如果他们找到一个适用于某个NP-Complete问题的解决方案,它将适用于每个NP-Complete问题。)...在 OptaPlanner 中,得分约束用面向对象的语言(例如Java代码)编写。这样的代码易于编写、灵活且可扩展。 1.2.3 规划问题存在巨大的搜索空间 规划问题有许多解决方案。

    50031

    普通企业的规划类项目中,OptaPlanner更适合作为APS的规划优化引擎

    这些都是目前世界顶级的求解器,已发展多年;无论是性能与通用性,都是数一数二的水平。...因此,在OptaPlanner求解过程的初始阶段,会有一个从业务模型到数学模型的转化过程,也就是把业务模型转化为规划核心程序可识别的数学模型,例如对于用Drools脚本表达的约束与优化目标(硬约束和软约束...但OptaPlanner也有一定的难点,主要表现在两方面的学习成本,存在以下两个方面的成本: Drools规则引擎的学习成本 在OptaPlanner目前主流的约束表达体系中,Drools...suject to在OptaPlanner中可视作硬约束, 目标函数则对应于OptaPlanner中的软约。...那么从业务识别出哪些是硬性约束,哪些是优化目标后,应该如何通过约束实现不同的规则与优化目标,则需要对OptaPlanner中的评分体系有一定的理解,否则会较容易超出OptaPlanner的一些设计限制

    2.5K00

    OptaPlanner 基本概念 - 规划问题, 约束,方案

    没错,它就是结合Drools(一个开源规则引擎)一起应用的(也可以单独使用),Drools在这里的作用主要是用来作编写计分脚本,事实完全可以抛开Drools,直接使用Optaplanner自己的API...而我对Optaplanner的理解,它是一个Planning Engine - 规划引擎,针对各行各业的业务需求,开发人员需要将一些业务规则翻译成约束,并对业务场景中的实体进行抽象建模,规划引擎根据上述约束和模型对象进行规划...上述第3点所做的工作就是一个规划的过程,也就是引擎会根据约束的限制和规划实体的特性,对这些规划实体进行时间或/和空间的规划;这个就是规划过程。...约束(硬约束与软约束)   而我们把业务规则定义为约束,其实目前针对排程方面的规划问题,主要是通过约束进行评分机制的寻优方法。...所以,如果对于所有规则问题,都是使用这些暴力枚举的办法,以现有世界的计算机的算力,很多问题是没办法找到最优解的。

    2.2K01

    机械师实时调度示例(I) - 实时规划

    "注意,(这些是机器维修师)它演示了OptaPlanner是如何优化他们的行走时间,使他们可以花更多的时候在维修机械。" "你打算就把这玩艺展示给7000多个商务客呀?"...这看起来是一个简单的约束,但事实它存在两个冲突的约束: 优先修复健康值最低的机器,因为最低健康值的机器,其崩溃的风险最高。 通过让机械师走最短的穿梭路径,让机械师尽量快的时间修复就近的机器 。...若只考虑最短路径一个约束,这就是一个TSP问题(旅行商问题)。...上述两个约束存在竞争的,它们各自会偏向输出以下不同的解决方案: 这两种约束对完成时间的影响差别不太明显,即如何影响机械师一次修复所有有故障机器的所需时间。...通过上图可以看出,这些只是存在一些约束差别的相同问题。

    90920

    机械师实时调度示例(I) - OptaPlanner实时规划

    "注意,(这些是机器维修师)它演示了OptaPlanner是如何优化他们的行走时间,使他们可以花更多的时候在维修机械。" "你打算就把这玩艺展示给7000多个商务客呀?"...这看起来是一个简单的约束,但事实它存在两个冲突的约束: 优先修复健康值最低的机器,因为最低健康值的机器,其崩溃的风险最高。 通过让机械师走最短的穿梭路径,让机械师尽量快的时间修复就近的机器 。...若只考虑最短路径一个约束,这就是一个TSP问题(旅行商问题)。...上述两个约束存在竞争的,它们各自会偏向输出以下不同的解决方案: image.png 这两种约束对完成时间的影响差别不太明显,即如何影响机械师一次修复所有有故障机器的所需时间。...image.png 通过上图可以看出,这些只是存在一些约束差别的相同问题。

    1.2K30

    OptaPlanner终于支持多线程并行运行 - Multithreaded solving

    OptaPlanner 7.9.0.Final之前,启动引擎开始对一个Problem进行规划的时候,只能单线程进行的。...就算是一些在业务逻辑无法实现并行运算的情况,在引擎自行调用指定的算法进行寻优时,若可以将每个Step,甚至每个Move的运行操作,适当地分配到不同的线程中执行,那么在多核CPU的环境下,无疑能大大提升规划运算性能...我在我的项目中启用了此功能,试用过各种类型的项目,其性能的提升基本在30% - 150%之间。对于运算量巨大的情况(约束多且复杂、问题规划大),确实能有不少的提升。   此功能在7.12.0....关于并行计算功能的更新信息如下: New and noteworthy: Engine 7.9.0.Final Multithreaded incremental solving OptaPlanner... 对于OptaPlanner有任何疑问,可以通过邮件将问题发到我邮件,我将及时处理。通过即时通讯工具,我确实没办法即时处理,导致无意忽略了不少信息。

    1.1K30

    人类的规划能力有多强大?

    本文章译自OptaPlanner官网上,Geoffrey De Smit先生的博文,链接如下:How good are human planners?...没错,除了每个点没有编号之外,你也不是在点找米老鼠(也没有特定的连接要求)。...这仅仅是一个只有一个约束条件的简单路线规划问题,而在现实世界中,还需要将其它的约束条件考虑进行,例如车辆的运量,现实公路网络限制及一些个性化的业务约束。这些约束将会形成一个更为复杂的问题。...通过使用自动规划引擎,例如OptaPlanner, 我们可以在更短的时候内击败人类,可以处理更多的约束和更大的数据值(即处理更多城市的TSP问题)。...地球最聪明的人。 一个平均水平,但可以访问互联网和维基百科的毕业生。 同样地,如果从两个人中选一个,你希望谁在你的组织中做规划优化的工作?

    83640

    多工序、多机台(产线)环境下的排程要点

    例如通过工序的就绪情况来确定资源的就绪要求,例如MRP等,这些硬性的约束可以通过规则引擎(例如Drools)来确保在生成计划过程中,计划的安排满足各种业务规则;而无需通过规划引擎(例如Optaplanner...这时候关于工序的资源分配,会有相应的资源使用约束。但更重要的约束是:一个产品的多个工序的处理次序,这个次序必然是根据产品的工序路线设定的资源来执行的,否则就违反了硬性约束。...对于一个资源(例如机台)的生产效率而言,如何可以实现更多的同工序连接生产,因为即使是使用同一资源,通常在该资源,不同工序的生产任务之间的切换,会产生成本的,有可能是时间成本,也有可能是具体的货币成本...但往往这也是体现出Optaplanner价值的其中一个要点。 2....最终我的解决办法是:对Optaplanner在规划过程中产生的每个可能方案,都进行模型的抽象与简化,去除一些不影响死循环判断的因素,把它归约成一个正正式式的有向图,并通过一些成熟的有向图环检测的算法对其进行判断

    2.3K91

    OptaPlanner - 从探究示例中的hello world 初步认识规划引擎的运行步骤

    一篇我们成功以把Opotaplanner规划引擎下载回来,并把它的示例运行起来,简单解析了一下它的Cloud balance示例。...简而言之,Cloud banacing就是模拟在云端有很多任务,需要根据CPU, 内存及带宽的要求,分配到不同的计算机上去执行,在满足了每个任务的基础,还需要实现最省计算机资源的原则。...这就是典型的资源规则问题了,大家可以扩展到供应链各个环节中的场景,例如APS(Advanced Planning and Scheduling, 高级计划与排程)中,如何将任务按一定的要求分配到指定的车间、产线甚至机台、工位,...其中CloudBalance是一个由我们定义的Planning Problem对象,被规则的对象都会作为Planning Problem对象的属性列表而传进引擎中,它是Opaplanner的几大基本对象之一...,在这个示例中,第8行就是创建了一个Planning Problem对象,大家可以导航进去看到,创建它的时候,是否为它的两个列表(Computer和Process列表)初始化了一些对象。

    1.5K30

    探究Optaplanner示例,初步认识规划引擎的运行步骤

    一篇我们成功以把Opotaplanner规划引擎下载回来,并把它的示例运行起来,简单解析了一下它的Cloud balance示例。...简而言之,Cloud banacing就是模拟在云端有很多任务,需要根据CPU, 内存及带宽的要求,分配到不同的计算机上去执行,在满足了每个任务的基础,还需要实现最省计算机资源的原则。...这就是典型的资源规则问题了,大家可以扩展到供应链各个环节中的场景,例如APS(Advanced Planning and Scheduling, 高级计划与排程)中,如何将任务按一定的要求分配到指定的车间、产线甚至机台、工位,...其中CloudBalance是一个由我们定义的Planning Problem对象,被规则的对象都会作为Planning Problem对象的属性列表而传进引擎中,它是Opaplanner的几大基本对象之一...,在这个示例中,第8行就是创建了一个Planning Problem对象,大家可以导航进去看到,创建它的时候,是否为它的两个列表(Computer和Process列表)初始化了一些对象。

    2.3K30

    人工智能包括约束求解器吗?

    以下是翻译Optaplanner创始人Geoffrey De Smet的一篇文章《Does A.I. include constraint solvers?》。   ...因为英语及中文表达习惯的差异,以该博文发表示Optaplanner官网,其描述的问题及概念具有一定的上下文关联性;因此,为了对还不太熟悉Optaplanner的同学更容易理解,令文章更符合中文母语读者的阅读习惯...其中添加了一些扩展性的意译,基本能在脱离Optaplanner官网上下文情况下,一定程序上表达到Geoffrey的意思吧,有不正之处请大家多多指点。为谢!   ...那么,约束求解器能否也使用人工智能的标签呢?...从历史上看,约束求解器(如Optaplanner)明显是运筹学的一个分支领域,同时也不能排除它属于其它领域(译 者注:约束求解器不仅仅属于运筹学领域).我认为约束求解器也可以纳入人工智能领域,不仅仅是一些论文和书刊如是说

    1.2K30

    Excel与Google Sheets中实现线性规划求解

    OR-Tools应用的文章,并与Optaplanner作些关联对比。...我们要求解的问题跟很多运筹学教材或科普书籍的例子一样,也是最简单的在确定的条件约束下,求最大利润下的产品生产方案问题。...在列表下方的【管理(A)】下拉框中选择【Excel加载项】,点击【“转到...】按钮,会弹加载项窗口,如下图。在【可用加载宏(A)】列表中,选中【规划求解加载项】,点击确定,窗口关闭。...完成后条件约束的内容如上图中的【遵守约束列表中的内容。   5.【选择求解方法】:该栏列举了目前可选择的三种求解算法,分别是【单纯线性规划】,即单纯形解法,【非线性GRG】和【演化】。...Variable Name, Coefficient:一步仅添加了约束Resource1的基本结构。本步骤将要完成不等式中的式子部分。

    3.8K20

    APS技术中的多目标规划问题

    ,软约束在现实业务中,通常对应于成本、机台开动率、生产效率、订单交期等。也就是说,软约束是一种定量约束,整个规划的目标首先是确保硬约束全部符合,再在此基础再力求提高软约束的符合程度。...因此,硬约束与软约束在一定的环境条件下,存在互相转换的可能。而在我们对规划模型进行设计时,这种转则是性质的改变。当一个因素作为硬约束存在时,它是反映在规划模型的限制条件中的。...通过Optaplanner实现上述步骤时,只需将【保证交期】、提高机台利用率】和【降低成本】三个目标设计对应的软约束(大家应该知道为什么要定义为软约束),通过BendableScore评分机制,定义为由高到低的三个层次即可...Optaplanner在求解时,将会按上述逻辑,根据不同层次的约束分数的优先次序,来求得相对最优解。...当引擎在优化运算时,会根据各个可能解决方案的实际的交期和成本属性,自行对比并选择较优的解决方案。但看似简单的设计逻辑,在实现起来却非常具挑战性,其难点在于如何分配这两个目标的权重。

    1.6K01

    体现公平性公式在规划问题中的应用

    本文是在Optaplanner创始人 Geoffrey De Smet先生的一篇文章《Formula for measuring unfairness》的基础上进行翻译而成。...因为其博文发表在Optaplanner的官网上,因此,其行文过程中存在一定的上下文默认情况,如果直译原文,将会大大降低其可读性。因此,本文是在原文的基础添加一些本人修饰的表达而成。...例如按4个公式计算结果一致的方案D和E,理论应该是具有相同的公平程度的,但事实这两个方案公平性并不一致。 最大值 如果我们对每个方案中,取最大任务数,作为公平性的衡量标准会怎么样呢?...那么在Optaplanner里要实现这种衡量方式,我们需要针对每个员工定一个分数级别,Optaplanner会按分数级别进行排序,来找最佳方案。但是,如果我们需要排的员工数量非常大呢?...原文地址: Formula for measuring unfairness​www.optaplanner.org

    68530
    领券