Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        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);
        }