recoding files

This commit is contained in:
Aleksey Mukhin
2019-02-20 12:19:03 +07:00
parent 01cd2cdcc3
commit 5a4e1d30f5
5 changed files with 86 additions and 86 deletions

View File

@@ -21,16 +21,16 @@ Agent::Agent(Agent* father, int fID, Agent* mother, int mID){
this->motherID = mID; this->motherID = mID;
std::default_random_engine& generator = Settings::RANDOM_GENERATOR; std::default_random_engine& generator = Settings::RANDOM_GENERATOR;
std::uniform_int_distribution<int> distribution(0,1); // ERROR - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> std::uniform_int_distribution<int> distribution(0,1); // ERROR - генерирует только нули
int mAllele = distribution(generator); int mAllele = distribution(generator);
int fAllele = distribution(generator); int fAllele = distribution(generator);
// <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Тут пока без рекомбинации
this->mGenome = (mAllele == 0 ? mother->mGenome : mother->fGenome); this->mGenome = (mAllele == 0 ? mother->mGenome : mother->fGenome);
this->fGenome = (fAllele == 0 ? father->mGenome : father->fGenome); this->fGenome = (fAllele == 0 ? father->mGenome : father->fGenome);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Определяем глухоту: только если в обоих аллелях единицы
this->isDeaf = (this->mGenome.at(0) + this->fGenome.at(0)) > 1 ? true : false; this->isDeaf = (this->mGenome.at(0) + this->fGenome.at(0)) > 1 ? true : false;
@@ -42,21 +42,21 @@ Agent::Agent(Agent* father, int fID, Agent* mother, int mID){
this->isDeaf = true; this->isDeaf = true;
} }
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>. // Трансмиссия жестового языка.
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> // Пока решили, что если в семье хоть один глухой, то все его члены автоматически должны владеть им
// (<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) // (Егор с ОЛ должны решить этот момент)
// 2018.11.20 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 2018.11.20 Заменили на другой алгоритм в процессоре
//this->knowsSignLanguage = (father->knowsSignLanguage && father->isDeaf //this->knowsSignLanguage = (father->knowsSignLanguage && father->isDeaf
// || mother->knowsSignLanguage && mother->isDeaf); // || mother->knowsSignLanguage && mother->isDeaf);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>) // Социальная позиция (ДИСКУССИЯ НУЖНА)
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Пока: берём среднее от родителей и на некоторую нормально распределённую величину сдвигаем
std::normal_distribution<float> distrN(0,0.1f); std::normal_distribution<float> distrN(0,0.1f);
float delta = distrN(generator); float delta = distrN(generator);
this->socialPosition = 0.5f*(mother->socialPosition + father->socialPosition) + delta; this->socialPosition = 0.5f*(mother->socialPosition + father->socialPosition) + delta;
this->alreadyMarried = false; this->alreadyMarried = false;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Берём из популяции
// delta = distribution(generator); // delta = distribution(generator);
// this->bachelority = 0.5f*(mother->bachelority + father->bachelority) + delta; // this->bachelority = 0.5f*(mother->bachelority + father->bachelority) + delta;
// this->age = 0; // this->age = 0;

View File

@@ -22,7 +22,7 @@ protected:
public: public:
Agent(int fGene, int mGene, bool deaf, bool signL, Agent(int fGene, int mGene, bool deaf, bool signL,
float socialP); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> float socialP); // Только для инициализации
Agent(Agent*,int, Agent*, int); Agent(Agent*,int, Agent*, int);
bool deaf() const { return isDeaf;} bool deaf() const { return isDeaf;}
int getDeafAllelesCount() const { return mGenome.at(0)+fGenome.at(0);} int getDeafAllelesCount() const { return mGenome.at(0)+fGenome.at(0);}

View File

