/// <summary> /// Gets the <see cref="NodeConnection"/> between two nodes /// </summary> /// <param name="startNode"></param> /// <param name="endNode"></param> /// <returns></returns> public NodeConnection GetNodeConnection(INode startNode, INode endNode) { NodeConnection nodeConnection = null; var key = new Tuple <INode, INode>(startNode, endNode); if (_nodeConnectionCache.TryGetValue(key, out nodeConnection)) { return(nodeConnection); } nodeConnection = new NodeConnection() { StartNode = startNode, EndNode = endNode }; // TODO : Add dynamic stops nodeConnection.RouteStops = new List <RouteStop>(); //these stops are just used to calcuate route statistics for things like trip length var stops = new List <RouteStop>(); // start of connection is last stop of start node stops.Add(startNode.RouteStops.Last()); // end of connection is first stop of end node stops.Add(endNode.RouteStops.First()); nodeConnection.LocalRouteStatistics = _routeStopService.CalculateRouteStatistics(stops, true); return(nodeConnection); }
/// <summary> /// Creates a <see cref="NodeConnection"/> between two nodes /// </summary> /// <param name="startNode"></param> /// <param name="endNode"></param> /// <returns></returns> public virtual NodeConnection CreateNodeConnection(INode startNode, INode endNode) { var nodeConnection = new NodeConnection() { StartNode = startNode, EndNode = endNode }; // start of connection is last stop of start node var startStop = startNode.RouteStops.Last(); // end of connection is first stop of end node var endStop = endNode.RouteStops.First(); // calculate local route statistics var stops = new List<RouteStop> {startStop, endStop}; nodeConnection.RouteStatistics = _routeStopService.CalculateRouteStatistics(stops, true); if (startNode.Priority > 1) { nodeConnection.RouteStatistics += new RouteStatistics() { PriorityValue = startNode.Priority, }; } return nodeConnection; }
///// <summary> ///// Calculates the RouteStatistics for a given node ///// </summary> ///// <param name="node"></param> ///// <returns></returns> public RouteStatistics GetRouteStatistics(IRouteSegment node, IRouteSegment previousNode = null) { var routeStatistics = _routeStopService.CalculateRouteStatistics(node.RouteStops, TimeSpan.Zero, node.IsConnection, GetNodeEndRouteStop(previousNode)); return(routeStatistics); }
/// <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); }