예제 #1
0
        /// <summary>
        /// Creates route assignments from the given trucks and jobs
        /// </summary>
        /// <param name="drivers">the list of drivers available to run routes</param>
        /// <param name="defaultDriver">a default driver to use if there are more routes generated than drivers</param>
        /// <param name="jobs">a list of jobs to optimize</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.");
            }

            if (_isExecuting)
            {
                //throw new OptimizationException("Cannot BuildSolution while another BuildSolution is executing.");
            }

            // begin execution
            _isExecuting        = true;
            _isCancelling       = false;
            CurrentBestSolution = null;

            // clear pheromone matrix
            _pheromoneMatrix.Clear();

            // Create driver nodes
            var driverNodes = drivers.Select(driver => new DriverNode(driver)).ToList();

            // Create job nodes

            var jobNodes = jobs.Select((job, i) => _jobNodeService.CreateJobNode(job, defaultDriver.EarliestStartTimeSpan)).ToList();

            if (!DisallowPlaceholderDriver)
            {
                // create placeholder drivers (for worst case scenario)
                var placeholderDriversToCreate = jobNodes.Count() - driverNodes.Count();
                if (placeholderDriversToCreate > 0)
                {
                    var placeholderDriverNode = new DriverNode(defaultDriver);
                    for (int i = 0; i < placeholderDriversToCreate; i++)
                    {
                        driverNodes.Add(placeholderDriverNode);
                    }
                }
            }

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

            // done executing
            _isExecuting  = false;
            _isCancelling = false;

            CurrentBestSolution = bestSolution;

            return(bestSolution);
        }
예제 #2
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);
        }