📄 getcrossover.m
字号:
% 函数功能: 按照加速因子 in_c,得到“交叉”后新的序列
% |-思想:产生一个随机数r2,若 r2 < in_c 则交叉,随机取个子代做结果;否则不变
% |- 交叉:两点顺序交叉法 two-point order crossover
function [out_crosJobSeq] = getCrossover(in_jobSeq, in_optimal, in_c);
% 输入:
% |- in_jobSeq:原作业序列,(1 × jobCount)维
% |- in_optimal:交叉的最优解,(1 × jobCount)维,可以是个体最优或全局最优
% |- in_c: 加速因子,取值为[0, 1]
% 输出:
% |- out_crosJobSeq:变异后的序列,(1 × jobCount)维
[f_lowCount, f_jobCount] = size(in_jobSeq);
f_rand = rand(1);
if (f_rand < in_c) % 错位交叉
% 随机取两个位置 f_ind1,f_ind2
f_ind1 = ceil(rand(1) * (f_jobCount));
f_ind2 = ceil(rand(1) * (f_jobCount));
% 避免两位置相同,随机加上一个数,超出边界则修正为边界
if (f_ind1 == f_ind2)
f_add = ceil(rand(1) * (f_jobCount));
f_ind2 = f_ind2 + f_add;
if (f_ind2 > f_jobCount)
f_ind2 = f_jobCount;
end
end
if (f_ind1 > f_ind2) % 约定f_ind1 < f_ind2
f_swap = f_ind1;
f_ind1 = f_ind2;
f_ind2 = f_swap;
end
% 交叉开始
% ---保留in_jobSeq的前后半段到子代中
out_crosJobSeq(1, 1: f_ind1 - 1) = in_jobSeq(1, 1: f_ind1 - 1);
out_crosJobSeq(1, f_ind2 + 1: f_jobCount) = in_jobSeq(1, f_ind2 + 1: f_jobCount);
% ---中间的按 in_optimal 中的顺序排列
subSeqLen = f_ind2 - f_ind1 + 1;
subSeq = -ones(2, subSeqLen); % 第一行为中间子序列,第二行为在另一个父代 in_optimal 中对应的游标位置,初始为 -1
subSeq(1, 1:subSeqLen) = in_jobSeq(1, f_ind1: f_ind2); % 子序列赋值
% ----------找出对应的 in_optimal 游标顺序
for (ind = 1: subSeqLen)
curJob = subSeq(1, ind);
subSeq(2, ind) = (find(in_optimal == curJob));
end
% ----------重排
[stInd, idx] = sort(subSeq(2, :)); % 按第二行( in_optimal 中的位置)升序排序
stSubSeq = subSeq(:, idx); % 用 in_optimal 的游标顺序重排列 subSeq
out_crosJobSeq(1, f_ind1: f_ind2) = stSubSeq(1, 1:subSeqLen);
else %不交叉,保留原来的值
out_crosJobSeq = in_jobSeq;
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -