2016-11-18 1 views
0

내가 만드는 내 유전자 알고리즘에 대한 출력과 관련하여 질문이 있습니다. 특정 위치에서 디버깅 할 때와 비교할 때 프로젝트를 실행할 때 출력이 다른 것처럼 보입니다. 위의 코드에서 디버그와 다른 출력 릴리스

Population mutatePopulation(Population pop) 
    { 
     foreach(Chromosome x in pop.population) 
     { 
      x.mutateChromosome(x); 
     } 
     return pop; 
    } 

, 내 염색체의 일부 개체 변이하려면 다음과 같이 내 코드의

일부가 보인다. 이것은 다음과 같은 방법으로 수행됩니다

public Chromosome mutateChromosome(Chromosome x) 
    { 
     Chromosome result = x; 
     //SWAP mutation 
     Random rnd = new Random(); 
     double value = rnd.NextDouble(); 
     if (value < MUTATION_RATE) 
     { 
      int index1 = (int)rnd.Next(0, x.customerSequence.Count() - 1); 
      int index2 = (int)rnd.Next(0, x.customerSequence.Count() - 1); 
      Console.WriteLine( "Muation at chromosome: " + x.ToString() + ", mutation at indexes [" + index1 + "," + index2+ 
           "], values ["+x.customerSequence[index1].index+","+x.customerSequence[index2].index+"]"); 
      Customer cust1 = x.customerSequence[index1]; 
      Customer cust2 = x.customerSequence[index2]; 
      result.customerSequence[index1] = cust2; 
      result.customerSequence[index2] = cust1; 
     } 
     return result; 
    } 

나는 다음과 같은 출력을 얻을 (때로는, 확률 변수에 따라 다름) 내 프로젝트 I을 실행하면 :

하나 개의 염색체 돌연변이 될때 것으로 보인다
Generation #14 
10 12 9 5 4 2 8 13 6 3 7 11 || Fitness: 3209 
11 6 12 3 5 9 10 4 7 2 8 13 || Fitness: 3252 
13 8 11 4 10 3 6 5 9 2 12 7 || Fitness: 3301 
10 9 4 11 6 13 12 3 5 8 2 7 || Fitness: 3315 
7 3 9 10 11 4 13 8 6 2 5 12 || Fitness: 3354 
6 10 4 8 13 2 7 12 3 5 11 9 || Fitness: 3361 
10 7 13 5 8 9 3 6 11 4 2 12 || Fitness: 3394 
11 12 5 8 10 4 9 13 2 7 3 6 || Fitness: 3499 
11 13 12 9 3 4 7 5 10 6 2 8 || Fitness: 3708 
8 9 6 5 2 13 11 7 10 3 4 12 || Fitness: 3819 

Generation #15 
Muation at chromosome: XML.Chromosome, mutation at indexes [5,7], values [2,13] 
Muation at chromosome: XML.Chromosome, mutation at indexes [5,7], values [9,4] 
Muation at chromosome: XML.Chromosome, mutation at indexes [5,7], values [3,5] 
Muation at chromosome: XML.Chromosome, mutation at indexes [5,7], values [13,3] 
Muation at chromosome: XML.Chromosome, mutation at indexes [5,7], values [4,8] 
Muation at chromosome: XML.Chromosome, mutation at indexes [5,7], values [2,12] 
Muation at chromosome: XML.Chromosome, mutation at indexes [5,7], values [9,6] 
Muation at chromosome: XML.Chromosome, mutation at indexes [5,7], values [4,13] 
Muation at chromosome: XML.Chromosome, mutation at indexes [5,7], values [4,5] 
Muation at chromosome: XML.Chromosome, mutation at indexes [1,6], values [9,11] 
13 8 11 4 10 5 6 3 9 2 12 7 || Fitness: 3025 
11 6 12 3 5 4 10 9 7 2 8 13 || Fitness: 3088 
10 7 13 5 8 6 3 9 11 4 2 12 || Fitness: 3112 
10 12 9 5 4 13 8 2 6 3 7 11 || Fitness: 3315 
6 10 4 8 13 12 7 2 3 5 11 9 || Fitness: 3381 
11 13 12 9 3 5 7 4 10 6 2 8 || Fitness: 3689 
10 9 4 11 6 3 12 13 5 8 2 7 || Fitness: 3730 
7 3 9 10 11 8 13 4 6 2 5 12 || Fitness: 3733 
11 12 5 8 10 13 9 4 2 7 3 6 || Fitness: 3755 
8 11 6 5 2 13 9 7 10 3 4 12 || Fitness: 3808 

, 다른 모든 것들도 그렇습니다. 내가 출력을 얻을 디버깅 할 때

는 그러나, 나는이 필요합니다

