/// <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(); }
/// <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(); }