@@ -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 \t TotalPopulation \t Men \t Women \t Deaf " ;
@@ -41,10 +41,10 @@ void Processor::run(std::string fileName){
outputFile < < " \t DH marriages \t DH children " ;
outputFile < < " \t HH marriages \t HH children " ;
outputFile < < " \t DA frequency \t DA 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 < < " \n Main 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 < < " \t Initializing 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 < < " \t Saving 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 < < " \t Deleting 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 < < " \t Replacing 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++)
}
}