public void instances(string path, string SolomonInstancesName)
        {
            #region  数据的录入
            string strconn = path + SolomonInstancesName + ".xlsx;Extended Properties='Excel 12.0;HDR=no;IMEX=1'";
            for (int f = 42; f < 43; f++)                            //开始测试算例-r101
            {
                OleDbConnection Conn = new OleDbConnection(strconn); //读取算例文件名
                Conn.Open();
                OleDbDataAdapter MyCommand1 = new OleDbDataAdapter("SELECT * FROM [DATA$]", strconn);
                DataTable        TripData   = new DataTable();
                try
                {
                    MyCommand1.Fill(TripData);
                }
                catch (System.Exception ex)
                {
                    throw new System.Exception(ex.Message);
                }
                Conn.Close();
                string fileName = TripData.Rows[f][0].ToString();

                //读取顾客数据
                string          strConn = path + fileName + ".xlsx;Extended Properties='Excel 12.0;HDR=no;IMEX=1'";
                OleDbConnection conn    = new OleDbConnection(strConn);
                conn.Open();
                OleDbDataAdapter myCommand1 = new OleDbDataAdapter("SELECT * FROM [sheet1$]", strConn);
                DataTable        tripData   = new DataTable();
                try
                {
                    myCommand1.Fill(tripData);
                }
                catch (System.Exception ex)
                {
                    throw new System.Exception(ex.Message);
                }
                conn.Close();

                List <Request> CustomerSet = new List <Request>();
                double         EndTime     = Convert.ToDouble(tripData.Rows[0][4].ToString());
                Depots[0] = Convert.ToDouble(tripData.Rows[0][1].ToString());
                Depots[1] = Convert.ToDouble(tripData.Rows[0][2].ToString());
                for (int j = 0; j < Length; j++)
                {
                    int     mj       = j;
                    Request tempCust = new Request();
                    tempCust.ID        = mj;
                    tempCust.xCoord    = Convert.ToDouble(tripData.Rows[mj][1].ToString());
                    tempCust.yCoord    = Convert.ToDouble(tripData.Rows[mj][2].ToString());
                    tempCust.earlyTime = Convert.ToDouble(tripData.Rows[mj][3].ToString()) * (24.0 / EndTime);
                    tempCust.lastTime  = Convert.ToDouble(tripData.Rows[mj][4].ToString()) * (24.0 / EndTime);
                    tempCust.cusneed   = Convert.ToInt16(tripData.Rows[mj][5].ToString());
                    CustomerSet.Add(tempCust);
                }
                List <List <double> > Cij = CustomerDistance(CustomerSet); //顾客点距离矩阵
                List <List <double> > Tij = TimeMatrix(CustomerSet, Cij);  //顾客点行驶时间矩阵
                double max1 = 0;
                double min1 = double.MaxValue;
                for (int i = 0; i < Cij.Count; i++)
                {
                    for (int j = 0; j < Cij[0].Count; j++)
                    {
                        if (max1 < Cij[i][j])
                        {
                            max1 = Cij[i][j];
                        }
                        if (min1 > Cij[i][j])
                        {
                            min1 = Cij[i][j];
                        }
                    }
                }
                double max2 = 0;
                double min2 = double.MaxValue;
                for (int i = 0; i < CustomerSet.Count; i++)
                {
                    if (max2 < CustomerSet[i].cusneed)
                    {
                        max2 = CustomerSet[i].cusneed;
                    }
                    if (min2 > CustomerSet[i].cusneed)
                    {
                        min2 = CustomerSet[i].cusneed;
                    }
                }
                #endregion
                double    testResult          = 0;  //计算平均值
                double    totalTime           = 0;  //计算平均耗时
                int       numberOfExperiments = 10; //本算例实验次数
                Stopwatch time = new Stopwatch();
                time.Start();                       //开始计时
                for (int t = 0; t < numberOfExperiments; t++)
                {
                    //算法开始
                    List <Route> solution     = new GreedyInitialSolution(Cij, Tij, Capacity, ServiceTime, CustomerSet, A1, A2, Car_weight, MS).GetSolution(); //初始解
                    List <Route> BestSolution = new ALNS(Cij, Tij, Capacity, ServiceTime, CustomerSet, Coef, A1, A2, Car_weight, MS, min2, max2 - min2, min1, max1 - min1, Iterations).GetSolution(Q, solution);
                    if (!CheckSolution(BestSolution, CustomerSet, Cij, Tij).Equals(true))                                                                      //检查解正误,错误中断报警
                    {
                        BeepUp.Beep(500, 700);
                        Console.ReadLine();
                    }
                    ////输出最终解
                    //    Console.WriteLine("最终解");
                    //for (int i = 0; i < BestSolution.Count; i++)
                    //{
                    //    Console.WriteLine();
                    //    Console.Write("第{0}条route成员为:", i);
                    //    for (int j = 0; j < BestSolution[i].route.Count; j++)
                    //    {
                    //        Console.Write(BestSolution[i].route[j] + "\t");
                    //    }
                    //    Console.WriteLine();
                    //}
                    //Console.WriteLine();
                    testResult += SolutionCost(BestSolution);
                }
                time.Stop();
                //输出本次实验的均值
                Console.WriteLine("解合法!{0}:共实验{1}次,平均耗时{2}s,平均解:{3},平均误差:{4}%", fileName, numberOfExperiments, Math.Round(time.ElapsedMilliseconds / 1000.0 / numberOfExperiments, 2), Math.Round(testResult / numberOfExperiments, 2), Math.Round((Math.Round(testResult / numberOfExperiments, 2) - e) * 100 / e, 2));
            }
        }
        /// <summary>
        /// Executes a single method-run
        /// </summary>
        /// <param name="instanceFile">The path to the instance</param>
        /// <param name="configFile">The path to the config</param>
        /// <param name="outputDirectory">The directory to write the results to</param>
        /// <param name="seedNumber">The seed to use</param>
        public static void Execute(string instanceFile, string configFile, string outputDirectory, string seedNumber)
        {
            // Save parameters for the case of an exception
            ExInstanceName = instanceFile;
            ExConfigName   = configFile;
            ExSeedNumber   = seedNumber;

            // Read config
            Configuration config   = Configuration.Read(configFile);
            Instance      instance = Instance.ReadXML(instanceFile);

            // Create output dir if not already existing
            string exportationDir = Path.Combine(outputDirectory, instance.Name + "-" + config.Name + "-" + seedNumber);

            if (Directory.Exists(exportationDir))
            {
                Directory.Delete(exportationDir, true);
            }
            // Wait for directory to be really deleted - nasty but necessary
            while (Directory.Exists(exportationDir))
            {
                Thread.Sleep(100);
            }
            // Create a fresh directory
            Directory.CreateDirectory(exportationDir);

            // Catch unhandled exceptions
            if (!AppDomain.CurrentDomain.FriendlyName.EndsWith("vshost.exe"))
            {
                Console.WriteLine("Adding handler for unhandled exceptions ...");
                AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(LogUnhandledException);
            }

            // Determine log file
            string logFile = Path.Combine(exportationDir, "output.txt");

            // Write instance name
            using (StreamWriter sw = new StreamWriter(Path.Combine(exportationDir, FILENAME_INSTANCE_NAME)))
                sw.Write(instance.Name);

            // Write configuration name
            using (StreamWriter sw = new StreamWriter(Path.Combine(exportationDir, FILENAME_CONFIG_NAME)))
                sw.Write(config.Name);

            // Write all output
            using (StreamWriter outputWriter = new StreamWriter(logFile)
            {
                AutoFlush = true
            })
            {
                // Write solution status over time
                using (StreamWriter statusWriter = new StreamWriter(Path.Combine(exportationDir, FILENAME_STATUS_OVER_TIME))
                {
                    AutoFlush = true
                })
                {
                    // Prepare
                    Action <string> logger     = (string s) => { outputWriter.Write(s); Console.Write(s); };
                    Action <string> loggerLine = (string s) => { outputWriter.Write(s + Environment.NewLine); Console.WriteLine(s); };
                    statusWriter.WriteLine("% time incumbent");
                    config.LogSolutionStatus = (double timeStamp, double incumbent) => { statusWriter.WriteLine(timeStamp.ToString(ExportationConstants.FORMATTER) + ExportationConstants.GNUPLOT_DELIMITER + incumbent.ToString(ExportationConstants.FORMATTER)); };
                    config.Log  = logger;
                    config.Seed = int.Parse(seedNumber);
                    IMethod method = null;
                    switch (config.Type)
                    {
                    case MethodType.FrontLeftBottomStyle: { method = new LinearModelFLB(instance, config); } break;

                    case MethodType.TetrisStyle: { method = new LinearModelTetris(instance, config); } break;

                    case MethodType.HybridStyle: { method = new LinearModelHybrid(instance, config); } break;

                    case MethodType.SpaceIndexed: throw new NotImplementedException("Space indexed model not working for now.");

                    case MethodType.ExtremePointInsertion: { method = new ExtremePointInsertionHeuristic(instance, config); } break;

                    case MethodType.SpaceDefragmentation: { method = new SpaceDefragmentationHeuristic(instance, config); } break;

                    case MethodType.PushInsertion: { method = new PushInsertion(instance, config); } break;

                    case MethodType.ALNS: { method = new ALNS(instance, config); } break;

                    default: throw new ArgumentException("Unknown method: " + config.Type.ToString());
                    }

                    // Output some information before starting
                    loggerLine("Welcome to SardineCan CLI");
                    loggerLine("Parameters: " + instanceFile + " " + configFile + " " + outputDirectory + " " + seedNumber);
                    loggerLine("Initializing ...");
                    loggerLine("Instance: " + instance.Name);
                    loggerLine("Config: " + config.Name);
                    loggerLine("Seed: " + seedNumber);
                    loggerLine("Config-details: ");
                    LogConfigDetails(config, logger);
                    loggerLine("");

                    // Execute
                    logger("Executing ... ");
                    PerformanceResult result = method.Run();

                    // Log some information to the console
                    loggerLine("Finished!");
                    loggerLine("");
                    loggerLine("Result outline:");
                    loggerLine("Obj: " + result.ObjectiveValue.ToString(CultureInfo.InvariantCulture));
                    loggerLine("VolumeContained: " + result.Solution.VolumeContained.ToString(CultureInfo.InvariantCulture));
                    loggerLine("VolumeOfContainers: " + result.Solution.VolumeOfContainers.ToString(CultureInfo.InvariantCulture));
                    loggerLine("VolumeContainedRelative: " + (result.Solution.VolumeContainedRelative * 100).ToString(CultureInfo.InvariantCulture) + "%");
                    loggerLine("VolumeOfContainersInUse: " + result.Solution.VolumeOfContainersInUse.ToString(CultureInfo.InvariantCulture));
                    loggerLine("NumberOfContainersInUse: " + result.Solution.NumberOfContainersInUse.ToString(CultureInfo.InvariantCulture));
                    loggerLine("NumberOfPiecesPacked: " + result.Solution.NumberOfPiecesPacked.ToString(CultureInfo.InvariantCulture));
                    loggerLine("SolutionTime: " + result.SolutionTime.TotalSeconds.ToString(CultureInfo.InvariantCulture) + "s");

                    // Log performance information
                    using (StreamWriter solutionInfoWriter = new StreamWriter(File.Open(Path.Combine(exportationDir, "result.txt"), FileMode.Create)))
                    {
                        solutionInfoWriter.WriteLine("Runtime: " + result.SolutionTime.ToString());
                        solutionInfoWriter.WriteLine("ObjectiveValue: " + result.ObjectiveValue.ToString(ExportationConstants.FORMATTER));
                        solutionInfoWriter.WriteLine("BestBound: " + result.BestBound.ToString(ExportationConstants.FORMATTER));
                        solutionInfoWriter.WriteLine("RemainingGap: " + result.Gap.ToString(ExportationConstants.FORMATTER));
                        result.Instance.OutputInfo(solutionInfoWriter);
                        //result.Solution.out // TODO define output of solution info
                    }

                    // Log footprint
                    using (StreamWriter sw = new StreamWriter(Path.Combine(exportationDir, FILENAME_FOOTPRINT)))
                        sw.WriteLine(
                            instance.Name + ExportationConstants.CSV_DELIMITER +
                            config.Name + ExportationConstants.CSV_DELIMITER +
                            seedNumber + ExportationConstants.CSV_DELIMITER +
                            instance.Containers.Count + ExportationConstants.CSV_DELIMITER +
                            instance.Pieces.Count + ExportationConstants.CSV_DELIMITER +
                            instance.Containers.Sum(c => c.VirtualPieces.Count).ToString(CultureInfo.InvariantCulture) + ExportationConstants.CSV_DELIMITER +
                            instance.Containers.Sum(c => c.Slants.Count).ToString(CultureInfo.InvariantCulture) + ExportationConstants.CSV_DELIMITER +
                            result.ObjectiveValue.ToString(CultureInfo.InvariantCulture) + ExportationConstants.CSV_DELIMITER +
                            result.Solution.VolumeContained.ToString(CultureInfo.InvariantCulture) + ExportationConstants.CSV_DELIMITER +
                            result.Solution.VolumeOfContainers.ToString(CultureInfo.InvariantCulture) + ExportationConstants.CSV_DELIMITER +
                            (result.Solution.VolumeContainedRelative * 100).ToString(CultureInfo.InvariantCulture) + ExportationConstants.CSV_DELIMITER +
                            result.Solution.VolumeOfContainersInUse.ToString(CultureInfo.InvariantCulture) + ExportationConstants.CSV_DELIMITER +
                            result.Solution.NumberOfContainersInUse.ToString(CultureInfo.InvariantCulture) + ExportationConstants.CSV_DELIMITER +
                            result.Solution.NumberOfPiecesPacked.ToString(CultureInfo.InvariantCulture) + ExportationConstants.CSV_DELIMITER +
                            result.SolutionTime.TotalSeconds.ToString(CultureInfo.InvariantCulture));

                    // Write instance-solution as xml
                    if (instance.Solutions.Any())
                    {
                        instance.WriteXML(Path.Combine(exportationDir, "solution.xinst"));
                    }
                }
            }
        }
