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);
}
}
Représentation visuelle sur le bug Sans le pathfinder activé
« 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
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. –
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. –