Compare commits
10 Commits
01cd2cdcc3
...
b4b67e5a21
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b4b67e5a21 | ||
|
|
8cdf41b254 | ||
|
|
610abfa7bb | ||
|
|
4798a734bf | ||
|
|
016f4201c5 | ||
|
|
6eec4e85ee | ||
|
|
6147dcff6e | ||
|
|
0ad9bcc106 | ||
|
|
f8f65be180 | ||
|
|
5a4e1d30f5 |
@@ -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;
|
||||
|
||||
@@ -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);}
|
||||
|
||||
@@ -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);
|
||||
@@ -736,4 +736,4 @@ void Processor::initSettings(std::string fileName){
|
||||
}*/
|
||||
} // (END) for(curLine = 0; curLine < script.size(); curLine++)
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
BIN
ScriptDeaf/Deaf2.0.exe
Normal file
Binary file not shown.
63
ScriptDeaf/MultiAll.py
Normal file
63
ScriptDeaf/MultiAll.py
Normal 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)
|
||||
35
ScriptDeaf/Scenario/S1.txt
Normal file
35
ScriptDeaf/Scenario/S1.txt
Normal 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;
|
||||
|
||||
|
||||
|
||||
32
ScriptDeaf/Scenario/S2.txt
Normal file
32
ScriptDeaf/Scenario/S2.txt
Normal 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;
|
||||
|
||||
BIN
ScriptDeaf/Описание.docx
Normal file
BIN
ScriptDeaf/Описание.docx
Normal file
Binary file not shown.
Reference in New Issue
Block a user