Beispiel #1
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);
        }