OptaPlanner-车间调度个人总结

什么是车间调度

企业在生产过程中,以生产为中心,通过对有效的资源进行合理指挥、控制和调节,进而达到提高经济效益目的的问题。车间调度的优化工作在提高生产效率和降低生产成本方面起着非常重要的作用。
所以车间调度工作就是合理的调度资源,提高生产效率并且能够降低生产成本。

车间调度中的问题

在车间调度里,把一个调度问题中的对象,分为3类
1.规划实体:作业;
2.规划变量:执行机器(每台机器可以完成多种作业),作业时间,规划变量也分为常规变量和影子变量(随常规变量变化而变化);
3.问题常量:机器的承载,不同作业必须在指定机器上完成。
由问题常量可以引申成一个约束,约束又分为软约束以及硬约束。

硬约束:在车间调度中,硬约束是不能打破的,硬约束主要有:
1.作业优先级:作业只有在其所有先前作业完成后才能开始;
2.假设有5个作业分别为作业1、作业2…作业5,有3台机器分别为机1、机2、机3,机1上可完成作业1、作业2、作业5机2上可完成作业2、作业4机3上可完成作业1、作业3、作业4,所以作业5只能在机1上完成,作业3只能在机3上完成,这就是一个硬约束。
3.资源容量,所使用的资源不要超过可用的资源。资源是本地的(在同一项目的作业之间共享)或全局的(在所有作业之间共享);资源为可再生(每天可用)或不可再生(全天可用),容量减去已使用
4.还有一些是业务要求,也不细讲。

软约束:硬约束是作业加工中必须遵守的,那么软约束则是判定你完成所有作业的整体情况,是优是劣,都由软约束来打分(适应性函数,特定解决方案的质量,该值越高越好),软约束主要有:
1.成本:生产成本,
2.时间:生产一个作业所需时间,拿上面那个作业和机器的例子来讲,作业1、2、4可以分别在两台不同的机器上完成,不过在不同机器上完成,所需要的时间不同,这里就牵涉到了另一个软约束-效率。
3.效率:因为不同作业在不同机器上的完成时间不同,所有如何把作业安排到一个机器上,使得所有作业的完成时间能够得到优化,从而提升生产效率,这就是车间调度的核心问题。
4.质量:质量也是生产过程中要考虑的一个点,不过具体来说,只是每个作业在不同机器上的一个生产打分,所有可以把它和生产时间综合一起,给出一个评分。
5.环境:生产过程中难免会产生一些对环境造成影响的物质,因此环境因素也是值得考虑的一个点。

硬约束的权重不管多少,它都会超过软约束,如果违背了硬约束或者软约束,都会相应地扣分。

说完了硬约束和软约束,那么下面就来聊聊在车间调度中我们要实现的目标:
1.使用尽量少的机器数来完成尽量多的作业。
2.优先使用低成本的机器来完成作业。
3.减少机器的空置率,提高生产效率。
4.最大化满足客户的需求。

P问题、NP问题、NPC问题

P问题、NP问题、NPC问题都是组合优化问题,就拿上面提到的软约束来说,如何能够使得作业在生产过程中,它得生产时间、生产效率、生产质量、生产成本等等达到一个较优解,甚至是一个最优解,这就是一道NP-Hard难题。
P类问题:一个问题可以找到一个能在多项式得时间里解决它得算法。
NP问题:可以在多项式得时间里猜出一个解来解决一个问题。
NPC问题:又称NP-完全问题(complete),它是约化一个问题得解,把这个解运用到另一个问题上,简单来说就是用一个超级NP问题的解,解决所有的NP问题。
NP-Hard问题:满足能用一个已知的NPC问题约化,但这个问题不是一个NP问题。

OptaPlanner怎么帮助解决车间调度问题

按时间和执行模式安排所有作业,以尽量减少项目延迟。每项作业都是一个项目的一部分。作业可以以不同的方式执行:每种方式都是一种执行模式,它意味着不同的持续时间,但也意味着不同的资源使用。这是一种灵活的工作车间日程安排的形式。

OptaPlanner提供了几种优化算法,用于求解找出车间调度问题的较优解,可以通过几行XML或者代码切更改求解器配置,也可以很容易地切换优化算法。

构建一个车间调度,首先要构建几个类,配置求解器搜索,使用求解器求解。
按xml配置求解器,SolverFactory,由ClassLoader.getResource()
定义模型,定义分数函数,选择配置优化算法。
告诉OptaPlanner哪些类是规划实体,哪些属性是规划变量,有几种方法可以传递这些信息。

