示例#1
0
 public void AddJob(DriverNode driver, IList <JobNode> jobs)
 {
     if (DriverJobs != null)
     {
         DriverJobs.Add(new KeyValuePair <DriverNode, IList <JobNode> >(driver, jobs));
     }
 }
示例#2
0
        ///// <summary>
        ///// Creates a route solution from a list of nodes
        ///// </summary>
        ///// <param name="nodes"></param>
        ///// <returns></returns>
        public NodeRouteSolution CreateRouteSolution(IEnumerable <INode> nodes, DriverNode driverNode)
        {
            var routeSolution = new NodeRouteSolution
            {
                DriverNode = driverNode,
                StartTime  = driverNode.Driver.EarliestStartTime,
                Nodes      = nodes.ToList()
            };

            var allNodes = routeSolution.AllNodes;

            // calculate route statistics
            for (int i = 0; i < allNodes.Count; i++)
            {
                // create node plan
                var node = allNodes[i];

                // add node trip length
                routeSolution.RouteStatistics += node.RouteStatistics;

                var previousNode = i == 0 ? null : allNodes[i - 1];
                if (previousNode != null)
                {
                    var statistics = CalculateRouteStatistics(previousNode, node);
                    routeSolution.RouteStatistics += statistics;
                }
            }

            return(routeSolution);
        }
        public void TestSerializeNullException()
        {
            IGraphController graphController = new GraphController(null);
            IStorage         storage         = null;
            IVisualNode      node            = new DriverNode(graphController, Configurations.DriverInitialTextValue);

            Assert.Throws <ArgumentNullException>(() =>
            {
                node.Serialize(storage);
            });
        }
        public void TestDeserilaizeOperationException()
        {
            IGraphController graphController = new GraphController(null);
            IStorage         storage         = new BinaryStorage();
            IVisualNode      node            = new DriverNode(graphController, Configurations.DriverInitialTextValue);

            ulong signature = Utilities.MakeEightCC('T', 'E', 'S', 'T', ' ', ' ', ' ', ' ');

            storage.WriteUnsignedInteger(signature, 21);
            storage.Seek(0, SeekOrigin.Begin);

            bool result = node.Deserialize(storage);

            Assert.AreEqual(result, false);
        }
示例#5
0
        public void TestRecordNodeModficationForUndo00()
        {
            GraphController  graphController = new GraphController(null);
            UndoRedoRecorder urr             = new UndoRedoRecorder(graphController);

            List <IVisualNode> nodeList = new List <IVisualNode>();
            DriverNode         node     = new DriverNode(graphController);

            nodeList.Add(node);

            Assert.Throws <InvalidOperationException>(() =>
            {
                urr.RecordNodeModificationForUndo(nodeList);
            });
        }
示例#6
0
        /// <summary>
        /// Generates node sequence iteration
        /// </summary>
        /// <param name="nodes"></param>
        /// <param name="driverNode"> </param>
        /// <returns></returns>
        public virtual NodeRouteSolution GenerateRouteSolution(IList <INode> nodes, DriverNode driverNode)
        {
            IList <INode> processedNodes            = new List <INode>();
            INode         currentNode               = driverNode;
            var           startTime                 = driverNode.Driver.EarliestStartTime;
            var           currentNodeEndTime        = startTime;
            var           cumulativeRouteStatistics = new RouteStatistics();

            int exitCounter = 0;

            while (exitCounter++ < 1000)
            {
                // getting avaiable nodes that have not been processed
                var feasibleNodeTimings = GetFeasibleNodes(nodes, driverNode, processedNodes, currentNodeEndTime, cumulativeRouteStatistics);

                if (!feasibleNodeTimings.Any())
                {
                    break;
                }

                var feasibleNodeTimingsByNode = feasibleNodeTimings.ToDictionary(f => f.Node);

                // build probability matrix for the available nodes
                var probabilityData = _probabilityMatrix.BuildProbabilityDataMatrix(currentNode, feasibleNodeTimings);

                // find a suitable node based on the cumulative probability
                var selectedNode = (INode)_probabilityMatrix.GetNominatedElement(probabilityData);
                processedNodes.Add(selectedNode);
                currentNode = selectedNode;

                // now we update the current node's end time
                var selectedNodeTiming = feasibleNodeTimingsByNode[selectedNode];

                if (processedNodes.Count == 1 && selectedNodeTiming.DepartureTime != currentNodeEndTime)
                {
                    startTime = selectedNodeTiming.DepartureTime;
                }

                currentNodeEndTime        = selectedNodeTiming.EndExecutionTime;
                cumulativeRouteStatistics = selectedNodeTiming.CumulativeRouteStatistics;
            }

            // create solution object
            var result = _routeService.CreateRouteSolution(processedNodes, driverNode);

            result.StartTime = startTime;
            return(result);
        }
