【车间调度】基于matlab混合蛙跳算法 (SFLA) 求解简单调度问题【含Matlab源码 2247期】

news2025/2/25 15:57:57

⛄一、车间调度简介

在传统的SFLA中,每一个青蛙的位置代表一个解,若干个青蛙组成的种群代表一个解的集合,种群被划分为不同的组,即模因组,对每个模因组执行搜索过程,当达到终止条件后,重新将模因组合并成新的种群,这个过程称作种群重组。搜索和重组过程持续进行直到满足终止条件。

在FJSP中,每一个青蛙代表一个个体,即一个可行解,每一个可行解都有一个评价其优劣的指标,即目标值。考虑到传统SFLA依靠位置更新公式来产生新解,这种方式难以应用于FJSP这种离散问题中,所以需要对SFLA离散化,构建合理的编码解码以及搜索重组方式。
 
1 编码
FJSP包含两个基本问题,即工序调度问题和机器分配问题,因此,该问题的解决方案通常由两部分组成[16,17,18],工序串和机器串,工序串表示所有工件的加工顺序,机器串表示工件对应所选择的加工机器号。一个3×3的FJSP实例如表1所示。其中“2”表示第一个工件的第一道工序在1号机器上加工的时间为2,“-”表示该工件的该道工序不能在该机器上加工,以此类推。一个完整的解决方案可以表示为{[132123]|[332112]},第一部分{[1 3 2 1 2 3]}表示工序加工顺序,数字代表工件号,数字出现的次数则代表对应工件的第几道工序。第二部分{[3 3 2 1 1 2]}表示对应工件所选择的加工机器。 
表1 3×3FJSP实例
在这里插入图片描述
2 解码
解码是为了将工序串和机器串转换所求的目标值,在此基础上合理地安排各个工件在机器上加工,从而使得目标值最优。本文为了实现染色体解码对解空间的高效搜索,设计了一种进化贪婪插入法(evolutionary greedy insertion, EGI),其解码过程如图1所示。
在这里插入图片描述
图1 EGI解码过程示意图
工序Oij即将在机器Mb上加工,根据当前加工情况,有三段空闲可供选择,Idle1、Idle2和Idle3三段空闲时间均大于等于Oij的加工时间。Idle1的开始时间小于Oi(j-1)结束时间,故不满足约束条件。Idle2和Idle3都满足约束条件,而Idle2更接近Oij的加工时间,所以选择Idle2插入。相对于一般的解码方法,EGI提供了更多可供选择的空闲时间段,更利于找到最优解。

3 种群初始化
初始种群质量的优劣对于算法而言至关重要,一个高质量的种群能够为算法的进化提供一个优越的起点,使算法减少从差解到优解的搜寻时间。本算法采用了ZHANG等[19]提出的GLS初始化方法,即全局选择(global selection, GS)、局部选择(local selection, LS)和随机选择(random selection, RS),除此以外,再加入一种全局最小化(global minimization, GM)方法,选择可选机器集中加工时间最短的那一台机器进行加工。在上述多种启发式规则启发下生成的初始种群能够为算法的进化提供一个较好的起点,加快算法的整体收敛速度。

4 族群划分
混合蛙跳算法区别于其他算法最大的特点就是对种群进行分组,而传统的随机划分方式由于不能平衡各个组内青蛙的优劣程度,会大大增加算法求解的随机性,使得算法的收敛速度变慢。本文算法采用LEI等[20]提出的二元锦标赛选择方式将种群划分成w个族群V(V1,V2,…,Vw),先从种群中选择最好的w个个体依次作为每个族群中的第一个个体,再从余下的个体中利用锦标赛选择法补充每个族群的剩余个体,即从剩下的种群中随机选择两个个体Q1和Q2,优秀的那一个个体进入V1,作为V1中的第二个个体,较差的那个返回种群;再从种群中随机选择两个个体,较好的那一个进入V2,作为V2中的第二个个体,以此类推,直至所有的族群被填满。

5 族群内进化策略
对于每一个族群内的个体来说,如果都采用相同的进化策略,则难以对不同质量的个体进行有针对性的进化,所以为了避免盲目进化,通常在各自族群内部会区分出优劣个体,然后对其采用不同的更新策略进行优化。对族群中优秀的个体采用邻域搜索,加强对更优解的挖掘。对族群中的劣势解,则采用全局加局部结合的协调优化策略,平衡整个族群中个体的优劣程度,加快算法的收敛速度。

6 更新策略
6.1 交叉操作

交叉的目的是为了获得新的个体,在尽量保证优良基因不被破坏的情况下,对解空间进行高效搜索,因而交叉操作应该满足可行性、继承性和非冗余性。针对FJSP的特性,ZHANG等[21]提出的POX交叉法,因其具有低约束性,并且可以避免冲突检测,所以被普遍用来完成对工序编码层的交叉操作。本文对POX交叉法进行局部改进,提出一种改进的交叉法(improved intersection method, IIM),具体步骤如下:

