2016-09-28 5 views
2

Je ne savais pas comment formuler le titre de question mieux sans être trop descriptif, je suis désolé à l'avance ...objets dans la liste supprimeront lors de l'application de la mise en œuvre de l'algorithme Dijkstra

Quoi qu'il en soit, mon problème est le Suivant.

J'ai une List NodeList, et une liste secondaire nommée Unvisited. J'utilise la méthode GetPath sur la liste Unvisited (c'est une implémentation de l'algorithme Pathfidning de Dijkstra). Mais pour une raison étrange lorsque je dessine la texture stockée dans les nœuds dans la liste des nœuds, certains des nœuds (en particulier, les nœuds utilisés pour tracer un chemin entre) sont supprimés.

Je cherche une explication pourquoi les nœuds supprimeront de la NodeList même quand je mets clairement Unvisited égale NodeList ...

EDIT: S'il y a un code qui manque pour comprendre le problème, demandez et Je vais éditer!

pertinentes du Code:

public class Hotel 
{ 
    public List<Node> nodeList; 

     //constructor loadscontent and initialises list, ommitted here. 

    public void BuildHotel(ContentManager content) 
    { 
     for (int i = 0; i < 5; i++) 
     { 
      GuestRoom temp = new GuestRoom(100 + i, content, new Point(64 + (i * 64), 128), new Point(2, 1)); 
      nodeList.Add(new Node(temp, new Point(64 + (i * 64), 128))); 
     } 

     // add edges between some nodes 
     for (int i = 0; i < 4; i++) 
     { 
      AddEdge(nodeList[i].Room.RoomId, nodeList[i + 1].Room.RoomId, 2); 
     } 

     guest = new Guest(content); 
     guest.Setpath(100, 104, nodeList); 
    } 


} 
class PathFinding 
{ 
    public List<Node> Unvisited; 
    public List<Node> Visited; 
    private Stack<Node> _temp = new Stack<Node>(); 

    public Stack<Node> GetPath(int startroom, int finalroom, List<Node> nodeList) 
    { 
     Unvisited = nodeList; 
     Node startNode = Unvisited.DefaultIfEmpty(null).FirstOrDefault(x => x.Room.RoomId == startroom); 
     Node finalNode = Unvisited.DefaultIfEmpty(null).FirstOrDefault(x => x.Room.RoomId == finalroom); 

     if (startNode == null || finalNode == null) 
     { 
      Console.WriteLine("At least one of the nodes does not exist"); 
      return null; 
     } 

     startNode.Distance = 0; 

     Node currentNode = startNode; 

     while (!IsVisited(currentNode, finalNode)) 
     { 
      currentNode = Unvisited.Aggregate((l, r) => l.Distance < r.Distance ? l : r); 
     } 

     //reverse nodes in queue 
     Queue<Node> reversedqueue = MakePath(startNode, currentNode, finalNode); 
     for (int i = 0; i < MakePath(startNode, currentNode, finalNode).Count; i++) 
     { 
      _temp.Push(reversedqueue.Dequeue()); 
     } 
     return _temp; 
    } 
} 

public class SimulationScreen : Screen 
{ 
    private Hotel hotel; 
    //.. other methods ommited. 
    public override void Activate(bool instancePreserved) 
    { 
     if (!instancePreserved) 
     { 
      if (_content == null) 
       _content = new ContentManager(ScreenManager.Game.Services, "Content"); 

      ScreenManager.Game.ResetElapsedTime(); 
     } 
     hotel = new Hotel(_content); 
    } 
} 

Visual Representation on the bug Représentation visuelle sur le bug Without the pathfinder turned on Sans le pathfinder activé

+1

« Mais pour une raison bizarre quand je dessine la texture stockée dans les nœuds du NodeList certains des nœuds (en particulier, les nœuds utilisés pour tracer un chemin entre). " Je pense que vous manquez la fin de cette phrase; "se faire enlever" peut-être? – RJFalconer

+0

Répertoriez chaque emplacement du programme dans lequel un noeud est supprimé. L'un d'eux est retiré de la mauvaise liste. Maintenant, déterminez lequel. –

+0

Vous pourriez envisager de réécrire votre algorithme pour utiliser des listes immuables; c'est une technique puissante pour s'assurer que vous n'avez jamais un bug causé par une mutation de liste; il n'y a pas de mutations de liste. –

Répondre

2

Votre problème est ici:

Unvisited = nodeList; 

T C'est le problème, j'ai examiné toute ma solution et il n'y a pas un seul endroit où les nœuds sont retirés de la liste des nœuds. toute suppression de la liste provient de la liste Unvisited ...: s

Après cette affectation, toute suppression de la liste Unvisited est supprimée de nodeList. La liste est un type de référence, donc quand vous changez sa valeur avec une affectation, vous changez vraiment l'objet auquel elle fait référence. Unvisited et nodeList se réfèrent au même objet après cela. Pour éviter cela, instancier une nouvelle liste en utilisant l'ancien plutôt que d'attribuer les deux listes à la même référence:

Unvisited = new List<Node>(nodeList); 
+1

Oh mon dieu! Je vous remercie! C'est exactement ce que le problème était! En effet, je n'ai jamais initialisé la liste de façon autonome, donc je l'ai supprimé de 'NodeList'.Merci pour l'explication aussi :) –