⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 getcrossover.m

📁 离散算法
💻 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 + -