如何在matlab中进行两个矩阵之间的单点交叉

时间:2016-03-05 05:30:44

标签: matlab genetic-algorithm

我需要通过单点交叉使用任意两个矩阵来进行交叉。 Matlab中的代码是什么?

n=input('no.of ROWS AND COLUMNS');
sm_mat = eye(n);
for i=1:n
    temp = randperm(n);
    fprintf('Initial Population %d\n',i)
    eval(['sm_mat_', num2str(i) '=sm_mat(:,temp)']);
end

1 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题,您可以轻松地手动执行单点交叉。所以你确实想要创建n个可能的父母,随机选择其中两个,然后在他们的行之间执行交叉,以便创建一个新的个体(孩子)。

而不是为每个(候选)父级创建不同的变量(这将使这两个父母的随机选择难以置信)我建议你创建一个单元格数组n单元格,其中第i个单元格将包含第i个矩阵(候选父级)。

n=input('no.of ROWS AND COLUMNS');
sm_mat = eye(n);
for i=1:n
    temp = randperm(n);
%     fprintf('Initial Population %d\n',i)
%     eval(['sm_mat_', num2str(i) '=sm_mat(:,temp)']);
    InitialPopCell{i}=sm_mat(:,temp);
end

InitialPopCell将成为我们的单元阵列 现在你需要随机选择两个父母:为此,你可以随机选择两个不同的细胞。

i=0; j=0;
while i==j
    i=randi(n);
    j=randi(n);
end

通过这种方式,我们选择两个指数(ij),考虑到它们必须在[1:n]范围内并且它们必须彼此不同。
现在我们可以选择两个父母:

ParentA=InitialPopCell{i};
ParentB=InitialPopCell{j};
Child=[]; 

我们也将Child(即新个体)矩阵初始化为空 现在,最后,让我们执行交叉:

for i=1:size(ParentA,1)
    % select random integer between 1 and the number of chromosomes
    % this will be the crossover point
    XOverPoint=randi(size(ParentA,2));

    % create new individual by concatenating Parent A and B taking into
    % account the crossover point
    Child(i,:)=[ParentA(i,1:XOverPoint) ParentB(i,XOverPoint+1:end)];
end