protected func Initialize() { // Show wealth in HUD. GUI_Controller->ShowWealth(); // Rules: team account and buying at flagpole. CreateObject(Rule_TeamAccount); CreateObject(Rule_BuyAtFlagpole); // Goal: Sell Gems, amount depends on difficulty and initial availability. var gems = (4 * GetMaterialCount(Material("Ruby"))) / (5 * GetMaterialVal("Blast2ObjectRatio", "Material", Material("Ruby"))); gems += (4 * GetMaterialCount(Material("Amethyst"))) / (5 * GetMaterialVal("Blast2ObjectRatio", "Material", Material("Amethyst"))); var percentage = 55 + 15 * SCENPAR_Difficulty; var goal = CreateObject(Goal_SellGems); goal->SetTargetAmount((gems * percentage) / 100); // Initialize different parts of the scenario. InitEnvironment(SCENPAR_Difficulty); InitVegetation(); InitAnimals(); InitResources(SCENPAR_Difficulty); InitMainIsland(4 - SCENPAR_Difficulty); InitIslands(4 - SCENPAR_Difficulty); return; }
/******************************************************************* ** 変数をデフォルトにセット *******************************************************************/ void OpenGL::SetDefault(void) { // レンダリングコンテキストの初期化 m_hRC = NULL; VType = PERSPECTIVE; InitEnvironment(); return; }
BOOL CTorrentWizardApp::InitInstance() { CCommandLineInfoEx cmdInfo; ParseCommandLine(cmdInfo); cmdInfo.GetOption( _T("sourcefile"), m_sCommandLineSourceFile ); cmdInfo.GetOption( _T("destination"), m_sCommandLineDestination ); cmdInfo.GetOption( _T("tracker"), m_sCommandLineTracker ); cmdInfo.GetOption( _T("comment"), m_sCommandLineComment ); if ( m_sCommandLineSourceFile.GetLength() > 0 && m_sCommandLineDestination.GetLength() > 0 && m_sCommandLineTracker.GetLength() > 0 ) { if ( m_sCommandLineComment.IsEmpty() ) m_sCommandLineComment = _T("http://shareaza.sourceforge.net/"); } SetRegistryKey( _T("Shareaza") ); InitEnvironment(); InitResources(); CWizardSheet pSheet; CWelcomePage pWelcome; CSinglePage pSingle; CPackagePage pPackage; CTrackerPage pTracker; CCommentPage pComment; COutputPage pOutput; CFinishedPage pFinished; m_pSheet = &pSheet; pSheet.AddPage( &pWelcome ); pSheet.AddPage( &pSingle ); pSheet.AddPage( &pPackage ); pSheet.AddPage( &pTracker ); pSheet.AddPage( &pOutput ); pSheet.AddPage( &pComment ); pSheet.AddPage( &pFinished ); pSheet.DoModal(); return FALSE; }
protected func Initialize() { // Show wealth in HUD. GUI_Controller->ShowWealth(); // Rules: team account and buying at flagpole. CreateObject(Rule_TeamAccount); CreateObject(Rule_BuyAtFlagpole); // Goal: gain wealth dependent on difficulty. var goal = CreateObject(Goal_Wealth); goal->SetWealthGoal(100 + 150 * SCENPAR_Difficulty); // Initialize different parts of the scenario. InitEnvironment(SCENPAR_Difficulty); InitVegetation(SCENPAR_MapSize); InitAnimals(SCENPAR_MapSize); InitMaterial(4 - SCENPAR_Difficulty); return; }
BOOL CTorrentEnvyApp::InitInstance() { CCommandLineInfoEx cmdInfo; ParseCommandLine( cmdInfo ); cmdInfo.GetOption( L"sourcefile", m_sCommandLineSourceFile ); cmdInfo.GetOption( L"destination", m_sCommandLineDestination ); cmdInfo.GetOption( L"tracker", m_sCommandLineTracker ); cmdInfo.GetOption( L"comment", m_sCommandLineComment ); if ( ! m_sCommandLineSourceFile.IsEmpty() && ! m_sCommandLineDestination.IsEmpty() && ! m_sCommandLineTracker.IsEmpty() ) { if ( m_sCommandLineComment.IsEmpty() ) m_sCommandLineComment = L"http://getenvy.com/"; } else { // Test prior app instance for non-commandline HANDLE pMutex = CreateMutex( NULL, FALSE, L"Global\\TorrentEnvy" ); if ( GetLastError() == ERROR_ALREADY_EXISTS ) { // Show first instance //if ( CWnd* pWnd = CWnd::FindWindow( L"TorrentEnvy", NULL ) ) //{ // pWnd->SendMessage( WM_SYSCOMMAND, SC_RESTORE ); // pWnd->ShowWindow( SW_SHOWNORMAL ); // pWnd->BringWindowToTop(); // pWnd->SetForegroundWindow(); //} if ( MessageBox( NULL, (LPCWSTR)L"TorrentEnvy is currently running.\nDo you wish to open a new window?", (LPCWSTR)L"Envy TorrentEnvy", MB_ICONQUESTION | MB_OKCANCEL | MB_SETFOREGROUND ) == IDCANCEL ) { CloseHandle( pMutex ); return FALSE; } } // else Continue... } SetRegistryKey( L"Envy" ); InitEnvironment(); InitResources(); CWizardSheet pSheet; CWelcomePage pWelcome; CExpertPage pExpert; CSinglePage pSingle; CPackagePage pPackage; CTrackerPage pTracker; CCommentPage pComment; COutputPage pOutput; CFinishedPage pFinished; m_pSheet = &pSheet; pSheet.AddPage( &pWelcome ); pSheet.AddPage( &pExpert ); pSheet.AddPage( &pSingle ); pSheet.AddPage( &pPackage ); pSheet.AddPage( &pTracker ); pSheet.AddPage( &pComment ); pSheet.AddPage( &pOutput ); pSheet.AddPage( &pFinished ); if ( cmdInfo.m_sPaths.GetCount() ) { if ( m_sCommandLineSourceFile.IsEmpty() && cmdInfo.m_sPaths.GetCount() == 1 ) m_sCommandLineSourceFile = cmdInfo.m_sPaths.GetHead(); for ( int i = (int)cmdInfo.m_sPaths.GetCount(); i; i-- ) m_sCommandLinePaths.AddTail( cmdInfo.m_sPaths.RemoveHead() ); } pSheet.DoModal(); return FALSE; }
void Evolution(TModeSettings* ModeSettings, TTimeSettings* TimeSettings, TMutationSettings* MutationSettings, TFilenameSettings* FilenameSettings, TRunSettings* RunSettings, TPrimarySystemogenesisSettings* PrimarySystemogenesisSettings, TLearningSettings* LearningSettings, double EnVariableProbability) { TEnvironmentAims EnvironmentAims; InitEnvironment(&EnvironmentAims, FilenameSettings->EnvironmentFilename); // Загружаем среду // Файлы с отчетными результатами FILE* hResultFile; // Основной файл результатов FILE* hHistogramFile; // Файл с гистограммами распределения награды по поколению FILE* hBestAgentFile; // Файл с лучшими агентами в каждой популяции PrepareOutputFiles(&hResultFile, &hHistogramFile, &hBestAgentFile, FilenameSettings, RunSettings, TimeSettings, MutationSettings, &EnvironmentAims, EnVariableProbability, ModeSettings->RewardMode); TAgentGenomePopulation AgentGenomePopulation; // Создаем популяцию геномов AgentGenomePopulation.PopulationAgentQuantity = TimeSettings->AgentPopulationQuantity; TAgentPopulation AgentPopulation; AgentPopulation.PopulationAgentQuantity = AgentGenomePopulation.PopulationAgentQuantity; if (!ModeSettings->EvolutionMode) // Если используется алгоритм NEAT {}//InitFirstGeneration_NEAT(&AgentGenomePopulation, EnvironmentAims.EnvironmentResolution, EnvironmentAims.OutputResolution); else // Если используется модифицированный эволюционный алгоритм InitFirstGeneration_ModernEvolution(&AgentGenomePopulation, EnvironmentAims.EnvironmentResolution, EnvironmentAims.OutputResolution, ModeSettings->LearningMode ? PrimarySystemogenesisSettings->InitialPoolCapacity : 1); double BestAverageReward = 0; // Средняя награда лучшей популяции double CurrentConInnovationNumber = (double) AgentGenomePopulation.AgentGenome[0]->ConnectionQuantity; double CurrentPredConInnovationNumber = (double) AgentGenomePopulation.AgentGenome[0]->PredConnectionQuantity; for (int EvolutionStep=1; EvolutionStep<=TimeSettings->EvolutionTime; ++EvolutionStep) { for (int AgentNumber=0; AgentNumber<AgentGenomePopulation.PopulationAgentQuantity; ++AgentNumber) // Прогоняем жизнь всех агентов { AgentPopulation.Agent[AgentNumber] = CreateNeuralNetwork(); if (ModeSettings->LearningMode) AgentPrimarySystemogenesis(AgentPopulation.Agent[AgentNumber], AgentGenomePopulation.AgentGenome[AgentNumber], PrimarySystemogenesisSettings); else AgentLinearPrimarySystemogenesis(AgentPopulation.Agent[AgentNumber], AgentGenomePopulation.AgentGenome[AgentNumber]); //!! /*char AgentDotFile[255]; sprintf(AgentDotFile, "C:/EvolutionImages/Agent%i-%i.dot", EvolutionStep, AgentNumber); NeuralNetwork2Dot(AgentPopulation.Agent[AgentNumber], AgentDotFile); FILE* file = fopen("C:/EvolutionImages/Agent.txt", "w"); RecordNeuralNetwork(AgentPopulation.Agent[AgentNumber], AgentNumber, file); fclose(file); printf("\nD\n"); char c = getchar();*/ //!! AgentLife(AgentPopulation.Agent[AgentNumber], &EnvironmentAims, TimeSettings->RewardRecoveryTime, EnVariableProbability, TimeSettings->AgentLifetime, ModeSettings->NetworkMode, ModeSettings->LearningMode, LearningSettings); AgentGenomePopulation.AgentGenome[AgentNumber]->Reward = AgentPopulation.Agent[AgentNumber]->Reward; } //Вывод результатов ResultsOutput(&AgentGenomePopulation, hResultFile, hHistogramFile, hBestAgentFile, FilenameSettings->BestPopulationFilename, &BestAverageReward, EvolutionStep, ModeSettings->RewardMode, MutationSettings->PenaltyRewardLimit); //!! /*double MaxRewardAgent = -1; int BestAgent = 0; for (int CurrentAgent=0; CurrentAgent<AgentGenomePopulation.PopulationAgentQuantity; CurrentAgent++) if (AgentGenomePopulation.AgentGenome[CurrentAgent]->Reward > MaxRewardAgent) { MaxRewardAgent = AgentGenomePopulation.AgentGenome[CurrentAgent]->Reward; BestAgent = CurrentAgent; } char BestGenomeDotFile[255]; sprintf(BestGenomeDotFile, "D:/EvolutionImages/BestGenome%i.dot", EvolutionStep); char BestAgentDotFile[255]; sprintf(BestAgentDotFile, "D:/EvolutionImages/BestAgent%i.dot", EvolutionStep); PoolNetwork2Dot(AgentGenomePopulation.AgentGenome[BestAgent], BestGenomeDotFile); NeuralNetwork2Dot(AgentPopulation.Agent[BestAgent], BestAgentDotFile);*/ //!! GenerateNextPopulation(&AgentGenomePopulation, MutationSettings, EvolutionStep, ModeSettings->EvolutionMode, ModeSettings->RewardMode, &CurrentConInnovationNumber, &CurrentPredConInnovationNumber); for (int AgentNumber =0; AgentNumber<AgentPopulation.PopulationAgentQuantity; ++AgentNumber) AgentPopulation.Agent[AgentNumber] = DeleteNeuralNetwork(AgentPopulation.Agent[AgentNumber]); } for (int CurrentAgent=0; CurrentAgent<AgentGenomePopulation.PopulationAgentQuantity; ++CurrentAgent) AgentGenomePopulation.AgentGenome[CurrentAgent] = DeletePoolNetwork(AgentGenomePopulation.AgentGenome[CurrentAgent]); fclose(hResultFile); fclose(hHistogramFile); fclose(hBestAgentFile); }
// Основная процедура распараллеливания анализа эволюции void ParallelAnalysis(int argc, char **argv) { MPI_Init(&argc, &argv); //------- Создание семейства/структуры процессов -------- char InMessage[MessageLenght]; // Входящее сообщение для процесса char OutMessage[MessageLenght]; // Исходящее сообщение для процесса int PrRank; // Номер процесса int PrsSize; // Общее кол-во процессов int type = 99; // Служебный тип сообщений MPI_Status status; MPI_Comm_size(MPI_COMM_WORLD, &PrsSize); // Определение общего количества процессов MPI_Comm_rank(MPI_COMM_WORLD, &PrRank); // Определение процессом своего номера // Создаем структуры и переменные настроек TTimeSettings TimeSettings; TMutationSettings MutationSettings; TModeSettings ModeSettings; TDirectorySettings DirectorySettings; TGeneralRunSettings GeneralRunSettings; TPrimarySystemogenesisSettings PrimarySystemogenesisSettings; TLearningSettings LearningSettings; double EnVariableProbability = 0; int ProgramMode = 0; bool NoEnVariableCheck = 0; // Сначала заполняем все настройки из файла FillSettingsFromFile(argv[1], &TimeSettings, &MutationSettings, &ModeSettings, &DirectorySettings, &GeneralRunSettings, &PrimarySystemogenesisSettings, &LearningSettings, &EnVariableProbability); if (PrRank == 0) // Если это родительский процесс { // Заполняем настройки из командной строки (это только для родительского процесса) FillCommandParametrs(argc, argv, &GeneralRunSettings, &ModeSettings, &(MutationSettings.EnConProb), &(MutationSettings.DisConProb), &EnVariableProbability, &ProgramMode, &NoEnVariableCheck); // Проверка целостности данных перед анализом CheckIntegrityOfData(&GeneralRunSettings, &ModeSettings, &DirectorySettings, NoEnVariableCheck, TimeSettings.AgentPopulationQuantity); char RunLogFilename[255]; sprintf(RunLogFilename, "%s/AnalysisRunLog_En%i-%i_Var%i_Noen%i_EnVar%.5f_EvM%i.txt", DirectorySettings.WorkDirectory, GeneralRunSettings.FirstEnvironmentNumber, GeneralRunSettings.LastEnvironmentNumber, GeneralRunSettings.VariableNumber, NoEnVariableCheck, EnVariableProbability, ModeSettings.EvolutionMode); FILE* hRunLogFile = fopen(RunLogFilename, "w"); // Массивы средних и максимальных наград для всех анализируемых запусков (для всех сред и для всех попыток) //double AverageRewardArray[(GeneralRunSettings.LastVariableNumber - GeneralRunSettings.VariableNumber + 1)*(GeneralRunSettings.LastEnvironmentNumber - GeneralRunSettings.FirstEnvironmentNumber + 1)*(GeneralRunSettings.LastTryNumber - GeneralRunSettings.FirstTryNumber + 1)]; //double MaxRewardArray[(GeneralRunSettings.LastVariableNumber - GeneralRunSettings.VariableNumber + 1)*(GeneralRunSettings.LastEnvironmentNumber - GeneralRunSettings.FirstEnvironmentNumber + 1)*(GeneralRunSettings.LastTryNumber - GeneralRunSettings.FirstTryNumber + 1)]; double* AverageRewardArray = new double[(GeneralRunSettings.LastVariableNumber - GeneralRunSettings.VariableNumber + 1)*(GeneralRunSettings.LastEnvironmentNumber - GeneralRunSettings.FirstEnvironmentNumber + 1)*(GeneralRunSettings.LastTryNumber - GeneralRunSettings.FirstTryNumber + 1)]; double* MaxRewardArray = new double[(GeneralRunSettings.LastVariableNumber - GeneralRunSettings.VariableNumber + 1)*(GeneralRunSettings.LastEnvironmentNumber - GeneralRunSettings.FirstEnvironmentNumber + 1)*(GeneralRunSettings.LastTryNumber - GeneralRunSettings.FirstTryNumber + 1)]; // Выдача дочерним процессам всех заданий данных на выполнение программе for (int CurrentVarNumber=GeneralRunSettings.VariableNumber; CurrentVarNumber<=GeneralRunSettings.LastVariableNumber; CurrentVarNumber++) { for (int CurrentEnNumber=GeneralRunSettings.FirstEnvironmentNumber; CurrentEnNumber<=GeneralRunSettings.LastEnvironmentNumber; CurrentEnNumber++) { for (int CurrentTryNumber=GeneralRunSettings.FirstTryNumber; CurrentTryNumber<=GeneralRunSettings.LastTryNumber; CurrentTryNumber++) { // Если не всем процессам выданы изначальные задания if( ( (CurrentVarNumber - GeneralRunSettings.VariableNumber)*(GeneralRunSettings.LastEnvironmentNumber - GeneralRunSettings.FirstEnvironmentNumber + 1)*(GeneralRunSettings.LastTryNumber - GeneralRunSettings.FirstTryNumber + 1) + (CurrentEnNumber - GeneralRunSettings.FirstEnvironmentNumber)*(GeneralRunSettings.LastTryNumber - GeneralRunSettings.FirstTryNumber + 1) + (CurrentTryNumber - GeneralRunSettings.FirstTryNumber + 1) ) <= (PrsSize-1)) { // Определяем номер процесса, которому мы должны послать задание int PrRankSend = (CurrentVarNumber - GeneralRunSettings.VariableNumber)*(GeneralRunSettings.LastEnvironmentNumber - GeneralRunSettings.FirstEnvironmentNumber + 1)*(GeneralRunSettings.LastTryNumber - GeneralRunSettings.FirstTryNumber + 1) + (CurrentEnNumber - GeneralRunSettings.FirstEnvironmentNumber)*(GeneralRunSettings.LastTryNumber - GeneralRunSettings.FirstTryNumber + 1) + (CurrentTryNumber - GeneralRunSettings.FirstTryNumber + 1); // Составляем сообщение sprintf(OutMessage,"%ie%.5fd%.5fc%.5fv%it%ip%ig%in%ir%if",CurrentEnNumber, MutationSettings.DisConProb, MutationSettings.EnConProb, EnVariableProbability, CurrentTryNumber,CurrentVarNumber, ModeSettings.EvolutionMode, ModeSettings.NetworkMode, ModeSettings.RewardMode, NoEnVariableCheck); MPI_Send(OutMessage, MessageLenght-1, MPI_CHAR, PrRankSend, type, MPI_COMM_WORLD); // Записываем в лог выдачу задания fprintf(hRunLogFile, "Environment: %i Try: %i - Issued for pr.%i\n", CurrentEnNumber, CurrentTryNumber, PrRankSend); } // Если все процессы получили изначальные задания, то ждем завершения заданий и по ходу выдаем новые задания else { // Ждем входяшее сообщение MPI_Recv(InMessage, MessageLenght-1, MPI_CHAR, MPI_ANY_SOURCE, type, MPI_COMM_WORLD, &status); char tmp_str[10]; // Строка, использующаяся для определения номера процесса strcpy(tmp_str,""); int PrRankSend; // Номер процесса для высылки задания double _AverageReward, _MaxReward; // Данные о прогоне, которые прислал агент int CurrentTry, CurrentEnvironment; // Идентификаторы задания, которое выполнял процесс // Расшифровка сообщения for (unsigned int i=0; i<strlen(InMessage); i++) { if (((InMessage[i]>='0') && (InMessage[i]<='9'))||(InMessage[i]=='.')) // если символ число или точка sprintf(tmp_str,"%s%c",tmp_str,InMessage[i]); else { switch (InMessage[i]) { case 'e': CurrentEnvironment = atoi(tmp_str); break; case 't': CurrentTry = atoi(tmp_str); break; case 'o': PrRankSend = atoi(tmp_str); break; case 'a': _AverageReward = atof(tmp_str); break; case 'm': _MaxReward = atof(tmp_str); break; } strcpy(tmp_str,""); } } // Записываем в лог прием задания fprintf(hRunLogFile, "Environment: %i Try: %i - Done from pr.%i\n", CurrentEnvironment, CurrentTry, PrRankSend); //Записываем полученные данные анализа AverageRewardArray[(CurrentEnvironment - GeneralRunSettings.FirstEnvironmentNumber)*(GeneralRunSettings.LastTryNumber - GeneralRunSettings.FirstTryNumber+1) + CurrentTry - GeneralRunSettings.FirstTryNumber] = _AverageReward; MaxRewardArray[(CurrentEnvironment - GeneralRunSettings.FirstEnvironmentNumber)*(GeneralRunSettings.LastTryNumber - GeneralRunSettings.FirstTryNumber+1) + CurrentTry - GeneralRunSettings.FirstTryNumber] = _MaxReward; // Составляем сообщение и высылаем задание sprintf(OutMessage,"%ie%.5fd%.5fc%.5fv%it%ip%ig%in%ir%if",CurrentEnNumber, MutationSettings.DisConProb, MutationSettings.EnConProb, EnVariableProbability, CurrentTryNumber, CurrentVarNumber, ModeSettings.EvolutionMode, ModeSettings.NetworkMode, ModeSettings.RewardMode, NoEnVariableCheck); MPI_Send(OutMessage, MessageLenght-1, MPI_CHAR, PrRankSend, type, MPI_COMM_WORLD); // Записываем в лог выдачу очередного задания fprintf(hRunLogFile, "Environment: %i Try: %i - Issued for pr.%i\n", CurrentEnNumber, CurrentTryNumber, PrRankSend); } } } } // Когда все задания закончились, ждем пока все они будут выполнены и по ходу посылаем всем процессам команду о завершении int PrQuit = PrsSize-1; // Количество процессов которые еще выполняются и необходимо дождаться их окончания while (PrQuit > 0) // Пока не завершаться все процессы { MPI_Recv(InMessage, MessageLenght-1, MPI_CHAR, MPI_ANY_SOURCE, type, MPI_COMM_WORLD, &status); char tmp_str[10]; // Строка, использующаяся для определения номера процесса strcpy(tmp_str,""); int PrRankSend; // Номер процесса для высылки задания double _AverageReward, _MaxReward; // Данные о прогоне, которые прислал агент int CurrentTry, CurrentEnvironment; // Идентификаторы задания, которое выполнял процесс // Расшифровка сообщения for (unsigned int i=0; i<strlen(InMessage); i++) { if (((InMessage[i]>='0') && (InMessage[i]<='9'))||(InMessage[i]=='.')) // если символ число или точка sprintf(tmp_str,"%s%c",tmp_str,InMessage[i]); else { switch (InMessage[i]) { case 'e': CurrentEnvironment = atoi(tmp_str); break; case 't': CurrentTry = atoi(tmp_str); break; case 'o': PrRankSend = atoi(tmp_str); break; case 'a': _AverageReward = atof(tmp_str); break; case 'm': _MaxReward = atof(tmp_str); break; } strcpy(tmp_str,""); } } // Записываем в лог прием задания fprintf(hRunLogFile, "Environment: %i Try: %i - Done from pr.%i\n", CurrentEnvironment, CurrentTry, PrRankSend); //Записываем полученные данные анализа AverageRewardArray[(CurrentEnvironment - GeneralRunSettings.FirstEnvironmentNumber)*(GeneralRunSettings.LastTryNumber - GeneralRunSettings.FirstTryNumber+1) + CurrentTry - GeneralRunSettings.FirstTryNumber] = _AverageReward; MaxRewardArray[(CurrentEnvironment - GeneralRunSettings.FirstEnvironmentNumber)*(GeneralRunSettings.LastTryNumber - GeneralRunSettings.FirstTryNumber+1) + CurrentTry - GeneralRunSettings.FirstTryNumber] = _MaxReward; // Составляем сообщение о выходе и высылаем strcpy(OutMessage,"q"); MPI_Send(OutMessage, MessageLenght-1, MPI_CHAR, PrRankSend, type, MPI_COMM_WORLD); PrQuit--; } fclose(hRunLogFile); // Осуществляем запись общих результатов char NoEnVariableString[10]; // Признак того, что прогонялись агенты, обучавшиеся на стационарной среде if (NoEnVariableCheck) strcpy(NoEnVariableString, "_noenvar"); else strcpy(NoEnVariableString, ""); // Создаем файл с анализом char AnalysisFilename[255]; sprintf(AnalysisFilename, "%sBestPopulationAnalysis/BestPopAnalysis_en%i-%i%s_%.4f_%i", DirectorySettings.ResultDirectory, GeneralRunSettings.FirstEnvironmentNumber, GeneralRunSettings.LastEnvironmentNumber, NoEnVariableString, EnVariableProbability, GeneralRunSettings.VariableNumber); if (ModeSettings.RewardMode) strcat(AnalysisFilename, "_pen"); if (ModeSettings.EvolutionMode) strcat(AnalysisFilename, "_mod"); strcat(AnalysisFilename, ".txt"); FILE* hAnalysisFile = fopen(AnalysisFilename, "w"); // Массив для хранения средних результатов по всем средам //double AverageEnvReward[GeneralRunSettings.LastEnvironmentNumber - GeneralRunSettings.FirstEnvironmentNumber+1]; double* AverageEnvReward = new double[GeneralRunSettings.LastEnvironmentNumber - GeneralRunSettings.FirstEnvironmentNumber+1]; for (int i=0; i<GeneralRunSettings.LastEnvironmentNumber - GeneralRunSettings.FirstEnvironmentNumber+1; i++) AverageEnvReward[i] = 0; // Записываем полные результаты всех прогонов for (int CurrentEnNumber=GeneralRunSettings.FirstEnvironmentNumber; CurrentEnNumber<=GeneralRunSettings.LastEnvironmentNumber; CurrentEnNumber++) { // Загружаем среду и находим ее коэффициент сложности char EnvironmentFilename[255]; GetEnvironmentFilename(EnvironmentFilename, DirectorySettings.EnvironmentDirectory, CurrentEnNumber); TEnvironmentAims EnvironmentAims; InitEnvironment(&EnvironmentAims, EnvironmentFilename); double EnFullCoefficient = CoefFullEnvironment(&EnvironmentAims); // Записываем все результаты for (int CurrentTryNumber = GeneralRunSettings.FirstTryNumber; CurrentTryNumber<=GeneralRunSettings.LastTryNumber; CurrentTryNumber++) { char tmp_str[255]; // Записываем данные о среде в файл sprintf(tmp_str,"%i\t%i\t%.6f\t%.3f\t", CurrentEnNumber, EnvironmentAims.AimQuantity, EnFullCoefficient, 1.0/EnFullCoefficient); fprintf(hAnalysisFile, "%s", tmp_str); // Записываем данные прогона fprintf(hAnalysisFile,"%.2f\t", AverageRewardArray[(CurrentEnNumber - GeneralRunSettings.FirstEnvironmentNumber)*(GeneralRunSettings.LastTryNumber - GeneralRunSettings.FirstTryNumber+1) + CurrentTryNumber - GeneralRunSettings.FirstTryNumber]); fprintf(hAnalysisFile,"%.2f\n", MaxRewardArray[(CurrentEnNumber - GeneralRunSettings.FirstEnvironmentNumber)*(GeneralRunSettings.LastTryNumber - GeneralRunSettings.FirstTryNumber+1) + CurrentTryNumber - GeneralRunSettings.FirstTryNumber]); // Сразу же считаем среднее для каждой среды AverageEnvReward[CurrentEnNumber - GeneralRunSettings.FirstEnvironmentNumber] += AverageRewardArray[(CurrentEnNumber - GeneralRunSettings.FirstEnvironmentNumber)*(GeneralRunSettings.LastTryNumber - GeneralRunSettings.FirstTryNumber+1) + CurrentTryNumber - GeneralRunSettings.FirstTryNumber]; } AverageEnvReward[CurrentEnNumber - GeneralRunSettings.FirstEnvironmentNumber] = AverageEnvReward [CurrentEnNumber - GeneralRunSettings.FirstEnvironmentNumber] / ((double) GeneralRunSettings.LastTryNumber - GeneralRunSettings.FirstTryNumber + 1); } // Записываем в файл усредненные результаты для всех сред fprintf(hAnalysisFile,"\n"); for (int CurrentEnNumber = GeneralRunSettings.FirstEnvironmentNumber; CurrentEnNumber<=GeneralRunSettings.LastEnvironmentNumber; CurrentEnNumber++) { // Загружаем среду и находим ее коэффициент сложности char EnvironmentFilename[255]; GetEnvironmentFilename(EnvironmentFilename, DirectorySettings.EnvironmentDirectory, CurrentEnNumber); TEnvironmentAims EnvironmentAims; InitEnvironment(&EnvironmentAims, EnvironmentFilename); double EnFullCoefficient = CoefFullEnvironment(&EnvironmentAims); // Записываем данные о среде и результаты усреднения fprintf(hAnalysisFile, "%i\t%i\t%.6f\t%.3f\n", CurrentEnNumber, EnvironmentAims.AimQuantity, EnFullCoefficient, AverageEnvReward[CurrentEnNumber - GeneralRunSettings.FirstEnvironmentNumber]); } delete []AverageEnvReward; delete []AverageRewardArray; delete []MaxRewardArray; fclose(hAnalysisFile); } else // Если это один из рабочих процессов { MPI_Recv(InMessage, MessageLenght-1, MPI_CHAR, 0, type, MPI_COMM_WORLD, &status); //Ждем сообщения с заданием while (strcmp(InMessage,"q")) // Если не было команды о выходе { TRunSettings RunSettings; // Параметры текущего запуска //Декодируем сообщение с заданием DecodeTaskMessage(InMessage, &RunSettings, &ModeSettings, &(MutationSettings.DisConProb), &(MutationSettings.EnConProb), &EnVariableProbability, &NoEnVariableCheck); // Определяем ядро инициализации RunSettings.RandomizeRank = (unsigned) time(0) + PrRank; // К ядру инизиацлизации случайных чисел добавляется номер процесса, чтобы развести изначально инициализируемые процессы double AverageReward, MaxReward; //Данные анализа // Запускаем рабочую процедуру анализа запуска эволюции BestPopulationAnalysis(&AverageReward, &MaxReward, &RunSettings, &DirectorySettings, &TimeSettings, &ModeSettings, &LearningSettings, EnVariableProbability, NoEnVariableCheck); //Посылка ответа о завершении работы над заданием sprintf(OutMessage,"%ie%it%.2fa%.2fm%io",RunSettings.EnvironmentNumber, RunSettings.TryNumber, AverageReward, MaxReward, PrRank); MPI_Send(OutMessage, MessageLenght-1, MPI_CHAR, 0, type, MPI_COMM_WORLD); //Ожидание нового задания MPI_Recv(InMessage, MessageLenght-1, MPI_CHAR, 0, type, MPI_COMM_WORLD, &status); } } MPI_Finalize(); }