Пример #1
0
        /// <summary>
        /// Creates route assignments from the given trucks and jobs
        /// </summary>
        /// <param name="drivers"></param>
        /// <param name="defaultDriver"> </param>
        /// <param name="jobs"></param>
        /// <returns></returns>
        public virtual Solution BuildSolution(IList <Driver> drivers, Driver defaultDriver, IList <Job> jobs)
        {
            if (drivers == null)
            {
                throw new ArgumentNullException("drivers");
            }
            if (jobs == null)
            {
                throw new ArgumentNullException("jobs");
            }
            if (defaultDriver == null)
            {
                throw new ArgumentNullException("defaultDriver");
            }
            if (jobs.Count == 0)
            {
                throw new OptimizationException("Need at least one job to build solution");
            }

            if (!_initialized)
            {
                throw new OptimizationException("Optimizer not intialized.  Call Initialize() prior to building solutions.");
            }

            _isCancelling = false;

            // clear pheromone matrix
            _pheromoneMatrix.Clear();

            // Create driver nodes

            var driverNodes = drivers.Select(driver => new DriverNode(driver))
                              .OrderBy(f => _randomNumberGenerator.Next())
                              .ToList();

            foreach (var driverNode in driverNodes)
            {
                driverNode.Priority = 1; // init priority
            }

            // Create job nodes

            foreach (var job in jobs)
            {
                switch (job.OrderType)
                {
                case 3:
                    job.Priority = 1;
                    break;

                case  2:
                    job.Priority = 2;
                    break;

                case 1:
                    job.Priority = 3;
                    break;

                default:
                    job.Priority = 1;
                    break;
                }
            }

            var jobNodes = new List <JobNode>();

            foreach (var job in jobs.OrderBy(f => _randomNumberGenerator.Next()))
            {
                var jobNode = _nodeFactory.CreateJobNode(job);  // create node, set priority
                jobNode.RouteStatistics = _routeStopService.CalculateRouteStatistics(jobNode.RouteStops);
                jobNodes.Add(jobNode);
            }

            // create dummy drivers (for worst case scenario)
            var dummyDriversToCreate = jobNodes.Count() - driverNodes.Count();

            if (dummyDriversToCreate > 0)
            {
                var dummyDriverNode = new DriverNode(defaultDriver);
                for (int i = 0; i < dummyDriversToCreate; i++)
                {
                    driverNodes.Add(dummyDriverNode);
                }
            }

            // build solution
            var bestSolution = BuildSolution(defaultDriver, jobNodes.Cast <INode>().ToList(), driverNodes);

            _isCancelling = false;

            return(bestSolution);
        }