首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Matlab中的CrossOver

Matlab中的CrossOver
EN

Stack Overflow用户
提问于 2016-04-19 14:39:37
回答 1查看 470关注 0票数 0

我想问一下如何用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,使得新的子序列在单点或两点处交叉,结果在子序列中没有任何重复的数字。

致以敬意,

EN

回答 1

Stack Overflow用户

发布于 2016-04-19 19:10:42

对于一个点交叉,你在range 1..numel(sequence)-1中有唯一的点。您可以使用randperm来获取n唯一编号。两点交叉会有点困难,唯一组合的总数将是算术级数1..numel(sequence)-2的总和。

以下是单点交叉的示例:

代码语言:javascript
运行
复制
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)

结果与下面的结果类似:

代码语言:javascript
运行
复制
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

更新。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36710414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档