示例#7
0
        private bool PassesFilterCriteria(DriverNode driverNode, JobNode jobNode, List <INode> filteredAvailableNodes)
        {
            if (!driverNode.Driver.IsHazmat && jobNode.Job.IsHazmat)
            {
                return(false);
            }

            if (!driverNode.Driver.IsFlatbed && jobNode.Job.IsFlatbed)
            {
                return(false);
            }

            if (driverNode.Driver.Priority < jobNode.Job.Priority)
            {
                return(false);
            }

            return(true);
        }
示例#8
0
        /// <summary>
        /// Gets the best solution between a new list of <see cref="INode"/> and a current best <see cref="NodeRouteSolution"/>
        /// </summary>
        /// <param name="nodes"></param>
        /// <param name="driverNode"> </param>
        /// <param name="bestSolution"></param>
        /// <returns>the best solution</returns>
        public NodeRouteSolution GetBestFeasableSolution(IEnumerable <INode> nodes, DriverNode driverNode, NodeRouteSolution bestSolution)
        {
            // create solution
            var routeSolution = CreateRouteSolution(driverNode, nodes);

            // check feasibility
            if (IsFeasableRouteSolution(routeSolution))
            {
                if (bestSolution != null)
                {
                    routeSolution = GetBestSolution(bestSolution, routeSolution);
                }
            }
            else
            {
                routeSolution = bestSolution;
            }

            return(routeSolution);
        }
示例#9
0
        private void FillDrivers()
        {
            DriverNode resultAlias   = null;
            Employee   employeeAlias = null;

            driversList = UoW.Session.QueryOver <Employee>(() => employeeAlias)
                          .Where(
                () => employeeAlias.Status != EmployeeStatus.IsFired &&
                (employeeAlias.Category == EmployeeCategory.driver || employeeAlias.Category == EmployeeCategory.forwarder) &&
                !employeeAlias.VisitingMaster
                )
                          .SelectList(list => list
                                      .Select(() => employeeAlias.Id).WithAlias(() => resultAlias.Id)
                                      .Select(() => employeeAlias.Name).WithAlias(() => resultAlias.Name)
                                      .Select(() => employeeAlias.LastName).WithAlias(() => resultAlias.LastName)
                                      .Select(() => employeeAlias.Category).WithAlias(() => resultAlias.Category)
                                      .Select(() => employeeAlias.FirstWorkDay).WithAlias(() => resultAlias.FirstWorkDay))
                          .OrderBy(e => e.LastName).Asc.ThenBy(x => x.Name).Asc
                          .TransformUsing(Transformers.AliasToBean <DriverNode>())
                          .List <DriverNode>();
        }
        public void TestHandleSaveGraphAndLoadGraph()
        {
            try
            {
                GraphController graphController1 = new GraphController(null);
                IVisualNode     node1            = new CodeBlockNode(graphController1, "Double Click and Type");
                IVisualNode     node2            = new DriverNode(graphController1, Configurations.DriverInitialTextValue);
                IVisualNode     node3            = new FunctionNode(graphController1, "", "-", "double,double");
                IVisualNode     node4            = new IdentifierNode(graphController1, "c");

                string filePath = Path.GetTempPath() + "test.bin";
                graphController1.DoSaveGraph(filePath);
                GraphController graphController2 = new GraphController(null, filePath);

                Assert.AreEqual(4, graphController2.GetVisualNodes().Count);
            }
            finally
            {
                File.Delete(Path.GetTempPath() + "test.bin");
            }
        }
        public void TestSerializeDeserialize()
        {
            IGraphController graphController = new GraphController(null);
            IStorage         storage         = new BinaryStorage();

            IVisualNode node1 = new DriverNode(graphController, Configurations.DriverInitialTextValue);
            IVisualNode node2 = new DriverNode(graphController, Configurations.DriverInitialTextValue);

            node1.Serialize(storage);
            storage.Seek(0, SeekOrigin.Begin);
            node2.Deserialize(storage);

            Assert.AreEqual(NodeType.Driver, node2.VisualType);
            Assert.AreEqual(node1.NodeId, node2.NodeId);
            Assert.AreEqual(true, ((DriverNode)node2).Dirty);
            Assert.AreEqual(((DriverNode)node1).Text, ((DriverNode)node2).Text);
            Assert.AreEqual(((DriverNode)node1).Caption, ((DriverNode)node2).Caption);
            Assert.AreEqual(node1.X, node2.X);
            Assert.AreEqual(node1.Y, node2.Y);
            Assert.Null(node2.GetInputSlots());
            Assert.AreEqual(1, node2.GetOutputSlots().Length);
        }
