2017-01-18 12 views
1

Основано на this answer Я попытался сделать выбор колес рулетки в генетическом алгоритме.Выбор колесика рулетки в GA: ArrayIndexOutOfBoundsException error

private static final int NUMBER_OF_TOURISTS = 20; 

private static int[] roulette(int population[]) { 
    int sumProb = 0; 
    for (int i = 0; i < population.length; i++) { 
     sumProb += population[i]; 
    } 

    int[] rouletteIndex = new int[NUMBER_OF_TOURISTS]; 
    Random r = new Random(); 
    for (int i = 0; i < NUMBER_OF_TOURISTS; i++) { 
     int numberRand = r.nextInt(sumProb); 
//------------------------------------------------------- 
     int j = 0;   
     while (numberRand > 0) { 
      numberRand = numberRand - population[j]; 
      j++; 
     } 
     rouletteIndex[i] = j-1; 
//------------------------------------------------------- 
    } 
    return rouletteIndex; 
} 

после этого я получаю:

[6, 2, -1, 19, 13, 2, 14, 2, 6, 19, 7, 14, 18, 0, 1, 9, 13, 10, 7, 2] 

"-1"? Но как, когда j всегда должно быть больше 0. Это случается, когда числоRand = 0 и цикл while не запускается ни разу? Но как это исправить?

ответ

0

Random.nextInt(int bound) возвращает 0 (включительно) в указанные ограничения (исключительные).

Так ваш цикл:

while (numberRand > 0) { 
    numberRand = numberRand - population[j]; 
    j++; 
} 

не будет работать, если nextInt(int bound) возвращает 0, в результате чего j равным 0 по адресу: rouletteIndex[i] = j-1;

+0

Как я думал. Я просто: только если (j> 0), чем j = j-1; else j = 0 – PioPi0

+0

Ну, в соответствии с ответом, который вы связали с вашей реализацией, имеет смысл. Но псевдокод не дает понять, что должно произойти, когда 'r = 0'. Я бы предложил 'rouletteIndex [i] = j == 0? 0: j - 1; 'как быстрое исправление. –