示例#1
0
        public NodeState MakeChild(ref NodeState parentNode, int i)
        {
            //FROM and TO city indices
            int cityCount = Cities.Length;
            int fromCity  = parentNode.GetLastCityInRouteIndex();
            int toCity    = i;

            //Make a child matrix from parent
            double[,] copyMatrix  = CopyMatrix(parentNode.GetMatrix(), cityCount);
            double[,] childMatrix = MakeChildMatrix(copyMatrix, fromCity, toCity);

            //Inherit and add to lower bound for the child
            double childLB = parentNode.GetLowerBound() + parentNode.GetMatrix()[toCity, fromCity];

            //Inherit and add to route for the child
            ArrayList childRoute = (ArrayList)parentNode.GetRoute().Clone();

            childRoute.Add(Cities[toCity]);

            //Inherit the cities already visited by the parent and add the city the child is going to be in.
            List <bool> childCitiesVisited = CopyCitiesVisited(parentNode.GetCitiesVisited());

            childCitiesVisited[toCity] = true;

            return(new NodeState(childMatrix, childLB, childRoute, toCity, childCitiesVisited));
        }
示例#2
0
        public void GenerateChildren(ref List <NodeState> queue, ref int MaxNodeStateAmount, ref int BSSFupdates, ref int TotalNodeStates, ref int TotalNodeStatesPrunned, int startCity)
        {
            int cityCount = Cities.Length;
            //Get the first node in the priority
            NodeState currentNodeState = DeletePriorityNode(ref queue);

            //If the currentNodeState should be prunned
            if (currentNodeState.GetLowerBound() >= bssf.costOfRoute())
            {
                currentNodeState = PruneTheQueue(ref queue, currentNodeState, ref TotalNodeStatesPrunned);
            }
            //Generate a child for each city the currentNodeState can go to.
            for (int i = 0; i < cityCount; i++)
            {
                if (!currentNodeState.AlreadyVisited(i))
                {
                    //Make a child
                    NodeState child = MakeChild(ref currentNodeState, i);
                    child.ReduceMatrixAndUpdateLowerBound(cityCount);
                    // Add to node states because a child was generated
                    TotalNodeStates++;

                    //If LB is less BSSF then add to queue, TNS++
                    if (child.GetLowerBound() < bssf.costOfRoute())
                    {
                        //Before adding to the queue, see if you have a new BSSF
                        if (BetterBSSFExists(ref child, startCity))
                        {
                            bssf = new TSPSolution(child.GetRoute());
                            BSSFupdates++;
                        }
                        else
                        {
                            //add node to the queue
                            if (!child.HasVisitedAllCities())
                            {
                                //Add
                                AddNodeToPriorityQueue(ref queue, child);
                            }
                        }
                    }
                    else
                    {
                        //Prune. We don't need to even visit it.
                        TotalNodeStatesPrunned++;
                    }
                }
            }

            //Check the MaxNodeStates
            CheckQueueSize(ref MaxNodeStateAmount, queue.Count - 1);
        }