【车间调度】基于协同进化遗传算法求解流水车间调度问题附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法       神经网络预测       雷达通信       无线传感器        电力系统

信号处理              图像处理               路径规划       元胞自动机        无人机 

⛄ 内容介绍

为求解多协作车间的计划调度问题,提出了并行协同进化遗传算法.该算法采用基于工序的染色体编码方案.在遗传操作过程中,首先利用提出的基于工序约束的基因调整算法进行交叉操作和变异操作,保证了新个体满足工序约束.在解码操作过程中,采用考虑设备能力空间的解码算法,使得解码产生的调度为活动调度.此外,运用协同进化的思想,提出了协同适应值计算的算法,使协作环境的变化能灵敏地反映在个体的适应值上,从而有效地指导种群的进化.实例表明,该算法能够满足多协作车间并行协同调度的要求.

⛄ 部分代码

%COGA Summary of this function goes here

%   标准合作型协同进化遗传算法

clc;

clear all;

AVE=0;

Array_TestValue=[];

%% 定义全局变量

global POPSIZE_1  POPSIZE_2;%种群1的规模 种群2的规模

global P0 P1 T PC PM ;  %种群1,种群2,变异概率,交叉概率

POPSIZE_1=20;

POPSIZE_2=100;

Pc=0.90;

    %输入基础数据信息包含,工件个数N,每个工件的子工件个数,每个子工件在两台机器上的加工时间

    N=100;%工件的个数

    Range_Child_N=[3,7];%Range_Child_N  切割子工件的个数的范围

    Range_Time_M1_D=5;Range_Time_M1_U=30;% 机器1的加工时间范围

    Range_Time_M2_D=5;Range_Time_M2_U=30;% 机器2的加工时间的范围

    Limit_Volume=40;   % 缓冲区容量限制

    Info_N=zeros(N,max(Range_Child_N)*2+1);  % 第一列每个工件包含的的子工件数量,从第2列开始,表示子工件在两台机器上的加工时间比如  N=[3,2,5,1,8,4,6]

P0= cell(1,POPSIZE_1);  %  由20个矩阵组成的元胞

P1= zeros(POPSIZE_2,N);

T=150;   % 迭代次数150

FitnessValue_P0=zeros(1,POPSIZE_1);

FitnessValue_P1=zeros(POPSIZE_2,4);     %[选取的PO中的个体的编号,Cmax.Ctime,Count]

Size_External_Set=T;

Num_Coop=10;

Size_Nbest=7;

BestValueSet=cell(Size_External_Set,5); %档集中,外部存档集的形势{[个体0][个体2][Cmax][Ctime][Count]}

 % ***********填充Inof_N

% for i=1:size(Info_N,1)

%     for j=1: size(Info_N,2)

%         if j==1  % 子工件的个数

%             Info_N(i,j)= round(rand(1,1)*(Range_Child_N(1,2)-Range_Child_N(1,1)))+Range_Child_N(1,1); % 3-6的随机整数

%             continue;

%         elseif(j>=2 && j<=2*Info_N(i,1)+1)

%              if(mod(j,2)==0) % 表示第一台机器的加工时间

%                 Info_N(i,j)= round(rand(1,1)*(Range_Time_M1_U-Range_Time_M1_D))+Range_Time_M1_D; % 5-20的随机整数

%              else

%                 Info_N(i,j)= round(rand(1,1)*(Range_Time_M2_U-Range_Time_M2_D))+Range_Time_M2_D; % 5-20的随机整数

%             end

%         else

%             Info_N(i,j)=0;

%         end

%     end

% end

% fid=fopen('F:\cn_windows_7_ultimate_with_sp1_x86_dvd_618763\0824\论文数据\Info_N1.txt','wt');

% for i=1:size(Info_N,1)

%     for j=1:size(Info_N,2)

%        fprintf(fid,'%d\t',Info_N(i,j));         

%     end

%     fprintf(fid,'%s\n',';');  

% end

% fclose(fid);