Exemple #3
0
        /// <summary>
        /// Executes a single method-run
        /// </summary>
        /// <param name="exportationDir">The exportation dir to export the results to</param>
        /// <param name="logFilename">The name of the log-files</param>
        /// <param name="timeOut">A timeout in milliseconds</param>
        private void Execute(string exportationDir, string logFilename, int timeOut)
        {
            // Prepare
            IMethod method = null;

            switch (_methodToUse)
            {
            case MethodType.FrontLeftBottomStyle:
            {
                method = new LinearModelFLB(_instance, Config);
            }
            break;

            case MethodType.TetrisStyle:
            {
                method = new LinearModelTetris(_instance, Config);
            }
            break;

            case MethodType.HybridStyle:
            {
                method = new LinearModelHybrid(_instance, Config);
            }
            break;

            case MethodType.SpaceIndexed:
                throw new NotImplementedException("Space indexed model not working for now.");

            case MethodType.ExtremePointInsertion:
            {
                method = new ExtremePointInsertionHeuristic(_instance, Config);
            }
            break;

            case MethodType.SpaceDefragmentation:
            {
                method = new SpaceDefragmentationHeuristic(_instance, Config);
            }
            break;

            case MethodType.PushInsertion:
            {
                method = new PushInsertion(_instance, Config);
            }
            break;

            case MethodType.ALNS:
            {
                method = new ALNS(_instance, Config);
            }
            break;

            default:
                throw new ArgumentException("Unknown method: " + _methodToUse.ToString());
            }
            // Write instance-solution as xml
            string xmlInstanceFile = logFilename + ".xinst";

            if (!File.Exists(xmlInstanceFile))
            {
                _instance.WriteXML(Path.Combine(exportationDir, xmlInstanceFile));
            }
            _method = method;
            // Execute
            _startSingleSolveAction.Invoke();
            PerformanceResult result = null;
            bool executionSuccess    = Helper.TryExecute(method.Run, timeOut, out result);

            _finishSingleSolveAction.Invoke();
            string solutionFile = logFilename + "_Solution.txt";

            using (StreamWriter solutionInfoWriter = new StreamWriter(File.Open(Path.Combine(exportationDir, solutionFile), FileMode.Create)))
            {
                solutionInfoWriter.WriteLine("Runtime: " + ((executionSuccess) ? result.SolutionTime.ToString() : "timeout"));
                solutionInfoWriter.WriteLine("ObjectiveValue: " + ((executionSuccess) ? result.ObjectiveValue.ToString(ExportationConstants.FORMATTER) : "timeout"));
                solutionInfoWriter.WriteLine("BestBound: " + ((executionSuccess) ? result.BestBound.ToString(ExportationConstants.FORMATTER) : "timeout"));
                solutionInfoWriter.WriteLine("RemainingGap: " + ((executionSuccess) ? result.Gap.ToString(ExportationConstants.FORMATTER) : "timeout"));
                if (executionSuccess)
                {
                    result.Instance.OutputInfo(solutionInfoWriter);
                }
                //result.Solution.out // TODO define output of solution info
            }
            // Log information
            if (executionSuccess)
            {
                _timeConsumed.Add(result.SolutionTime);
                _evaluationValues.Add(result.ObjectiveValue);
                _bestBounds.Add(result.BestBound);
                _gaps.Add(result.Gap);
            }
            else
            {
                _timeConsumed.Add(TimeSpan.FromMilliseconds(timeOut));
                _evaluationValues.Add(0);
                _bestBounds.Add(double.NaN);
                _gaps.Add(double.NaN);
            }
            // Write statistics
            using (StreamWriter statisticsWriter = new StreamWriter(File.Open(Path.Combine(exportationDir, _statisticsFile), FileMode.Append)))
            {
                statisticsWriter.WriteLine(
                    _instance.GetIdent() +
                    ExportationConstants.CSV_DELIMITER +
                    ((executionSuccess) ?
                     result.SolutionTime.TotalSeconds.ToString(ExportationConstants.EXPORT_FORMAT_SHORT, ExportationConstants.FORMATTER) :
                     TimeSpan.FromMilliseconds(timeOut).TotalSeconds.ToString(ExportationConstants.EXPORT_FORMAT_SHORT, ExportationConstants.FORMATTER)) +
                    ExportationConstants.CSV_DELIMITER +
                    ((executionSuccess) ?
                     result.ObjectiveValue.ToString(ExportationConstants.EXPORT_FORMAT_SHORT, ExportationConstants.FORMATTER) :
                     (0.0).ToString(ExportationConstants.EXPORT_FORMAT_SHORT, ExportationConstants.FORMATTER)) +
                    ExportationConstants.CSV_DELIMITER +
                    ((executionSuccess) ?
                     result.BestBound.ToString(ExportationConstants.EXPORT_FORMAT_SHORT, ExportationConstants.FORMATTER) :
                     double.NaN.ToString(ExportationConstants.EXPORT_FORMAT_SHORT, ExportationConstants.FORMATTER)) +
                    ExportationConstants.CSV_DELIMITER +
                    ((executionSuccess) ?
                     result.Gap.ToString(ExportationConstants.EXPORT_FORMAT_SHORT, ExportationConstants.FORMATTER) :
                     double.NaN.ToString(ExportationConstants.EXPORT_FORMAT_SHORT, ExportationConstants.FORMATTER)));
            }
            // Write instance-solution as xml
            if (_instance.Solutions.Any())
            {
                _instance.WriteXML(Path.Combine(exportationDir, logFilename + "_Solution.xinst"));
            }
            // Draw visuals
            if (_method.HasSolution)
            {
                _submitAction(method.Solution, _method.HasSolution, exportationDir, logFilename);
            }
            // Wait a bit
            Thread.Sleep(5000);
        }
        public static PerformanceResult Execute(Instance instance, Configuration config, Action <string> logger)
        {
            // Prepare logging
            void loggerLine(string msg)
            {
                logger?.Invoke(msg + Environment.NewLine);
            }

            config.Log = logger;

            // Init method
            IMethod method;

            switch (config.Type)
            {
            case MethodType.FrontLeftBottomStyle: { method = new LinearModelFLB(instance, config); } break;

            case MethodType.TetrisStyle: { method = new LinearModelTetris(instance, config); } break;

            case MethodType.HybridStyle: { method = new LinearModelHybrid(instance, config); } break;

            case MethodType.SpaceIndexed: throw new NotImplementedException("Space indexed model not working for now.");

            case MethodType.ExtremePointInsertion: { method = new ExtremePointInsertionHeuristic(instance, config); } break;

            case MethodType.SpaceDefragmentation: { method = new SpaceDefragmentationHeuristic(instance, config); } break;

            case MethodType.PushInsertion: { method = new PushInsertion(instance, config); } break;

            case MethodType.ALNS: { method = new ALNS(instance, config); } break;

            default: throw new ArgumentException("Unknown method: " + config.Type.ToString());
            }

            // Output some information before starting
            loggerLine($">>> Welcome to SardineCan");
            loggerLine($"Initializing ...");
            loggerLine($"Instance: {instance.Name}");
            loggerLine($"Config: {config.Name}");
            loggerLine($"Seed: {config.Seed}");
            loggerLine($"Config-details: ");
            LogConfigDetails(config, logger);
            logger?.Invoke(Environment.NewLine);

            // Execute
            loggerLine($"Executing ... ");
            PerformanceResult result = method.Run();

            // Log some information to the console
            loggerLine($"Finished!");
            loggerLine($"Result outline:");
            loggerLine($"Obj: {result.ObjectiveValue.ToString(CultureInfo.InvariantCulture)}");
            loggerLine($"VolumeContained: {result.Solution.VolumeContained.ToString(CultureInfo.InvariantCulture)}");
            loggerLine($"VolumeOfContainers: {result.Solution.VolumeOfContainers.ToString(CultureInfo.InvariantCulture)}");
            loggerLine($"VolumeContainedRelative: {(result.Solution.VolumeContainedRelative * 100).ToString(CultureInfo.InvariantCulture)}%");
            loggerLine($"VolumeOfContainersInUse: {result.Solution.VolumeOfContainersInUse.ToString(CultureInfo.InvariantCulture)}");
            loggerLine($"NumberOfContainersInUse: {result.Solution.NumberOfContainersInUse.ToString(CultureInfo.InvariantCulture)}");
            loggerLine($"NumberOfPiecesPacked: {result.Solution.NumberOfPiecesPacked.ToString(CultureInfo.InvariantCulture)}");
            loggerLine($"SolutionTime: {result.SolutionTime.TotalSeconds.ToString(CultureInfo.InvariantCulture)}s");

            // We're done here
            return(result);
        }