【发布时间】: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
我想问一下如何使用 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..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
更新。
此函数仅保证枢轴对于所有子节点都是唯一的。但不能保证孩子们将拥有所有独特的元素(这个要求对我来说听起来很奇怪),你必须手动检查。
【讨论】: