Compare commits

..

10 Commits

Author SHA1 Message Date
Anna Smirnova
b4b67e5a21 добавила создание папок 2019-04-03 15:42:12 +07:00
Anna
8cdf41b254 Delete .gitkeep 2019-04-03 04:34:37 -04:00
Anna
610abfa7bb Delete .gitkeep 2019-04-03 04:34:26 -04:00
Anna
4798a734bf Delete .gitkeep 2019-04-03 04:34:16 -04:00
Anna
016f4201c5 Add new directory 2019-04-03 04:32:13 -04:00
Anna
6eec4e85ee Add new directory 2019-04-03 04:31:57 -04:00
Anna
6147dcff6e Add new directory 2019-04-03 04:31:38 -04:00
Anna Smirnova
0ad9bcc106 Merge branch 'master' of ssh://gate1.cytogen.ru:8029/lashin/deaf2.0 2019-04-03 15:27:18 +07:00
Anna Smirnova
f8f65be180 добавила скрипт для обработки статистики по выводу Deaf 2019-04-03 15:26:04 +07:00
Aleksey Mukhin
5a4e1d30f5 recoding files 2019-02-20 12:19:03 +07:00
10 changed files with 216 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);

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;
}; };

BIN
ScriptDeaf/Deaf2.0.exe Normal file

Binary file not shown.

63
ScriptDeaf/MultiAll.py Normal file
View File

@@ -0,0 +1,63 @@
import os, sys
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import pylab
n = 1 #количество итераций
current_path = os.getcwd() #определяю путь до папки в которой лежит этот скрипт
if not os.path.exists(current_path + '\Results'):#создаю папку Results
os.makedirs(current_path + '\Results')
if not os.path.exists(current_path + '\Common'):#создаю папку Common
os.makedirs(current_path + '\Common')
if not os.path.exists(current_path + '\Pictures'):#создаю папку Pictures
os.makedirs(current_path + '\Pictures')
pass_to_scenario = current_path + '\Scenario' #эта переменная хранит путь до папки Scenario
for filename in os.listdir(pass_to_scenario): #читаю файл за файлом в директории Scenario, т.е. поочередно иду по каждому сценарию
scenario = filename[0:-4]
if not os.path.exists(current_path + '\Pictures' + '\\' + scenario):#создаю в папке Pictures папки с названиями сценариев, для удобства
os.makedirs(current_path + '\Pictures' + '\\' + scenario)
for i in range (n): #количесво запусков текущего сценария
timestr = time.strftime("%Y%m%d-%H%M%S") #переменная, которая хранит текущее время для задания имени файла выдачи
os.chdir(current_path + '\Results') #меняю директорию на ту, куда будут попадать файлы выдачи
os.system(current_path + '\Deaf2.0.exe ' + pass_to_scenario + '\\' + filename) #запускаю exe'шник и подаю ему на вход текущий файл-сценарий с параметрами
print(current_path + '\Deaf2.0.exe ' + pass_to_scenario + '\\' + filename)
os.rename('output.deaf2.0.csv', filename[0:-4] + '_' + str(i) + '_' + timestr + '.txt') #переименовываю файл output.txt на текущую датуи время, учитывая номер сценария и итерации
#print(current_path + '\Deaf2.0.exe ' + pass_to_scenario + '\\' + filename + ' ' + '1>out.txt ' + '2>err.txt')
#----------- Объединение в датафреймы
pass_to_results = current_path + '\Results'
list_of_scenario = []
for filename in os.listdir(pass_to_results):
pos_end = filename.find("_")
list_of_scenario.append(filename[0:pos_end])
count_scenario = set(list_of_scenario)
os.chdir(current_path + '\Common')
for l in count_scenario:
data = pd.DataFrame(columns=('Generation', 'TotalPopulation', 'Men', 'Women', 'Deaf', 'DD marriages', 'DD children', 'DH marriages', 'DH children', 'HH marriages', 'HH children', 'DA frequency', 'DA homozygotes frequency'))
for filename in os.listdir(pass_to_results):
pos_end = filename.find("_")
if l == filename[0:pos_end]:
data = data.append(pd.read_csv(pass_to_results +'\\'+ filename, sep='\t'))
data.sort_values(by=['Generation']).to_csv('commonSort' + l + '.txt', sep='\t')
print(list_of_scenario)
#----------- Построение графиков
data = pd.DataFrame(columns=('Generation', 'TotalPopulation', 'Men', 'Women', 'Deaf', 'DD marriages', 'DD children', 'DH marriages', 'DH children', 'HH marriages', 'HH children', 'DA frequency', 'DA homozygotes frequency'))
pass_to_common = current_path + '\Common'
list_of_columns = []
os.chdir(current_path + '\Pictures')
for filename in os.listdir(pass_to_common): #Идем по всем файлам из папки Common, то есть по сценариям
os.chdir(current_path + '\Pictures' + '\\' + filename[10:-4])#переход в папку с названием спенария в Pictures
data = pd.read_csv(pass_to_common +'\\'+ filename, sep='\t') #Создаю dataFrame с данными по текущему сценарию
del data['Unnamed: 0'] #Удаляю лишний столбец (особенности создания датафрейма)
list_of_columns = data.columns.values #получаю список из названий столбцов
list_of_clmn = list(list_of_columns)
list_of_clmn.remove('Generation') #удаляю generation так как для него не надо строить боксплот
for i in list_of_clmn: #беру по одному название столбца и строю для него боксплот
data.boxplot(column = i, by='Generation') #то, что по оси Х это "by", а что, что боксплочу это в 'colomn' записываю'
plt.savefig(filename[10:-4] + '_' + i + '.png', dpi=400) #сохраняю график и даю название <имя сценария> + <имя столбца>
plt.grid(True)

View File

@@ -0,0 +1,35 @@
generations = 10;
init_pop_men = 15000;
init_pop_women = 15000;
candidate_pairs_mean = 150;
candidate_pairs_var = 30;
spontaneous_deaf = 0.0025f;
deaf_allele_ratio = 0.0f;
deaf_homozygotes = 0.0025f;
hear_homozygotes = 0.8975f;
birth_rate_hearing = 2.1f;
birth_rate_deaf = 2.1f;
beta_a = 2.0f;
beta_b = 5.0f;
social_mean_h = 0.3f;
social_mean_d = 0.05f;
social_var_h = 0.3f;
social_var_d = 0.05f;
weight_phenotype_hearing = 0.5f;
weight_phenotype_deaf = 0.0f;
weight_sign_h = 0.5f;
weight_sign_d = 0.5f;
sign_lang_d = 1.0f;
sign_lang_h = 0.0f;
deaf_community_model = 1;

View File

@@ -0,0 +1,32 @@
generations = 10;
init_pop_men = 10000;
init_pop_women = 10000;
candidate_pairs_mean = 150;
candidate_pairs_var = 30;
spontaneous_deaf = 0.0025f;
deaf_homozygotes = 0.0025f;
hear_homozygotes = 0.8975f;
birth_rate_hearing = 2.2f;
birth_rate_deaf = 2.2f;
beta_a = 2.0f;
beta_b = 5.0f;
social_mean_h = 0.3f;
social_mean_d = 0.05f;
social_var_h = 0.3f;
social_var_d = 0.05f;
weight_phenotype_hearing = 0.5f;
weight_phenotype_deaf = 0.0f;
weight_sign_h = 0.5f;
weight_sign_d = 0.5f;
sign_lang_d = 1.0f;
sign_lang_h = 0.0f;
deaf_community_model = 1;

Binary file not shown.