2016-03-05 388 views
0

我需要通过采用任意两个使用单点交叉的矩阵来进行交叉。在Matlab中的代码是什么?如何在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 
+0

我需要采取任何两个矩阵,想越过..上面创建在不同的地方1与每行一个1的。 –

+0

该问题的任何其他信息(例如您发布的代码)都应添加到问题本身中。您可以使用问题选项卡下方的[编辑]链接(或我的评论中的两个[编辑]链接)。 – BSMP

+0

请使用正确的代码格式(即大括号)编辑您的问题。此外,澄清(以一个例子将是可爱的)沿着哪个维度交叉应该被执行。 – Alessiox

回答

0

如果我正确理解您的问题是什么,您可以轻松地手动执行单点交叉。因此,您需要创建可能的父母,随机选择其中的两个,然后在他们的行之间执行交叉以创建新的个人(孩子)。

而不是为每个(候选人)家长创建不同的变量(这将使这两个父母的随机选择难以置信地难)我建议你创建一个单元格阵列与n单元格,其中第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