分数计算速度,评价性能影响,OptaPlanner将优化算法与规则引擎的分数计算结合的框架,因为它可以额外的添加软或硬限制

每个作业可以有执行机器和开始时间两个规划变量

输入输出

分配类:
1.作业
2.分配类的资源分配、接收器分配、前任分配表、继任分配表
3.规划变量中(规划期间的变化、计算分数的变化)常规变量:执行模式、延迟,影子变量:前任完成日期
4.当前作业的开始时间、结束时间、当前作业所属项目、该项目的关键路径结束时间、作业类型、作业ID

执行模式类:
1.当前作业
2.持续时间
3.资源需求表

作业类:
1.所属项目
2.作业类型
3.执行模式表
4.继任者作业清单

作业类型类:
1.资源
2.标准
3.接收器

项目类:
1.完工时间
2.关键路径持续时间
3.本地资源表
4.作业表
5.返回关键路径结束时间:完工时间加上关键路径持续时间
6.返回作业名

资源需求类:
1.执行模式
2.资源
3.需求

进度类
1.项目表
2.作业表
3.执行模式表
4.资源表
5.资源需求表
6.分配表
7.分数

延迟强度比较器:比较a,b之间的差值。
执行模式权重:得到执行模式及其需求可取性,最终得到一个比较器,返回权重大的。
前任完工时间变量更新:变量变化之后,变更分数和分配

资源类
1.全局资源
2.当前资源
3.资源

项目作业调度导入器:
1.项目表大小
2.资源表大小
3.全局资源表大小
4.项目ID
5.资源ID
6.作业ID
7.执行模式ID
8.资源需求ID

一.app文件中的projectjobscheduling.app
1.导入了swingui文件中的ProjectJobSchedulingPanel
2.导入了persistence文件中的ProjectJobSchedulingXmlSolutionFileIO以及ProjectJobSchedulingImporter
3.导入了domain中的Schedule
4.导入了公共包中的persistence.AbstractSolutionImporter
5.导入了公共包中的app.CommonApp(继承了该类中的Schedule)
6.导入了javadocs下的persistence.common.api.domain.solution.SolutionFileIO(文件输入输出端口)

二.domain文件下有两个文件和一些java文件,分别是resource、solver等
resource文件中有globalresource、localresource、resource三个java文件
globalresource:全部资源,继承了resource类,定义了一个可更新函数isrenewable()
localresourc:本地资源,继承了resource类,定义了两个私有函数project和renewable
resource:资源,包含一个容量变量,抽象方法名isrenewable

solver文件中有DelayStrengthComparator、ExecutionModeStrengthWeightFactory、NotSourceOrSinkAllocationFilter、PredecessorsDoneDateUpdatingVariableListener四个java文件
DelayStrengthComparator:延迟强度比较器,返回两个变量之间的差值
ExecutionModeStrengthWeightFactory:执行模式权重工厂,导入了core文件中的SelectionSorterWeightFactory,执行模式、资源需求、进度、资源。实现权重排序,首先得到各个资源需求量、累加全部资源,需求可取性(如果资源总量大于当前资源容量,那么需求可取性=原需求可取性加上(资源总量-当前资源容量)乘上资源需求乘上资源是否可更新),权重返回执行模式以及需求可取性,最后返回多个权重比较。
NotSourceOrSinkAllocationFilter:非资源或接收器分配过滤器,判断作业类型是否为资源类型或者接收器类型。
PredecessorsDoneDateUpdatingVariableListener:前任完工时间变量更新监视者,继承进程和分配,当后续的实体或者变量发生变化时,更新评分总监和分配两个量。设定完工时期等于实际完工时期与原设定完工时期中最大的值

其他java文件有Allocation、ExecutionMode、Job、JobType、Project、ResourceRequirement、Schedule
Allocation:分配,包含作业、资源分配、接收器分配、前任分配、后继分配、执行模式、延迟、影子变量:前任完工时期,分配用于获取当前作业的开始时间(前任完工时间加上延迟),获取当前作业的完工时间(前任完工时间加上延迟加上执行当前模式的持续时间)、项目、当前项目的标准路径结束时间、作业类型、作业名
ExecutionMode:执行模式,包含作业、持续时间、资源需求
Job:作业,包含项目、作业类型、执行模式、后继作业
JobType:作业类型,包含资源、标准、接收器
Project:项目,包含完工时间、关键路径持续时间、本地资源、作业,得到一个关键路径结束日期(开工日期加上关键路径持续时间)、项目名
ResourceRequirement:资源需求,包含执行模式、资源、需求、资源更新
Schedule:调度,包含项目、作业、执行模式、资源、资源需求、分配、评分(硬约束和软约束,硬约束优先级高于软约束)

