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); }