APS开源源码解读: 排程工具 optaplanner II
上篇
排产,原则上也就是分配时间,分配资源;保证资源日历约束,保证工艺路线约束。我们看一下如何实现optaplanner 优化的
- 定义一个move, 一个move可能改变了分配到的资源,也可能改变了一个资源上的顺序。改变即意味着优化的可能
- 原本分配的资源,把后工序移到前面来。前后各算一个score. 通过socreDirector中定义的beforeVariableChanged/afterVariableChanged
- 再更新另一个资源上的链,同时前后继续scoreDirector触发
- 另一个shadow variable: Start time,通过StartTimeUpdatingVariableListener触发改变。这里的改变保证了不同资源上的job满足工艺路线的约束
模型
如何建模对一个优化问题非常关键
Chain Structure:
The previousAllocation can now be either a Resource (anchor) or another Allocation
Resource becomes a shadow variable automatically updated based on the chain
This creates a clean chain: Resource -> Allocation1 -> Allocation2 -> …
Move Simplification:
No need for separate resource change moves
Single ChainChangeMove handles both resource changes and sequence changes
When moving to a different resource, just set the previous to be the resource
When moving within same resource, set previous to be another allocation
Benefits:
Simpler code structure
Fewer variables to maintain
More efficient move generation
Better encapsulation of the chaining logic
Automatic resource updates through shadow variable
过程
本文我们继续试图学习optaplanner来进行排产规划。
When a move changes an allocation’s resource and/or sequence:
When OptaPlanner/timefold selects a move:
- Check if move is doable (isMoveDoable)
- Verify resource compatibility
- Check for circular dependencies
- Validate sequence constraints
- Execute the move (doMove)
- Update primary planning variables
- Shadow variable listener triggers
- Start/end times cascade update
- Score calculation
- Check hard constraints
- Resource conflicts
- Job dependencies
- Resource compatibility
- Evaluate soft constraints
- Makespan
- Setup times
- Resource preferences
- Accept/Reject move based on score
- If better: keep change
- If worse: maybe keep (based on meta-heuristic)
The previousAllocation shadow variable is updated first
This triggers the AnchorShadowVariable (resource) to update
The StartTimeUpdatingVariableListener then recalculates timing
Chain Update Process:
When an allocation moves to a new resource:
a. It disconnects from its old chain (previous/next allocations are relinked)
b. Inserts into new resource’s chain at specified position
c. Updates shadow variables (resource, start time) for moved allocation
d. Recursively updates all downstream allocations in both chains
Impact on Route Dependencies:
The StartTimeUpdatingVariableListener ensures timing consistency
When start time changes, it propagates updates down the chain
If jobs have dependencies across resources, you’ll need additional constraints
Can add precedence constraints between related jobs
例如
Before:
Resource1 -> Allocation1 -> Allocation2 -> Allocation3
Resource2 -> Allocation4 -> Allocation5
After:
Resource1 -> Allocation1 -> Allocation3
Resource2 -> Allocation4 -> Allocation2 -> Allocation5
The system will:
Update Allocation2’s previousAllocation to Allocation4
Update Allocation2’s resource to Resource2
Recalculate start times for Allocation2 and all subsequent allocations
Update Allocation3’s previousAllocation to Allocation1
Recalculate start times in Resource1’s chain
细节
当一个move发生的时候:
- isMoveDoable() is checked
- doMove() is called if move is doable
- Score is calculated after each change
- Move is accepted/rejected based on score
During doMove()
- beforeVariableChanged() notifies ScoreDirector
- Chain updates occur
- afterVariableChanged() notifies ScoreDirector
- Shadow variables update automatically
- Score calculator runs automatically
Score calculation triggers:
- After every genuine variable change
- After shadow variables update
- After variable listeners complete their updates
- Before move acceptance/rejection decision
// Move implementation for changing position in chain
public class ChainChangeMove extends AbstractMove<JobShopSchedule> {private final Allocation allocation;private final Object newPrevious; // Can be Resource or Allocation@Overrideprotected void doMoveOnGenuineVariables(ScoreDirector<JobShopSchedule> scoreDirector) {Object oldPrevious = allocation.getPreviousAllocation();Allocation nextAllocation = findNextAllocation(allocation);// Remove allocation from old chain positionif (nextAllocation != null) {scoreDirector.beforeVariableChanged(nextAllocation, "previousAllocation");nextAllocation.setPreviousAllocation(oldPrevious);scoreDirector.afterVariableChanged(nextAllocation, "previousAllocation");}// Insert allocation at new chain positionAllocation newNext = null;if (newPrevious instanceof Allocation) {newNext = findNextAllocation((Allocation) newPrevious);}// Update the moved allocation's previousscoreDirector.beforeVariableChanged(allocation, "previousAllocation");allocation.setPreviousAllocation(newPrevious);scoreDirector.afterVariableChanged(allocation, "previousAllocation");// Update the next allocation's previous if it existsif (newNext != null) {scoreDirector.beforeVariableChanged(newNext, "previousAllocation");newNext.setPreviousAllocation(allocation);scoreDirector.afterVariableChanged(newNext, "previousAllocation");}}
}
ScoreDirector manages this process
scoreDirector.beforeVariableChanged()
→ Make changes
→ scoreDirector.afterVariableChanged()
→ Shadow updates
→ Score calculation
→ Move acceptance
For chain moves specifically:
a. Original chain score is calculated
b. Move changes are applied
c. New chain score is calculated
d. Downstream impacts are scored
e. Total impact determines move acceptance
相关文章:
APS开源源码解读: 排程工具 optaplanner II
上篇 排产,原则上也就是分配时间,分配资源;保证资源日历约束,保证工艺路线约束。我们看一下如何实现optaplanner 优化的 定义一个move, 一个move可能改变了分配到的资源,也可能改变了一个资源上的顺序。改变即意味着优…...
科技是把双刃剑,巧用技术改变财务预测
数字化和全球化的双向驱动,引领我国各行各业在技术革新的浪潮中不断扬帆。这一趋势不仅带来了前所未有的突破与创新,推进企业迈向数据驱动决策的新未来,同时也伴随着一些潜在的问题和挑战。科技的普及就像是一场革命,在财务管理领…...
vscode默认添加python项目的源目录路径到执行环境(解决ModuleNotFoundError: No module named问题)
0. 问题描述 vscode中编写python脚本,导入工程目录下的其他模块,出现ModuleNotFoundError: No module named 错误 在test2的ccc.py文件中执行print(sys.path) 查看路径 返回结果发现并无’/home/xxx/first_demo’的路径,所以test2下面的文…...
【每日刷题】Day143
【每日刷题】Day143 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 200. 岛屿数量 - 力扣(LeetCode) 2. LCR 105. 岛屿的最大面积 - 力扣&…...
基于Springboot智能学习平台的设计与实现
基于Springboot智能学习平台的设计与实现 开发语言:Java 框架:springboot JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:idea 源码获取:https://download.csdn.net/downlo…...
黑马javaWeb笔记重点备份11:Web请求与响应
请求 SpringBoot内置Servlet 在Tomcat这类Web服务器中,是不识别我们自己定义的Controller的,但在tomcat中是可以识别 Servlet程序的。在SpringBoot进行web程序开发时,它内置了一个核心的Servlet程序 DispatcherServlet,称之为 核…...
H5对接海康硬盘录像机视频简单说明
开发过程中使用HTML5(通常是通过Web技术栈,如HTML、CSS、JavaScript)与海康威视(Hikvision)的硬盘录像机(DVR)进行视频对接,通常涉及以下步骤: 获取DVR的RTSP流地址:海康威视DVR支持RTSP协议,你可以通过DVR的管理界面获取每个摄像头的RTSP流地址。 使用视频播放器库…...
测试人必备的Linux常用命令大全...【全网最全面整理】
Linux常用命令大全(非常全!!!) 最近都在和Linux打交道,感觉还不错。我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因,…...
苹果AI落后两年?——深度解析苹果在AI领域的挑战与前景
# 苹果AI落后两年?——深度解析苹果在AI领域的挑战与前景 近年来,人工智能(AI)领域的技术竞争日益激烈,各大科技巨头纷纷推出突破性的AI产品。然而,关于苹果公司在AI领域的表现,最近传出一些内…...
三菱PLC伺服-停止位置不正确故障排查
停止位置不正确时,请确认以下项目。 1)请确认伺服放大器(驱动单元)的电子齿轮的设定是否正确。 2)请确认原点位置是否偏移。 1、设计近点信号(DOG)时,请考虑有足够为0N的时间能充分减速到爬行速度。该指令在DOG的前端开始减速到爬行速度&…...
Mybatis 批量操作存在则更新或者忽略,不存在则插入
Mybatis 批量操作新增,如果存在重复有下列2种处理方式: 1、存在则忽略代码示例: <insert id"insertDuplicateKeyIgnoreList">INSERT IGNORE INTO specs(status,type,code,name,create_time,create_by)VALUES<foreach col…...
「C/C++」C++ STL容器库 之 std::deque 双端队列容器
✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…...
一招教你解决Facebook广告账号问题
这段时间,我们写了很多文章来探讨Facebook的广告账户问题:《Facebook被封号该怎么办》《Facebook二不限、三不限账号是什么》《Facebook海外户(三不限)和账单户该如何选择》《如何区分真假Facebook三不限海外户》相信看过这些文章…...
MySQL启动报错:InnoDB: Unable to lock ./ibdata1 error
MySQL启动报错:InnoDB: Unable to lock ./ibdata1 error 在OS X环境下MySQL启动时报错: 016-03-03T00:02:30.483037Z 0 [ERROR] InnoDB: Unable to lock ./ibdata1 error: 35 2016-03-03T00:02:30.483100Z 0 [Note] InnoDB: Check that you do not alr…...
Linux终端之旅: 打包和压缩
在 Linux 世界中,打包和压缩文件是管理系统资源、传输数据和备份的重要技能。通过命令行工具如 tar、gzip、zip 等,我们可以高效地将多个文件或目录打包为一个文件,并通过压缩减少其体积。接下来,我将记录学习如何利用这些工具&am…...
PDA手持机提升管理效率和准确性
在当今快节奏的商业世界中,管理效率和准确性是企业成功的关键因素。而 PDA 手持机的出现,为企业管理带来了革命性的变革,成为提升管理效率和准确性的有力武器。 PDA 手持机,即个人数字助理手持设备,集数据采集、存储、…...
C++ [项目] 愤怒的小鸟
现在才发现C游戏的支持率这么高,那就发几篇吧 零、前情提要 此篇为 制作,由于他没有CSDN,于是由我代发 一、基本介绍 支持Dev-C5.11版本(务必调为英文输入法),基本操作看游戏里的介绍,怎么做的……懒得说,能看懂就看注释,没有的自己猜,如果你很固执……私我吧 …...
群控系统服务端开发模式-市场分析
刚刚我把群控系统服务端开发模式的文档全部整理了一下,结果发现还缺市场分析这篇文档没有上传,不好意思啦。 一、前言 在互联网高速发展且稳定的时代,营销系统是自运营公司线上最好的系统。加上现在直播行业很火,引流很重要&#…...
智能听诊器革新宠物健康监测
在宠物健康护理领域,智能听诊器的引入标志着一个新时代的开启,它正成为宠物医疗保健的新宠。这款设备通过高精度传感器捕捉宠物的心跳和呼吸声,为宠物主人和兽医提供精确的健康数据。 智能听诊器的即时反馈功能,使得主人能够通过…...
2000-2023年上市公司绿色专利申请授权面板数据
2000-2023年上市公司绿色专利申请授权面板数据 1、时间:2000-2023年 2、来源:国家知识产权局、WPIO清单 3、指标:年份、股票代码、股票简称、行业名称、行业代码、省份、城市、区县、区县代码、上市状态、绿色专利申请总量、绿色发明专利申…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