三.optional文件中有benchmark文件、score.drools文件
benchmark:基准,包含ProjectJobSchedulingBenchmarkApp,建立一个基准
score.drools:分数,包含RenewableResourceUsedDay:可再生资源使用日,包含资源、使用日,返回资源on使用日,资源所占容量

四.persistence文件包含ProjectJobSchedulingImporter文件、ProjectJobSchedulingXmlSolutionFileIO文件
ProjectJobSchedulingImporter:调度导入器,包含调度、项目大小、资源大小、全局资源大小、项目ID、资源ID、作业ID、执行模式ID、资源需求ID
ProjectJobSchedulingXmlSolutionFileIO:xml解决文件IO

五.score文件包含capacity文件和ProjectJobSchedulingIncrementalScoreCalculator
capacity:容量,包含NonrenewableResourceCapacityTracker、RenewableResourceCapacityTracker、ResourceCapacityTracker三个文件
NonrenewableResourceCapacityTracker:不可再生资源容量追踪器,包含容量、使用,插入该资源时,使用等于已使用加上资源需求,移除该资源时,使用等于已使用减去资源需求,硬约束:当容量大于已使用时,返回0,否则返回容量-已使用。
ResourceCapacityTracker:资源容量追踪器,输入资源需求以及分配,得到硬约束分数。
RenewableResourceCapacityTracker:可再生资源容量追踪器,包含每天容量、每天使用、硬约束,每日资源容量等于资源所需容量,插入资源需求和分配,输入开始日期和结束日期,使用等于开始日到结束日的每日资源使用,如果使用超过每日资源使用,那么将硬约束分数加上每日使用减去每日容量。
ProjectJobSchedulingIncrementalScoreCalculator:项目作业调度增量分数计算器,包含资源容量追踪器、最大化工程结束日期、硬约束分数、软约束0分数、软约束1分数,有一个重置工作解决方案,遍历资源表,资源容量追踪表等于资源和资源是否可更新,如果可以更新则返回RenewableResourceCapacityTracker,否则返回RenewableResourceCapacityTracker。遍历项目表,最小化项目开工日期为项目开工日期和最小化开工日期的较小值,软约束1分数等于软约束1分数加上最小化开工日期,软约束0分数等于本身减去结束日加上标准路径结束日,当结束日大于最大化项目结束日,软约束1分数等于本身减去结算日减去最大化项目结束日,然后将最大化项目结束日定为当前的结束日。

六.swingui文件包含ProjectJobSchedulingPanel
ProjectJobSchedulingPanel:项目作业调度面板,连接输入值

环境模式:REPRODUCIBLE和FAST_ASSERT

projectjobschedulingSolverConfig文件:搜索时间限制为5,构造启发式算法设为FIRST_FIT,实体禁忌率设为0.2,延迟接收大小设为500,接受计数限制设为4。

影子变量:只有效地优化了真正的变量(并且大多忽略了影子变量):它只是确保当一个真正的变量发生变化时,任何因属的影子变量都会相应地发生变化。

优化算法:在现实世界中搜索空间的大小,计算可能的解决方案的数量取决于域模型的设计,这个搜索空间大小的计算包括了不可行的解(如果它们可以用模型来表示),因为:最优解可能是不可行的。有许多类型的硬约束不能实际地纳入到公式中。例如,在云平衡中,尝试在公式中加入CPU容量约束。即使在公式中添加一些硬约束是可行的情况下(例如,课程调度),所得到的搜索空间仍然很大。一种检查所有可能的解决方案的算法(即使是剪枝,如在分支和绑定中)可以很容易地在一个单一的真实规划问题中运行数十亿年。其目的是在可用的时间框架内找到最好的解决方案。规划竞赛(如国际计时竞赛)表明,鉴于现实世界的时间限制,本地搜索变化(表搜索、模拟退火、延迟接受……)通常对现实问题表现最好。OptaPlanner支持三种优化算法,扩展搜索、构造启发式、元启发式(与要初始化的构造启发式相结合是推荐的选择)

