Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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);
        }
Ejemplo n.º 4
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);
        }