遗传算法求柔性车间调度FJSP问题MATLAB源码
2019-03-18 21:45阅读:
这个问题我曾经查阅过很多论文和教科书,研究过,并根据算例编写过程,具体的求解过程我也整理过,由于整理的资料上有公式,在此无法编辑,所以我就直接上传图片了。

MATLAB编程得到的计算结果图如下:
所有程序文件如下图:

%%%% 遗传算法双层编码求PFJSP:第一层为工序编码(TSP编码),第二层为机器分配编码
%%%% PFJSP:部分柔性作业车间调度问题,只有部分工件的部分工序都可以在可选择的机器中
%%%% 选择一台进行加工。(注意区别TFJSP)两种不同的问题其编码是不同的
%%%% by 圆 一个有心的人在用心做事
%%%% 2018-09-17
%%%% 如有问题请联系 QQ530807088
新浪微博:MATLAB圆创工作室
% ======================= 高 端 定 制 · 华 丽 分 割
======================
clear
clc
close all
load data
% M: 加工机器矩阵,M{i,j}表示工件i的第j道工序的加工机器集合
% T: 加工时间矩阵,T{i,j}表示工件i的第j道工序在对应机器上的加工时间
% m: 机器数量
[n, q] = size(M);
% n为工件数量,
q为工序个数
CityNum = n * q;
%
工序总个数
Cm = zeros(1,CityNum); % 各工序对应的可选加工机器数量
k = 1;
for i = 1 : n
for j = 1 : q
Candidate =
M{i,j};
Cm(k) =
length(Candidate);
% 可选加工机器数量
k = k +
1;
end
end
NP = 40;
% 种群大小
maxgen = 200;
%
最大进化代数
Pc = 0.8;
% 交叉概率
Pm = 0.6;
% 变异概率
Gap = 0.9;
% 代沟(Generation gap)
%% 初始化种群
X = XInitPop(NP, n, q);
% 工序顺序种群初始化
Y = YInitPop(X, M);
% 机器分配种群初始化
%% 遗传进化
gen = 1;
figure;
hold on;
box on
xlim([0,maxgen])
title('优化过程'); xlabel('代数'); ylabel('最优值')
Fxy = zeros(NP,1);
for i = 1:NP
Fxy(i) = Fitness(X(i,:), Y(i,:), m ,M, T);
% 计算路线长度
end
fpbest=min(Fxy);
while gen
line([gen-1,gen],[fpbest,min(Fxy)]);
pause(0.01)
% 记录各代最优值
fpbest = min(Fxy);
FG(gen) = fpbest;
% 各代最短路径
% 计算适应度
fit = 1./(Fxy+1);
%
将求最小路径转为最大值fit
% 选择
XSel = Select(X, fit, Gap);
YSel = Select(Y, fit, Gap);
% 交叉操作
XSel = XRecombin(XSel, Pc);
YSel = YRecombin(YSel, Pc);
% 变异
XSel = XMutate(XSel, Pm);
YSel = YMutate(YSel, m, Pm);
% 重插入子代的新种群
X = Reins(X, XSel, fit);
Y = Reins(Y, YSel, fit);
% 不可行机器编码检查,
Y = YCheck(X, Y, Cm);
% 计算路线长度
for i = 1 : NP
Fxy(i) =
Fitness(X(i,:), Y(i,:), m, M, T);
% 计算路线长度
end
% 更新迭代次数
gen = gen + 1 ;
end
%% 画出最优解的路线图
[fgbest,Idx] = min(Fxy);
xgbest = X(Idx(1),:);
ygbest = Y(Idx(1),:);
fgbest
figure
drawGantt(xgbest, ygbest, m, M, T)