穷举搜索(ES):
Brute Force(暴力破解)可以创建并评估每一个可能的解决方案。可扩展0/5,最优级5/5,易于使用5/5,可调整0/5,是否需要构造启发式NO
Branch And Bound(分支定界)分支和绑定也探索了指数搜索树中的节点,但它首先研究了更有前途的节点,并修剪掉了毫无价值的节点。对于每个节点,“分支和边界”将计算乐观边界:该节点可能得到的最佳分数。如果节点的乐观边界低于或等于全局悲观边界,则它会删除该节点(包括其所有子节点的整个分支)。可扩展0/5,最优级5/5,易于使用4/5,可调整2/5,是否需要构造启发式NO

构造启发式(CH):
First Fit(首次适应算法)找到当前可行解之后,直接找下一个可行解,有时候并不一定能找到最终的可行解。可扩展5/5,最优级1/5,易于使用5/5,可调整1/5,是否需要构造启发式NO

First Fit Decreasing(首次适应下降算法)就像First Fit一样,但首先分配更困难的规划实体,因为它们不太可能适应剩下的部分。因此,它对减少难度的规划实体进行了分类。它可能先找下一个的可行解,再向上下寻找可行解。可扩展5/5,最优级2/5,易于使用4/5,可调整2/5,是否需要构造启发式NO

Weakest Fit(最坏适应算法)和First Fit一样,但首先使用较弱的规划值,因为强大的规划值更有可能适应以后的规划实体。因此,它对计划值的增加强度进行排序。可扩展5/5,最优级2/5,易于使用4/5,可调整2/5,是否需要构造启发式NO

Weakest Fit Decreasing(最坏适应下降算法)结合First Fit和Weakest Fit。对降低难度的规划实体和规划价值进行分类。要求模型支持规划实体难度比较和规划价值强度比较。可扩展5/5,最优级2/5,易于使用4/5,可调整2/5,是否需要构造启发式NO

Strongest Fit(最优适应算法)像First Fit一样,但首先使用强大的规划值,因为强大的规划值更有可能使用较低的软成本。所以它对随着强度下降的规划值进行排序。要求模型支持计划值强度比较。可扩展5/5,最优级2/5,易于使用4/5,可调整2/5,是否需要构造启发式NO

Strongest Fit Decreasing(最优适应下降算法)结合First Fit和Strongest Fit。对降低难度的规划实体和规划值进行分类。要求模型支持规划实体难度比较和规划价值强度比较。可扩展5/5,最优级2/5,易于使用4/5,可调整2/5,是否需要构造启发式NO

Allocate entity from queue(从队列中分配实体)通用形式的First Fit,First Fit Decreasing, Weakest Fit,
Weakest Fit Decreasing, Strongest Fit 和Strongest Fit Decreasing。其工作原理如下:1.将所有实体放入一个队列中。2.将第一个实体(从该队列中)分配为最佳值。3.重复此操作,直到分配了所有实体。

Cheapest Insertion(增量最小插入法)可扩展3/5,最优级2/5,易于使用5/5,可调整2/5,是否需要构造启发式NO

Regret Insertion 可扩展3/5,最优级2/5,易于使用5/5,可调整2/5,是否需要构造启发式NO

元启发式(MH):
Local Search(本地搜索):
Hill Climbing(爬山法)可扩展5/5,最优级2/5,易于使用4/5,可调整3/5,是否需要构造启发式YES
Tabu Search(禁忌搜索)可扩展5/5,最优级4/5,易于使用3/5,可调整5/5,是否需要构造启发式YES
Simulated Annealing(模拟退火法)可扩展5/5,最优级4/5,易于使用2/5,可调整5/5,是否需要构造启发式YES
Late Acceptance(延迟接受,搭配爬山法)可扩展5/5,最优级4/5,易于使用3/5,可调整5/5,是否需要构造启发式YES
Great Deluge(大洪水算法)可扩展5/5,最优级4/5,易于使用3/5,可调整5/5,是否需要构造启发式YES
Step Counting Hill Climbing(计步爬山算法)可扩展5/5,最优级4/5,易于使用3/5,可调整5/5,是否需要构造启发式YES
Variable Neighborhood Descent(可变邻域下降算法)可扩展3/5,最优级5/5,易于使用2/5,可调整5/5,是否需要构造启发式YES

Evolutionary Algorithms (进化算法):
Evolutionary Strategies(进化策略)可扩展3/5,最优级3/5,易于使用2/5,可调整5/5,是否需要构造启发式YES
Genetic Algorithms(遗传算法)可扩展3/5,最优级3/5,易于使用2/5,可调整5/5,是否需要构造启发式YES

