function [Population2,F2] = Cross(T,Population1,F1,Pmax,Fmax,method)
% 交叉操作 - 策略详见参考文献
% 输入参数:
% T - 时间矩阵
% Population1 - 交叉前种群
% F1 - 交叉前种群适应度
% Pmax - 前subpopnum个最优个体
% Fmax - 前subpopnum个最优个体适应度
% method - 方法选择,1 - 伪并行小生境自适应遗传算法(PPNSA)
% 2 - 混合蛙跳算法(SFLA)
% 3 - 批处理蛙跳算法(BFLA),为SFLA的改进算法
% 4 - PPNSA+扰动算子(首选算法,运行速度快,收敛速度中,较易跳出局部极小)
% 5 - SFLA+扰动算子(末选算法,运行速度慢,收敛速度快,最易陷入局部极小)
% 6 - BFLA+扰动算子(次选算法,运行速度中,收敛速度中,可能陷入局部极小)
% 输出参数:
% Population2 - 交叉后种群
% F2 - 交叉后种群适应度
%--------------------------------------------------------------------------
% 伪并行小生境自适应遗传算法(PPNSA)
if (method==1 || method==4)
Pc = [0.6,0.99]; % 自适应交叉概率范围(如果是标量,则概率固定)
[PCross,FCross,I] = SelfAdaptionCross(Population1,F1,Pc);
% 由自适应交叉概率概率Pc,求参与交叉群体PCross,及适应度
% 输入参数:
% Population1 - 群体(每一行一个个体)
% F1 - 群体适应度(列向量)
% Pc - 自适应交叉概率范围
% 输出参数:
% PCross - 交叉群体(每一行一个个体)
% FCross - 交叉群体适应度(列向量)
% I - 交叉群体序号
Population2 = Population1;
F2 = F1;
c = length(I)/2; % 交叉次数
if c>0
Par1 = PCross(1:2:end,:);
Par2 = PCross(2:2:end,:);
F_Par1 = FCross(1:2:end);
F_Par2 = FCross(2:2:end);
[Off1,F_Off1,Off2,F_Off2] = SubCross(Par1,Par2,T);
% 输入参数:
% Par1 - 父代群体1
% F_Par1 - 父代群体1适应度
% Par2 - 父代群体2
% F_Par2 - 父代群体2适应度
% T - 时间矩阵
% 输出参数:
% Off1 - 子代群体1
% F_Off1 - 子代群体1适应度
% Off2 - 子代群体2
% F_Off2 - 子代群体2适应度
%---------------------------------------
F4 = [F_Par1,F_Par2,F_Off1,F_Off2];
[tmp,I4] = sort(F4,2,'descend'); % 交叉操作2+2选择
F_Off1 = tmp(:,1);
F_Off2 = tmp(:,2);
for i = 1:c
tmp4 = [Par1(i,:);Par2(i,:);Off1(i,:);Off2(i,:)];
Off1(i,:) = tmp4(I4(i,1),:);
Off2(i,:) = tmp4(I4(i,2),:);
end
Population2(I,:) = [Off1;Off2];
F2(I) = [F_Off1;F_Off2];
end
[F2,I] = sort(F2,'descend');
Population2 = Population2(I,:);
end
%--------------------------------------------------------------------------
% 混合蛙跳算法(SFLA)
if (method==2 || method==5)
[d,digit] = size(Population1);
c = d-1;
Population2 = Population1;
F2 = F1;
for i = 1:c
Par1 = Population2(1,:);
Par2 = Population2(d,:);
F_Par1 = F2(1);
F_Par2 = F2(d);
[Off1,F_Off1] = SubCross(Par1,Par2,T);
% 输入参数:
% Par1 - 父代群体1
% F_Par1 - 父代群体1适应度
% Par2 - 父代群体2
% F_Par2 - 父代群体2适应度
% T - 时间矩阵
% 输出参数:
% Off1 - 子代群体1
% F_Off1 - 子代群体1适应度
% Off2 - 子代群体2
% F_Off2 - 子代群体2适应度
%---------------------------------------
if F_Off1>F_Par2
F2(end) = F_Off1;
Population2(end,:) = Off1;
else
Par1 = Pmax(1,:);
F_Par1 = Fmax(1);
[Off2,F_Off2] = SubCross(Par1,Par2,T);
% 输入参数:
% Par1 - 父代群体1
% F_Par1 - 父代群体1适应度
% Par2 - 父代群体2
% F_Par2 - 父代群体2适应度
% T - 时间矩阵
% 输出参数:
% Off1 - 子代群体1
% F_Off1 - 子代群体1适应度
% Off2 - 子代群体2
% F_Off2 - 子代群体2适应度
if F_Off2>F_Par2
F2(end) = F_Off2;
Population2(end,:) = Off2;
else
[Population2(d,:),F2(d)] = Initialize(T,1);
end
end
%---------------------------------------
[F2,I2] = sort(F2,'descend');
Population2 = Population2(I2,:);
end
end
%--------------------------------------------------------------------------
% 批处理蛙跳算法(BFLA),为SFLA的改进算法
if (method==3 || method==6)
[d,digit] = size(Population1);
c = d-1;
Par1 = repmat(Population1(1,:),c,1);
Par2 = Population1(2:d,:);
F_Par1 = repmat(F1(1),c,1);
F_Par2 = F1(2:d);
[Off1,F_Off1,Off2,F_Off2] = SubCross(Par1,Par2,T);
% 输入参数:
% Par1 - 父代群体1
% F_Par1 - 父代群体1适应度
% Par2 - 父代群体2
% F_Par2 - 父代群体2适应度
% T - 时间矩阵
% 输出参数:
% Off1 - 子代群体1
% F_Off1 - 子代群体1适应度
% Off2 - 子代群体2
% F_Off2 - 子代群体2适应度
%----------------------------------------
% 条件最强
F4 = [F_Par2,F_Off1,F_Off2];
[F4,I4] = sort(F4,2,'descend'); % 交叉操作2+2选择
F_Off = F4(:,1);
Off = zeros(size(Off1));
for i = 1:c
tmp4 = [Par2(i,:);Off1(i,:);Off2(i,:)];
Off(i,:) = tmp4(I4(i,1),:);
end
Population2 = Population1;
F2 = F1;
Population2(2:d,:) = Off;
F2(2:d) = F_Off;
%----------------------------------------
I5 = find(F_Par2==F_Off); % 第一次无改善的下标
if ~isempty(I5)
c = length(I5);
Par1 = repmat(Pmax,c,1);
Par2 = Par2(I5,:);
F_Par1 = repmat(Fmax,c,1);
F_Par2 = F_Par2(I5);
[Off1,F_Off1,Off2,F_Off2] = SubCross(Par1,Par2,T);
% 输入参数:
% Par1 - 父代群体1
% F_Par1 - 父代群体1适应度
% Par2 - 父代群体2
% F_Par2 - 父代群体2适应度
% T - 时间矩阵
% 输出参数:
% Off1 - 子代群体1
% F_Off1 - 子代群体1适应度
% Off2 - 子代群体2
% F_Off2 - 子代群体2适应度
F4 = [F_Par2,F_Off1,F_Off2];
[F4,I4] = sort(F4,2,'descend'); % 交叉操作2+2选择
F_Off = F4(:,1);
Off = zeros(size(Off1));
for i = 1:c
tmp4 = [Par2(i,:);Off1(i,:);Off2(i,:)];
Off(i,:) = tmp4(I4(i,1),:);
end
Population2(I5+1,:) = Off;
F2(I5+1) = F_Off;
I6 = find(F_Par2==F_Off); % 第二次无改善的下标
if ~isempty(I6)
c = length(I6);
[Population2(I5(I6)+1,:),F2(I5(I6)+1)] = Initialize(T,c);
end
end
%----------------------------------------
Par1 = Pmax;
Par2 = Population1(1,:); % 子群最大值更新
F_Par1 = Fmax;
F_Par2 = F1(1);
[Off1,F_Off1,Off2,F_Off2] = SubCross(Par1,Par2,T);
% 输入参数:
% Par1 - 父代群体1
% F_Par1 - 父代群体1适应度
% Par2 - 父代群体2
% F_Par2 - 父代群体2适应度
% T - 时间矩阵
% 输出参数:
% Off1 - 子代群体1
% F_Off1 - 子代群体1适应度
% Off2 - 子代群体2
% F_Off2 - 子代群体2适应度
F4 = [F_Par2,F_Off1,F_Off2];
[F2(1),i4] = max(F4); % 子群最大值更新
tmp4 = [Par2;Off1;Off2];
Population2(1,:) = tmp4(i4,:); % 子群最大个体更新
%----------------------------------------
[F2,I] = sort(F2,'descend');
Population2 = Population2(I,:);
end
%==========================================================================
function [Off1,F_Off1,Off2,F_Off2] = SubCross(Par1,Par2,T)
% 输入参数:
% Par1 - 父代群体1
% F_Par1 - 父代群体1适应度
% Par2 - 父代群体2
% F_Par2 - 父代群体2适应度
% T - 时间矩阵
% 输出参数:
% Off1 - 子代群体1
% F_Off1 - 子代群体1适应度
% Off2 - 子代群体2
% F_Off2 - 子代群体2适应度
[c,digit] = size(Par1);
Off1 = zeros(size(Par1));
Off2 = zeros(size(Par2));
for i = 1:c
Par1i = Par1(i,:);
Par2i = Par2(i,:);
switch ceil(3*rand()) % mod(i,3)+1
case 1
I = 1:digit;
Flow_Shop_Scheduling_Problem.rar_flow shop_改进蛙跳算法_蛙跳算法_调度_车间调度
版权申诉
5星 · 超过95%的资源 67 浏览量
2022-09-19
11:09:01
上传
评论 1
收藏 30KB RAR 举报
weixin_42651887
- 粉丝: 75
- 资源: 1万+
最新资源
- 3122080306 邹子轩 实验报告二.docx
- 基于STM32 NUCLEO板设计彩色LED照明灯(纯cubeMX开发)(大赛作品,文档完整,可直接运行)
- 发那科工业机器人保养大全
- Sphere.h
- REMD固有时间尺度分解信号分量可视化(Matlab完整源码和数据)
- 嵌入式系统双单片机STC89C52+STC15W104多功能学习板电路图可扩展 适用于单片机初学者和教学
- 基于STM32蓝牙控制小车系统设计(硬件+源代码+论文)大赛作品
- XILINXFPGA源码基于Spartan3火龙刀系列FPGA开发板VGA测试例程
- Java聊天室的设计与实现【尚学堂·百战程序员】
- python中matplotlib教程
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