MATLAB实现蚁群算法优化柔性车间调度(ACO-fjsp)

蚁群算法优化车间调度的步骤可以分为以下几个主要阶段:

1.初始化阶段:
设置算法参数,如信息素浓度、启发式因子等。这些参数将影响蚂蚁在选择路径时的决策过程。
确定车间调度的具体问题规模,包括工件数量、机器数量以及每个工件在各机器上的加工时间等。
2.构建解阶段:
将蚂蚁(即搜索代理)放置在初始位置,这通常代表调度的起始点。
每只蚂蚁根据路径上的信息素浓度和启发式信息,按概率选择下一个要访问的节点(在这里可能是指工件或机器)。这个过程模拟了蚂蚁在寻找食物时根据信息素和可见性(即距离、时间等因素)来选择路径的行为。
蚂蚁在车间调度问题中的移动,代表了对工件加工顺序和机器分配的探索。通过多次迭代,蚂蚁们能够逐渐发现更优的调度方案。
3.信息素更新阶段:
当所有蚂蚁都完成了一次路径搜索后,根据它们的搜索结果来更新路径上的信息素。这通常涉及到两个方面:一是增加找到较优解路径上的信息素(正反馈),二是减少其他路径上的信息素(由于挥发或负反馈)。
信息素的更新规则可能因具体实现而异,但通常都会考虑到路径的长度、质量以及蚂蚁走过的次数等因素。
4.收敛判断与优化阶段:
检查算法是否满足停止条件,如达到最大迭代次数、找到满足精度要求的解或解的质量在连续多次迭代中无明显改进等。
如果满足停止条件,则输出当前找到的最优解;否则,返回到构建解阶段继续搜索。
5.后处理与优化展示

柔性车间调度的模型如下:


1.目标函数:
柔性车间调度的目标函数通常包括多个方面,如最大完工时间最小、总完工时间最小、最大负荷的机器负荷最小等。这些目标可以根据实际需求进行选择或组合。一般采用最大完工时间最小:
f_1 = \min(C_{\max})
其中,C_{\max} 表示所有工件中的最晚完工时间。

其中,C_i 表示第i个工件的完工时间,n是工件的总数。

2.约束条件:
柔性车间调度的约束条件通常包括以下几点:

(1)同一台机器同一时刻只能加工一个工件。
(2)同一工件的同一道工序在同一时刻被加工的机器数是一。即,一个工序不能同时在多台机器上进行。
(3)任意工序开始加工后不能中断。这意味着一旦一个工序开始,就必须连续进行直到完成。
(4)各个工件之间不存在优先级的差别。除非特别指定,否则所有工件都被视为具有相同的优先级。
(5)同一工件的工序之间存在先后约束。即,一个工件的一个工序必须在它之前的工序完成后才能开始。
(6)所有工件在零时刻都可以被加工。这意味着没有工件在开始时就有延迟。
这些约束条件确保了调度方案的可行性和实际性。在实际应用中,可能还需要考虑其他特定的约束条件,如机器的可用性、工件的交货期等。

算例数据如下:

初始加工明细表
工件号工序M1M2M3M4M5M6
11346-1-1-1
12-1-110-1-1-1
13-11298-15
14-17-123-1
21-111-167-1
22-18-1-1-16
23-1-1511-113
24788-1-1-1
31-1-13-1-1-1
32233-1-1-1
33-1-11045-1
3410-111-13-1
41-1-112-1-17
42899-112-1
43-1-12-1-1-1
44-1-1-11112-1
51-1-158-19
52-1-1-113128
53356-1-1-1
54-1-1-156-1
61579-1-1-1
62-1-1115-110
63-1-1-1439
64-1-1-1510-1

完整代码见:https://download.csdn.net/download/corn1949/89173025

MATLAB主程序如下:

%% 蚁群算法
clc;close all;clear all;warning off;% 清除变量
rand('seed', 100);
randn('seed', 100);
format long g;
addpath(genpath('mytoolbox'));

global jobtable mIDsetcell jobnumber machinenumber S20;
global N1 N2 indexM K;

filename='数据.xlsx';
[adata201,bdata201,cdata201]=xlsread(filename);
jobtable=adata201;% [工件号 工序 各个机器的时间]

N1=size(jobtable,1);% 工序总数
jobnumber=length(unique(jobtable(:,1)));% 工件数
machinenumber=size(jobtable,2)-2;% 机器数

S20=[];
for j=1:jobnumber
    opernumber=sum(jobtable(:,1)==j);
    Sj=j*ones(1,opernumber);
    S20=[S20,Sj];
