Clear Filters
Clear Filters

interchanging the matrix element between two matrix to produce offsprings?

5 views (last 30 days)
i have two parents
p1=[2 3 4 5 1 6 7 9 8 10]
p2=[1 3 5 6 7 8 9 10 2 4]
step 1:
here i wanna change in-between values by crossing [5 1 6 7] and [6 7 8 9] of p1 and p2 respectively
off1=[* * * 6 7 8 9 * * *]
off2=[* * * 5 1 6 7 * * *]
step 2:
then select values not in the crossing operation and such as [2 3 4 10] and change * if previously exist by comparing p1 and p2 to make off1 and off2.
off1=[2 3 4 6 7 8 9 * * 10]
off2=[* 3 * 5 1 6 7 10 3 4]
the remaining values are swapped based on interchange in first step 5=6;1=7;6=8;7=9 then swapped to other value if one of the number existing in p1 and p2. for eg we have 9 and 8 at p1 which remains *. it should be swapped based on step1 condition given above (5=6;1=7;6=8;7=9) so 9 replaced by 7 and 8 replaced by 6. similarly for off2
off1=[2 3 4 6 7 8 9 7 8 10]
off2=[7 3 8 5 1 6 7 10 3 4]
here when selecting 8 conflict exists 5=6 but 6 already existing so 6=8 is considered and changed accordingly.
help me in coding this...
thank you

Answers (1)

Martin Seliga
Martin Seliga on 18 Apr 2018
Edited: Martin Seliga on 18 Apr 2018

Hi.

I think you don't need this anymore, but maybe someone will searching for the solution. Here is the code:

 function [childA, childB] = crossover(parentA, parentB)
    n = length(parentA);
    childA = zeros(1,n);
    childB = zeros(1,n);
    x1 = randperm(n,1);
    x2 = randperm(n-x1,1)+x1;
    childA(x1:x2) = parentB(x1:x2);
    childB(x1:x2) = parentA(x1:x2);
    for i = 1:x2-x1+1
        mapRelation(1:2,i)=[childA(x1+i-1), childB(x1+i-1)];
    end
    for i = 1:x1-1
        if(length(find(childA == parentA(i))) < 1)
            childA(i) = parentA(i);
        end
        if(length(find(childB == parentB(i))) < 1)
            childB(i) = parentB(i);
        end
    end
    for i = x2+1:n
        if(isempty(find(childA == parentA(i),1)))
            childA(i) = parentA(i);
        end
        if(isempty(find(childB == parentB(i),1)))
            childB(i) = parentB(i);
        end
    end
    while(~isempty(find(childA == 0,1)))
        mapA = mapRelation;
        i = find(childA == 0,1);
        v = parentA(i);
        while (~isempty(find(mapA == v,1)))
            [j, k] = find(mapA == v,1);
            if (j == 1)
                v = mapA(2,k);
            else
                v = mapA(1,k);
            end
            mapA(:,k) = [];
        end
        childA(i) = v;
    end
    while(~isempty(find(childB == 0,1)))
        mapB = mapRelation;
        i = find(childB == 0,1);
        v = parentB(i);
        while (~isempty(find(mapB == v,1)))
            [j, k] = find(mapB == v,1);
            if (j == 1)
                v = mapB(2,k);
            else
                v = mapB(1,k);
            end
            mapB(:,k) = [];
        end
        childB(i) = v;
    end
end

Categories

Find more on Elementary Math in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!