Matlab中的CrossOver

时间:2016-04-19 06:39:37

标签: matlab

我想问一下如何使用MATLAB在遗传算法中实现CrossOver。 让我们假设我们有以下两个序列,

sequence1 = 1 2 3 7 9 10 5 4 6 8

sequence2 = 4 3 9 2 1 7 6 10 8 5

现在我想知道如何在Matlab中创建一个代码来执行CrossOver,以便新的子序列在单点或两点交叉,并且结果在子序列中没有重复任何数字

的问候,

1 个答案:

答案 0 :(得分:0)

使用一个点交叉,您在范围1..numel(sequence)-1中有唯一的点。要获得n个唯一号码,您可以使用randperm。使用两点交叉将会更加困难,唯一组合的总数将是算术级数1..numel(sequence)-2的总和。

以下是单点交叉的示例:

function [result] = CrossoverAtPoint(sequence1, sequence2, point)
    result = [sequence1(1:point-1), sequence2(point:end)];
end

function [result] = CrossoverSinglePoint(sequence1, sequence2, number)
    len = numel(sequence1); % Calculate length
    points = randperm(len-1, number)+1; % Generate set of crossover points in range 2..len
    result = zeros(number, len); % Preallocate matrix
    for i = 1:number
        result(i,:) = CrossoverAtPoint(sequence1, sequence2, points(i));
    end
end

seq1 = [1 2 3 7 9 10 5 4 6 8];
seq2 = [4 3 9 2 1 7 6 10 8 5];
CrossoverSinglePoint(seq1, seq2, 3)

结果与此类似:

1    2    3    7    9   10    5    4    8    5
1    2    9    2    1    7    6   10    8    5
1    2    3    7    1    7    6   10    8    5

更新

此功能仅保证枢轴对所有儿童都是唯一的。但不保证孩子们会拥有所有独特的元素(这个要求对我来说听起来很奇怪),你必须亲自检查一下。