流水线型车间作业调度问题遗传算法Matlab源码
流水线型车间作业调度问题可以描述如下:n个任务在流水线上进行m个阶段的加工,每一阶段至少有一台机器且至少有一个阶段存在多台机器,并且同一阶段上各机器的处理性能相同,在每一阶段各任务均要完成一道工序,各任务的每道工序可以在相应阶段上的任意一台机器上加工,已知任务各道工序的处理时间,要求确定所有任务的排序以及每一阶段上机器的分配情况,使得调度指标(一般求Makespan)最小。下面的源码是求解流水线型车间作业调度问题的遗传算法通用MATLAB源码,属于GreenSim团队原创作品,转载请注明。

function [Zp,Y1p,Y2p,Y3p,Xp,LC1,LC2]=JSPGA(M,N,Pm,T,P)
%--------------------------------------------------------------------------
% JSPGA.m
% 流水线型车间作业调度遗传算法
% GreenSim团队原创作品,转载请注明
% Email:greensim@163.com
% GreenSim团队主页:http://blog.sina.com.cn/greensim
% 欢迎访问GreenSim——算法仿真团队→http://blog.sina.com.cn/greensim

%--------------------------------------------------------------------------
% 输入参数列表
% M 遗传进化迭代次数
% N 种群规模(取偶数)
% Pm 变异概率
% T m×n的矩阵,存储m个工件n个工序的加工时间
% P 1×n的向量,n个工序中,每一个工序所具有的机床数目
% 输出参数列表
% Zp 最优的Makespan值
% Y1p 最优方案中,各工件各工序的开始时刻,可根据它绘出甘特图
% Y2p 最优方案中,各工件各工序的结束时刻,可根据它绘出甘特图
% Y3p 最优方案中,各工件各工序使用的机器编号
% Xp 最优决策变量的值,决策变量是一个实数编码的m×n矩阵
% LC1 收敛曲线1,各代最优个体适应值的记录
% LC2 收敛曲线2,各代群体平均适应值的记录
% 最后,程序还将绘出三副图片:两条收敛曲线图和甘特图(各工件的调度时序图)

%第一步:变量初始化
[m,n]=size(T);%m是总工件数,n是总工序数
Xp=zeros(m,n);%最优决策变量
LC1=zeros(1,M);%收敛曲线1
LC2=zeros(1,N);%收敛曲线2

%第二步:随机产生初始种群
farm=cell(1,N);%采用细胞结构存储种群
for k=1:N
X=zeros(m,n);
for j=1:n
for i=1:m
X(i,j)=1+(P(j)-eps)*rand;
end
end
farm{k}=X;
end

counter=0;%设置迭代计数器
while counter<M%停止条件为达到最大迭代次数

%第三步:交叉
newfarm=cell(1,N);%交叉产生的新种群存在其中
Ser=randperm(N);
for i=1:2:(N-1)
A=farm{Ser(i)};%父代个体
Manner=unidrnd(2);%随机选择交叉方式
if Manner==1
cp=unidrnd(m-1);%随机选择交叉点
%双亲双子单点交叉
a=[A(1:cp,:);B((cp+1):m,:)];%子代个体
b=[B(1:cp,:);A((cp+1):m,:)];
else
cp=unidrnd(n-1);%随机选择交叉点
b=[B(:,1:cp),A(:,(cp+1):n)];
end
newfarm{i}=a;%交叉后的子代存入newfarm
newfarm{i+1}=b;
end
%新旧种群合并
FARM=[farm,newfarm];

%第四步:选择复制
FITNESS=zeros(1,2*N);
fitness=zeros(1,N);
plotif=0;
for i=1:(2*N)
X=FARM{i};
Z=COST(X,T,P,plotif);%调用计算费用的子函数
FITNESS(i)=Z;
end
%选择复制采取两两随机配对竞争的方式,具有保留最优个体的能力
Ser=randperm(2*N);
for i=1:N
f2=FITNESS(Ser(2*i));
if f1<=f2
farm{i}=FARM{Ser(2*i-1)};
fitness(i)=FITNESS(Ser(2*i-1));
else
farm{i}=FARM{Ser(2*i)};
end
end
%记录最佳个体和收敛曲线
minfitness=min(fitness)
meanfitness=mean(fitness)
LC1(counter+1)=minfitness;%收敛曲线1,各代最优个体适应值的记录
LC2(counter+1)=meanfitness;%收敛曲线2,各代群体平均适应值的记录
pos=find(fitness==minfitness);
Xp=farm{pos(1)};

%第五步:变异
for i=1:N
if Pm>rand;%变异概率为Pm
X=farm{i};
I=unidrnd(m);
J=unidrnd(n);
X(I,J)=1+(P(J)-eps)*rand;
farm{i}=X;
end
end
farm{pos(1)}=Xp;

counter=counter+1
end

%输出结果并绘图
figure(1);
plotif=1;
X=Xp;
[Zp,Y1p,Y2p,Y3p]=COST(X,T,P,plotif);
figure(2);
plot(LC1);
figure(3);
plot(LC2);