Info_N =[6 10 6 29 15 30 7 14 6 7 28 24 13 0 0 ;

6 16 28 12 30 14 14 7 25 7 9 14 23 0 0 ;

4 8 12 7 6 12 14 11 25 0 0 0 0 0 0 ;

7 20 10 27 15 10 5 25 26 16 19 5 29 9 26 ;

4 11 21 20 22 27 25 23 29 0 0 0 0 0 0 ;

6 11 17 10 16 14 21 24 20 24 17 24 28 0 0 ;

7 7 7 24 13 13 6 8 20 9 16 9 6 10 22 ;

5 16 23 26 5 24 7 11 7 19 22 0 0 0 0 ;

7 26 21 16 13 10 11 8 7 20 25 13 24 29 10 ;

6 28 18 25 25 28 22 14 22 16 12 24 6 0 0 ;

4 7 20 29 12 30 19 9 12 0 0 0 0 0 0 ;

7 18 22 14 25 9 18 9 9 25 24 13 28 19 19 ;

4 22 21 7 22 29 25 21 22 0 0 0 0 0 0 ;

6 14 8 20 18 21 19 26 30 8 15 28 13 0 0 ;

5 22 14 19 16 17 22 13 17 14 23 0 0 0 0 ;

5 18 8 7 17 13 9 23 10 17 24 0 0 0 0 ;

4 16 13 25 8 8 7 15 27 0 0 0 0 0 0 ;

4 8 20 6 22 28 8 12 17 0 0 0 0 0 0 ;

4 19 6 26 8 15 12 9 9 0 0 0 0 0 0 ;

6 28 12 14 21 30 28 21 23 23 15 24 7 0 0 ;

4 16 5 17 12 21 23 12 5 0 0 0 0 0 0 ;

5 28 13 8 14 24 27 5 27 13 26 0 0 0 0 ;

5 23 30 25 14 18 18 21 25 22 30 0 0 0 0 ;

6 16 28 10 28 19 28 25 19 21 15 13 20 0 0 ;

5 19 26 20 29 12 21 17 22 26 8 0 0 0 0 ;

6 19 19 17 9 7 12 25 30 13 28 13 11 0 0 ;

6 16 13 26 19 6 11 26 5 25 22 18 29 0 0 ;

4 25 23 18 22 9 26 26 6 0 0 0 0 0 0 ;

5 22 30 24 28 18 7 27 21 27 8 0 0 0 0 ;

5 19 21 16 16 28 7 28 13 10 14 0 0 0 0 ;

6 23 26 12 8 20 19 15 14 15 27 24 13 0 0 ;

5 7 6 21 18 18 21 10 25 17 9 0 0 0 0 ;

4 17 13 23 18 24 23 28 6 0 0 0 0 0 0 ;

5 25 29 22 23 23 21 23 19 26 29 0 0 0 0 ;

5 11 14 14 26 12 22 16 13 6 30 0 0 0 0 ;

5 21 20 15 14 17 21 30 22 16 8 0 0 0 0 ;

5 13 19 28 17 10 22 22 9 5 8 0 0 0 0 ;

4 12 9 10 7 20 18 13 14 0 0 0 0 0 0 ;

6 12 23 8 18 17 5 15 29 27 24 14 9 0 0 ;

3 10 8 27 16 23 19 0 0 0 0 0 0 0 0 ;

5 12 23 15 29 19 9 12 14 17 6 0 0 0 0 ;

3 20 11 29 29 9 10 0 0 0 0 0 0 0 0 ;

7 7 26 5 24 17 23 26 30 8 20 11 22 8 7 ;

6 20 12 7 27 28 23 23 27 8 28 5 10 0 0 ;

5 11 26 11 29 17 9 21 7 21 9 0 0 0 0 ;

4 11 26 22 20 22 19 30 18 0 0 0 0 0 0 ;

4 23 25 27 18 17 27 21 14 0 0 0 0 0 0 ;

4 13 26 15 12 15 30 30 27 0 0 0 0 0 0 ;

6 27 14 24 18 30 6 26 8 20 10 17 19 0 0 ;

5 30 18 24 30 6 9 15 14 25 27 0 0 0 0 ;

7 10 26 8 8 19 27 13 20 12 28 11 6 16 27 ;

4 11 15 23 7 22 28 29 17 0 0 0 0 0 0 ;

5 16 10 21 27 13 7 7 25 25 18 0 0 0 0 ;

5 9 29 18 6 12 17 19 30 19 19 0 0 0 0 ;

7 10 22 19 10 24 28 7 13 21 13 21 19 9 18 ;

4 24 11 26 9 11 12 17 24 0 0 0 0 0 0 ;

6 19 16 6 9 22 26 21 18 21 25 6 20 0 0 ;

4 9 14 24 14 27 17 16 8 0 0 0 0 0 0 ;

5 21 18 11 13 9 27 12 24 22 11 0 0 0 0 ;

6 29 12 18 26 7 17 19 28 26 19 24 7 0 0 ;

4 25 16 15 15 14 6 28 11 0 0 0 0 0 0 ;

4 8 17 25 7 17 14 24 29 0 0 0 0 0 0 ;

6 14 27 22 18 15 13 7 5 20 21 14 11 0 0 ;

6 30 11 9 26 26 15 27 16 20 16 14 10 0 0 ;

5 6 29 15 22 21 17 21 24 6 17 0 0 0 0 ;

6 19 7 11 24 14 12 22 24 8 18 30 10 0 0 ;

6 29 11 25 11 22 24 8 26 13 7 13 8 0 0 ;

4 13 9 28 8 16 29 12 26 0 0 0 0 0 0 ;

3 26 7 25 9 25 8 0 0 0 0 0 0 0 0 ;

3 19 23 22 29 8 23 0 0 0 0 0 0 0 0 ;

6 5 16 15 6 10 5 20 30 20 28 21 25 0 0 ;

4 9 10 11 14 25 11 30 14 0 0 0 0 0 0 ;

3 8 23 16 16 17 12 0 0 0 0 0 0 0 0 ;

5 24 16 27 5 22 22 29 19 16 5 0 0 0 0 ;

3 17 18 10 21 21 27 0 0 0 0 0 0 0 0 ;

3 27 16 17 20 14 9 0 0 0 0 0 0 0 0 ;

7 6 29 15 17 15 23 27 6 25 13 13 27 25 6 ;

3 6 29 7 12 14 22 0 0 0 0 0 0 0 0 ;

5 27 25 15 25 22 15 25 24 27 29 0 0 0 0 ;

4 20 21 12 7 5 14 11 9 0 0 0 0 0 0 ;

6 16 19 11 6 8 27 19 11 22 29 18 22 0 0 ;

6 25 30 19 28 20 29 27 26 28 23 5 28 0 0 ;

4 27 6 23 20 9 8 22 28 0 0 0 0 0 0 ;

4 28 30 15 5 27 25 26 15 0 0 0 0 0 0 ;

3 22 24 16 27 10 24 0 0 0 0 0 0 0 0 ;

7 6 18 17 7 22 25 14 12 24 11 23 28 21 8 ;

6 11 23 6 26 24 30 18 29 11 21 19 8 0 0 ;

6 13 6 9 26 29 9 28 30 5 21 26 26 0 0 ;

6 26 22 19 5 25 9 5 29 20 13 12 29 0 0 ;

5 21 21 17 29 20 16 28 27 14 19 0 0 0 0 ;

6 14 8 12 5 8 16 10 21 19 28 10 10 0 0 ;

4 13 9 9 26 6 18 13 13 0 0 0 0 0 0 ;

6 25 21 8 25 13 28 17 15 21 21 9 24 0 0 ;

4 17 18 18 22 16 25 27 27 0 0 0 0 0 0 ;

6 14 17 25 25 15 24 25 6 11 21 7 23 0 0 ;

3 29 9 30 23 5 23 0 0 0 0 0 0 0 0 ;

3 6 21 23 6 15 25 0 0 0 0 0 0 0 0 ;

4 28 24 10 18 14 29 16 22 0 0 0 0 0 0 ;

6 5 28 28 15 12 12 16 5 23 16 8 14 0 0 ;

5 29 24 6 29 28 23 26 17 7 8 0 0 0 0 ];

