2016-03-05 1 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

Любая дополнительная информация по вопросу, например, код, который вы опубликовали, следует добавить к самому вопросу. Вы можете использовать ссылку [edit] прямо под вкладкой вашего вопроса (или двумя [править] ссылки в моем комментарии). – BSMP

+0

Пожалуйста, отредактируйте свой вопрос, используя правильное форматирование кода (то есть фигурные скобки). Кроме того, уточните (с примером будет прекрасным), по какой размерности должен быть выполнен кроссовер. – Alessiox

ответ

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: п], и они должны отличаться друг от друга.
Теперь мы можем выбрать два родителей:

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