Esempio n. 1
0
        /// <summary>
        /// Simplest run possible with a randomly generated problem instance.
        /// </summary>
        public void SimpleRun(int gridSize, int agentsNum, int obstaclesNum)
        {
            CFMAM_Run runner = new CFMAM_Run(this.imsSolversList, this.cfmCbsSolversList);

            runner.OpenResultsFile(this.resultsFileName);
            runner.PrintResultsFileHeader();
            ProblemInstance instance = runner.GenerateProblemInstance(gridSize, agentsNum, obstaclesNum);

            instance.Export("Test.instance");
            runner.SolveGivenProblem(instance);
            runner.CloseResultsFile();
        }
Esempio n. 2
0
        /// <summary>
        /// Runs a set of experiments.
        /// This function will generate a random instance (or load it from a file if it was already generated)
        /// </summary>
        public void RunExperimentSet(int gridSizes, int agentListSizes, int obstaclesProbs, int instances)
        {
            int[] grid      = new int[] { gridSizes };
            int[] agentList = new int[] { agentListSizes };
            int[] obstacles = new int[] { obstaclesProbs };

            ProblemInstance instance;
            string          instanceName;
            CFMAM_Run       runner = new CFMAM_Run(this.imsSolversList, this.cfmCbsSolversList);

            bool resultsFileExisted = File.Exists(this.resultsFileName);

            runner.OpenResultsFile(this.resultsFileName);
            if (resultsFileExisted == false)
            {
                runner.PrintResultsFileHeader();
            }

            bool continueFromLastRun = false;

            string[] LastProblemDetails     = null;
            string   currentProblemFileName = Path.Combine(new[] { this.outputDirectory, "current_problem_" + Process.GetCurrentProcess().ProcessName });

            if (File.Exists(currentProblemFileName)) //if we're continuing running from last time
            {
                var lastProblemFile = new StreamReader(currentProblemFileName);
                LastProblemDetails = lastProblemFile.ReadLine().Split(',');  //get the last problem
                lastProblemFile.Close();
                continueFromLastRun = true;
            }

            for (int gs = 0; gs < grid.Length; gs++)
            {
                for (int obs = 0; obs < obstacles.Length; obs++)
                {
                    runner.ResetOutOfTimeCounters();
                    for (int ag = 0; ag < agentList.Length; ag++)
                    {
                        if (grid[gs] * grid[gs] * (1 - obstacles[obs] / 100) < agentList[ag]) // Probably not enough room for all agents
                        {
                            continue;
                        }
                        for (int i = 0; i < instances; i++)
                        {
                            if (continueFromLastRun)  //set the latest problem
                            {
                                gs  = int.Parse(LastProblemDetails[0]);
                                obs = int.Parse(LastProblemDetails[1]);
                                ag  = int.Parse(LastProblemDetails[2]);
                                i   = int.Parse(LastProblemDetails[3]);
                                for (int j = 4; j < LastProblemDetails.Length; j++)
                                {
                                    runner.outOfTimeCounters[j - 4] = int.Parse(LastProblemDetails[j]);
                                }
                                continueFromLastRun = false;
                                continue; // "current problem" file describes last solved problem, no need to solve it again
                            }
                            if (runner.outOfTimeCounters.Length != 0 &&
                                runner.outOfTimeCounters.Sum() == runner.outOfTimeCounters.Length * Constants.MAX_FAIL_COUNT) // All algs should be skipped
                            {
                                break;
                            }
                            instanceName = "Instance-" + grid[gs] + "-" + obstacles[obs] + "-" + agentList[ag] + "-" + i;
                            try
                            {
                                instance            = ProblemInstance.Import(Path.Combine(new[] { this.outputDirectory, instanceName }));
                                instance.instanceId = i;
                            }
                            catch (Exception importException)
                            {
                                if (onlyReadInstances)
                                {
                                    Console.WriteLine("File " + instanceName + "  dosen't exist");
                                    return;
                                }

                                instance            = runner.GenerateProblemInstance(grid[gs], agentList[ag], obstacles[obs] * grid[gs] * grid[gs] / 100);
                                instance.instanceId = i;
                                instance.Export(instanceName);
                            }
                            instance.fileName = instanceName;

                            try
                            {
                                runner.SolveGivenProblem(instance);
                            }
                            catch (TimeoutException e)
                            {
                                Console.Out.WriteLine(e.Message);
                                Console.Out.WriteLine();
                                continue;
                            }

                            // Save the latest problem
                            try
                            {
                                if (File.Exists(currentProblemFileName))
                                {
                                    File.Delete(currentProblemFileName);
                                }
                            }
                            catch
                            {
                                ;
                            }
                            var lastProblemFile = new StreamWriter(currentProblemFileName);
                            lastProblemFile.Write("{0},{1},{2},{3}", gs, obs, ag, i);
                            for (int j = 0; j < runner.outOfTimeCounters.Length; j++)
                            {
                                lastProblemFile.Write("," + runner.outOfTimeCounters[j]);
                            }
                            lastProblemFile.Close();
                        }
                    }
                }
            }
            runner.CloseResultsFile();
        }