2016-04-03 1 views
0

Так что я смущен как ссылку на индексы массива индивидуумов. Существует класс людей, каждый из которых имеет набор генов и фитнес. Затем класс называется населением, которое представляет собой массив отдельных лиц. При создании объекта «Население», как вы относитесь к каждому человеку?Доступ к массивам в PNRG на основе генетического алгоритма? «нет соответствия для оператора []»

Ошибка возникает в MatingAlgorithm "турнирПопулярность [i] = oldPopulation [random% POPULATION_SIZE];" и main "nextGen [i] = child;"

Объяснение как то, что я делаю неправильно синтаксически, было бы действительно полезно.

Это исследовательский проект, поэтому я не могу предоставить общий доступ ко всему исходному коду. Но обеспечит как можно больше.

//GENETIC ALGORITHM PARAMETERS 
const static int POPULATION_SIZE = 50; 
const static double MUTATION_RATE = 1;//in percent 
const static double CROSSOVER_RATE = 50;//in percent 
const static int TOURNAMENT_SIZE = 4; 

class Individual 
{ 
//define characteristics of an individual 
public: 
    unsigned long long genes; 
    double fitness; 

//Getters and Setters 
long long getGenes() 
    { 
     return genes; 
    }//getGenes 

void setGenes(unsigned long long value) 
    { 
     genes = value; 
    }//SetGenes 

double getFitness() 
    { 
     return fitness; 
    }//getFitness 

void setFitness(double value) 
    { 
     fitness = value; 
    }//setFitness 

};//Individual 

class Population 
{ 
    public: 
//CREATE A POPULATION OF INDIVIDUALS 
Individual population[POPULATION_SIZE]; 

//initialize population 
void initializePopulation() 
{ 
    //CODE HIDDEN 

}//initialize population 

};//Population 

class MatingAlgorithm 
{ 
public: 
int random = rand(); 
Individual tournamentSelection(Population oldPopulation) 
{ 
    //MAKE A SUBPOPULATION OF TOURNAMENT INDIVIDUALS 
    Individual tournamentPopulation[TOURNAMENT_SIZE]; 

ошибка в этом блоке:

//RANDOMLY PICK FOUR INDIVIDUALS FROM THE POPULATION TO COMPETE 
    int i; 
    for(i = 0; i < TOURNAMENT_SIZE; i++) 
    { 
     tournamentPopulation[i] = oldPopulation[random % POPULATION_SIZE]; 
    }//for 

продолжает:

//TAKE ONLY THE FITTEST INDIVIDUAL 
    Individual fittest = tournamentPopulation[0]; 
    for(i = 0; i < TOURNAMENT_SIZE; i++) 
    { 
     //IF THE CURRENT FITTEST IS WEAKER THAN THE NEXT INDIVIDUAL IN THE TOURNAMENT SUB POPULATION. DECLARE THE OTHER INDIVIDUAL THE NEW FITTEST 
     if(fittest.getFitness() < tournamentPopulation[i].getFitness()) 
     { 
      fittest= tournamentPopulation[i]; 
     } 
    }//for 

    return fittest; 
} 
//LOOP OVER POPULATION AND CREATE NEW INDIVIDUALS WITH CROSSOVER 
Individual Crossover(Individual parent1, Individual parent2) 
{ 
    unsigned long long bit; 
    //Initialize Child 
    Individual child; 
    child.setGenes(0); 

    //CODE HIDDEN 

    return child; 
}//crossover 

void Mutate(Individual child) 
{ 
//CODE HIDDEN 
}//mutate 
};//matingAlgorithm 


int main() 
{ 
cout<<"Starting..."; 
Population firstGen; 
Population nextGen; 
firstGen.initializePopulation(); 
MatingAlgorithm MA; 

//PLACE NEW INDIVIDUALS IN NEW POPULATION; 
for (int i = 0; i < POPULATION_SIZE; i++) 
{ 
Individual parent1 = MA.tournamentSelection(firstGen); 
Individual parent2 = MA.tournamentSelection(firstGen); 
Individual child = MA.Crossover(parent1,parent2); 
MA.Mutate(child); 

ошибку на этой линии:

nextGen[i] = child; 

продолжает

cout<<child.getGenes(); 
} 

cout<<"code executed"<<endl; 
return 0; 
}//main 
+0

Короткий ответ: вам нужно реализовать 'operator []' для 'Population' – vu1p3n0x

ответ

0

Быстрый и простой ответ: добавить к вашей Population класса

Individual& operator [](int i) { return population[i]; } 

Похоже, что я думаю, что вы пытаетесь сделать. (доступ к индивидуальному массиву в классе Population)

+0

Да, это то, что я пытался выполнить. Спасибо! –