基于遗传算法求解流水车间调度问题(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台机器上的加工时序,无时间冲突。

posted @ 2025-11-06 10:29  晃悠人生  阅读(58)  评论(0)    收藏  举报