2014-04-17 2 views
0

유전 알고리즘에 대한 내 돌연변이 기능을 사용하는 데 문제가 있습니다 (모든 종류의 문제가 있습니다). 나는 Integer.toString(Float.floatToIntBits(value))에서 오는 DNA로 문자열을 조작합니다. 모든 것이 멋지게 교차하고 다시 채워지므로 이제는 불쾌한 돌연변이를위한 시간이되었습니다. 그리고 지금은 문제가 있다면,이 내 돌연변이 기능입니다 :문자열 조작 - GA

public void muttate() { 
    Random rand = new Random(); 
    int mutationPoint = rand.nextInt(valueString.length()-1); 
    //int mutationPoint=valueString.length()-1; 
    //System.out.println(mutationPoint); 
    if(mutationPoint==0) 
     valueString = rand.nextInt(10) 
     + valueString.substring(0); 
    else if (mutationPoint == 1) 
     valueString = valueString.charAt(0) 
       + Integer.toString(rand.nextInt(10)) 
       + valueString.substring(mutationPoint); 
    else if (mutationPoint != valueString.length()-1) 
     valueString = valueString.substring(0, mutationPoint-1) 
       + Integer.toString(rand.nextInt(10)) 
       + valueString.substring(mutationPoint); 
    else 
     valueString = valueString.substring(0, mutationPoint - 1) 
       + Integer.toString(rand.nextInt(10)); 
    changeStringtovalue(); 
    calculateFitnes(); 
} 

하고 내가 그것을 실행으로, 난 내 DNA를 먹는 참조 (그래서 길이는 약간의 시간이 8이고 너무 오래 후 후 첫 9입니다) . 그리고 이것은 돌연변이가 아닌 돌연변이 부분에서 비롯된 것입니다. 나는 어리석은 실수라고 생각하지만 단서를 찾을 수 없다.

그리고 이런 종류의 돌연변이가이 상황에서도 유효합니까? 어쩌면 마스크를 적용한 후 비트를 조작하여 해당 플로트의 특정 부분을 가져와야합니다.

+0

Else 블록의 'valueString.substring (mutationPoint);'가 누락 되었습니까? – Jay

답변

2

돌연변이는 두 번 tt없이 철자됩니다. 무작위로 호출하는 방식 때문에 코드가 마지막 위치를 변경하지 않습니다.

문제는 은 끝 인덱스 문자를 포함하지 않는 문자열을 반환합니다. 그래서 당신은 한 캐릭터를 잃어 버리고 있습니다. 블록 전체가 불필요합니다. 당신이 돌연변이하려는 경우, 당신은 다음과 같은 기능을 쓸 수있다 :

여기
public void mutate() { 
    Random rand = new Random(); 
    int mutPos = rand.nextInt(valueString.length()); 
    valueString = valueString.substring(0, mutPos) 
     + rand.nextInt(10) + valueString.substring(mutPos+1); 
} 

몇 가지 팁입니다 :

문자열 "ABC"을 감안할 때.

substring(1,2)"B"이며, 인덱스 1은 인덱스 2를 포함하지 않습니다.

substring(0, string.length()) 전체 문자열 반환.

substring(0) 전체 문자열을 반환합니다.

substring(i, i) 반환 ""

string.length() 인덱스의 마지막 문자 (과거 인덱스 하나에서 시작 (및 종료) 경우 하위 문자열도 ""를 반환합니다.

이것은 당신이 쉽게와 같은 문장의 경우없이 코너 케이스를 처리 할 수 ​​있습니다

+0

감사합니다. 이름을 refractor (especaily 내 모국어로되어 있어야합니다. :)). 나는 모든 오류를 다룰 때주의를 기울여야한다. 그래서 이것이 manny ifs이다. 또한 여전히 mutPos = 0 오류가 있지만 그것을 처리 할 수 ​​있습니다. – Yeris

+0

흠 ....은 오류가 아니어야합니다. mutPos = 0의 경우 : 'substring (0,0) + int + substring (1)'을 가져야합니다. "+"+ int + 모든 문자가 아닌 첫 번째 문자로 해석되어야합니다. 이 오류를 반환 할 수있는 유일한 방법은 문자열이 null이거나 길이가 0 인 경우입니다. –

+0

루프에서 1000000 회 실행하여 테스트했지만 오류는 발생하지 않았습니다. –