如果我正确理解您的问题是什么,您可以轻松地手动执行单点交叉。因此,您需要创建可能的父母,随机选择其中的两个,然后在他们的行之间执行交叉以创建新的个人(孩子)。
而不是为每个(候选人)家长创建不同的变量(这将使这两个父母的随机选择难以置信地难)我建议你创建一个单元格阵列与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
以这种方式,我们选择两个索引(i
和j
)考虑到它们必须在范围[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
我需要采取任何两个矩阵,想越过..上面创建在不同的地方1与每行一个1的。 –
该问题的任何其他信息(例如您发布的代码)都应添加到问题本身中。您可以使用问题选项卡下方的[编辑]链接(或我的评论中的两个[编辑]链接)。 – BSMP
请使用正确的代码格式(即大括号)编辑您的问题。此外,澄清(以一个例子将是可爱的)沿着哪个维度交叉应该被执行。 – Alessiox