Beispiel #1
0
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;
}
Beispiel #2
0
/*******************************************************************
**	変数をデフォルトにセット
*******************************************************************/
void OpenGL::SetDefault(void)
{
	// レンダリングコンテキストの初期化
	m_hRC = NULL;

	VType = PERSPECTIVE;

	InitEnvironment();

	return;
}
Beispiel #3
0
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;
}
Beispiel #4
0
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;
}
Beispiel #5
0
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;
}
Beispiel #6
0
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);
}
Beispiel #7
0
// Основная процедура распараллеливания анализа эволюции
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();
}