示例#12
0
        private bool PassesFilterCriteria(DriverNode driverNode, JobNode jobNode)
        {
            if (!driverNode.Driver.IsHazmatEligible && jobNode.Job.IsHazmat)
            {
                return(false);
            }

            if (!driverNode.Driver.IsShortHaulEligible && jobNode.Job.IsShortHaul)
            {
                return(false);
            }

            if (!driverNode.Driver.IsLongHaulEligible && jobNode.Job.IsLongHaul)
            {
                return(false);
            }

            if (driverNode.Driver.OrderType > 0 && driverNode.Driver.OrderType > jobNode.Job.OrderType)
            {
                return(false);
            }

            return(true);
        }
示例#13
0
        public bool JobNodeTimings(IList <Job> jobs, Driver driver, out List <NodeTiming> nodeTimings, out IList <int> ints)
        {
            nodeTimings = new List <NodeTiming>();
            ints        = new List <int>();
            if (driver == null || jobs == null || !jobs.Any())
            {
                {
                    return(true);
                }
            }

            var jobNodes                  = jobs.Select((job, i) => _jobNodeService.CreateJobNode(job, null, i != 0)).Cast <INode>().ToList();
            var driverNode                = new DriverNode(driver);
            var processedNodes            = new List <INode>();
            var cumulativeRouteStatistics = new RouteStatistics();

            //var routeSolution = GenerateRouteSolution(jobNodes, driverNode);

            //GetFeasibleNodes(jobNodes, driverNode, processedNodes, )
            //var isFirstStop = processedNodes.Count == 0;
            //var currentNode = isFirstStop ? driverNode : processedNodes.Last();

            // first check feasibility for driver to first node
            var nodeTimingResult = _routeStatisticsService.GetNodeTiming(
                driverNode, jobNodes.FirstOrDefault(), driverNode.WindowStart, cumulativeRouteStatistics);


            if (!nodeTimingResult.IsFeasableTimeWindow)
            {
                // all are infeasible
                {
                    ints = jobNodes.Select(p => p.Id).ToList();
                    return(true);
                }
            }

            nodeTimings = new List <NodeTiming>()
            {
                nodeTimingResult
            };

            for (int i = 1; i < jobNodes.Count; i++)
            {
                var currentNode        = (JobNode)jobNodes[i];
                var lastNode           = jobNodes[i - 1];
                var iterationStartTime = nodeTimingResult.EndExecutionTime;

                nodeTimingResult = _routeStatisticsService.GetNodeTiming(
                    lastNode, currentNode, iterationStartTime, cumulativeRouteStatistics);

                nodeTimingResult.CumulativeRouteStatistics = cumulativeRouteStatistics + nodeTimingResult.CumulativeRouteStatistics;

                if (_routeExitFunction.ExeedsExitCriteria(nodeTimingResult.CumulativeRouteStatistics, driverNode.Driver))
                {
                    nodeTimingResult.IsFeasableTimeWindow = false;
                }

                nodeTimings.Add(nodeTimingResult);
            }

            var lastLeg = _routeStatisticsService.GetRouteStatistics(nodeTimingResult.Node, driverNode, nodeTimingResult.EndExecutionTime);
            var finalRouteStatistics = nodeTimingResult.CumulativeRouteStatistics + lastLeg;

            if (_routeExitFunction.ExeedsExitCriteria(finalRouteStatistics, driverNode.Driver))
            {
                nodeTimingResult.IsFeasableTimeWindow = false;
            }

            nodeTimings.Add(nodeTimingResult);
            return(false);
        }