步骤1:选出两条染色体P1、P2作为父代,P1=[1 3 2 4 3 1 2 4 3],P2=[3 1 1 2 4 4 2 3 3];

步骤2:将工件集J={1,2,3,4}分为两个非空子集,J1={1,2},J2={3,4};

步骤3:复制P1中包含在J1中的基因按原顺序插入子代染色体C1中,复制P2中包含在J1中的基因按原顺序插入子代染色体C2中;

步骤4:复制P2中包含在J2中的基因按原顺序插入C1中,复制P1中包含在J2中的基因按原顺序插入C2中,得到C1=[1 3 2 4 4 1 2 3 3],C2=[3 1 1 2 4 3 2 4 3];

步骤5:对C1、C2进行倒序操作得到C3、C4,C3=[3 3 2 1 4 4 2 3 1],C4=[3 4 2 3 4 2 1 1 3],对C1、C2、C3、C4进行解码操作,选取最优的两个解代替C1、C2。

而对于机器编码层采用多点交叉方式,可避免产生非法解。具体步骤如下:

步骤1:随机选择两条机器染色体L1和L2,L1=[1 2 5 3 4 2 6 1 5],L2=[3 3 5 2 1 4 2 3 3];

步骤2:生成一个和机器染色体维度一样的0、1数组X,X=[0 0 1 1 0 0 1 0 0];

步骤3:找到矩阵中所有1所在的位置;

步骤4:将所有位置1上的L1和L2的基因对换得到L1′和L2′,L1′=[1 2 5 2 4 2 2 1 5],L2′=[3 3 4 3 4 2 6 3 3]。

6.2 局部搜索操作
为了提高算法的搜索能力和开发能力,在保持种群多样性的同时又能够提高算法的收敛能力,本文算法采用了分别针对于工序编码层和机器编码层的局部搜索策略。

(1)针对工序编码层OS,采用如下步骤进行局部搜索操作:
步骤1:选择一条工序染色体P,P=[1 3 2 4 1 1 2 2 3];

步骤2:随机选择两个工序数相等的工件J1和J2,J1={1},J2={2},找出它们所有工序在染色体中的位置;

步骤3:交换两个工件对应所有工序的位置,并保持原来的顺序,得到新的工染色体P′,P′=[2 3 1 4 2 2 1 1 3]。

(2)针对机器编码层,结合图2具体搜索步骤如下:
步骤1:选择一组染色体,其中工序染色体为P,P=[1 1 2 3 3 1 4 2 4];机器染色体为L,L=[2 1 3 2 3 1 3 2 1];对应加工时间矩阵为T,T=[1 2 1 3 1 4 1 2 2 ];

步骤2:计算出所有机器上的总负载Ptotal,Ptotal=[8 6 3];最大完成时间Cmax,Cmax=9;计算得到所有机器的负载率,其中每台机器的负载率P=Ptotal/Cmax,P=[0.89 0.67 0.33],并排序得到负载率最高和最低的机器;

步骤3:在满足约束条件的情况下,从负载率最高的机器上选择该机器加工的最后一道工序移动到负载率最低的那一台机器上,从图2可以看出,在未进行该局部搜索时,最大完成时间为9,经过该局部搜索,将M1上的O42移动到M3上,得到的最大完成时间为8。
在这里插入图片描述
图2 机器局部搜索

7 ISFLA算法整体框架
根据上述改进策略,结合FJSP,提出的ISFLA框架流程图如图3所示。
在这里插入图片描述
图3 ISFLA流程图

⛄二、部分源代码

function pop = RunFLA(pop, params)

%% FLA Parameters
q = params.q; % Number of Parents
alpha = params.alpha; % Number of Offsprings
beta = params.beta; % Maximum Number of Iterations
sigma = params.sigma;
CostFunction = params.CostFunction;
VarMin = params.VarMin;
VarMax = params.VarMax;
VarSize = size(pop(1).Position);
BestSol = params.BestSol;

nPop = numel(pop); % Population Size
P = 2*(nPop+1-(1:nPop))/(nPop*(nPop+1)); % Selection Probabilities

% Calculate Population Range (Smallest Hypercube)
LowerBound = pop(1).Position;
UpperBound = pop(1).Position;
for i = 2:nPop
LowerBound = min(LowerBound, pop(i).Position);
UpperBound = max(UpperBound, pop(i).Position);
end

%% FLA Main Loop

for it = 1:beta

% Select Parents
L = RandSample(P, q);
B = pop(L);

% Generate Offsprings
for k = 1:alpha

