Понимание векторных классов и выбора турниров

Я хочу иметь возможность сравнивать «общие» ценности человека с другим человеком. Я не уверен, правильно ли я их храню, и не знаю, как их правильно сравнить. Я не знаю, как получить доступ к «общим» ценностям какого-либо отдельного человека, и это то, что я думаю, беспокоит меня больше всего.

Заголовочный файл

#ifndef Population_h
#define Population_hclass population
{
friend class person;
private:
int size;
int generation;public:
void setsize(int x);
void tournament_selection(population x, int z);};class person
{
friend class population;
private:
float fit1;
float fit2;
float overall;public:

void generatefit();
void setfit();
void langerman();
void printinfo();

};

#endif

Population.cpp

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#include <random>
#include <string>
#include <CMATH>
#include <vector>
#include "Population.h"using namespace std;

void person ::generatefit()
{
float randomnumb1;
float randomnumb2;
//float((rand() % 10)*0.1);

randomnumb1 = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);
randomnumb2 = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);

fit1 = randomnumb1;
fit2 = randomnumb2;}

void person::setfit()
{
float x = fit1;
float y = fit2;
}

void person::langerman()
{
overall = 3 * pow(fit1, 2) + 2 * fit2 + 0.0252;
for (overall; overall > 1; overall--);
}void person::printinfo()
{
cout << overall << " " << endl;
}void population::setsize(int x)
{
size = x;
}void population::tournament_selection(population x, int total)
{
float best = 0;
for (int i = 0; i <= total; i++)
{

}}

main.cpp

#include "Population.h"#include <iostream>
#include <string>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <chrono>
#include <random>
#include <vector>
#include <stdlib.h>
using namespace std;

int main()
{
cout << "Program is starting " << endl;

srand(static_cast <unsigned> (time(0)));
population pop;
vector<person> popvector;
vector<person> survivor;
person *p1;

int popsize = 500;
pop.setsize(popsize);

for (int i = 0; i <= popsize; i++)
{
p1 = new person;

p1 ->generatefit();
p1->setfit();
p1->langerman();
popvector.push_back(*p1);
delete p1;
}
cout << "The fit values of the person are listed here: " << endl;
vector<person> ::iterator it; //iterator to print everything in the vector
for (it = popvector.begin(); it != popvector.end(); ++it)
{
it->printinfo();
}

unsigned seed = std::chrono::system_clock::now().time_since_epoch().count(); // generate a seed for the shuffle process of the vector.

cout << "Beggining selection process" << endl;

shuffle(popvector.begin(), popvector.end(), std::default_random_engine(seed));

//want to pick consecutive parents

int j = 0;}

Я хочу иметь возможность сравнивать людей, сохранять «победителей» в векторе «выживших», а затем перейти к использованию вектора «выживших» для создания новой популяции с использованием кроссовера и мутации для X поколений.

-1

Решение

Вы могли бы использовать перегрузка оператора установить индивидуальное «правило» сравнения уровня физической подготовки двух людей. std::string является прекрасным примером «: равные операции могут быть выполнены непосредственно if(str1 == str2) вместо if(!strcmp(str1, str2)), демонстрируя преимущества техники перегрузки операторов.

Следующий код должен соответствовать вашим потребностям:

class person {
friend class population;
private:
float fit1;
float fit2;
float overall;

public:
void generatefit();
void setfit();
void langerman();
void printinfo();

//Overloading '<' operator
bool operator(const person&);
};

//The following function defines
//rule of fitness in the jungle
bool person::operator < (const person& p2){
//This is just an example, you can define your own rules
return overall < p2.overall;
}

Как только правило сравнения установлено, вы можете Сортировать ваше население по этому самому правилу:

//The "less fit" rule is defined so the population will be sorted
//in ascending order, if you want to sort them by descending order,
//just change the definition of your fitness rules accordingly.

sort(popvector, popvector + popsize);

Или вы можете использовать заказанный контейнер хранить население в первую очередь. Такой выбор может быть задавать, карта или же priority_queue. Элементы в упорядоченном контейнере всегда будут следовать точному порядку, который вы указали при объявлении таких объектов-контейнеров.

В вашем случае я бы предложил priority_queue потому что вы можете легко вытащить самого непригодного человека из верхней части кучи, например так:

#include<priority_queue>

//Still, the definition of "priority" is required beforehand
priority_queue<person> pqPerson;

person tmp;
for(int i = 0; i < popsize; ++i){
tmp.setfit(fit1, fit2, overall);
pqPerson.push(tmp);
}

for(int generation = 0; generation < X; +=generation){
//The weakest group will perish
for(int j = 0; j < tollSize; ++j){
pqPerson.pop();
}

//Crossover and Mutation process
}
1

Другие решения

Других решений пока нет …