【问题标题】:CrossOver in MatlabMatlab中的交叉
【发布时间】:2016-04-20 01:05:51
【问题描述】:

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

序列1 = 1 2 3 7 9 10 5 4 6 8

序列2 = 4 3 9 2 1 7 6 10 8 5

现在我想知道如何编写代码以在 Matlab 中执行 CrossOver,以便新的子序列在单点或两点交叉,结果在子序列中没有任何数字重复.

问候,

【问题讨论】:

    标签: matlab


    【解决方案1】:

    通过一个点交叉,您在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
    

    更新。

    此函数仅保证枢轴对于所有子节点都是唯一的。但不能保证孩子们将拥有所有独特的元素(这个要求对我来说听起来很奇怪),你必须手动检查。

    【讨论】:

    • 我复制它,它给了我错误,>> stack ???错误:文件:stack.m 行:6 列:1 在此上下文中不允许函数定义。
    • @asif 我现在没有matlab,但它可以在octave 中使用。而且我不能帮助你,尤其是没有你得到的错误。
    • FUNCTION 关键字在此处使用无效。这可能会导致稍后出现有关 END 的消息。当我将光标放在第 6 行的函数上时出现此错误。:(
    • 子序列也有重复的数字。 5 重复。
    • 看起来matlab只允许函数放在单独的文件中。
    猜你喜欢
    • 2014-12-07
    • 2017-02-21
    • 2015-05-27
    • 2013-04-24
    • 2017-06-09
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    相关资源
    最近更新 更多