function [Zp,Y1p,Y2p,Y3p]=COST(X,T,P,plotif)
% JSPGA的内联子函数,用于求调度方案的Makespan值
% 输入参数列表
% X 调度方案的编码矩阵,是一个实数编码的m×n矩阵
% T m×n的矩阵,存储m个工件n个工序的加工时间
% P 1×n的向量,n个工序中,每一个工序所具有的机床数目
% plotif 是否绘甘特图的控制参数
% 输出参数列表
% Zp 最优的Makespan值
% Y1p 最优方案中,各工件各工序的开始时刻
% Y2p 最优方案中,各工件各工序的结束时刻
% Y3p 最优方案中,各工件各工序使用的机器编号

%第一步:变量初始化
[m,n]=size(X);
Y1p=zeros(m,n);
Y2p=zeros(m,n);
Y3p=zeros(m,n);

%第二步:计算第一道工序的安排
Q1=zeros(m,1);
Q2=zeros(m,1);
R=X(:,1);%取出第一道工序
Q3=floor(R);%向下取整即得到各工件在第一道工序使用的机器的编号
%下面计算各工件第一道工序的开始时刻和结束时刻
for i=1:P(1)%取出机器编号
pos=find(Q3==i);%取出使用编号为i的机器为其加工的工件的编号
lenpos=length(pos);
if lenpos>=1
Q1(pos(1))=0;
if lenpos>=2
for j=2:lenpos
Q1(pos(j))=Q2(pos(j-1));
Q2(pos(j))=Q2(pos(j-1))+T(pos(j),1);
end
end
end
end
Y1p(:,1)=Q1;
Y3p(:,1)=Q3;

%第三步:计算剩余工序的安排
for k=2:n
R=X(:,k);%取出第k道工序
Q3=floor(R);%向下取整即得到各工件在第k道工序使用的机器的编号
%下面计算各工件第k道工序的开始时刻和结束时刻
for i=1:P(k)%取出机器编号
pos=find(Q3==i);%取出使用编号为i的机器为其加工的工件的编号
lenpos=length(pos);
if lenpos>=1
EndTime=Y2p(pos,k-1);%取出这些机器在上一个工序中的结束时刻
POS=zeros(1,lenpos);%上一个工序完成时间由早到晚的排序
for jj=1:lenpos
POS(jj)=ppp(1);
EndTime(ppp(1))=Inf;
end
%根据上一个工序完成时刻的早晚,计算各工件第k道工序的开始时刻和结束时刻
Q1(pos(POS(1)))=Y2p(pos(POS(1)),k-1);
Q2(pos(POS(1)))=Q1(pos(POS(1)))+T(pos(POS(1)),k);%前一个工件的结束时刻
if lenpos>=2
for j=2:lenpos
Q1(pos(POS(j)))=Y2p(pos(POS(j)),k-1);%预定的开始时刻为上一个工序的结束时刻
if Q1(pos(POS(j)))<Q2(pos(POS(j-1)))%如果比前面的工件的结束时刻还早
Q1(pos(POS(j)))=Q2(pos(POS(j-1)));
end
end
end
end
end
Y1p(:,k)=Q1;
Y2p(:,k)=Q2;
Y3p(:,k)=Q3;
end
%第四步:计算最优的Makespan值
Y2m=Y2p(:,n);
Zp=max(Y2m);
%第五步:绘甘特图
if plotif
for i=1:m
for j=1:n
mPoint1=Y1p(i,j);
mPoint2=Y2p(i,j);
mText=m+1-i;
PlotRec(mPoint1,mPoint2,mText);
Word=num2str(Y3p(i,j));
%text(0.5*mPoint1+0.5*mPoint2,mText-0.5,Word);
hold on
x1=mPoint1;y1=mText-1;
x2=mPoint2;y2=mText-1;
x4=mPoint1;y4=mText;
%fill([x1,x2,x3,x4],[y1,y2,y3,y4],'r');
fill([x1,x2,x3,x4],[y1,y2,y3,y4],[1,0.5,1]);
text(0.5*mPoint1+0.5*mPoint2,mText-0.5,Word);
end
end
end

function PlotRec(mPoint1,mPoint2,mText)
% 此函数画出小矩形
% 输入:
% mPoint1 输入点1,较小,横坐标
% mPoint2 输入点2,较大,横坐标
% mText 输入的文本,序号,纵坐标
vPoint = zeros(4,2) ;
vPoint(1,:) = [mPoint1,mText-1];
vPoint(2,:) = [mPoint2,mText-1];
vPoint(3,:) = [mPoint1,mText];
vPoint(4,:) = [mPoint2,mText];
plot([vPoint(1,1),vPoint(2,1)],[vPoint(1,2),vPoint(2,2)]);
hold on ;
plot([vPoint(1,1),vPoint(3,1)],[vPoint(1,2),vPoint(3,2)]);
plot([vPoint(2,1),vPoint(4,1)],[vPoint(2,2),vPoint(4,2)]);
plot([vPoint(3,1),vPoint(4,1)],[vPoint(3,2),vPoint(4,2)]);

