2012-11-06 4 views
0

두 개의 염색체 (유전자 알고리즘)를 재결합 (교차)하고 싶습니다. 이것은 내 의사 코드입니다. 내 문제는 어디에 있습니까?matlab에 두 염색체를 재결합

popu 50 * 10 행렬이다. 선택 (내 인구)
popsize = 50
1 * 50 매트릭스 (체력 평가와 선택 최고의 개인)

function pop = recombin(popu,selected) 
    global popsize; 
    pop=zeros(50,10); 
    for i=1:popsize/2 
     rc=randi([1,10]); 
     for j=1:10 
      if(j<=rc) 
       pop(i,j)=popu(selected(i),j); 
       pop(i+25,j)=popu(selected(i+25),j); 
      else 
       pop(i,j)=popu(selected(i+25),j); 
       pop(i+25,j)=popu(selected(i),j); 
      end 
      %keyboard 
     end 
    end 
end 

내 코드가 올바르게 작동합니다 (구문 적으로). 하지만 이것은 일반적인 알고리즘 :(2 chromesomes을 결합하는 올바른 방법입니다 확실하지 않다

+1

발생한 것입니다. 코드가 실행되지만 예기치 않은 결과가 발생합니까? 아니면 오류없이 코드를 실행하는 데 문제가 있습니까? 질문을 편집하고 그것을 설명하기 위해 세부 사항을 추가 할 수 있습니까? –

+0

@EitanT txx for your attention – zhilevan

+0

for 루프를 제거하고 pop (i, 1 : rc-1) = popu (i + 25를 선택한 경우, 1 : rc-1)와 같은 말을하면 성능이 향상 될 수 있습니다. ; pop (i, rc : end) = popu (selected (i), rc : end); – Bill

답변

0

귀하의 질문에 짧은 대답은 다음과 같습니다. 코드가 (거의) 올바른, 그것은 하나의 점을 수행한다 크로스 오버

각 개인의 첫 번째 요소가 스왑되지 않는다는 의미에서 코드가 거의 정확합니다. rc가 [1, 10]이고 스왑이 j이 rc보다 엄격한 경우 pop(i, 1)은 항상 popu(selected(i), 1)popu(selected(i + 25), j)이 아님)

이 기능은 원하는 기능 일 수 있지만 바람직하지 않은 테두리 효과처럼 보일 수 있습니다.이 lin e 대신 rc = randi([0,10]);.

그래서 빌의 의견을 고려, 코드는 다음과 같을 것이다 : 나는이 문제를 이해하는 데 문제가

function pop = recombin(popu, selected) 
    [popsize, dimension] = size(popu); 
    pop = zeros(popsize, dimension); 
    halfpopsize = floor(popsize/2) 

    for i = 1:halfpopsize 
     rc = randi([0, 10]); 
     pop(i, :) = [popu(selected(i), 1:rc), popu(selected(i + halfpopsize), rc + 1:end)]; 
     pop(i + halfpopsize, :) = [popu(selected(i + halfpopsize), 1:rc), popu(selected(i), rc + 1:end)]; 
    end 
end