Я хочу иметь возможность сравнивать «общие» ценности человека с другим человеком. Я не уверен, правильно ли я их храню, и не знаю, как их правильно сравнить. Я не знаю, как получить доступ к «общим» ценностям какого-либо отдельного человека, и это то, что я думаю, беспокоит меня больше всего.
Заголовочный файл
#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 поколений.
Вы могли бы использовать перегрузка оператора установить индивидуальное «правило» сравнения уровня физической подготовки двух людей. 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
}
Других решений пока нет …