private static void FleetBench(string mainDir, Tasker xr, int nrSecs, byte nrThreads) { string[] files = System.IO.Directory.GetFiles(mainDir + @"\Instances"); double totCost = 0, percentError = 0, totOptimal = 0; int nrInst = 0; string logFileName = @"C:\Windows\Temp\instances_result_" + nrSecs.ToString() + "secs_" + nrThreads + "thread_" + DateTime.Now.Ticks + ".txt"; string htmlFileName = logFileName.Replace(".txt", ".html"); File.AppendAllText(logFileName, "All Instances, " + nrSecs.ToString() + " seconds, " + nrThreads.ToString() + " threads" + Environment.NewLine); foreach (string f in files) { System.IO.FileInfo fi = new System.IO.FileInfo(f); string fileName = fi.Name; FleetRouter rout = null; if (fileName.Contains("-") && fileName.Contains(".vrp")) { string comment = ""; try { rout = FleetInstance.Read(f, out comment); double opt; if (comment.ToLower().Contains("optimal value:")) opt = Convert.ToDouble(comment.Substring(comment.ToLower().IndexOf("optimal value:")).Split(')')[0].Trim().Split(' ')[2]); else continue; // Skip test without a known optimal rout.NrThreads = nrThreads; FleetResult res = rout.Solve(nrSecs); percentError += Math.Max(res.TotalCost - opt, 0) / opt; totCost += res.TotalCost; totOptimal += opt; nrInst++; string optStr = PadToLen(opt.ToString(), 6); string totStr = PadToLen(res.TotalCost.ToString(), 6); string nrVehiclesStr = PadToLen(res.NrRoutes.ToString(), 2); string errStr = PadToLen(Math.Round(100 * Math.Max(res.TotalCost - opt, 0) / opt, 2).ToString() + "%", 6).Replace(",", "."); if (res.TotalCost < opt) totStr = "*" + totStr.Substring(0, 5); fileName = PadToLen(fileName, 15); if (!rout.Verify(res)) errStr += " <VERIFY FAILED>"; File.AppendAllText(logFileName, fileName + " Optimal: " + optStr + " Result: " + totStr + " Vehicles: " + nrVehiclesStr + " Error: " + errStr + Environment.NewLine); File.AppendAllText(htmlFileName, "<tr><th>" + fileName.Replace(".vrp", "").Trim() + "</th><td>" + opt + "</td><td>" + res.TotalCost + "</td><td>" + res.NrRoutes + "</td><td>" + errStr.Trim() + "</td></tr>"); } catch (Exception ex) { File.AppendAllText(logFileName, comment + " Exception: " + ex.Message + Environment.NewLine); } } } string text = "SUMMARY Instances " + nrSecs + " seconds!" + Environment.NewLine + "Total cost: " + totCost.ToString() + Environment.NewLine + "Optimal: " + totOptimal.ToString() + Environment.NewLine + "Error: " + Math.Round(100.0 * percentError / (double)nrInst, 2).ToString() + "%"; File.AppendAllText(logFileName, Environment.NewLine + text + Environment.NewLine); File.AppendAllText(htmlFileName, "<tr style=\"font-weight:bold\"><th style=\"font-weight:bold\">Summary:</th><td>" + totOptimal + "</td><td>" + totCost + "</td><td>N/A</td><td>" + Math.Round(100.0 * percentError / (double)nrInst, 2) + "%</td></tr>"); }