% Sort Population
[B, SortOrder] = SortPopulation(B);
L = L(SortOrder);

% Flags
ImprovementStep2 = false;
Censorship = false;

% Improvement Step 1
NewSol1 = B(end);
Step = sigmarand(VarSize).(B(1).Position-B(end).Position);
NewSol1.Position = B(end).Position + Step;
if IsInRange(NewSol1.Position, VarMin, VarMax)
[NewSol1.Cost NewSol1.Sol] = CostFunction(NewSol1.Position);
if NewSol1.Cost<B(end).Cost
B(end) = NewSol1;
else
ImprovementStep2 = true;
end
else
ImprovementStep2 = true;
end

% Improvement Step 2
if ImprovementStep2
NewSol2 = B(end);
Step = sigmarand(VarSize).(BestSol.Position-B(end).Position);
NewSol2.Position = B(end).Position + Step;
if IsInRange(NewSol2.Position, VarMin, VarMax)
[NewSol2.Cost NewSol2.Sol] = CostFunction(NewSol2.Position);
if NewSol2.Cost<B(end).Cost
B(end) = NewSol2;
else
Censorship = true;
end
else
Censorship = true;
end
end

⛄三、运行结果

在这里插入图片描述
在这里插入图片描述

⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 王玉芳,缪昇,葛嘉荣.面向柔性作业车间调度的改进混合蛙跳算法[J].组合机床与自动化加工技术. 2022,(05)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/40447.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

编译原理13:SLR(1)分析表、LR(1)分析表

更强的LR分析 可以根据当前单词&#xff0c;来选择是移进还是归约。只要所有移进项目中的点后面的那些终结符&#xff0c;与归约项目生成的非终结符的Follow集合的元素没有重叠。若当前单词属于上述Follow集合里则规约 SLR(1)冲突解决办法 SLR(1)分析表的构造 SLR(1)分析表的构…

001. 组合

1.题目链接&#xff1a; 77. 组合 2.大概思路&#xff1a; 2.1题目要求&#xff1a; 给两个值 n 和 k &#xff0c;要求从[1&#xff0c;n]的区间中&#xff0c;输出所有元素数量为k的组合。&#xff08;不能有[1,1]&#xff0c;值只能取一次&#xff09; 2.2思路&#xff…

(十七)Spring6整合JUnit

文章目录环境Spring对JUnit4的支持Spring对JUnit5的支持上一篇&#xff1a;&#xff08;十六&#xff09;Spring对事务的支持 环境 spring6里程碑版本的仓库 依赖&#xff1a;spring context依赖、spring对junit的支持相关依赖、junit4依赖、junit5依赖 <!--配置多个仓库-…

Spring【Spring的创建与使用】

Spring【Spring的创建项目与使用】&#x1f34e;一.Spring创建项目&#x1f352;1.1 创建⼀个 Maven 项⽬&#x1f352;1.2 添加 Spring 框架⽀持&#x1f352;1.3 添加启动类&#x1f34e;二.Bean对象的存储与获取&#x1f352;2.1 存储 Bean 对象&#x1f349; 2.1.1 创建 Be…

C语言【微项目19】—大整数字符串乘法器[纯字符串乘法][乘法表与加法表]【2022-11-27】

C语言【微项目19】—大整数字符串乘法器[纯字符串乘法][乘法表与加法表]【2022-11-27】1.函数功能2 简要测试结果3.BigInterNoLimitMutiString.c3.大整数字符串乘法器实现思路4. 大整数字符串乘法器典型使用流程main.c【TDTX】 【C99】 【编译与运行环境】64位Windows操作系统&…

Unity嵌入Android项目开发

目录前言1 搭建开发环境2 创建Unity项目2.1 新建项目2.2 Unity构建配置2.3 Android环境相关配置2.4 导出Unity库文件3 创建Android项目3.1 新建Android项目3.2 Android环境相关配置3.2 导入Unity相关的库3.3 Android中跳转到Unity视图4 进阶扩展4.1 包体积优化4.1.1 mono和IL2C…

ILRuntime1.安装

目录 1&#xff1a;官网地址&#xff1a;介绍 — ILRuntime 2&#xff1a;注意事项&#xff1a; 3&#xff1a;安装 此文章是参照官方文档&#xff0c;自己的开发笔记。 1&#xff1a;官网地址&#xff1a;介绍 — ILRuntime 官方Unity示例代码&#xff1a;GitHub - Ourpa…

CUDA-矩阵乘2

这里从一个 cuda 初学者的角度来阐述如何优化一个形状较大的正方形乘正方形的 FP32 矩阵乘。 矩阵乘作为目前神经网络计算中占比最大的一个部分&#xff0c;其快慢会显著影响神经网络的训练与推断所消耗的时间。虽然现在市面上已经有非常多的矩阵乘的高效实现——如基于 cpu 的…

