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;
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 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->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;
@@ -42,21 +42,21 @@ Agent::Agent(Agent* father, int fID, Agent* mother, int mID){
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
// || 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);
float delta = distrN(generator);
this->socialPosition = 0.5f*(mother->socialPosition + father->socialPosition) + delta;
this->alreadyMarried = false;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Берём из популяции
// delta = distribution(generator);
// this->bachelority = 0.5f*(mother->bachelority + father->bachelority) + delta;
// this->age = 0;

View File

@@ -22,7 +22,7 @@ protected:
public:
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);
bool deaf() const { return isDeaf;}
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;
///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 birthRateD = Settings::BIRTH_RATE_D; // <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; // среднее число потомков
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::ofstream outputFile(Settings::OUTPUT_FILE);
outputFile<<"Generation\tTotalPopulation\tMen\tWomen\tDeaf";
@@ -41,10 +41,10 @@ void Processor::run(std::string fileName){
outputFile<<"\tDH marriages\tDH children";
outputFile<<"\tHH marriages\tHH children";
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;
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> > matrixFuture;
@@ -54,7 +54,7 @@ void Processor::run(std::string fileName){
std::vector<Agent*> newMen;
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*> deafWomen;
std::vector<Agent*> deafNewMen;
@@ -65,18 +65,18 @@ void Processor::run(std::string fileName){
//generator.seed(std::time(0));
//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";
int deafHomozygotes = (int) (initPopSizeM*Settings::DEAF_HOMOZYGOTES);
int hearHomozygotes = (int) (initPopSizeM*Settings::HEAR_HOMOZYGOTES);
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++){
bool isDeaf = false;
int alleleFather = 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);
if(distrUI(generator) < Settings::SPONTANEOUS_DEAF)
isDeaf = true;
@@ -94,14 +94,14 @@ void Processor::run(std::string fileName){
if(isDeaf)
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++){
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;
// <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);
if(distrUI(generator) < Settings::SPONTANEOUS_DEAF)
isDeaf = true;
@@ -119,9 +119,9 @@ void Processor::run(std::string fileName){
if(isDeaf)
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++){
bool isDeaf = true;
int alleleFather = 1;
@@ -141,23 +141,23 @@ void Processor::run(std::string fileName){
if(isDeaf)
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(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<<"Creating women..\t";
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Создаём женщин
deafHomozygotes = (int) (initPopSizeW*Settings::DEAF_HOMOZYGOTES);
hearHomozygotes = (int) (initPopSizeW*Settings::HEAR_HOMOZYGOTES);
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++){
bool isDeaf = false;
int alleleFather = 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);
if(distrUI(generator) < Settings::SPONTANEOUS_DEAF)
isDeaf = true;
@@ -175,14 +175,14 @@ void Processor::run(std::string fileName){
if(isDeaf)
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++){
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;
// <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);
if(distrUI(generator) < Settings::SPONTANEOUS_DEAF)
isDeaf = true;
@@ -200,9 +200,9 @@ void Processor::run(std::string fileName){
if(isDeaf)
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++){
bool isDeaf = true;
int alleleFather = 1;
@@ -222,14 +222,14 @@ void Processor::run(std::string fileName){
if(isDeaf)
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(deafWomen.begin(), deafWomen.end());
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Создали женщин
std::cout<<"Done\n";
std::cout<<"\nMain cycle\n";
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// Основной цикл
for(int gen = 0; gen < maxGenerations; gen++){
std::cout<<"Generation\t"<<gen<<"\n";
int marriageDD = 0;
@@ -244,9 +244,9 @@ void Processor::run(std::string fileName){
//matrixCurrent.assign(men.size(),vect);
//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::uniform_real_distribution<float> distrUI(0.f,1.f);
std::cout<<".";
@@ -258,11 +258,11 @@ void Processor::run(std::string fileName){
int candidatePairs = Settings::CANDIDATE_PAIRS_MEAN
+ (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 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){
left = 0;
right = women.size() - 1;
@@ -281,29 +281,29 @@ void Processor::run(std::string fileName){
std::vector<std::pair<unsigned int,float> > pairs(candidatePairs);
for(unsigned int p = 0; p < pairs.size(); p++){
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)
pairs.at(p).second = esteem(men.at(i),women.at(left));
left++;
}
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";
// <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++){
// <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// По всем женщинам
for(unsigned int w = 0; w < women.size(); w++){
if(matrixCurrent.at(m).at(w) >= 0.0f)
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";
// <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;
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++){
// <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;
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++){
if(matrixCurrent.at(m).at(w) > bestScore){
bestScore = matrixCurrent.at(m).at(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++){
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)
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* childrenType = &childrenHH;
@@ -387,9 +387,9 @@ void Processor::run(std::string fileName){
(*mariage)++;
(*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>
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*> 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>
// TODO: Добавить знание жестового языка если хотя бы один сибс - глухой + знает жестовый язык
std::vector<Agent*> newSibs; // Для учёта распространения жестового языка в одной семье
std::vector<Agent*> deafSibs;// Для подсчёта вновь рождённых глухих
for(int i = 0; i < children; i++){
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()){
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);
if(distrUI(generator) == 0){
newMen.push_back(newAgent);
@@ -406,8 +406,8 @@ void Processor::run(std::string fileName){
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)->knowsSign() || women.at(bestW)->knowsSign()){
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){
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;
// <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++){
if(distrUF(generator) <= Settings::SIGN_LANG_DEAF){
deafSibs.at(i)->teachSignLanguage();
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++){
if(!newSibs.at(i)->deaf() && distrUF(generator) <= Settings::SIGN_LANG_HEAR){
newSibs.at(i)->teachSignLanguage();
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){
for(auto i = 0; i < newSibs.size(); i++){
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 {
std::uniform_real_distribution<float> distrUF(0.f,1.f);
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;
//for(int i = m; i < men.size(); i++){
// 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<<"\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();
outputFile<<gen;
outputFile<<"\t"<<totalP;
@@ -515,7 +515,7 @@ void Processor::run(std::string fileName){
std::cout<<"Done\n";
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++){
delete men.at(i);
}
@@ -525,7 +525,7 @@ void Processor::run(std::string fileName){
std::cout<<"Done\n";
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;
women = newWomen;
std::random_shuffle(men.begin(), men.end());
@@ -537,13 +537,13 @@ void Processor::run(std::string fileName){
newWomen.clear();
std::cout<<"Done\n";
} // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
} // Основной цикл
outputFile.close();
}
float Processor::esteem(Agent* man, Agent* woman){
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() ||
man->getMotherID() == woman->getMotherID()) && woman->getMotherID() != -1){
return -50.f;
@@ -597,7 +597,7 @@ void Processor::initSettings(std::string fileName){
boost::to_lower(instr);
boost::trim(instr);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Инструкции
if(instr == "generations" || instr == "iterations" ){
int iter = Settings::MAX_GENERATIONS;
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::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_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_H = 2.3f; // среднее число потомков
float Settings::BIRTH_RATE_D = 2.1f; // среднее число потомков
float Settings::BETA_A = 2.0f;
float Settings::BETA_B = 5.0f;

View File

@@ -16,8 +16,8 @@ public:
static float DEAF_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_D; // <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; // среднее число потомков
static float BETA_A;
static float BETA_B;
@@ -37,7 +37,7 @@ public:
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;
};

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.