1

С помощью метода кроссовера моего GA я все время получаю исключение ArrayOutOfBounds при конкатенации второй половины матери в первую половину отца. ArrayList имеют одинаковый размер. Почему моя мать продолжает пытаться получить доступ к 10-му элементу в моем списке объектов? MyPair - это объект со случайным направлением и случайным числом шагов.Генетический алгоритм - Java Crossover

В настоящее время мы изучаем эту тему в моем A.I. класс, поэтому я еще не специалист в GA. Любой дополнительный комментарий к моему алгоритму кроссовера приветствуется.

public static class Chromosome{ 

     public ArrayList<MyPair> pairs; 
     private double x, y; 
     public double cost; 

     public Chromosome(){ 
      this.pairs = new ArrayList<MyPair>(); 
      this.x = 100.0; this.y = 100.0; 

//   not sure if I should do this or not 
      for(int numPairs = 0; numPairs < 10; numPairs++) 
       this.addToChromosome(); 
     } 

     public void addToChromosome(){ 
      MyPair myPair = new MyPair(); 
      this.pairs.add(myPair); 
     } 

     public ArrayList<MyPair> getPairsList(){ 
      return this.pairs; 
     } 

     public Chromosome crossOver(Chromosome father, Chromosome mother){ 

      Chromosome replacement = new Chromosome(); 
      int pos1 = r.nextInt(father.getPairsList().size()); 

      while(pos1 >= 10) 
       pos1 = r.nextInt(father.getPairsList().size()); 

      for(int i = 0; i < pos1; i++){ 
       MyPair tempPair = father.getPairsList().get(i); 
       replacement.getPairsList().set(i, tempPair); 
      }   

      for(int i = pos1; i < mother.getPairsList().size() - 1; i++){ 
       MyPair tempPair = mother.getPairsList().get(i); 

       // ArrayList keeps trying to set out of bounds here 
       replacement.getPairsList().set(i, tempPair); 
      } 

      return replacement; 
     } 
+1

Похож на 'mother.getPairsList(). Size()> 10'. Установите контрольную точку в crossOver и проверьте. –

+0

Лучшая ставка будет заключаться в использовании отладчика и попытке отслеживания изменений переменных, чтобы узнать, почему это происходит. – Brandon

ответ

1

Проблема, кажется, что вы строите хромосом, включая replacement иметь 10 пар, а затем вы устанавливаете элемент в положении я, когда может быть 10 или больше.

У этого есть несколько эффектов, которые вы, возможно, не планировали. Если вы соберете мать и отца, чтобы у матери было менее 10 пар, вы все равно получите 10 пар, а последние будут просто новыми парами. Если у матери более 10 пар, вы пытаетесь установить элементы arraylist, которых не существует, поэтому вы получаете исключение. Еще одна вещь, с которой вы, возможно, еще не столкнулись, состоит в том, что вы не скопировали информацию в паре, вы скопировали ссылку на пару. Это означает, что если вы позже дадите матери мутацию, изменив информацию в паре, а не заменяя пару, это повлияет на потомство ребенка и потомков ребенка, что, вероятно, не так, как вы предполагали.

Вместо этого запустите хромосому с пустым списком пар, а затем добавьте копии пар от отца, а затем добавьте копии пар из матери.

Непроверенные код:

public Chromosome crossOver(Chromosome father, Chromosome mother){ 

    Chromosome replacement = new Chromosome(); 
    replacement.getPairsList().clear(); // get rid of the original 10 pairs 

    int pos1 = r.nextInt(father.getPairsList().size()); 

    while(pos1 >= 10) 
     pos1 = r.nextInt(father.getPairsList().size()); 

     for(int i = 0; i < pos1; i++){ 
      MyPair tempPair = father.getPairsList().get(i); 
      replacement.getPairsList().add(tempPair.makeCopy()); // appended copy instead of setting ith 
     }   

     for(int i = pos1; i < mother.getPairsList().size() - 1; i++){ 
      MyPair tempPair = mother.getPairsList().get(i); 

      // ArrayList keeps trying to set out of bounds here 
      replacement.getPairsList().add(tempPair.makeCopy()); // append copy instead of setting ith 
     } 

     return replacement; 
    } 

Вы должны сделать метод makeCopy в классе Пара, которая возвращает пару с той же информацией. Есть и другие способы сделать это.

+0

Зачем добавлять копию этих пар, а не просто добавлять эти пары в конец списка? –

+0

Разница заключается в том, все ли они указывают на тот же объект Pair, созданный у первоначального предка, или содержат ли они свою собственную информацию. Предположим, что ваша ДНК поражена космическим лучом, и ваш генетический код мутирует, и вы получаете рак. Означает ли это, что ваша мать получает тот же самый рак одновременно? Нет, потому что у вас есть ** копия ** ДНК вашей матери, которая может мутировать независимо. Если вы просто присоедините ** ссылки ** к парам вашей матери, мутация вашей ДНК будет одновременно мутировать ДНК вашей матери и ДНК ваших детей и, возможно, ДНК вашего брата и т. Д. Что вы намерены? –

+0

Во всяком случае, это был не ваш вопрос, просто что-то еще, что может привести к неправильной ошибке позже, если вы не измените ту же часть кода, который генерирует исключения. Когда я сделал одно исправление, я указал на другую проблему, но вы можете решить позже, если это проблема для вас. –

Смежные вопросы