(转载)基于多层编码遗传算法的车间调度算法(matlab实现)

news2024/10/5 23:29:18

        以下内容大部分来源于《MATLAB智能算法30个案例分析》,仅为学习交流所用。

1 理论基础

        遗传算法具有较强的问题求解能力,能够解决非线性优化问题。遗传算法中的每个染色体表示问题中的一个潜在最优解,对于简单的问题来说,染色体可以方便地表达问题的潜在解,然而,对于较为复杂的优化问题,一个染色体难以准确表达问题的解。多层编码遗传算法把个体编码分为多层,每层编码均表示不同的含义,多层编码共同完整表达了问题的解,从而用一个染色体准确表达出了复杂问题的解。多层编码遗传算法扩展了遗传算法的使用领域,使得遗传算法可以方便用于复杂问题的求解。

2 案例背景

2.1 问题描述

        车间调度是指根据产品制造的合理需求分配加工车间顺序,从而达到合理利用产品制造资源、提高企业经济效益的目的。车间调度问题从数学上可以描述为有n个待加工的零件要在m台机器上加工,车间调度的数学模型如下:

2.2 模型建立

        基于多层编码遗传算法的车间调度算法流程如图11-1所示。其中,种群初始化模块初始化种群构成问题的初始解集;适应度值计算模块计算染色体的适应度值;选择操作采用轮盘赌法选择优秀个体;交叉操作采用整数交叉法得到优秀个体;变异操作采用整数变异法得到优秀个体。

 

2.3 算法实现

1.个体编码
5.变异操作
        种群通过变异操作获得新的个体,从而推动整个种群向前进化。变异算子首先从种群中随机选取变异个体,然后选择变异位置posl和pos2,最后把个体中pos1和pos2位的加工工序以及对应的加工机器序号对换,如下所示,交叉位置为2和4。

3 MATLAB程序实现

        根据多层编码遗传算法原理,在MATLAB中编程实现基于多层编码遗传算法的车间调度算法,算法全部代码如下。

3.1 主函数

        主函数首先进行个体初始化,然后采用选择、交叉和变异操作搜索最佳个体,得到最优的车间调度方法,主要代码如下:
%% 清空环境
clc;clear

%% 下载数据
load scheduleData Jm T JmNumber
%工序 时间

%% 基本参数
NIND=40;        %个体数目
MAXGEN=50;      %最大遗传代数
GGAP=0.9;       %代沟
XOVR=0.8;       %交叉率
MUTR=0.6;       %变异率
gen=0;          %代计数器
%PNumber 工件个数 MNumber  工序个数
[PNumber MNumber]=size(Jm);  
trace=zeros(2, MAXGEN);      %寻优结果的初始值
WNumber=PNumber*MNumber;     %工序总个数

%% 初始化
Number=zeros(1,PNumber);     % PNumber 工件个数
for i=1:PNumber
    Number(i)=MNumber;         %MNumber工序个数
end

% 代码2层,第一层工序,第二层机器
Chrom=zeros(NIND,2*WNumber);
for j=1:NIND
    WPNumberTemp=Number;
    for i=1:WNumber
        
        %随机产成工序
        val=unidrnd(PNumber);
        while WPNumberTemp(val)==0
            val=unidrnd(PNumber);
        end
        
        %第一层代码表示工序
        Chrom(j,i)= val;
        WPNumberTemp(val)=WPNumberTemp(val)-1;
        
        %第2层代码表示机器
        Temp=Jm{val,MNumber-WPNumberTemp(val)};
        SizeTemp=length(Temp);
        %随机产成工序机器
        Chrom(j,i+WNumber)= unidrnd(SizeTemp);
        
    end
end
 
%计算目标函数值
[PVal ObjV P S]=cal(Chrom,JmNumber,T,Jm);  

%% 循环寻找
while gen<MAXGEN
    
    %分配适应度值
    FitnV=ranking(ObjV);  
    %选择操作
    SelCh=select('rws', Chrom, FitnV, GGAP);       
    %交叉操作
    SelCh=across(SelCh,XOVR,Jm,T);          
    %变异操作
    SelCh=aberranceJm(SelCh,MUTR,Jm,T);            
    
    %计算目标适应度值
    [PVal ObjVSel P S]=cal(SelCh,JmNumber,T,Jm);   
    %重新插入新种群
    [Chrom ObjV] =reins(Chrom, SelCh,1, 1, ObjV, ObjVSel);       
    %代计数器增加
    gen=gen+1;       
    
    %保存最优值
    trace(1, gen)=min(ObjV);       
    trace(2, gen)=mean(ObjV);  
    
    % 记录最佳值
    if gen==1
        Val1=PVal;
        Val2=P;
        MinVal=min(ObjV);%最小时间
        STemp=S;
    end
    %记录 最小的工序
    if MinVal> trace(1,gen)
        Val1=PVal;
        Val2=P;
        MinVal=trace(1,gen);
        STemp=S;
    end
    
end

% 当前最佳值
PVal=Val1; %工序时间
P=Val2;  %工序 
S=STemp; %调度基因含机器基因