使用什么优化算法?
1.从一个快速配置开始,很少或不涉及配置和优化代码:看First Fit
2.接下来,实施规划实体难度比较,并将其转化为First Fit Decreasing
3.接下来,后面添加延迟接收:a. First Fit Decreasing. b. Late Acceptance.
可以在投资时间的回报下得到改善。使用基准测试,并尝试几种不同的表搜索、模拟退火和延迟验收配置,例如:1. First Fit Decreasing 2. Late Acceptance(相对较长的时间) 3.禁忌搜索(相对使用时间较短)

求解器可以依次使用多种优化算法。每个优化算法都由一个求解器相位表示。同时解决的问题不得不止一个阶段。
通常,求解器将首先运行一个构造启发式,然后运行一个或多个元启发式,如果没有配置任何阶段,OptaPlanner将默认为构造启发式阶段,然后是本地搜索阶段。某些阶段(特别是构造启发式阶段)将自动终止。其他阶段(特别是元启发式)仅在阶段配置为终止时终止。如果求解器终止(在最后一个阶段结束之前),当前阶段将终止,所有后续阶段将不会运行。
处理多个实体类的最简单方法是为每个实体类运行一个单独的构造启发式

个人思考

多目标:最小完工时间、机器的利用率(先考虑一个)
利用甘特图绘制
使用禁忌搜索、模拟退火、遗传算法,考虑混合算法
动态规划:解决突然出现的紧急情况:机器故障、人员调整、订单突然插入和取消
没有出现问题的情况下,每天固定时间实行新的调度安排
机器利用率:一个机器当天的使用时间
小工序:可执行的机器、对应的加工时间
变更OptaPlanner的输入

一个生产工单过来,一个工单需要加工n个工件( J 1 、 J 2 、 J 3 . . . J n J_1、J_2、 J_3...J_n J1J2J3...Jn),每一个工件包含一道或多道工序。
工序顺序有优先级(预先确定),比如工件 j 1 j_1 j1要完成4道工序,这4道工序分别在几台机器上完成。
工序可以在m台机器上完成( M 1 、 M 2 、 M 3 . . . M m M_1、M_2、M_3...M_m M1M2M3...Mm),不同的工序在不同机器上加工的时间不同。
大问题(目标):最小完工时间
转换为所求子问题:如何确定工序要在哪台机器上加工(机器选择),各个机器上的加工先后顺序(工序排序)。
约束条件:
(1)同一台机器在某一时刻只能加工一个工件(不能发生机器和时间冲突)
(2)同一工件的同一道工序在同一时刻只能被一台机器加工(不能发生同一道工序同时在两台机器上加工,这里指的是工件1的工序,如果工件2也有该工序,那么也不会产生影响)
(3)每个工件的某一道工序开始了,就不能中途停止(如果当前工单被删除了,那么也必须等该工序完成)
(4)不同工件之间具有相同的优先级(优先级只体现在同一工件的各个工序上)
(5)不同工件的工序之间没有先后约束(各个工件的工序之间互不影响)
(6)所有工件在零时刻都可以被加工

数学模型:
n:工件总数。
m:机器总数。
Ω:总的机器集。
i,e:机器序号,i,e=1,2,3,…,m。
j,k:工件序号,j,k=1,2,3,…,n。
h j h_j hj,第j个工件的工序总数
l:工序序号,l=1,2,3,…, h j h_j hj

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OptaPlanner是一个约束解决器,它可以优化业务资源,包括车间调度等各种规划调度问题。它是一个用Java编写的开源引擎,具有强大的可拓展性和集成性。OptaPlanner提供了一套完整的建模与求解方法论,适用性广泛。它支持算法配置和一定的自定义功能,可以适应不同的问题需求。此外,OptaPlanner还支持动态调度和滚动调度功能,以及并行运算。由于其轻量化、开源和高更新频率的特点,OptaPlanner成为了许多人选择的任务规划与调度引擎。所以,OptaPlanner可以用于车间调度等各种规划调度问题。 #### 引用[.reference_title] - *1* [Optaplanner逐步学习(0) : 基本概念 - Optaplanner,规划问题, 约束,方案](https://blog.csdn.net/weixin_33885253/article/details/89687183)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [轻量化规划调度引擎——OptaPlanner简介](https://blog.csdn.net/weixin_42597238/article/details/82413762)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值