%% 初始化种群信息  定义两2个种群,编写人工解的生成方法,解码函数。

tic;

%获取一个人工解: 入参:工件的信息,和体积容量

[Pop0_Artifical,Pop1_Artifical] = getArtifical(Info_N,Limit_Volume);

% 填充初始种群

for i=1:max(POPSIZE_1,POPSIZE_2)

    if(i<=min(POPSIZE_1,POPSIZE_2))

       if(i==1)

           P0{1,i}=Pop0_Artifical;

           P1(i,:)=Pop1_Artifical;

       else

           % 获取规则解

           [Pop0_Rule,Pop1_Rule] = getRule(Info_N,Limit_Volume);

           P0{1,i}=Pop0_Rule;

           P1(i,:)=Pop1_Rule;

       end

    else

        if(POPSIZE_1>POPSIZE_2)

           [Pop0_Rule,Pop1_Rule] = getRule(Info_N,Limit_Volume);

           P0{1,i}=Pop0_Rule;

           P1(i,:)=Pop1_Rule;   

        else

           P1(i,:)=randperm(N);

        end

    end

end

⛄ 运行结果

⛄ 参考文献

[1] 于晓义, 孙树栋, 褚崴. 基于并行协同进化遗传算法的多协作车间计划调度[J]. 计算机集成制造系统, 2008, 14(5):10.