end

% 变量范围
lb=1*ones(1,N1);
ub=zeros(1,N1);
mIDsetcell=cell(N1,1);
for i=1:N1
    index201= find(jobtable(i,3:end)>0);
    ub(i)=length(index201);% 可用机器数
    mIDsetcell{i,1}=index201;
end


S0=ub-lb+1;
indexM=S2indexMfun(S0);% 变量层分割
K=length(lb);
nodenumber=sum(S0);
E=nearfun(indexM,K,nodenumber);
N2=sum(S0);

%% 蚁群算法参数
maxgen=100;%蚁群迭代次数
popsize=20;%蚂蚁数
alpha=3;% xinx
beta=2;
rho=0.1;
Q=1;

dmat201=ones(N1,N1);
Eta201=1./dmat201;
index201=1:N1;
Tau201=ones(N1,N1)*0.1;%信息素初始化

dmat202=ones(N2,N2);
Eta202=1./dmat202;
Tau202=ones(N2,N2)*0.1;%信息素初始化

tracemataco=zeros(maxgen,2);
%% 蚁群算法构造路径
wait_hand = waitbar(0,'ACO running……', 'tag', 'TMWWaitbar');
for gen=1:maxgen
    % 蚁群1
    routemat201=zeros(popsize,N1);
    for i=1:popsize
        OpNodeSetLocal=index201;
        route=randi([1,N1],1,1);%初始化起点
        currNode=route(end);
        OpNodeSetLocal(OpNodeSetLocal==currNode)=[];
        while ~isempty(OpNodeSetLocal)%还没选完就要继续
            long1=length(OpNodeSetLocal);
            P=zeros(long1,1);
            %% 计算转移概率
            for j=1:long1
                tempnextnode=OpNodeSetLocal(j);
                P(j,1)=(Tau201(currNode,tempnextnode)^alpha)*(Eta201(currNode,tempnextnode)^beta);
            end
            P = P/sum(P);
            Pc =cumsum(P);
            index02 = find(Pc >= rand);
            next_node = OpNodeSetLocal(index02(1));%选择参数
            route=[route,next_node];%更新路径
            currNode=route(end);
            OpNodeSetLocal(OpNodeSetLocal==currNode)=[];
        end
        routemat201(i,:)=route;
    end
    
    % 蚁群2
    routemat202=zeros(popsize,N1);
    for i=1:popsize
        route=randi([1,S0(1)],1,1);%初始化起点
        currNode=route(end);
        OpNodeSetLocal= find(E(currNode,:));% 可选集
        while ~isempty(OpNodeSetLocal)%还没选完就要继续
            long1=length(OpNodeSetLocal);
            P201=zeros(long1,1);
            %% 计算转移概率
            for j=1:long1
                tempnextnode=OpNodeSetLocal(j);
                P201(j,1)=(Tau202(currNode,tempnextnode)^alpha)*(Eta202(currNode,tempnextnode)^beta);
            end
            P201=P201/sum(P201);
            Pc=cumsum(P201);
            index02= find(Pc >= rand);
            next_node =OpNodeSetLocal(index02(1));%选择参数
            route=[route,next_node];%更新路径
            currNode=route(end);
            OpNodeSetLocal= find(E(currNode,:));% 可选集
        end
        routemat202(i,:)=route;
    end
    
    chrom=[routemat201,routemat202];
    Value= decodingfun(chrom,popsize);%调用成本函数计算成本
    [vmin,indexmin]=min(Value);
    
    %% 更新信息素
    Tau201=updatetau(routemat201,popsize,rho,Q,Tau201,Value);% 更新全局信息素
    Tau202=updatetau(routemat201,popsize,rho,Q,Tau202,Value);% 更新全局信息素
    
    %% 记录最优
    if gen==1
        bestroute=chrom(indexmin,:);%记录最优染色体
        bestvalueaco=vmin;%记录的最优值
    end
    if bestvalueaco>vmin
        bestvalueaco=vmin;%记录的最优值
        bestroute=chrom(indexmin,:);
    end
    tracemataco(gen,1)=bestvalueaco;% 保留最优
    tracemataco(gen,2)=mean(Value);% 均值
    
    waitbar(gen/maxgen,wait_hand);%每循环一次更新一次进步条
end
delete(wait_hand);%执行完后删除该进度条

% 绘图
figure;
plot(tracemataco(:,1),'r-','linewidth',1);
legend({'蚁群最优值'},'fontname','宋体');
xlabel('迭代次数','fontName','宋体');
ylabel('目标函数','fontName','宋体');
title('蚁群算法优化目标函数曲线','fontName','宋体');

