我需要通过单点交叉使用任意两个矩阵来进行交叉。 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 :(得分: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
通过这种方式,我们选择两个指数(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