基于Pytorch框架的轻量级卷积神经网络垃圾分类识别系统

在我之前的博文中也写过一篇关于垃圾识别的文章&#xff0c;主要是基于tensorflow和keras实现的&#xff0c;数据集是一个比赛提供的&#xff0c;有40个细分的子类别&#xff0c;最近是在学习PyTorch框架&#xff0c;实践做项目的过程中就想拿垃圾识别的数据集再开发垃圾识别模…

物联网-常见的服务架构演变

常见的服务架构演变 背景 在互联网的发展中&#xff0c;后端的web服务也经历了很多的演变&#xff1b;在公司业务稍微简单的时候&#xff0c;采用简单的服务&#xff0c;可以提高开发效率&#xff0c;可以帮忙节省更多的成本。但随着用户数量的剧增&#xff0c;流量突增&…

keras-yolo3-master 项目实战cookbook

1、.h5文件转化 1.1 Error: FileNotFoundError: [Errno 2] No such file or directory: ‘yolov3.weights’ 解决办法&#xff1a;通过在.py文件中添加print()命令发现文件的打开路径有问题&#xff0c;因此在代码中手动添加.weights的绝对路径&#xff0c;使程序能够找到该文…

java.lang.reflect.Field 解读

java.lang.reflect.Field Java 中 Field 提供有关类或接口的单个字段的信息&#xff0c;以及对它的动态访问权限。反射的字段可能是一个类字段或实例字段。Field 是成员变量的意思。Field 也是一个类&#xff0c;该类位于 java.lang.reflect 包下。 https://docs.oracle.com/…

每天五分钟机器学习:支持向量机损失函数和互熵损失函数

本文重点 本节课程我们讲学习两个常见的损失函数,一个是支持向量机损失,也叫做hinge loss,另外一个损失函数是互熵损失函数,它常常应用于softmax分类器中。 hinge loss 单样本的hinge loss可以为: 这个意思是说样本分类错误的分数-样本分类正确的分数小于阈值▲,则损…

Spring Boot 2.7.6 正式版发布, SpringBoot 2.7.6来了

一、发布说明 11 月 25 日官方发布了 Spring Boot 2.7.6 版本&#xff0c;此版本包括 44 个错误修复、文档改进和依赖项升级。 二、更新内容 2.1 bug 修复 即使未启用基于注释的计划&#xff0c;ScheduledBeanLazyInitializationExcludeFilter 也会自动配置使用 ContextHi…

第16章-Spring AOP中的基础API

文章目录一、概述二、切点&#xff08;Pointcut&#xff09;三、通知&#xff08;Advice&#xff09;1. 环绕通知2. 前置通知3. 异常通知4. 后置通知四、通知者&#xff08;Advisor&#xff09;五、附录1. 常用接口2. 示例代码前面我们讲了基于 XML 和注解两种方式配置 AOP&…

SpringBoot SpringBoot 原理篇 2 自定义starter 2.3 定时任务报表开发

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇2 自定义starter2.3 定时任务报表开发2.3.1 直接开干2.3.2 小结2 自定义start…

JavaScript函数进阶:闭包

变量作用域 变量根据作用域的不同分为两种&#xff1a;全局变量和局部变量。 1. 函数内部可以使用全局变量。 2. 函数外部不可以使用局部变量。 3. 当函数执行完毕&#xff0c;本作用域内的局部变量会销毁 什么是闭包 闭包&#xff08;closure&#xff09;指有权访问另一…

Day13--商品列表-请求并渲染商品列表的数据

1.定义请求参数对象 接口部分&#xff1a; 文档部分&#xff1a; 我的操作&#xff1a; 1》在goods_list.vue中&#xff1a; 1>初步操作&#xff1a; 其效果图&#xff1a; 2>进一步操作&#xff1a; 在goods_list.vue中&#xff1a; 情况①&#xff1a; 情况②&…

python高级在线题目训练-第二套·主观题

1、《Walden》 是美国作家梭罗独居瓦尔登湖畔的记录,描绘了他两年多时间里的所见、所闻和所思。该书崇尚简朴生活&#xff0c;热爱大自然的风光&#xff0c;内容丰厚&#xff0c;意义深远&#xff0c;语言生动。 请用Python统计小说《Walden》 中各单词出现的频次&#xff0c;…

Metabase学习教程:视图-8

漏斗图 使用漏斗图显示步骤的进度。 图1。我们将用示例数据库构建一个漏斗图。 漏斗图用一系列台阶显示了指标。通常&#xff0c;它们用于显示有多少人通过特定的序列&#xff08;如网站上的结帐流程&#xff09;完成。第一步是多少人访问你的网站。然后有多少人浏览了一个产品…