disp('显示蚁群算法优化得到的结果');
disp('蚁群算法优化得到最佳目标函数');
bestvalueaco
disp('蚁群算法优化得到最佳路径');
bestroute

x=bestroute;
[y,G]=myfun(x);
G
title201='蚁群算法优化得到的甘特图';
drawgattG(G,jobnumber,title201);



rmpath(genpath('mytoolbox'));

程序结果:


S20 =

     1     1     1     1     2     2     2     2     3     3     3     3     4     4     4     4     5     5     5     5     6     6     6     6

显示蚁群算法优化得到的结果
蚁群算法优化得到最佳目标函数

bestvalueaco =

    44

蚁群算法优化得到最佳路径

bestroute =

  1 至 28 列

    12    22     7    15    11    18     4    10    13     8     5    19    20    21     9    14     6    23     2    17    16     1     3    24     1     4     8    11

  29 至 48 列

    13    15    17    20    23    25    29    32    34    35    39    41    42    47    49    52    54    58    61    62


G =

     3     1     3     0     3
     6     1     2     0     7
     2     1     4     0     6
     4     1     6     0     7
     3     2     2     7    10
     5     1     3     3     8
     1     1     1     0     3
     3     3     5    10    15
     4     2     1     7    15
     2     2     2    10    18
     2     3     3    18    23
     5     2     6     8    16
     5     3     2    18    23
     6     2     6    16    26
     3     4     5    15    18
     4     3     3    23    25
     2     4     1    23    30
     6     3     6    26    35
     1     2     3    25    35
     5     4     5    23    29
     4     4     5    29    41
     1     3     6    35    40
     1     4     5    41    44
     6     4     4    35    40

>> 

 完整代码见:https://download.csdn.net/download/corn1949/89173025

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

通过Docker新建并使用MySQL数据库

1. 安装Docker 确保您的系统上已经安装了Docker。可以通过以下命令检查Docker是否安装并运行: systemctl status docker如果没有安装或运行,请按照官方文档进行安装和启动。 2. 拉取MySQL镜像 从Docker Hub拉取MySQL官方镜像。这里以MySQL 5.7版本为…

【数学】深度学习中的概率基础知识记录

基于 Deep Learning (2017, MIT) 书总结了必要的概率知识 原blog 以及用到的Ipython notebook 文章目录 1 概述2 知识2.1 离散变量和概率质量函数(PMF)2.2 连续变量和概率密度函数(PDF)2.3 边缘概率2.4 条件概率2.5 条件概率的链式…

Qt gsl库配置踩坑记录

想求解非线性方程组,之前使用拟牛顿法写过相关的matlab代码,这次想移植到C代码,网上说gsl库挺好用的,于是我也想试一下。相关参考: 【C】GSL(GNU Scientific Library) 的安装及在 Visual Studio 2017 中的使用 QT5使用…

k8s部署Eureka集群

