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、指标:年份、股票代码、股票简称、行业名称、行业代码、省份、城市、区县、区县代码、上市状态、绿色专利申请总量、绿色发明专利申…...
普通人 0 基础能转网安吗?转行路径全面拆解,告诉你到底值不值得
前言 最近在后台有看到很多朋友问我关于网络安全转行的问题,今天做了一些总结,其中最多的是,觉得目前的工作活多钱少、不稳定、一眼望到头,还有一些就是目前工作稳定但是缺乏上升空间的。总的来说,大家主要的问题是&a…...
PolyWin 多融易|预测赛道的崛起:当人工智能体开始理解未来
PolyWin 多融易|预测赛道的崛起:当人工智能体开始理解未来过去十年,互联网行业经历了从移动支付、数字资产、去中心化金融到人工智能的多轮变革。每一次技术升级,都会带来新的商业模式,也会重新定义市场对于“信息、数…...
基于BLE与CircuitPython的无线8-bit音乐合成器DIY全攻略
1. 项目概述与核心思路想不想亲手做一个能揣在口袋里,随时随地弹奏出复古8-bit音乐的小玩意儿?不是那种手机App模拟的,而是实实在在的、有物理按键、能无线连接、还会发光的小合成器。今天分享的这个项目,就是基于两块小巧但功能强…...
FPGA与以太网:从MII接口到UDP通信的实战解析
1. 以太网通信与FPGA开发入门 第一次接触FPGA以太网开发时,我被各种专业术语搞得晕头转向。MII、PHY、MAC、UDP这些名词像天书一样,直到真正动手做了一个数据采集项目才豁然开朗。以太网通信看似复杂,其实拆解开来就是硬件接口协议栈数据处理…...
tcpdive性能评估报告:CPU占用率与QPS影响分析终极指南
tcpdive性能评估报告:CPU占用率与QPS影响分析终极指南 【免费下载链接】tcpdive A TCP performance profiling tool. 项目地址: https://gitcode.com/gh_mirrors/tc/tcpdive tcpdive作为一款专业的TCP性能分析工具,在生产环境中的性能表现至关重要…...
LEANN:基于选择性重计算的本地向量检索,实现97%存储压缩
1. 项目概述:LEANN,一个重新定义本地向量检索的开源项目如果你和我一样,对当前AI应用生态里动辄需要将个人数据上传到云端、依赖昂贵且臃肿的向量数据库感到厌倦,那么LEANN的出现,绝对会让你眼前一亮。这不仅仅是一个工…...
Adobe-GenP激活工具:5分钟解锁Adobe创意套件全功能
Adobe-GenP激活工具:5分钟解锁Adobe创意套件全功能 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP Adobe-GenP是一款专为Adobe Creative Cloud用户设计的…...
pyecharts-assets终极指南:告别网络依赖,打造本地可视化环境
pyecharts-assets终极指南:告别网络依赖,打造本地可视化环境 【免费下载链接】pyecharts-assets 🗂 All assets in pyecharts 项目地址: https://gitcode.com/gh_mirrors/py/pyecharts-assets 还在为pyecharts图表加载慢而烦恼吗&…...
ElevenLabs声音库实战速配:7类行业场景(播客/教育/游戏)精准选声公式大公开
更多请点击: https://intelliparadigm.com 第一章:ElevenLabs声音库核心能力全景图解 ElevenLabs 声音库并非传统意义上的静态音频集合,而是一套基于深度神经语音合成(DNNS)的实时可编程语音基础设施。其核心能力围绕…...
RAG 系统性能优化完全指南:从“答非所问“到“精准命中“的六步进化
🎯 RAG 系统性能优化完全指南:从"答非所问"到"精准命中"的六步进化 一句话总结:本文用餐厅备菜的类比,拆解 RAG 系统六大优化环节——从智能切菜、混合找料、精选食材到严控火候,让你的 AI 回答又…...