示例#14
0
        public virtual NodeRouteSolution GenerateIterativeRouteSolution(IList <INode> nodes, DriverNode driverNode, bool reOrder = true)
        {
            IList <INode> processedNodes            = new List <INode>();
            INode         currentNode               = driverNode;
            var           startTime                 = driverNode.Driver.EarliestStartTimeSpan;
            var           currentNodeEndTime        = startTime;
            var           cumulativeRouteStatistics = new RouteStatistics();

            nodes = SortINodes(nodes, driverNode.Driver, reOrder).ToList();

            int exitCounter = 0;

            while (exitCounter++ < 1000)
            {
                nodes = nodes.Where(x => !processedNodes.Select(y => y.Id).ToList().Contains(x.Id)).ToList();

                // getting avaiable nodes that have not been processed
                if (!nodes.Any())
                {
                    break;
                }

                var feasibleNodeTimingsList = SortINodes(nodes, driverNode.Driver, reOrder).ToList();

                var firstHitFeasibleNodeTiming = feasibleNodeTimingsList.FirstOrDefault(y => y.WindowEnd > currentNodeEndTime);

                if (firstHitFeasibleNodeTiming == null)
                {
                    break;
                }

                var firstHitFeasibleNodeTimingNode = firstHitFeasibleNodeTiming;

                var selectedNode    = firstHitFeasibleNodeTimingNode;
                var selectedJobNode = selectedNode is JobNode ? selectedNode as JobNode : null;

                var processedRouteStops   = processedNodes.SelectMany(x => x.RouteStops);
                var provisionalRouteStops = new Queue <RouteStop>();
                foreach (var processedRouteStop in processedRouteStops)
                {
                    provisionalRouteStops.Enqueue(processedRouteStop);
                }
                foreach (var routeStop in selectedNode.RouteStops)
                {
                    provisionalRouteStops.Enqueue(routeStop);
                }

                var tempJob = new Job
                {
                    RouteStops = provisionalRouteStops.Select(x => x).ToList(),
                    IsHazmat   = selectedJobNode != null && selectedJobNode.Job != null ? selectedJobNode.Job.IsHazmat : false
                };

                var tempJobNode = _jobNodeService.CreateJobNode(tempJob, driverNode.Driver.EarliestStartTimeSpan, false);

                if (!tempJobNode.IsInvalid)
                {
                    var serviceTimeIndex = _jobNodeService.GetMatrixIndex("ServiceTime");
                    var waitTimeIndex    = _jobNodeService.GetMatrixIndex("WaitTime");
                    var travelTimeIndex  = _jobNodeService.GetMatrixIndex("TravelTime");
                    var entryCount       = tempJobNode.RouteStatisticsMatrix.GetLength(1);

                    var travelTime  = TimeSpan.Zero;
                    var serviceTime = TimeSpan.Zero;
                    var waitTime    = TimeSpan.Zero;

                    for (var i = 0; i < entryCount; i++)
                    {
                        travelTime  += TimeSpan.FromSeconds(tempJobNode.RouteStatisticsMatrix[travelTimeIndex, i]);
                        serviceTime += TimeSpan.FromSeconds(tempJobNode.RouteStatisticsMatrix[serviceTimeIndex, i]);
                        waitTime    += TimeSpan.FromSeconds(tempJobNode.RouteStatisticsMatrix[waitTimeIndex, i]);
                    }

                    var statistics = new RouteStatistics
                    {
                        TotalExecutionTime = serviceTime,
                        TotalIdleTime      = waitTime,
                        TotalTravelTime    = travelTime,
                        TotalQueueTime     = TimeSpan.Zero
                    };
                    if (!_routeExitFunction.ExeedsExitCriteria(statistics, driverNode.Driver) &&
                        _routeExitFunction.MeetsPortCriteria(tempJobNode.RouteStops, driverNode.Driver) &&
                        PassesFilterCriteria(driverNode, tempJobNode, new List <INode>())
                        )
                    {
                        processedNodes.Add(selectedNode);
                        driverNode.Driver.EarliestStartTime = tempJobNode.WindowStart.Ticks;
                    }
                    else
                    {
                        nodes.RemoveAt(0);
                    }
                }
                else
                {
                    nodes.RemoveAt(0);
                }
            }

            // create solution object, adjust start time
            var result           = _routeService.CreateRouteSolution(driverNode, processedNodes);
            var driverStartTicks = Math.Max(driverNode.Driver.EarliestStartTime, startTime.Ticks);

            result.StartTime = TimeSpan.FromTicks(driverStartTicks);

            var s = string.Join("\t", result.Nodes.Select(f => "[" + f.Id + "]").ToArray());

            Console.WriteLine(s);
            Console.WriteLine(result.RouteStatistics.ToString());

            return(result);
        }