matlab算法的更多相关文章

  1. 遗传学详解及Matlab算法实现

    遗传学算法概述 从之前转载的博客<非常好的理解遗传算法的例子>中可以知道,遗传学算法主要有6个步骤: 1. 个体编码 2. 初始群体 3. 适应度计算 4. 选择运算 5. 交叉运算 6. ...

  2. 边缘检测matlab算法汇总

    边缘检测matlab算法汇总 1.      基于一阶微分算子检测边缘图像 一阶微分边缘算子又称梯度边缘算子,它是利用图像在边缘处的阶跃性,及图像梯度在边缘去得极大值得特征性进行边缘检测. Sobel ...

  3. matlab算法转为c语言注意事项

    matlab算法转为c语言后,影响c语言效率的关键在于multiword的产生,基于此会有multiword加减法和乘除法,极大消耗资源,减少甚至消除multiword很重要,需注意的是:算法中尽量减 ...

  4. 数字图像处理:基于MATLAB的车牌识别项目 标签: 图像处理matlab算法 2017-06-24 09:17 98人阅读 评论(0)

    学过了数字图像处理,就进行一个综合性强的小项目来巩固一下知识吧.前阵子编写调试了一套基于MATLAB的车牌识别的项目的代码.今天又重新改进了一下代码,识别的效果好一点了,也精简了一些代码.这里没有使用 ...

  5. 笔画宽度变化(C++和matlab算法)

    最近一直在看工作方面的书籍,把论文的事情搁置了,之前承诺的贴代码的事一直拖.现在把代码整理发上来,只有核心部分的,都不是我写的,我是网上整理下载的,matlab代码的效果比较差. 全部文件网盘下载地址 ...

  6. MATLAB Coder从MATLAB生成C/C++代码步骤

    MATLAB Coder可以从MATLAB代码生成独立的.可读性强.可移植的C/C++代码. 使用MATLAB Coder产生代码的3个步骤: 准备用于产生代码的MATLAB算法: 检查MATLAB代 ...

  7. MATLAB R2018b Mac中文版安装教程

    MATLAB r2018b mac中文版是一款强大的可视化数学分析软件,专门用于在Mac上执行数值计算,编程和可视化任务时极大地提高您的工作效率.在MATLAB的帮助下,您可以分析数据,创建应用程序, ...

  8. 转 举例说明使用MATLAB Coder从MATLAB生成C/C++代码步骤

    MATLAB Coder可以从MATLAB代码生成独立的.可读性强.可移植的C/C++代码. http://www.mathworks.cn/products/matlab-coder/ 使用MATL ...

  9. CPM(Cluster Percolation method)派系过滤算法

    一.概念 (1)完全子图/全耦合网络/k-派系:所有节点全部两两相连 图1 这些全耦合网络也成为派系,k-派系表示该全耦合网络的节点数目为k 1)k-派系相邻:两个不同的k-派系共享k-1个节点,认为 ...

随机推荐

  1. 图片延迟加载(用jq自己写的方法)

    $(function() { $("img.lazy").attr("src","2.jpg"); show(); $(window).sc ...

  2. MySQL学习笔记--基本操作

    1.登录数据库 在命令行输入 "mysql -u username -p" 回车后输入密码 2.选择数据库 USE datebase name,选择要操作的数据库 3.显示所有数据 ...

  3. 饮水思源——python中常用基础类源码解析

    1.bool类 2.int类 3.long类 4.float类 5.str类 6.list类 7.tuple类 8.dict类 9.collections类 Counter类:为hashable对象计 ...

  4. free函数

    free函数 原型: void free(void *ptr) 功 能: 释放ptr指向的存储空间.被释放的空间通常被送入可用存储区池,以后可在调用malloc.realloc以及calloc函数来再 ...

  5. 51nod 1158 全是1的最大子矩阵

    题目链接:51nod 1158 全是1的最大子矩阵 题目分类是单调栈,我这里直接用与解最大子矩阵类似的办法水过了... #include<cstdio> #include<cstri ...

  6. CodeForces #369 div2 D Directed Roads DFS

    题目链接:D Directed Roads 题意:给出n个点和n条边,n条边一定都是从1~n点出发的有向边.这个图被认为是有环的,现在问你有多少个边的set,满足对这个set里的所有边恰好反转一次(方 ...

  7. iOS开发UI篇—在UItableview中实现加载更多功能

    一.实现效果 点击加载更多按钮,出现一个加载图示,三秒钟后添加两条新的数据.                      二.实现代码和说明 当在页面(视图部分)点击加载更多按钮的时候,主页面(主控制器 ...

  8. pwnable.kr-bof

    .Nana told me that buffer overflow is one of the most common software vulnerability. Is that true? D ...

  9. QT快速使用ntohs

    QT快速使用ntohs,需要注意3点:1. ntohs只是转换相邻的2个字节2. 引入头文件#include <windows.h>3. 需要加上win32{LIBS+=-lws2_32} ...

  10. Android重要控件———ListView

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools= ...