部署有状态负载 镜像配置: 环境变量如下: AUTHENTICATE_ENABLEtrue JAVA_OPTS-Dauth.userName账号 -Dauth.password密码 MY_POD_NAMEmetadata.name BOOL_REGISTERtrue BOOL_FETCHtrue APPLICATION_NAME负载名称 EUREKA_INSTANCE_HOSTNAME${MY_POD_NA…

单臂路由实验

单臂路由是一种在单个物理接口上配置多个逻辑接口,以实现不同VLAN间通信的技术。它通过在路由器接口上划分子接口,每个子接口对应一个VLAN网段,从而实现了VLAN间的互联互通。单臂路由能够重新封装MAC地址,转换VLAN标签&#xff0c…

1.微服务介绍

完整的微服务架构图 注册中心 配置中心 服务集群 服务网关 分布式缓存 分布式搜索 数据库集群 消息队列 分布式日志服务 系统监控链路追踪 Jenkins docker k8s 技术栈 微服务治理: 注册发现、远程调用、负载均衡、配置管理、网关路由、系统保护、流量…

(mac)性能监控平台搭建JMeter+Grafana+Influxdb

【实现原理】 通过influxdb数据库存储jmeter的结果,再通过grafana采集influxdb数据库数据,完成监控平台展示 一、时间序列数据InfluxDB 1.InfluxDB下载安装 官网下载 https://portal.influxdata.com/downloads/ 官网最新版: &#xff0…

计算机网络1-TCP和UDP

TCP与UDP 同:都工作在传输层,目标都是在程序间传输数据(文本、视频等等),都是2进制数据; 区别: TCP:电话,基于连接, UDP:书信,基于非…

Golang图像处理实战:image/png包的应用详解

Golang图像处理实战:image/png包的应用详解 介绍基本操作读取PNG文件保存PNG文件 处理图像数据修改图像像素图像裁剪和缩放 高级功能使用 image/color 处理颜色优化PNG性能 错误处理与调试常见错误及其解决方法文件无法打开图像解码失败 使用工具和库进行调试 结语 …

软航H5 PDF签章产品经nginx代理之后浏览器中PDF盖章时提示:签章失败:网络错误 的问题排查及解决办法

目录 问题现象 问题排查思路 问题处理办法 附:软航H5 PDF签章产品介绍 软航电子签章系统 软航版式文档签批系统 问题现象 问题描述:在系统中集成了软航H5 PDF签章产品,软航H5 PDF签章产品的对应服务是通过nginx代理的,在奇安…

微信小程序地图polyline坐标太多异常显示BUG

描述 微信小程序map地图上显示polyline线,点位超过1250个出现bug,(仅真机上出现,模拟器上正常) 这里以加载四川省边界为例, 以下是示例代码 // 读取geojson数据 uni.request({url: https://geo.datav.aliyun.com/a…

公网IP地址如何申请SSL证书?有免费的IP ssl吗?

如果用户没有域名或只有公网IP地址或者不方便使用域名,IP地址ssl证书这一特殊的证书可以为IP地址实现HTTPS的安全保护,提高网站数据传输的安全性。 IP地址申请SSL证书的基本步骤 IP ssl证书下载---注册填写230916https://www.joyssl.com/certificate/sel…

CalcPad(2) 单位设置和绘制图表

CalcPad(2) 单位设置和绘制图表 Hi uu们,CalcPad用的还好吗?有发现一些问题吗? 在我的使用中,经常需要指定一些计算结果的符号,比如说我希望ADC最小分辨率的计算结果是以uV展示,那我们该怎么操作呢&#…

x-cmd mod | x whisper - 使用 whisper.cpp 进行本地 AI 语音识别

介绍 Whisper 模块通过 whisper.cpp 帮助用户快速将音频转换为文字。 INFO: whisper.cpp 是一个用 C/C 编写的轻量级智能语音识别库,是基于 OpenAI 的 Whisper 模型的移植版本,旨在通过深度学习模型实现音频转文字功能。 由于 whisper.cpp 目前只支持 1…

cdp集群Hbase组件HRegionServer服务停止原因以及排查

前言:重启集群后某一节点HRegionServer服务停止,重启前所有服务均正常 去查看日志: 日志报错 ERROR HRegionServer Master rejected startup because clock is out of sync org.apache.hadoop.hbase.ClockOutOfSyncException: org.apache.h…

OpenHarmony鸿蒙南向开发案例:【智能窗户通风设备】

样例简介 本文档介绍了安全厨房案例中的相关智能窗户通风设备,本安全厨房案例利用轻量级软总线能力,将两块欧智通V200Z-R/BES2600开发板模拟的智能窗户通风设备和燃气告警设备组合成。当燃气数值告警时,无需其它操作,直接通知软总…

小球反弹(蓝桥杯)

文章目录 小球反弹【问题描述】答案:1100325199.77解题思路模拟 小球反弹 【问题描述】 有一长方形,长为 343720 单位长度,宽为 233333 单位长度。在其内部左上角顶点有一小球(无视其体积),其初速度如图所…

企业单位IPTV数字电视直播与点播系统-中国卫通怀来地球站IPTV数字电视直播与点播系统应用浅析

企业单位IPTV数字电视直播与点播系统-中国卫通怀来地球站IPTV数字电视直播与点播系统应用浅析 由北京海特伟业科技有限公司任洪卓发布于2024年4月19日 一、运营商光猫接入企业/单位IPTV数字电视直播与点播系统建设概述 中国卫通怀来地球站,位于怀来县土木镇&#xf…

W11安装WSL2 ubuntu 攻略

W11安装WSL2 ubuntu 攻略 最近换了新电脑重新安装一遍wsl2,记录一下方便以后使用。 打开控制面板,选择程序 —— 启用或关闭Windows功能,勾选 适用于Linux的Windows子系统还有虚拟机平台选项,修改后需要重启 wsl2版本 wsl --se…

springcloud第4季 springcloud-alibaba之nacos篇-配置中心

一 nacos的配置中心 1.1 配置中心 namespace,group,dataid 之间的关系 1.2 配置样例
最新文章