%% 描绘解的变化
figure(1)
plot(trace(1,:));
hold on;
plot(trace(2,:),'-.');grid;
legend('解的变化','种群均值的变化');

%% 显示最优解
figure(2);
MP=S(1,PNumber*MNumber+1:PNumber*MNumber*2);
for i=1:WNumber  
    val= P(1,i);
    a=(mod(val,100)); %工序
    b=((val-a)/100); %工件
    Temp=Jm{b,a};
    mText=Temp(MP(1,i));
    
    x1=PVal(1,i);
    x2=PVal(2,i);
    
    y1=mText-1;
    y2=mText;
    PlotRec(x1,x2,mText);
    
    PlotRec(PVal(1,i),PVal(2,i),mText);
    hold on;
    
    fill([x1,x2,x2,x1],[y1,y1,y2,y2],[1-1/b,1/b,b/PNumber]);
    text((x1+x2)/2,mText-0.25,num2str(P(i)));
end

3.2 仿真结果

        采用多层编码遗传算法求解车间调度问题,共有6个工件,在10台机器上加工,每个工件都要经过6道加工工序,每个工序可选择机器序号如表11-1所列。每道工序的加工时间如表11-2所列。

 

        算法的基本参数为:种群数目为40,最大迭代次数为50,交叉概率为0.8,变异概率为0.6,算法搜索得到的全部工件完成的最短时间为47s,算法搜索过程如图11-2所示。

 

4 素例扩展

4.1 模糊目标

        在实际的车间调度问题中,工件的加工时间往往需要在客户要求的时间窗口内。因此,对工件加工完成时间进行改进,采用了遵循顾客提货期要求的模糊提交时间。对于工件pi的交货期,梯形模糊数如图11-4所示。模糊分布函数为

 

 

 

 

 

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

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

相关文章

【ProtoBuf】2.环境配置

————————————每一个不曾起舞的日子都是对生命的辜负。 ProtoBuf安装 一. 安装Protofbuf-Win二. 配置环境变量三.验证是否添加成功四. Linux下Protobuf安装包的安装1. 下载ProtoBuf2. 解压压缩包3. 安装ProtoBuf4. 最后添加内容5.检查是否安装成功 五. 升级g到8版本…

Java 高级应用-多线程-(一)实现 Runnable 接口与继承 Thread 类

1.1 程序、进程与线程 • 程序&#xff08;program&#xff09;&#xff1a;为完成特定任务&#xff0c;用某种语言编写的一组指令的集合。即指一段 静态的代码&#xff0c;静态对象。 • 进程&#xff08;process&#xff09;&#xff1a;程序的一次执行过程&#xff0c;或是正…

支持图片扩展等AI功能,PS 2023 v24.5 安装教程

主要功能 PS发布了革命性的AI功能&#xff0c;创意填充&#xff0c;创意工具&#xff0c;图像预设&#xff0c;智能移除&#xff0c;上下文任务栏&#xff0c;智能渐变。 “创意填充”是一套具有革命性且神奇的全新功能&#xff0c;它由 AI 提供支持&#xff0c;基于您与生俱…

Spring Boot如何实现定时任务调度?

Spring Boot如何实现定时任务调度&#xff1f; Spring Boot提供了非常方便的方式来实现定时任务调度&#xff0c;我们可以使用Spring框架自带的Scheduled注解来实现。在本文中&#xff0c;我们将介绍如何使用Scheduled注解进行定时任务调度。 什么是定时任务调度&#xff1f; …

网瘾少年转行软件测试,月薪20k? 叛逆少年终归成长...

前言&#xff1a; 高中住校期间沉迷游戏&#xff08;DNF&#xff09;,尤其是高三那年,晚上翻墙出去通宵&#xff0c;白天上课睡觉&#xff0c;高考自然是考了个稀碎&#xff0c;高考结束那个暑假刚开始觉得整个人都自由了&#xff0c;爸妈看我没考上大学&#xff0c;知道我心情…

使用kong网关来实现负载均衡

一、负载均衡 当前一个服务进行多实例部署后&#xff0c;外部调用其中任意一个服务地址都可以得到响应。但是外部不可能记住也不应该记住所有的服务地址&#xff0c;这个时候就需要一个统一入口提供给外部进行调用&#xff0c;类似提供一个虚拟主机形式进行实现。后续就请求这…

Socket(七)

文章目录 1. 单文件服务器2. 重定向器Redirector3. 功能完备的HTTP服务器 1. 单文件服务器 要研究HTTP服务器&#xff0c;先从一个简单的服务器开始&#xff0c;无论接受什么请求&#xff0c;这个服务器都始终发送同一个文件。这个单文件服务器名为SingleFileHTTPServer&#…

泛型的介绍以及原理

目录 一、前言 二、什么泛型 三、为什么要使用泛型 3.1、保证了类型的安全性。 3.2、消除强制转换 3.3、提高程序的性能 3.4、 提高了代码的重用性 四、如何使用泛型 4.1、 泛型类 4.2、泛型接口 4.3、泛型方法 五、泛型通配符 5.1、无边界的通配符 5.2、固定上边…