示例#15
0
        /// <summary>
        /// Generates node sequence iteration
        /// </summary>
        /// <param name="nodes"></param>
        /// <param name="driverNode"> </param>
        /// <returns></returns>
        public virtual NodeRouteSolution GenerateRouteSolution(IList <INode> nodes, DriverNode driverNode)
        {
            IList <INode> processedNodes            = new List <INode>();
            INode         currentNode               = driverNode;
            var           startTime                 = driverNode.Driver.EarliestStartTimeSpan;
            var           currentNodeEndTime        = startTime;
            var           cumulativeRouteStatistics = new RouteStatistics();

            int exitCounter = 0;

            while (exitCounter++ < 1000)
            {
                // getting avaiable nodes that have not been processed
                var feasibleNodeTimings = GetFeasibleNodes(nodes, driverNode, processedNodes, currentNodeEndTime, cumulativeRouteStatistics);
                if (!feasibleNodeTimings.Any())
                {
                    break;
                }

                var feasibleNodeTimingsByNode = feasibleNodeTimings.ToDictionary(f => f.Node);

                // build probability matrix for the available nodes
                var probabilityData = _probabilityMatrix.BuildProbabilityDataMatrix(currentNode, feasibleNodeTimings);

                // find a suitable node based on the cumulative probability
                var selectedNode = (INode)_probabilityMatrix.GetNominatedElement(probabilityData);

                selectedNode.DepartureTime = feasibleNodeTimingsByNode[selectedNode].DepartureTime; // set the Departure Time

                // break if we nominated the driver node
                if (selectedNode == driverNode)
                {
                    break;
                }

                processedNodes.Add(selectedNode);
                currentNode = selectedNode;

                // now we update the current node's end time
                var selectedNodeTiming = feasibleNodeTimingsByNode[selectedNode];

                if (processedNodes.Count == 1 && selectedNodeTiming.DepartureTime != currentNodeEndTime.Ticks)
                {
                    startTime = new TimeSpan(selectedNodeTiming.DepartureTime);
                }

                currentNodeEndTime        = selectedNodeTiming.EndExecutionTime;
                cumulativeRouteStatistics = selectedNodeTiming.CumulativeRouteStatistics;

                var processedRouteStops   = processedNodes.SelectMany(x => x.RouteStops);
                var provisionalRouteStops = new Queue <RouteStop>();
                foreach (var processedRouteStop in processedRouteStops)
                {
                    provisionalRouteStops.Enqueue(processedRouteStop);
                }
                foreach (var routeStop in selectedNode.RouteStops)
                {
                    provisionalRouteStops.Enqueue(routeStop);
                }

                var tempJob = new Job
                {
                    RouteStops = provisionalRouteStops.Select(x => x).ToList()
                };

                var tempJobNode = _jobNodeService.CreateJobNode(tempJob, driverNode.Driver.EarliestStartTimeSpan, false);

                if (!tempJobNode.IsInvalid)
                {
                    var serviceTimeIndex = _jobNodeService.GetMatrixIndex("ServiceTime");
                    var waitTimeIndex    = _jobNodeService.GetMatrixIndex("WaitTime");
                    var travelTimeIndex  = _jobNodeService.GetMatrixIndex("TravelTime");
                    var entryCount       = tempJobNode.RouteStatisticsMatrix.GetLength(1);

                    var travelTime  = TimeSpan.Zero;
                    var serviceTime = TimeSpan.Zero;
                    var waitTime    = TimeSpan.Zero;

                    for (var i = 0; i < entryCount; i++)
                    {
                        travelTime  += TimeSpan.FromSeconds(tempJobNode.RouteStatisticsMatrix[travelTimeIndex, i]);
                        serviceTime += TimeSpan.FromSeconds(tempJobNode.RouteStatisticsMatrix[serviceTimeIndex, i]);
                        waitTime    += TimeSpan.FromSeconds(tempJobNode.RouteStatisticsMatrix[waitTimeIndex, i]);
                    }

                    var statistics = new RouteStatistics
                    {
                        TotalExecutionTime = serviceTime,
                        TotalIdleTime      = waitTime,
                        TotalTravelTime    = travelTime,
                        TotalQueueTime     = TimeSpan.Zero
                    };
                    if (!_routeExitFunction.ExeedsExitCriteria(statistics, driverNode.Driver))
                    {
                        processedNodes.Add(selectedNode);
                        driverNode.Driver.EarliestStartTime = tempJobNode.WindowStart.Ticks;
                    }
                }
            }

            // create solution object, adjust start time
            var result           = _routeService.CreateRouteSolution(driverNode, processedNodes);
            var driverStartTicks = Math.Max(driverNode.Driver.EarliestStartTime, startTime.Ticks);

            result.StartTime = TimeSpan.FromTicks(driverStartTicks);

            var s = string.Join("\t", result.Nodes.Select(f => "[" + f.Id + "]").ToArray());

            Console.WriteLine(s);
            Console.WriteLine(result.RouteStatistics.ToString());

            return(result);
        }