Generation #2 
2 13 3 12 7 5 4 10 11 9 8 6 || Fitness: 2823 
13 6 11 5 2 9 4 10 7 8 12 3 || Fitness: 3019 
4 13 12 8 6 10 7 3 5 11 9 2 || Fitness: 3254 
3 7 11 4 2 8 9 10 13 5 6 12 || Fitness: 3267 
3 4 2 8 9 5 11 7 6 10 13 12 || Fitness: 3309 
2 7 5 8 9 4 10 3 6 12 13 11 || Fitness: 3448 
12 4 2 5 8 10 6 13 11 3 9 7 || Fitness: 3484 
7 12 8 11 5 3 10 13 2 9 6 4 || Fitness: 3712 
11 7 5 6 4 3 12 13 2 9 8 10 || Fitness: 3775 
2 6 12 10 11 13 3 4 8 9 7 5 || Fitness: 3846 

Generation #3 
Muation at chromosome: XML.Chromosome, mutation at indexes [1,3], values [6,5] 
Muation at chromosome: XML.Chromosome, mutation at indexes [8,7], values [13,10] 
Muation at chromosome: XML.Chromosome, mutation at indexes [8,8], values [6,6] 
Muation at chromosome: XML.Chromosome, mutation at indexes [4,6], values [9,10] 
2 13 3 12 7 5 4 10 11 9 8 6 || Fitness: 2823 
3 7 11 4 2 8 9 13 10 5 6 12 || Fitness: 3249 
4 13 12 8 6 10 7 3 5 11 9 2 || Fitness: 3254 
3 4 2 8 9 5 11 7 6 10 13 12 || Fitness: 3309 
13 5 11 6 2 9 4 10 7 8 12 3 || Fitness: 3434 
2 7 5 8 10 4 9 3 6 12 13 11 || Fitness: 3443 
12 4 2 5 8 10 6 13 11 3 9 7 || Fitness: 3484 
7 12 8 11 5 3 10 13 2 9 6 4 || Fitness: 3712 
11 7 5 6 4 3 12 13 2 9 8 10 || Fitness: 3775 
2 6 12 10 11 13 3 4 8 9 7 5 || Fitness: 3846 

누군가가 내 문제 좀 도와 주 시겠어요? 나는 그것이 사용하고있는 무작위 객체와 관련이 있다는 것을 직감했다. 그러나 나는 그것을 알아낼 수 없다. 감사합니다.

(PS.이는 내가 규칙을 준수하지 해요 경우 미안, 여기에 내 자신의 질문이 처음이다)

+0

왜 배열 인덱스에 이중 값이 필요합니까? – Matt

답변

2

문제는 당신이 당신의 mutate에 new Random()를 만드는 것입니다 방법. 이러지 마. 염색체를 충분히 빠르게 변이 시키면 각 Random 인스턴스에 동일한 값으로 시드되고 동일한 난수 시퀀스가 ​​생성됩니다.

대신 Random이라는 단일 인스턴스를 만들어 모든 염색체에 사용하십시오. 예를 들면 다음과 같습니다.

Population mutatePopulation(Population pop, Random random) 
{ 
    foreach(Chromosome x in pop.population) 
    { 
     x.mutateChromosome(x, random); 
    } 
    return pop; 
} 

public Chromosome mutateChromosome(Chromosome x, Random rnd) 
{ 
    Chromosome result = x; 
    //SWAP mutation 
    double value = rnd.NextDouble(); 
    if (value < MUTATION_RATE) 
    { 
     int index1 = (int)rnd.Next(0, x.customerSequence.Count() - 1); 
     int index2 = (int)rnd.Next(0, x.customerSequence.Count() - 1); 
     Console.WriteLine( "Muation at chromosome: " + x.ToString() + ", mutation at indexes [" + index1 + "," + index2+ 
          "], values ["+x.customerSequence[index1].index+","+x.customerSequence[index2].index+"]"); 
     Customer cust1 = x.customerSequence[index1]; 
     Customer cust2 = x.customerSequence[index2]; 
     result.customerSequence[index1] = cust2; 
     result.customerSequence[index2] = cust1; 
    } 
    return result; 
} 

이 단일 무작위 인스턴스가 생성되어 필드에 저장됩니다. 내가 만든 아키텍처를 이해하지 못하면 어디에 최적인지 말할 수 없으므로 무작위 인스턴스를 임의성이 필요한 메서드에 전달할 매개 변수로 옮겼습니다.

+0

빠른 응답 감사합니다. 무작위 인스턴스가 그런 식으로 작동했는지는 몰랐습니다. 이것은 내 문제를 실제로 해결했습니다 :-) – Marijn

+1

@Marijn, 이것이 문제를 해결했다면 답을 표시하는 것을 고려하십시오. – deloreyk

관련 문제