static void run_search(Configuration config, int trialID) { int fid = config.FunctionType == "Rastrigin" ? 1 : 0; double[] trialVector = new double[config.NumParams]; for (int i = 0; i < config.NumParams; i++) { trialVector[i] = -boundaryValue; } maxFitnessValue = evaluate(fid, trialVector); fitnessScalarValue = -100.0 / maxFitnessValue; int individualCount = 0; RunningIndividualLog individualLog = null; if (config.Search.LogIndividuals) { string logFilepath = string.Format("logs/individuals_{0}.csv", trialID); individualLog = new RunningIndividualLog(logFilepath); } SearchAlgorithm algo = generate_search(trialID, config.Search, config.NumParams); while (algo.IsRunning()) { Individual cur = algo.GenerateIndividual(); cur.ID = individualCount++; cur.Fitness = evaluate(fid, cur.ParamVector); cur.NormFitness = norm_fitness(cur.Fitness); if (config.Search.LogIndividuals) { individualLog.LogIndividual(cur); } algo.ReturnEvaluatedIndividual(cur); } }
public void Run() { _maxWins = 0; _maxFitness = Int32.MinValue; _runningWorkers = new Queue <int>(); _idleWorkers = new Queue <int>(); _individualStable = new Dictionary <int, Individual>(); // Let the workers know we are here. using (FileStream ow = File.Open(_activeSearchPath, FileMode.Create, FileAccess.Write, FileShare.None)) { WriteText(ow, "Strategy Search"); WriteText(ow, _configFilename); ow.Close(); } Console.WriteLine("Begin search..."); while (_searchAlgo.IsRunning()) { FindNewWorkers(); // Disbatch jobs to the available workers. while (_idleWorkers.Count > 0 && !_searchAlgo.IsBlocking()) { int workerId = _idleWorkers.Dequeue(); _runningWorkers.Enqueue(workerId); Console.WriteLine("Starting worker: " + workerId); Individual choiceIndividual = _searchAlgo.GenerateIndividual(); string inboxPath = string.Format(_inboxTemplate, workerId); Console.WriteLine(inboxPath); Console.WriteLine(choiceIndividual.ToString()); SendWork(inboxPath, choiceIndividual); _individualStable[workerId] = choiceIndividual; } // Look for individuals that are done. int numActiveWorkers = _runningWorkers.Count; for (int i = 0; i < numActiveWorkers; i++) { int workerId = _runningWorkers.Dequeue(); string inboxPath = string.Format(_inboxTemplate, workerId); string outboxPath = string.Format(_outboxTemplate, workerId); // Test if this worker is done. if (File.Exists(outboxPath) && !File.Exists(inboxPath)) { // Wait for the file to finish being written. Console.WriteLine("Worker done: " + workerId); ReceiveResults(outboxPath, _individualStable[workerId]); _searchAlgo.ReturnEvaluatedIndividual(_individualStable[workerId]); LogIndividual(_individualStable[workerId]); _idleWorkers.Enqueue(workerId); } else { _runningWorkers.Enqueue(workerId); } } Thread.Sleep(1000); } // Let the workers know that we are done. File.Delete(_activeSearchPath); }