telnet 120.XX8888会超时或者无反应,防火墙加入8888,安全组也加入8888,但是访问120.XX:8888也没有反应

⚠️命令都是远程登录的哦 选这个远程连接&#xff1a; 初次密码自己设置别忘了 1、看是否8888端口是否有正常监听 netstat -ntlp我这边清楚看到没有8888 2、如果没有监听是无法连接&#xff0c;需要安装对应的程序同时监听8888端口 比如我想用宝塔面板 我就需要下载宝塔面…

一步步入门编写PHP扩展

1、写在最前 随着互联网飞速发展&#xff0c;lamp架构的流行&#xff0c;php支持的扩展也越来越多&#xff0c;这样直接促进了php的发展。 但是php也有脚本语言不可避免的问题&#xff0c;性能比例如C等编译型语言相差甚多&#xff0c;所以在考虑性能问题的时候最好还是通过php…

00后实在太强了,98年的我被卷废了,太离谱了...

前言 最近在公司我真的感受到了什么叫“卷”&#xff0c;以往的我划划水日子过的轻轻松松&#xff0c;直到公司最近招了一个00后进来&#xff0c;真的让我感受到了危机&#xff0c;刚进来工资就和我差不多&#xff0c;我刚开始其实有点不太舒服&#xff0c;凭什么我辛辛苦苦干…

在pycharm中调用qt界面功能

目录 一、新建designer文件 1、打开pycharm中的designer 2、创建个widget 3、拖动几个简单按钮 4、保存一下 5、右击test1.ui 这边首先环境已经配置完毕&#xff0c;可以参考之前写的博客&#xff1a; 关于PyQt5的环境搭建_Littlehero_121的博客-CSDN博客 一、新建desi…

如何使用PHM技术提高汽车工业的效率和性能?

在汽车工业中&#xff0c;预测性健康管理&#xff08;PHM&#xff09;技术正日益受到关注。作为一种基于数据驱动的解决方案&#xff0c;PHM技术通过实时监测和分析设备和系统的状态&#xff0c;实现对设备健康状况的预测和管理。 图.汽车制造&#xff08;iStock&#xff09; 汽…

代码示范【FabEdge v0.8.0】配置 connector 公开端口

FabEdge项目简介&#xff1a; FabEdge是博云在2021年8月发起&#xff0c;基于Kubernetes 构建的专注于边缘计算场景的容器网络方案&#xff0c;支持 KubeEdge 、SuperEdge、OpenYurt 等主流边缘计算框架。旨在解决边缘计算场景下容器网络配置管理复杂、网络割裂互不通信、缺少…

hadoop单机版部署

1.下载hadoop wget --no-check-certificate https://mirrors.bfsu.edu.cn/apache/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz 2.解压重命名 tar -zxvf hadoop-3.3.1.tar.gz mv hadoop-3.3.1.tar.gz hadoop 3.编辑hosts vim /etc/hosts 172.17.1.1 hadoop925 4.进入配置…

4.Apache网页优化

文章目录 Apache网页优化网页压缩网页缓存隐藏版本信息Apache防盗链 Apache网页优化 Apache网页优化 网页压缩网页缓存 Apache安全优化 隐藏版本信息配置防盗链 网页压缩 配置Apache的网页压缩功能&#xff0c;是使用gzip压缩算法来对网页内容进行压缩后再传输到客户端浏览器…

LNMT架构之反向代理负载均衡

目录 一、实验前提环境配置 &#xff08;一&#xff09;关闭防火墙&#xff0c;安装本地yum &#xff08;二&#xff09;部署tomcat &#xff08;三&#xff09;部署Mariadb &#xff08;四&#xff09;部署nginx 二、反向代理负载均衡 方法一&#xff1a;&#xff08;轮…

【算法学习系列】07 - 无序数组中的局部最小值问题

文章目录 说明约束条件简单说下思路解决方案随机无序数组样本生成器算法实现验证代码进行大样本随机测试验证算法正确性 说明 在算法中&#xff0c;局部最小值是指一个函数在一个局部范围内的最小值。 具体而言&#xff0c;如果一个函数在一个小区间内的取值都比该区间内的其他…

C++:STL--priority_queue

文章目录 一.STL设计思想:容器适配器STL--stack的代码设计STL--queue的代码设计stack和queue的默认容器适配器deque的数据结构解析deque的存储结构示意图 二.C仿函数仿函数示例 三.STL--priority_queue(优先级队列)1.C优先级队列的数据结构2.priority_queue的实现框架比较函数(…

chatgpt赋能python:Python中创建画布的函数——matplotlib

Python中创建画布的函数——matplotlib Python作为一种强大的编程语言&#xff0c;拥有许多重要且广泛应用的模块和库。其中&#xff0c;matplotlib是一种用于制作高质量的图形和图表的库&#xff0c;而创建画布的函数便是其基础功能之一。 什么是matplotlib&#xff1f; Ma…