@@ -28,12 +28,12 @@ void Processor::run(std::string fileName){
int initPopSizeW = Settings::INIT_POP_SIZE_W; int initPopSizeW = Settings::INIT_POP_SIZE_W;
///float deafAlleleRatio = Settings::DEAF_ALLELE_RATIO; ///float deafAlleleRatio = Settings::DEAF_ALLELE_RATIO;
float birthRateH = Settings::BIRTH_RATE_H; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> float birthRateH = Settings::BIRTH_RATE_H; // среднее число потомков
float birthRateD = Settings::BIRTH_RATE_D; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> float birthRateD = Settings::BIRTH_RATE_D; // среднее число потомков
int maxGenerations = Settings::MAX_GENERATIONS; int maxGenerations = Settings::MAX_GENERATIONS;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Подготовка файла выдачи
std::cout<<"Initializing output file..\t"; std::cout<<"Initializing output file..\t";
std::ofstream outputFile(Settings::OUTPUT_FILE); std::ofstream outputFile(Settings::OUTPUT_FILE);
outputFile<<"Generation\tTotalPopulation\tMen\tWomen\tDeaf"; outputFile<<"Generation\tTotalPopulation\tMen\tWomen\tDeaf";
@@ -41,10 +41,10 @@ void Processor::run(std::string fileName){
outputFile<<"\tDH marriages\tDH children"; outputFile<<"\tDH marriages\tDH children";
outputFile<<"\tHH marriages\tHH children"; outputFile<<"\tHH marriages\tHH children";
outputFile<<"\tDA frequency\tDA homozygotes frequency"; outputFile<<"\tDA frequency\tDA homozygotes frequency";
// TODO <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> // TODO Допишите ещё данные, которые вы хотите чтобы были
outputFile<<std::endl; outputFile<<std::endl;
std::cout<<"Done\n"; std::cout<<"Done\n";
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Инициализация исходной популяции
//std::vector<std::vector<float> > matrixCurrent; //std::vector<std::vector<float> > matrixCurrent;
//std::vector<std::vector<float> > matrixFuture; //std::vector<std::vector<float> > matrixFuture;
@@ -54,7 +54,7 @@ void Processor::run(std::string fileName){
std::vector<Agent*> newMen; std::vector<Agent*> newMen;
std::vector<Agent*> newWomen; std::vector<Agent*> newWomen;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20> <20><><EFBFBD> // Эмуляция сообщества глухих - образуют замкнутый круг знающих все и вся
std::vector<Agent*> deafMen; std::vector<Agent*> deafMen;
std::vector<Agent*> deafWomen; std::vector<Agent*> deafWomen;
std::vector<Agent*> deafNewMen; std::vector<Agent*> deafNewMen;
@@ -65,18 +65,18 @@ void Processor::run(std::string fileName){
//generator.seed(std::time(0)); //generator.seed(std::time(0));
//RandomDevice::RandomDevice(unsigned long n) : rand_seed(n), engine(n){ } //RandomDevice::RandomDevice(unsigned long n) : rand_seed(n), engine(n){ }
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Создаём мужчин
std::cout<<"Creating men..("<<initPopSizeM<<")\t"; std::cout<<"Creating men..("<<initPopSizeM<<")\t";
int deafHomozygotes = (int) (initPopSizeM*Settings::DEAF_HOMOZYGOTES); int deafHomozygotes = (int) (initPopSizeM*Settings::DEAF_HOMOZYGOTES);
int hearHomozygotes = (int) (initPopSizeM*Settings::HEAR_HOMOZYGOTES); int hearHomozygotes = (int) (initPopSizeM*Settings::HEAR_HOMOZYGOTES);
int heterozygores = initPopSizeM - deafHomozygotes - hearHomozygotes; int heterozygores = initPopSizeM - deafHomozygotes - hearHomozygotes;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) // Слышащие гомозиготы (в них могут быть спонтанные)
for(int i = 0; i < hearHomozygotes; i++){ for(int i = 0; i < hearHomozygotes; i++){
bool isDeaf = false; bool isDeaf = false;
int alleleFather = 0; int alleleFather = 0;
int alleleMother = 0; int alleleMother = 0;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Спонтанная глухота - только для негенетических
std::uniform_real_distribution<float> distrUI(0.f,1.f); std::uniform_real_distribution<float> distrUI(0.f,1.f);
if(distrUI(generator) < Settings::SPONTANEOUS_DEAF) if(distrUI(generator) < Settings::SPONTANEOUS_DEAF)
isDeaf = true; isDeaf = true;
@@ -94,14 +94,14 @@ void Processor::run(std::string fileName){
if(isDeaf) if(isDeaf)
deafMen.push_back(a); deafMen.push_back(a);
} // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> } // Создали мужчин - слышащих гомозигот
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) // Слышащие гетерозиготы (в них могут быть спонтанные)
for(int i = 0; i < heterozygores; i++){ for(int i = 0; i < heterozygores; i++){
bool isDeaf = false; bool isDeaf = false;
int alleleFather = 1; // TODO: <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> int alleleFather = 1; // TODO: Чуть аккуратнее
int alleleMother = 0; int alleleMother = 0;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Спонтанная глухота - только для негенетических
std::uniform_real_distribution<float> distrUI(0.f,1.f); std::uniform_real_distribution<float> distrUI(0.f,1.f);
if(distrUI(generator) < Settings::SPONTANEOUS_DEAF) if(distrUI(generator) < Settings::SPONTANEOUS_DEAF)
isDeaf = true; isDeaf = true;
@@ -119,9 +119,9 @@ void Processor::run(std::string fileName){
if(isDeaf) if(isDeaf)
deafMen.push_back(a); deafMen.push_back(a);
} // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> } // Создали мужчин - слышащих гетерозигот
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Глухие гомозиготы
for(int i = 0; i < deafHomozygotes; i++){ for(int i = 0; i < deafHomozygotes; i++){
bool isDeaf = true; bool isDeaf = true;
int alleleFather = 1; int alleleFather = 1;
@@ -141,23 +141,23 @@ void Processor::run(std::string fileName){
if(isDeaf) if(isDeaf)
deafMen.push_back(a); deafMen.push_back(a);
}// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> }// Создали мужчин - неслышащих гомозигот
std::random_shuffle(men.begin(), men.end()); std::random_shuffle(men.begin(), men.end());
std::random_shuffle(deafMen.begin(), deafMen.end()); std::random_shuffle(deafMen.begin(), deafMen.end());
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Создали всех мужчин
std::cout<<"Done\n"; std::cout<<"Done\n";
std::cout<<"Creating women..\t"; std::cout<<"Creating women..\t";
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Создаём женщин
deafHomozygotes = (int) (initPopSizeW*Settings::DEAF_HOMOZYGOTES); deafHomozygotes = (int) (initPopSizeW*Settings::DEAF_HOMOZYGOTES);
hearHomozygotes = (int) (initPopSizeW*Settings::HEAR_HOMOZYGOTES); hearHomozygotes = (int) (initPopSizeW*Settings::HEAR_HOMOZYGOTES);
heterozygores = initPopSizeW - deafHomozygotes - hearHomozygotes; heterozygores = initPopSizeW - deafHomozygotes - hearHomozygotes;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) // Слышащие гомозиготы (в них могут быть спонтанные)
for(int i = 0; i < hearHomozygotes; i++){ for(int i = 0; i < hearHomozygotes; i++){
bool isDeaf = false; bool isDeaf = false;
int alleleFather = 0; int alleleFather = 0;
int alleleMother = 0; int alleleMother = 0;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Спонтанная глухота - только для негенетических
std::uniform_real_distribution<float> distrUI(0.f,1.f); std::uniform_real_distribution<float> distrUI(0.f,1.f);
if(distrUI(generator) < Settings::SPONTANEOUS_DEAF) if(distrUI(generator) < Settings::SPONTANEOUS_DEAF)
isDeaf = true; isDeaf = true;
@@ -175,14 +175,14 @@ void Processor::run(std::string fileName){
if(isDeaf) if(isDeaf)
deafWomen.push_back(a); deafWomen.push_back(a);
} // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> } // Создали женщин - слышащих гомозигот
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) // Слышащие гетерозиготы (в них могут быть спонтанные)
for(int i = 0; i < heterozygores; i++){ for(int i = 0; i < heterozygores; i++){
bool isDeaf = false; bool isDeaf = false;
int alleleFather = 1; // TODO: <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> int alleleFather = 1; // TODO: Чуть аккуратнее
int alleleMother = 0; int alleleMother = 0;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Спонтанная глухота - только для негенетических
std::uniform_real_distribution<float> distrUI(0.f,1.f); std::uniform_real_distribution<float> distrUI(0.f,1.f);
if(distrUI(generator) < Settings::SPONTANEOUS_DEAF) if(distrUI(generator) < Settings::SPONTANEOUS_DEAF)
isDeaf = true; isDeaf = true;
@@ -200,9 +200,9 @@ void Processor::run(std::string fileName){
if(isDeaf) if(isDeaf)
deafWomen.push_back(a); deafWomen.push_back(a);
} // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> } // Создали женщин - слышащих гетерозигот
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Глухие гомозиготы
for(int i = 0; i < deafHomozygotes; i++){ for(int i = 0; i < deafHomozygotes; i++){
bool isDeaf = true; bool isDeaf = true;
int alleleFather = 1; int alleleFather = 1;
@@ -222,14 +222,14 @@ void Processor::run(std::string fileName){
if(isDeaf) if(isDeaf)
deafWomen.push_back(a); deafWomen.push_back(a);
}// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> }// Создали женщин - неслышащих гомозигот
std::random_shuffle(women.begin(), women.end()); std::random_shuffle(women.begin(), women.end());
std::random_shuffle(deafWomen.begin(), deafWomen.end()); std::random_shuffle(deafWomen.begin(), deafWomen.end());
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Создали женщин
std::cout<<"Done\n"; std::cout<<"Done\n";
std::cout<<"\nMain cycle\n"; std::cout<<"\nMain cycle\n";
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> // Основной цикл
for(int gen = 0; gen < maxGenerations; gen++){ for(int gen = 0; gen < maxGenerations; gen++){
std::cout<<"Generation\t"<<gen<<"\n"; std::cout<<"Generation\t"<<gen<<"\n";
int marriageDD = 0; int marriageDD = 0;
@@ -244,9 +244,9 @@ void Processor::run(std::string fileName){
//matrixCurrent.assign(men.size(),vect); //matrixCurrent.assign(men.size(),vect);
//std::cout<<"\tDone\n"; //std::cout<<"\tDone\n";
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> // Сначала приоритетный поиск только у глухих между собой
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD> <<3C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>> // Эмулятор разреженной матрицы - пара <индекс, оценка>
std::cout<<"\tInitializing settledPairs\t"; std::cout<<"\tInitializing settledPairs\t";
std::uniform_real_distribution<float> distrUI(0.f,1.f); std::uniform_real_distribution<float> distrUI(0.f,1.f);
std::cout<<"."; std::cout<<".";
@@ -258,11 +258,11 @@ void Processor::run(std::string fileName){
int candidatePairs = Settings::CANDIDATE_PAIRS_MEAN int candidatePairs = Settings::CANDIDATE_PAIRS_MEAN
+ (int)(sign*f*Settings::CANDIDATE_PAIRS_VAR); + (int)(sign*f*Settings::CANDIDATE_PAIRS_VAR);
// TODO: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> // TODO: Несколько топологий краёв
int left = i - candidatePairs/2; int left = i - candidatePairs/2;
int right = i + candidatePairs/2; int right = i + candidatePairs/2;
// HACK: 2018/11/23 <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> // HACK: 2018/11/23 Для глухих модель Егора
if(men.at(i)->deaf() && Settings::DEAF_COMMUNITY_MODEL == 1){ if(men.at(i)->deaf() && Settings::DEAF_COMMUNITY_MODEL == 1){
left = 0; left = 0;
right = women.size() - 1; right = women.size() - 1;
@@ -281,29 +281,29 @@ void Processor::run(std::string fileName){
std::vector<std::pair<unsigned int,float> > pairs(candidatePairs); std::vector<std::pair<unsigned int,float> > pairs(candidatePairs);
for(unsigned int p = 0; p < pairs.size(); p++){ for(unsigned int p = 0; p < pairs.size(); p++){
pairs.at(p).first = left; pairs.at(p).first = left;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-<2D><><EFBFBD><EFBFBD><EFBFBD> // Зараз и оценили друг-друга
//matrixCurrent.at(i).at(left) //matrixCurrent.at(i).at(left)
pairs.at(p).second = esteem(men.at(i),women.at(left)); pairs.at(p).second = esteem(men.at(i),women.at(left));
left++; left++;
} }
settledPairs.at(i) = pairs; settledPairs.at(i) = pairs;
} }
// (END) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // (END) Эмулятор разреженной матрицы
std::cout<<"Done\n"; std::cout<<"Done\n";
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Заполняем матрицу взаимных оцениваний
// <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // По всем мужчинам
/*for(unsigned int m = 0; m < men.size(); m++){ /*for(unsigned int m = 0; m < men.size(); m++){
// <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // По всем женщинам
for(unsigned int w = 0; w < women.size(); w++){ for(unsigned int w = 0; w < women.size(); w++){
if(matrixCurrent.at(m).at(w) >= 0.0f) if(matrixCurrent.at(m).at(w) >= 0.0f)
matrixCurrent.at(m).at(w) = esteem(men.at(m),women.at(w)); matrixCurrent.at(m).at(w) = esteem(men.at(m),women.at(w));
} }
} */ } */
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Заполнили матрицу взаимных оцениваний
/* std::cout<<"\tGenerating offsprings\t"; /* std::cout<<"\tGenerating offsprings\t";
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Формируем окончательные пары, генерируем потомков
// <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // По всем мужчинам
std::cout << "MENS" << std::endl; std::cout << "MENS" << std::endl;
for (auto m = 0; m < settledPairs.size(); ++m) for (auto m = 0; m < settledPairs.size(); ++m)
{ {
@@ -319,19 +319,19 @@ void Processor::run(std::string fileName){
for(int m = 0; m < men.size(); m++){ for(int m = 0; m < men.size(); m++){
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Ищем наиболее подходящую женщину
int bestW = 0; int bestW = 0;
float bestScore = 0.0f; float bestScore = 0.0f;
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> /* БЫЛО ДО РАЗРЕЖЕННЫХ МАТРИЦ
for(int w = 0; w < women.size(); w++){ for(int w = 0; w < women.size(); w++){
if(matrixCurrent.at(m).at(w) > bestScore){ if(matrixCurrent.at(m).at(w) > bestScore){
bestScore = matrixCurrent.at(m).at(w); bestScore = matrixCurrent.at(m).at(w);
bestW = w; bestW = w;
} }
} // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> } // Нашли
**/ **/
// <EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // С РАЗРЕЖЕННЫМИ
for(unsigned int p = 0; p < settledPairs.at(m).size(); p++){ for(unsigned int p = 0; p < settledPairs.at(m).size(); p++){
unsigned int w = settledPairs.at(m).at(p).first; unsigned int w = settledPairs.at(m).at(p).first;
@@ -344,12 +344,12 @@ void Processor::run(std::string fileName){
} }
} }
// (END) <EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // (END) С РАЗРЕЖЕННЫМ
if(bestScore <= 0.0f) if(bestScore <= 0.0f)
continue; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> continue; // Этому мужчине никто не подошёл
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> // Формируем пару, рожаем детей
int* mariage = &marriageHH; int* mariage = &marriageHH;
int* childrenType = &childrenHH; int* childrenType = &childrenHH;
@@ -387,9 +387,9 @@ void Processor::run(std::string fileName){
(*mariage)++; (*mariage)++;
(*childrenType) += children; (*childrenType) += children;
// TODO: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> + <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> // TODO: Добавить знание жестового языка если хотя бы один сибс - глухой + знает жестовый язык
std::vector<Agent*> newSibs; // <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> std::vector<Agent*> newSibs; // Для учёта распространения жестового языка в одной семье
std::vector<Agent*> deafSibs;// <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> std::vector<Agent*> deafSibs;// Для подсчёта вновь рождённых глухих
for(int i = 0; i < children; i++){ for(int i = 0; i < children; i++){
Agent* newAgent = new Agent(men.at(m), m, women.at(bestW), bestW); Agent* newAgent = new Agent(men.at(m), m, women.at(bestW), bestW);
@@ -397,7 +397,7 @@ void Processor::run(std::string fileName){
if(newAgent->deaf()){ if(newAgent->deaf()){
deafSibs.push_back(newAgent); deafSibs.push_back(newAgent);
} }
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Добавляем в общую популяцию
std::uniform_int_distribution<int> distrUI(0,1); std::uniform_int_distribution<int> distrUI(0,1);
if(distrUI(generator) == 0){ if(distrUI(generator) == 0){
newMen.push_back(newAgent); newMen.push_back(newAgent);
@@ -406,8 +406,8 @@ void Processor::run(std::string fileName){
newWomen.push_back(newAgent); newWomen.push_back(newAgent);
} }
} }
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> // Трансмиссия жестового языка
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1 - <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD>-<2D><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Случай 1 - Хотя бы один родитель глухой и кто-то знает жестовый
if(men.at(m)->deaf() || women.at(bestW)->deaf()){ if(men.at(m)->deaf() || women.at(bestW)->deaf()){
if(men.at(m)->knowsSign() || women.at(bestW)->knowsSign()){ if(men.at(m)->knowsSign() || women.at(bestW)->knowsSign()){
for(auto i = 0; i < newSibs.size(); i++){ for(auto i = 0; i < newSibs.size(); i++){
@@ -416,26 +416,26 @@ void Processor::run(std::string fileName){
} }
} }
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2 - <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Случай 2 - Хотя бы один сибс глухой
else if(deafSibs.size() > 0){ else if(deafSibs.size() > 0){
std::uniform_real_distribution<float> distrUF(0.f,1.f); std::uniform_real_distribution<float> distrUF(0.f,1.f);
// <EFBFBD>) <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> // а) Он получает случайный шанс
bool sibsKnowSL = false; bool sibsKnowSL = false;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Глухие случайно узнают жестовый
for(auto i = 0; i < deafSibs.size(); i++){ for(auto i = 0; i < deafSibs.size(); i++){
if(distrUF(generator) <= Settings::SIGN_LANG_DEAF){ if(distrUF(generator) <= Settings::SIGN_LANG_DEAF){
deafSibs.at(i)->teachSignLanguage(); deafSibs.at(i)->teachSignLanguage();
sibsKnowSL = true; sibsKnowSL = true;
} }
} }
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Слышащие случайно узнают жестовый
for(auto i = 0; i < newSibs.size(); i++){ for(auto i = 0; i < newSibs.size(); i++){
if(!newSibs.at(i)->deaf() && distrUF(generator) <= Settings::SIGN_LANG_HEAR){ if(!newSibs.at(i)->deaf() && distrUF(generator) <= Settings::SIGN_LANG_HEAR){
newSibs.at(i)->teachSignLanguage(); newSibs.at(i)->teachSignLanguage();
sibsKnowSL = true; sibsKnowSL = true;
} }
} }
// <EFBFBD>) <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // б) Если родители или сибсы знают жестовый
if(men.at(m)->knowsSign() || women.at(bestW)->knowsSign() || sibsKnowSL){ if(men.at(m)->knowsSign() || women.at(bestW)->knowsSign() || sibsKnowSL){
for(auto i = 0; i < newSibs.size(); i++){ for(auto i = 0; i < newSibs.size(); i++){
newSibs.at(i)->teachSignLanguage(); newSibs.at(i)->teachSignLanguage();
@@ -443,7 +443,7 @@ void Processor::run(std::string fileName){
} }
} }
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 3 - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Случай 3 - Слышащий просто случайно узнаёт жестовый
else { else {
std::uniform_real_distribution<float> distrUF(0.f,1.f); std::uniform_real_distribution<float> distrUF(0.f,1.f);
for(auto i = 0; i < newSibs.size(); i++){ for(auto i = 0; i < newSibs.size(); i++){
@@ -452,18 +452,18 @@ void Processor::run(std::string fileName){
} }
} }
} }
// (END) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> // (END) Трансмиссия жестового языка
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Делаем эту женщину недоступной для всех остальных
women.at(bestW)->alreadyMarried = true; women.at(bestW)->alreadyMarried = true;
//for(int i = m; i < men.size(); i++){ //for(int i = m; i < men.size(); i++){
// matrixCurrent.at(i).at(bestW) = -100.0f; // matrixCurrent.at(i).at(bestW) = -100.0f;
//} //}
} // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> } // Конец генерации потомков
std::cout<<"Done\n"; std::cout<<"Done\n";
std::cout<<"\tSaving model state\t"; std::cout<<"\tSaving model state\t";
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Сохранить текущее состояние модели
int totalP = men.size()+women.size(); int totalP = men.size()+women.size();
outputFile<<gen; outputFile<<gen;
outputFile<<"\t"<<totalP; outputFile<<"\t"<<totalP;
@@ -515,7 +515,7 @@ void Processor::run(std::string fileName){
std::cout<<"Done\n"; std::cout<<"Done\n";
std::cout<<"\tDeleting old agents\t"; std::cout<<"\tDeleting old agents\t";
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Удалить старых агентов
for(int i = 0; i < men.size(); i++){ for(int i = 0; i < men.size(); i++){
delete men.at(i); delete men.at(i);
} }
@@ -525,7 +525,7 @@ void Processor::run(std::string fileName){
std::cout<<"Done\n"; std::cout<<"Done\n";
std::cout<<"\tReplacing old by new and shuffling\t"; std::cout<<"\tReplacing old by new and shuffling\t";
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Заменить старых новыми
men = newMen; men = newMen;
women = newWomen; women = newWomen;
std::random_shuffle(men.begin(), men.end()); std::random_shuffle(men.begin(), men.end());
@@ -537,13 +537,13 @@ void Processor::run(std::string fileName){
newWomen.clear(); newWomen.clear();
std::cout<<"Done\n"; std::cout<<"Done\n";
} // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> } // Основной цикл
outputFile.close(); outputFile.close();
} }
float Processor::esteem(Agent* man, Agent* woman){ float Processor::esteem(Agent* man, Agent* woman){
float ans = 0.0f; float ans = 0.0f;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Проверка брат-сестра
if( (man->getFatherID() == woman->getFatherID() || if( (man->getFatherID() == woman->getFatherID() ||
man->getMotherID() == woman->getMotherID()) && woman->getMotherID() != -1){ man->getMotherID() == woman->getMotherID()) && woman->getMotherID() != -1){
return -50.f; return -50.f;
@@ -597,7 +597,7 @@ void Processor::initSettings(std::string fileName){
boost::to_lower(instr); boost::to_lower(instr);
boost::trim(instr); boost::trim(instr);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // Инструкции
if(instr == "generations" || instr == "iterations" ){ if(instr == "generations" || instr == "iterations" ){
int iter = Settings::MAX_GENERATIONS; int iter = Settings::MAX_GENERATIONS;
sscanf_s(tokensVector.at(1).c_str(),"%d", &iter); sscanf_s(tokensVector.at(1).c_str(),"%d", &iter);
@@ -736,4 +736,4 @@ void Processor::initSettings(std::string fileName){
}*/ }*/
} // (END) for(curLine = 0; curLine < script.size(); curLine++) } // (END) for(curLine = 0; curLine < script.size(); curLine++)
} }

View File

@@ -13,8 +13,8 @@ float Settings::DEAF_ALLELE_RATIO = 0.1f;
float Settings::DEAF_HOMOZYGOTES = 0.05f; float Settings::DEAF_HOMOZYGOTES = 0.05f;
float Settings::HEAR_HOMOZYGOTES = 0.65f; float Settings::HEAR_HOMOZYGOTES = 0.65f;
float Settings::BIRTH_RATE_H = 2.3f; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> float Settings::BIRTH_RATE_H = 2.3f; // среднее число потомков
float Settings::BIRTH_RATE_D = 2.1f; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> float Settings::BIRTH_RATE_D = 2.1f; // среднее число потомков
float Settings::BETA_A = 2.0f; float Settings::BETA_A = 2.0f;
float Settings::BETA_B = 5.0f; float Settings::BETA_B = 5.0f;

View File

@@ -16,8 +16,8 @@ public:
static float DEAF_HOMOZYGOTES; static float DEAF_HOMOZYGOTES;
static float HEAR_HOMOZYGOTES; static float HEAR_HOMOZYGOTES;
static float BIRTH_RATE_H; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> static float BIRTH_RATE_H; // среднее число потомков
static float BIRTH_RATE_D; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> static float BIRTH_RATE_D; // среднее число потомков
static float BETA_A; static float BETA_A;
static float BETA_B; static float BETA_B;
@@ -37,7 +37,7 @@ public:
static std::default_random_engine RANDOM_GENERATOR; static std::default_random_engine RANDOM_GENERATOR;
static int DEAF_COMMUNITY_MODEL; // 0 - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>, 1 - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, 2 - <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> static int DEAF_COMMUNITY_MODEL; // 0 - сообщества глухих нет, 1 - глухие видят всю матрицу, 2 - малая матрица для глухих
static std::string OUTPUT_FILE; static std::string OUTPUT_FILE;
}; };