Matlab学习日志——基于遗传算法的车间调度
标签:
it教育 |
分类: 工作学习 |
资料来源《Matlab智能算法30个案例分析》 郁磊 史峰 等 著
问题描述:共有6个工件,在10台机器上加工,每个工件序经过6道工序,安排最零件加工方案。
http://s10/mw690/005vTYuqzy75AGUCkYx89&690
列号,表示零件的标号;行号表示加工工序;矩阵中的元素表示该零件的该道工序的加工机器
http://s11/mw690/005vTYuqzy75AH2eJAK6a&690
列号,表示零件的标号;行号表示加工工序;矩阵中的元素表示该零件的该道工序加工时所需的时间
unidrnd Random arrays from the discrete uniform distribution.
>
r =
题目中需要的数据保存在scheduleData.mat中
其中Jm是工序和可选机器表
http://s1/mw690/005vTYuqzy75AH7cqRi80&690
行数表示工序1-6
列数表示工件1-6
矩阵中的元素表示机器的标号,例如3行5列[4,10]表示第五个零件的第三道工序可以在4号或10号机器上加工
每个零件的工序必须依次完成
T表示每个零件每道工序的加工时间表
http://s10/mw690/005vTYuqzy75AH83Sulb9&690
JmNumber是机器数
程序
%% 清空环境
clc;clear
%% 下载数据
load scheduleData Jm T JmNumber%注意,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);
for i=1:PNumber
end
% 代码2层,第一层工序,第二层机器
Chrom=zeros(NIND,2*WNumber);
for j=1:NIND
end
%计算目标函数值
[PVal ObjV
P S]=cal(Chrom,JmNumber,T,Jm);
%% 循环寻找
while gen
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
end
function [PVal ObjV P S]=cal(Chrom,JmNumber,T,Jm)
%
功能说明:
%
% 输入参数:
%
%
%
% 输出参数:
%
%
%
%
%初始化
NIND=size(Chrom,1);
ObjV=zeros(NIND,1);
%
[PNumber MNumber]=size(Jm);
for
i=1:NIND
P= calp(S,PNumber);
function P=calp(S,PNumber)
%
功能说明:
% 输入参数:
%
%
% 输出参数:
%
%
WNumber=length(S);%工序总个数 即S的长度
WNumber=WNumber/2;
%取工序基因,取基因的一半
S=S(1,1:WNumber);
%初始化
temp=zeros(1,PNumber);
P=zeros(1,WNumber);
%解码生成调度工序 基因S的前36个编码表示工件
for i=1: WNumber
%当连续两个编码是同一个工件时,工序要加1
%例如S(i)=6,temp(6)=temp(6)+1=1
%s(i+1)=6,temp(6)=temp(6)+1=2
%S(i+2)=6,temp(6)=temp(6)+1=3;
%于是有P(i)=601,602,603 即第6个工件的第1,2,3道工序
end
function PVal=caltime(S,P,JmNumber,T,Jm)
%
功能说明:
% 输入参数:
%
%
%
%
% 输出参数:
%
%
[PNumber MNumber]=size(Jm);
%取机器基因,取基因的一半 取S的后半部分
%工序总个数
WNumber=length(P);
%初始化
TM=zeros(1,JmNumber);%机器个数
TP=zeros(1,PNumber);%工件个数
PVal=zeros(2,WNumber);%工序总个数
%计算调度工序时间
for i=1: WNumber %1-36,所有工件的工序
TMval=TM(1,m);%机器加工本工序开始的时间
%TM中存储的为机器时间,取标号为m的机器的时间。
End
%在零件加工的工程中,有可能机器正在被使用,所以零件需要等待机器使用完毕之后才能继续加工
或者机器没有使用时,零件可以直接使用,TM中就是记录的机器使用的时间,TP中记录的是零件加工工序的时间,即当TM3即第3台机器的时间大于TP3,表明第三台机器可以使用,所以时间取TM3,当TM3小于TP3时,说明第3台机器正在使用,只有等使用完成后才能进入下一道工序,所以时间取TP3
end
%最佳调度工序时间 最佳输出的调度工序
实验结果
其中301表示第3个零件的第一道工序,以此类推。
http://s12/mw690/005vTYuqzy75AHh9NI75b&690
http://s7/mw690/005vTYuqzy75AHhdJKmb6&690

加载中…