示例#16
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);
        }
示例#17
0
        ///// <summary>
        ///// Creates a route solution from a list of nodes
        ///// </summary>
        ///// <param name="nodes"></param>
        ///// <returns></returns>
        public NodeRouteSolution CreateRouteSolution(DriverNode driverNode, IEnumerable <INode> nodes)
        {
            var startTime    = driverNode.Driver.EarliestStartTimeSpan;
            var firstJobNode = nodes.FirstOrDefault();

            // adjust the start time
            if (firstJobNode != null)
            {
                // there may have been waiting for the driver to leave, do not count that as idle time
                // update the currentTime to the JobNode WindowEnd, less travel time
                var connection = _nodeService.GetNodeConnection(driverNode, nodes.First());
                if (firstJobNode.WindowEnd.Subtract(connection.RouteStatistics.TotalTravelTime) > startTime)
                {
                    startTime = firstJobNode.WindowEnd.Subtract(connection.RouteStatistics.TotalTravelTime);
                }
            }


            var routeSolution = new NodeRouteSolution
            {
                DriverNode = driverNode,
                StartTime  = startTime,
                Nodes      = nodes.ToList()
            };

            var allNodes = routeSolution.AllNodes;


            var currentTime = startTime;

            // calculate route statistics
            for (int i = 0; i < allNodes.Count; i++)
            {
                // create node plan
                var node         = allNodes[i];
                var previousNode = i > 0 ? allNodes[i - 1] : null;

                // insert waiting time as per JobNode windows
                if (i >= 1 && node is JobNode && previousNode is JobNode)
                {
                    // there may have been waiting for the driver to leave, do not count that as idle time
                    // update the currentTime to the JobNode WindowEnd, less travel time
                    var connection = _nodeService.GetNodeConnection(previousNode, node);
                    if (node.WindowEnd.Subtract(connection.RouteStatistics.TotalTravelTime) > currentTime)
                    {
                        // waiting found
                        var waitingTime       = node.WindowEnd.Subtract(currentTime);
                        var currentStatistics = routeSolution.RouteStatistics;
                        currentStatistics.TotalIdleTime = currentStatistics.TotalIdleTime.Add(waitingTime);
                        routeSolution.RouteStatistics   = currentStatistics;
                        currentTime = currentTime.Add(waitingTime);
                    }
                }

                // add node trip length
                var stats = _routeStatisticsService.GetRouteStatistics(node, currentTime, previousNode);
                routeSolution.RouteStatistics += stats;

                // currentTime = startTime + routeSolution.RouteStatistics.TotalTime;

                if (previousNode != null)
                {
                    var statistics = _routeStatisticsService.GetRouteStatistics(previousNode, node, currentTime);
                    routeSolution.RouteStatistics += statistics;
                }

                currentTime = startTime + routeSolution.RouteStatistics.TotalTime;
            }

            return(routeSolution);
        }
示例#18
0
        public virtual List <NodeTiming> GetFeasibleNodes(IList <INode> availableNodes, DriverNode driverNode, IList <INode> processedNodes,
                                                          TimeSpan currentNodeEndTime, RouteStatistics cumulativeRouteStatistics)
        {
            var isFirstStop = (processedNodes.Count == 0);
            var currentNode = isFirstStop ? driverNode : processedNodes.Last();

            if (currentNode is JobNode)
            {
                ;
            }
            var filteredAvailableNodes = new List <INode>();

            // filter available nodes based on predefined criteria
            foreach (var availableNode in availableNodes)
            {
                if (availableNode is JobNode)
                {
                    //if (PassesFilterCriteria(driverNode, (JobNode)availableNode))
                    {
                        filteredAvailableNodes.Add(availableNode);
                    }
                }
                else
                {
                    filteredAvailableNodes.Add(availableNode);  // we are only filtering JobNodes
                }
            }

            availableNodes = filteredAvailableNodes.ToList();

            // get the node timings for all of the available nodes
            var nodeTimings = availableNodes.Except(processedNodes)
                              .Select(nextNode => _nodeService.GetNodeTiming(currentNode, nextNode, currentNodeEndTime, cumulativeRouteStatistics))
                              .ToList();

            var feasibleNodes = new List <NodeTiming>();

            foreach (var nodeTiming in nodeTimings.Where(f => f.IsFeasableTimeWindow))
            {
                var finalConnection      = _nodeService.GetNodeConnection(nodeTiming.Node, driverNode);
                var finalRouteStatistics = nodeTiming.CumulativeRouteStatistics + finalConnection.RouteStatistics;

                if (!_routeExitFunction.ExeedsExitCriteria(finalRouteStatistics, driverNode.Driver))
                {
                    feasibleNodes.Add(nodeTiming);
                }
            }

            return(feasibleNodes);
        }
