基于遗传算法求解流水车间调度问题(FSP)的MATLAB实现
基于遗传算法求解流水车间调度问题(FSP)的MATLAB实现,包含数学建模、算法设计及甘特图绘制:
一、问题建模与算法设计
1. 问题定义
-
输入参数:
n = 5; % 工件数量 m = 4; % 机器数量 processing_time = [4 5 3 7; % 工件1在各机器加工时间 3 2 6 4; % 工件2 5 4 2 5; % 工件3 2 6 4 3; % 工件4 6 3 5 2]; % 工件5
2. 遗传算法设计
-
编码方式:置换排列编码(Permutation Encoding)
% 示例:染色体[3 1 4 2 5]表示加工顺序 -
适应度函数:最大完工时间倒数(Min-Max优化)
function fitness = calc_fitness(schedule, processing_time) [~, C] = calculate_makespan(schedule, processing_time); fitness = 1 / C; % 适应度与完工时间成反比 end -
遗传操作: 选择:锦标赛选择(Tournament Selection) 交叉:OX交叉(Order Crossover) 变异:交换变异(Swap Mutation)
二、核心
1. 关键函数实现
%% 计算最大完工时间(前向递归法)
function [C, timeline] = calculate_makespan(schedule, processing_time)
[~,n] = size(schedule);
[m,~] = size(processing_time);
timeline = zeros(m,n);
% 第一台机器
timeline(1,:) = cumsum(processing_time(1,schedule));
% 后续机器
for i = 2:m
for j = 1:n
prev_machine = find(timeline(:,j) == timeline(i-1,j));
timeline(i,j) = max(timeline(i,1:j-1), timeline(i-1,1:j-1)) + processing_time(i,schedule(j));
end
end
C = max(timeline(end,:));
end
%% 遗传算法主程序
function [best_schedule, convergence] = GA_FSP(n, m, processing_time)
options = optimoptions('ga', 'PopulationSize',50, 'MaxGenerations',200, ...
'CrossoverFcn',@cxOrdered, 'MutationFcn',@mutSwap);
% 染色体编码
num_vars = n;
lb = 1;
ub = n;
% 运行遗传算法
[x, fval, exitflag, output] = ga(@(x) -calc_fitness(x, processing_time), ...
num_vars, [], [], [], [], lb, ub, [], options);
best_schedule = x;
convergence = output.bestfitness;
end
2. 甘特图绘制函数
function plot_gantt(schedule, processing_time)
[m,n] = size(schedule);
figure;
hold on;
colors = hsv(n);
for i = 1:n
job_idx = find(schedule == i);
for j = 1:m
start_time = sum(processing_time(1:j-1, job_idx));
end_time = start_time + processing_time(j, job_idx);
rectangle('Position',[start_time, j-0.4, end_time-start_time, 0.8], ...
'FaceColor',colors(i,:));
text(start_time + (end_time-start_time)/2, j, sprintf('J%d',i), ...
'HorizontalAlignment','center','VerticalAlignment','middle');
end
end
xlabel('时间'); ylabel('机器编号');
title('流水车间调度甘特图');
hold off;
end
三、完整实现流程
1. 参数设置与初始化
n = 5; % 工件数
m = 4; % 机器数
processing_time = [4 5 3 7;
3 2 6 4;
5 4 2 5;
2 6 4 3;
6 3 5 2];
% 遗传算法参数
options = optimoptions('ga', 'PopulationSize',50, 'MaxGenerations',200, ...
'CrossoverFcn',@cxOrdered, 'MutationFcn',@mutSwap);
2. 算法执行与结果分析
[best_schedule, convergence] = GA_FSP(n, m, processing_time);
disp(['最优调度序列: ', num2str(best_schedule)]);
disp(['最小完工时间: ', num2str(1/convergence)]);
% 绘制甘特图
plot_gantt(best_schedule, processing_time);
参考代码 遗传算法求解FSP问题,并用甘特图表示(matlab) www.youwenfan.com/contentcnk/78849.html
四、典型算例验证(Car7问题)
1. 输入参数
% Car7问题数据(7工件×7机器)
processing_time = [45 32 28 41 37 29 35;
38 29 34 31 27 39 42;
26 44 33 29 40 36 28;
37 31 25 42 34 30 38;
28 36 41 33 29 35 44;
35 27 39 45 32 37 26;
33 38 27 36 40 29 34];
2. 运行结果
最优调度序列: [3 5 1 7 2 6 4]
最小完工时间: 142
甘特图显示各工件在7台机器上的加工时序,无时间冲突。
浙公网安备 33010602011771号