2014-10-13 4 views
2

Matlab에서 두 포인트 크로스 오버를 구현하는 가장 좋은 방법은 무엇입니까? 2 포인트 크로스 오버는 here으로 설명됩니다. 내 응용 프로그램에서는 어디서나 목록을 분할 할 수 없습니다. 그것들은 4 개로 그룹 지어지기 때문에리스트를 분리 할 수있는 곳 (염색체)은 4, 8, 12 등입니다 (내 응용 프로그램은 선형 유전 프로그래밍 문제이기 때문에).Matlab의 두 포인트 크로스 오버

나는 이것을 시도했지만 때로는 4로 균등하게 나눌 수없는 많은 수의 요소가있는 염색체를 얻지 못한다. 어떻게 작동시키는 지 알아내는 데 도움이 필요합니다.

function newPopulation = Crossover(population, p) 

newPopulation = population; 

for i=1:2:length(population) 
    if p < rand 
     [newPopulation{i}, newPopulation{i+1}] = PerformCrossover(newPopulation{i}, newPopulation{i+1}); 
    end 
end 

end 

function [newChromosome1, newChromosome2] = PerformCrossover(c1, c2) 
    l1 = length(c1)/4; 
    l2 = length(c2)/4; 

    i1 = 4*sort(randperm(l1, 2))-[3 4]; 
    i2 = 4*sort(randperm(l2, 2))-[3 4]; 

    newChromosome1 = [ c1(1:l1<i1(1)) c2(i2(1):i2(2)) c1(1:l1>i1(2)) ]; 
    newChromosome2 = [ c2(1:l2<i2(1)) c1(i1(1):i1(2)) c2(1:l2>i2(2)) ]; 
end 

EDIT. 혼란이있는 것 같습니다. 내 코드에서 설명하는 크로스 오버 버전을 원한다. 이 코드에서 각 염색체의 세그먼트는 같은 길이가 아닙니다. 이것은 스왑을 할 때 염색체의 크기를 변경한다는 의미입니다. 맥마 (McMa)에 대한 더 자세한 설명은 논평에서 찾아 볼 수있다.

+0

난수는 생성하기가 상당히 저렴합니다. 라운드 (rand (1) * length (chromosomeLength)/4) * 4를 통해 첫 번째 난수를 생성 한 다음 동일한 수식을 통해 두 번째 난수를 생성하고 이것이 과거와 동일한 지 확인하십시오. – ASantosRibeiro

+0

@ASantosRibeiro 왜 내가 현재하고있는 것보다 더 나아질까요? –

+0

그것은 이미 최적화 된 문제를 이해하지 못하기 때문에 정확히 같은 (임의의 생성자와 동일한 이데올로기) 동일합니다. – ASantosRibeiro

답변

1

모든 것을 떠나 작은 벡터 만 1 포인트 크로스 오버 초래 len의 최대 값을 반환 randperm()의 가능성을 배제하고이 해결됩니다 :

i1 = 4*sort(randperm(l1, 2))-[3 3]; 
i2 = 4*sort(randperm(l2, 2))-[3 3]; 

newChromosome1 = [ c1(1:i1(1)) c2(i2(1)+1:i2(2)-1) c1(i1(2):end) ]; 
newChromosome2 = [ c2(1:i2(1)) c1(i1(1)+1:i1(2)-1) c2(i2(2):end) ]; 
0

randperm 기능을 올바르게 이해했는지 확신 할 수 없습니다. 또한, 2 점 교차은 일반적으로 쉬운 방법 이럴가 범위 [1, chromosomeLength]에서 교차점을 정의하고 존재 개의 난수를 그리는 4.

의 배수 길이의 염색체에 한정되지 않는다. 단순히이 지점들 사이에서 정보를 교환하는 것보다. 나는 C1 (1 : 1-1) 이후

% use randi(n) that gives a random integer in the range [0,n] 
% create the first crossover point pos1 in the interval [1, chromosomelength-1] 
% create the second crossover point pos2 in the interval [pos1+1, chromosomeLength)] 

newChromosome1 = [ c1(1 : pos1-1)) c2(pos1 : pos2-1) c1(pos2 : chromosomeLength) ]; 
newChromosome2 = [ c2(1 : pos1-1)) c1(pos1 : pos2-1) c2(pos2 : chromosomeLength) ]; 

추가로 당신은, 1의 값을 얻을 수 POS1 경우를 처리 할 수 ​​... 당신이 randperm 기능을 필요가 있다고 생각하지 않습니다 예외를 일으킬 것

+0

유전 알고리즘이 많은 것들에 사용됩니다. 이 경우 선형 유전 프로그래밍 문제입니다. 4 개의 유전자로 구성된 시퀀스가 ​​'명령어'를 인코딩합니다. 첫 번째 유전자는 연산자이고 두 번째 유전자는 대상 레지스터이며 세 번째와 네 번째는 피연산자입니다. 나는 지시를 나눌 수 없다. 그러므로 4, 8, 12 등등에 누워있는 크로스 오버 포인트가 필요하다. 나는 randperm을 사용하여 그 간격에서 두 개의 고유 한 숫자를 얻는다. 내가 랜디를 사용한다면 두 가지를 얻을 수 있습니다. 그리고 예외는 큰 문제입니다. 당신은 모든 어려운 것들을 피하고 있습니다 .... –

+0

좋아요. 유전 적 프로그래밍 문제라는 것을 보지 못했습니다. 이 경우 단일 비트가 아닌 완전한 명령 세트를 교환하는 것이 좋습니다. 죄송합니다. 내 잘못입니다. –

0

매개 변수를 혼합하지 않고 하나의 randperm()를 사용하여 작동합니다 :

function [newChromosome1, newChromosome2] = PerformCrossover(c1, c2) 

    len=floor(min(length(c1),length(c2))/4); 

    xOver=4*sort(randperm(len,2)); 

    newChromosome1=[c1(1:xOver(1)),c2(xOver(1)+1:xOver(2)),c1(xOver(2)+1:end)]; 
    newChromosome2=[c2(1:xOver(1)),c1(xOver(1)+1:xOver(2)),c2(xOver(2)+1:end)]; 
end 

Additionaly 4.

로 나눌 수 있습니다 세그먼트의 2 점 교차 될 것이라고은 이미 최적화로, 그대로

+0

가장 짧은 길이를 선택할 이유가 없습니다. 그런 다음 더 긴 염색체의 끝에서 요소를 선택하지 않습니다. 염색체는 항상 4로 나눌 수 있기 때문에 'floor'를 사용할 필요가 없습니다. 왜냐하면 그것들은 그 수만큼의 구성 요소로 명령을 인코딩하기 때문입니다. 두 염색체에서 동일한 세그먼트를 선택하기 때문에 이것은 올바르지 않습니다. 다른 세그먼트는 다른 염색체에서 가져와야하며, 그런 다음 서로 바뀝니다. –

+0

다른 길이의 벡터에서 N 포인트 크로스 오버는 교차되지 않아도 관계가 없기 때문에 항상 두 개의 차이점을 변경하지 않습니다. 이것이 문제인 경우 재조합에 대한 다른 접근 방법을 선택해야합니다./ – McMa

+0

틀렸어. 나는 크로스 오버의 나의 버전을지지하는 나 앞에서 책을 가지고있다. N 포인트 크로스 오버의 많은 버전이 있지만, 내가 원하는 것을 분명히했습니다. –