示例#19
0
        public virtual List <NodeTiming> GetFeasibleNodes(IList <INode> availableNodes, DriverNode driverNode, IList <INode> processedNodes,
                                                          TimeSpan currentNodeEndTime, RouteStatistics cumulativeRouteStatistics)
        {
            var isFirstStop = (processedNodes.Count == 0);
            var currentNode = isFirstStop ? driverNode : processedNodes.Last();

            var filteredAvailableNodes = new List <INode>();

            var updatedNodes = new List <INode>();

            if (currentNode is JobNode)
            {
                // update nodes to adjust for potentially shortened execution time
                foreach (var n in availableNodes)
                {
                    if (n is JobNode)
                    {
                        var node = _jobNodeService.CreateJobNode(((JobNode)n).Job, currentNodeEndTime,
                                                                 IsExecutionTimeIgnored(currentNode, n));
                        updatedNodes.Add(node);
                    }
                    else
                    {
                        updatedNodes.Add(n);
                    }
                }

                availableNodes = updatedNodes.ToList();
            }

            // filter available nodes based on predefined criteria
            foreach (var availableNode in availableNodes)
            {
                if (availableNode is JobNode)
                {
                    if (PassesFilterCriteria(driverNode, (JobNode)availableNode, filteredAvailableNodes))
                    {
                        filteredAvailableNodes.Add(availableNode);
                    }
                    else
                    {
                        ;
                    }
                }
                else
                {
                    filteredAvailableNodes.Add(availableNode);  // we are only filtering JobNodes
                }
            }

            availableNodes = filteredAvailableNodes.ToList();

            // get the node timings for all of the available nodes
            var unprocessedNodes = availableNodes.Where(x => !processedNodes.Select(y => y.Id).ToList().Contains(x.Id));

            unprocessedNodes = new List <INode>();
            foreach (var availableNode in availableNodes)
            {
                var processedNodesIds = processedNodes.Select(x => x.Id);
                if (!processedNodesIds.Contains(availableNode.Id))
                {
                    unprocessedNodes = unprocessedNodes.Concat(new List <INode> {
                        availableNode
                    });
                }
            }

            var nodeTimings = unprocessedNodes.Select(nextNode =>
                                                      _routeStatisticsService.GetNodeTiming(currentNode, nextNode, currentNodeEndTime, cumulativeRouteStatistics));

            var feasibleNodes = new List <NodeTiming>();

            foreach (var nodeTiming in nodeTimings.Where(f => f.IsFeasableTimeWindow))
            {
                // calculate for return home to driver node
                var lastLeg = _routeStatisticsService.GetRouteStatistics(nodeTiming.Node, driverNode, nodeTiming.EndExecutionTime);
                var finalRouteStatistics = nodeTiming.CumulativeRouteStatistics + lastLeg;

                if (!_routeExitFunction.ExeedsExitCriteria(finalRouteStatistics, driverNode.Driver))
                {
                    feasibleNodes.Add(nodeTiming);
                }
            }

            return(feasibleNodes);
        }
