2012-02-16 5 views
0

다음과 같이 원 포인트 크로스 오버를 구현했습니다. 크로스 오버Java에서 2 포인트 크로스 오버

public void onePointCrossover(Individual indi) { 
    if (SGA.rand.nextDouble() < pc) { 

     int xoverpoint = SGA.rand.nextInt(length); 


     int tmp; 
     for (int i=xoverpoint; i<length; i++){ 
      tmp = chromosome[i]; 
      chromosome[i] = indi.chromosome[i]; 
      indi.chromosome[i] = tmp; 
     } 
    } 
} 

한 점 - 크로스 오버 포인트가 선택이, 크로스 오버 포인트에 염색체의 처음부터 진 문자열이 한 부모에서 복사, 나머지는 두 번째 부모로부터 복사됩니다.

부모 1 = 염색체 및 부모 2 = indi.

나는 부모를 어린이로 변모시키고있다.

나는 2 포인트 크로스 오버를해야하지만 약간의 문제가있다. 이것은 내가 지금까지 가지고있는 것이지만, 코드의 아래쪽 절반은 중간을 교환하는 것보다 1 포인트 크로스 오버와 같은 것을하고 있다고 생각한다. 섹션.

 public void twoPointCrossover(Individual indi) { 
     if (SGA.rand.nextDouble() < pc) { 

      int xoverpoint = SGA.rand.nextInt(length); 
      int xoverpoint2 = SGA.rand.nextInt(length); 



      int tmp; 

      if (xoverpoint > xoverpoint2){ 
       tmp = xoverpoint; 
       xoverpoint = xoverpoint2; 
       xoverpoint2 = tmp; 
      } 

      for (int i=xoverpoint; i<xoverpoint2; i++){ 
       tmp = chromosome[i]; 
       chromosome[i] = indi.chromosome[i]; 
       indi.chromosome[i] = tmp; 
      } 
     } 
    } 
} 

이것은 올바르게 보이지 않으며 도움이 될 것입니다. 감사!

+0

예상되는 결과는 무엇입니까? 이것은 완전한 예가 아니므로 도움이된다면 추측 일 가능성이 큽니다. – birryree

+0

왜 이것이 옳지 않다고 생각하십니까? 뭐하고 있니, 뭘 기대하고 있니? – npinti

+0

내가 한 모든 것은 원래의 한 지점 크로스 오버에 중간 섹션을 추가하는 것이고, 나머지는 동일합니다. 그것은 어떤 오류도주지 않는다. 그러나 나는 2 포인트 교차를하고 있다고 생각하지 않는다? – Student

답변

1

루프에 i<length이 아닌 i < (or <=) xoverpoint2을 확인해야합니다.

+0

두 개의 교차점을 선택하면 염색체의 처음부터 첫 번째 교차점까지의 이진 문자열이 한 부모에서 복사되고 첫 번째 교차점에서 두 번째 교차점까지의 부분이 두 번째 부모에서 복사되고 나머지는 첫 번째 부모에서 복사됩니다. 나의 첫번째 부모는 염색체이고 두번째 부모는 indi.chromosome이다. xoverpoint2 = j를 지정해야합니까? 그리고 나서 그것을 염색체 [j]와 같이 사용 하시겠습니까? – Student

+0

그게 더 합리적입니다. 따라서 부모님을 자녀의 위치로 돌려 놓으면 위의 해결책은 예상대로 작동해야합니다. 두 가지 염색체의 중간 부분을 바꿔야합니다. 이는 기본적으로 원하는 작업입니다. –

+0

예 위의 솔루션을 추가했지만 결과가 정확히 1 포인트 크로스 오버와 동일하므로 여전히 1 포인트 크로스 오버를 수행하고 있다고 생각합니다. 그렇습니다. 정확히 중간 부품을 교환하고 싶지만, 어떻게 해야할지 모르겠습니다. – Student