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