示例#20
0
        public void MakeVariableSelector()
        {
            MethodInfo privMethod = logixNodeSelector.GetType().GetMethod("BuildUI", BindingFlags.NonPublic | BindingFlags.Instance);
            //privMethod.Invoke(logixNodeSelector,new object[] { "LogiX/Variables" });
            //FieldInfo fi = typeof(LogixNodeSelector).GetField("_container", BindingFlags.NonPublic | BindingFlags.Instance);
            //Slot container = (Slot)fi.GetValue(logixNodeSelector);
            Slot variableNodesContainer  = nodesContainerSlot[0][0][0];
            Slot typeSelectTemplate      = mainSlot.AddSlot("Type select template");
            Slot variableNodesContainer2 = variableNodesContainer.Duplicate();

            variableNodesContainer2.AttachComponent <DynamicVariableSpace>();
            DynamicValueVariable <string> genericType = variableNodesContainer2.AttachComponent <DynamicValueVariable <string> >();

            genericType.VariableName.Value = "GenericType";
            variableNodesContainer2.SetParent(typeSelectTemplate);
            variableNodesContainer2[0].Destroy();
            for (int i = 0; i < variableNodesContainer2.ChildrenCount; i++)
            {
                Debug.Log(variableNodesContainer2[i]);
                Slot s                    = variableNodesContainer2[i];
                var  buttonRelay          = s.GetComponent <ButtonRelay <string> >();
                ValueField <string> store = s.AttachComponent <ValueField <string> >();
                Debug.Log(buttonRelay.Argument.Value);
                //store.Value.Value = LogixHelper.GetNodeVisualType(WorkerManager.GetType(buttonRelay.Argument.Value)).ToString();

                Type        type = WorkerManager.GetType(buttonRelay.Argument.Value);
                Image       componentInChildren = s.GetComponentInChildren <Image>((Predicate <Image>)null, false);
                System.Type nodeVisualType      = LogixHelper.GetNodeVisualType(type);
                componentInChildren.Sprite.Target        = (IAssetProvider <Sprite>)LogixHelper.GetTypeSprite(this.World, nodeVisualType.GetDimensions(), typeof(Delegate).IsAssignableFrom(nodeVisualType));
                componentInChildren.PreserveAspect.Value = false;

                store.Value.Value = BaseX.TypeHelper.TryGetAlias(type) ?? type.FullName;
                DynamicValueVariable <string> dynamicvar = s.AttachComponent <DynamicValueVariable <string> >();
                dynamicvar.VariableName.Value = "GenericType";
                FormatString formatString = s.AttachComponent <FormatString>();
                formatString.Parameters.Add();
                formatString.Parameters.Add();
                Cast_string_To_object cast1 = s.AttachComponent <Cast_string_To_object>();
                cast1.In.Value = dynamicvar.Value.ReferenceID;
                Cast_string_To_object cast2 = s.AttachComponent <Cast_string_To_object>();
                cast2.In.Value = store.Value.ReferenceID;
                formatString.Parameters[0].Value = cast1.ReferenceID;
                formatString.Parameters[1].Value = cast2.ReferenceID;
                ValueField <string> format = s.AttachComponent <ValueField <string> >();
                format.Value.Value        = "{0}[{1}]";
                formatString.Format.Value = format.Value.ReferenceID;
                DriverNode <string> driver = s.AttachComponent <DriverNode <string> >();
                driver.Source.Value       = formatString.Str.ReferenceID;
                driver.DriveTarget.Target = buttonRelay.Argument;
            }
            //this.RunSynchronously(() =>
            //{
            //    variableNodesContainer2.ForeachChild((Action<FrooxEngine.Slot>) (s =>
            //    {
            //        Debug.Log(s);
            //        //var buttonRelay = s.GetComponent<ButtonRelay<string>>();
            //        //Debug.Log(buttonRelay.ToString());
            //        //ValueField<string> store = s.AttachComponent<ValueField<string>>();
            //        //store.Value.Value = LogixHelper.GetNodeVisualType(WorkerManager.GetType(buttonRelay.Argument.Value)).ToString();
            //        //store.Value.Value = Type.GetType(buttonRelay.Argument.Value).GetContentType().ToString();
            //        //Debug.Log(buttonRelay.Argument.Value);
            //        //store.Value.Value = buttonRelay.Argument;
            //        //store.Value.Value = typeof(bool2).ToString();
            //        //DynamicValueVariable<string> dynamicvar = s.AttachComponent<DynamicValueVariable<string>>();
            //        //dynamicvar.VariableName.Value = "GenericType";
            //        //FormatString formatString = s.AttachComponent<FormatString>();
            //        //formatString.Parameters.Add();
            //        //formatString.Parameters.Add();
            //        //Cast_string_To_object cast1 = s.AttachComponent<Cast_string_To_object>();
            //        //cast1.In.Value = dynamicvar.Value.ReferenceID;
            //        //Cast_string_To_object cast2 = s.AttachComponent<Cast_string_To_object>();
            //        //cast2.In.Value = store.Value.ReferenceID;
            //        //formatString.Parameters[0].Value = cast1.ReferenceID;
            //        //formatString.Parameters[1].Value = cast2.ReferenceID;
            //        //ValueField<string> format = s.AttachComponent<ValueField<string>>();
            //        //format.Value.Value = "{0}[{1}]";
            //        //formatString.Format.Value = format.Value.ReferenceID;
            //        //DriverNode<string> driver = s.AttachComponent<DriverNode<string>>();
            //        //driver.Source.Value = formatString.Str.ReferenceID;
            //        //driver.DriveTarget.Target = buttonRelay.Argument;
            //    }));
            //});
            privMethod.Invoke(logixNodeSelector, new object[] { "LogiX", false });
        }
示例#21
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);
        }