С помощью метода кроссовера моего 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;
}
Похож на 'mother.getPairsList(). Size()> 10'. Установите контрольную точку в crossOver и проверьте. –
Лучшая ставка будет заключаться в использовании отладчика и попытке отслеживания изменений переменных, чтобы узнать, почему это происходит. – Brandon