[2] 郑金克, 杨明忠, 蔡兰. 基于遗传算法的流水车间调度的实现[J]. 机电工程技术, 2006, 035(001):92-94.

[3] 周艳平王功明. 协同进化遗传算法及在车间调度中的应用[J]. 计算机系统应用, 2021, 30(10):248-253.

⛳️ 代码获取关注我

❤️部分理论引用网络文献,若有侵权联系博主删除

❤️ 关注我领取海量matlab电子书和数学建模资料

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
车间调度问题是一个经典的组合优化问题,可以使用遗传算法求解。以下是一个基于遗传算法车间调度问题MATLAB代码: ```matlab % 遗传算法求解车间调度问题 %% 初始化 clear; clc; % 工件数目 num_jobs = 10; % 机器数目 num_machines = 3; % 种群数目 pop_size = 50; % 迭代次数 num_iter = 100; % 交叉概率 pc = 0.8; % 变异概率 pm = 0.1; % 生成初始种群 pop = zeros(num_jobs, num_machines, pop_size); for i = 1:pop_size pop(:, :, i) = randperm(num_jobs)'; end %% 迭代 for iter = 1:num_iter % 评估适应度 fitness = zeros(pop_size, 1); for i = 1:pop_size fitness(i) = evaluate_fitness(pop(:, :, i)); end % 选择 parents = select_parents(pop, fitness); % 交叉 children = crossover(parents, pc); % 变异 children = mutate(children, pm); % 合并种群 pop = cat(3, parents, children); end % 打印最佳解 best_pop = pop(:, :, fitness == max(fitness)); best_schedule = reshape(best_pop, num_jobs, num_machines); disp(best_schedule); %% 函数定义 % 评估适应度函数 function [fitness] = evaluate_fitness(schedule) % 计算每个工件的完成时间 completion_time = zeros(size(schedule, 1), size(schedule, 2)); completion_time(:, 1) = schedule(:, 1); for j = 2:size(schedule, 2) completion_time(:, j) = max(completion_time(:, j-1), schedule(:, j)); end % 计算总完成时间 fitness = max(completion_time(:, end)); end % 选择函数 function [parents] = select_parents(pop, fitness) % 轮盘赌选择 prob = fitness / sum(fitness); cum_prob = cumsum(prob); parents = zeros(size(pop)); for i = 1:size(pop, 3) r = rand(); j = find(cum_prob >= r, 1); parents(:, :, i) = pop(:, :, j); end end % 交叉函数 function [children] = crossover(parents, pc) children = zeros(size(parents)); for i = 1:2:size(parents, 3) if rand() < pc % 随机选择两个父代进行交叉 p1 = parents(:, :, i); p2 = parents(:, :, i+1); % 随机选择交叉点 cp = randi(size(p1, 1)-1); % 交叉 c1 = [p1(1:cp, :); p2(cp+1:end, :)]; c2 = [p2(1:cp, :); p1(cp+1:end, :)]; % 更新子代 children(:, :, i) = c1; children(:, :, i+1) = c2; else % 如果不进行交叉,则直接复制父代 children(:, :, i) = parents(:, :, i); children(:, :, i+1) = parents(:, :, i+1); end end end % 变异函数 function [children] = mutate(children, pm) for i = 1:size(children, 3) if rand() < pm % 随机选择一个工件和一个机器进行交换 j1 = randi(size(children, 1)); j2 = randi(size(children, 1)); m1 = randi(size(children, 2)); m2 = randi(size(children, 2)); % 变异 tmp = children(j1, m1, i); children(j1, m1, i) = children(j2, m2, i); children(j2, m2, i) = tmp; end end end ``` 代码中使用了轮盘赌选择、单点交叉和单点变异等遗传算法的基本思想。其中,`evaluate_fitness` 函数用于计算每个个体的适应度,`select_parents` 函数用于进行选择操作,`crossover` 函数用于进行交叉操作,`mutate` 函数用于进行变异操作。 以上是一个简单的遗传算法求解车间调度问题MATLAB代码,仅供参考。如果需要更多的帮助,可以查阅相关文献或咨询专业人士。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matlab科研助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值