Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当应用Dijkstra';s算法的实现_C#_List_Monogame_Path Finding - Fatal编程技术网

C# 当应用Dijkstra';s算法的实现

C# 当应用Dijkstra';s算法的实现,c#,list,monogame,path-finding,C#,List,Monogame,Path Finding,我不知道如何更好地表述问题的标题,同时又不进行太多的描述,我很抱歉 无论如何,我的问题如下 我有一个列表NodeList和一个名为Unvisited的二级列表 我在未访问列表上使用GetPath方法(它是Dijkstra的Pathfidning算法的一个实现)。但由于某种奇怪的原因,当我绘制存储在节点列表中的节点中的纹理时,一些节点(特别是用于跟踪节点之间路径的节点)被删除 我正在寻找一个解释,为什么即使我清楚地设置了未访问的相等节点列表,节点也会从节点列表中删除 编辑:如果有任何代码是失踪,以

我不知道如何更好地表述问题的标题,同时又不进行太多的描述,我很抱歉

无论如何,我的问题如下

我有一个列表NodeList和一个名为Unvisited的二级列表


我在未访问列表上使用GetPath方法(它是Dijkstra的Pathfidning算法的一个实现)。但由于某种奇怪的原因,当我绘制存储在节点列表中的节点中的纹理时,一些节点(特别是用于跟踪节点之间路径的节点)被删除

我正在寻找一个解释,为什么即使我清楚地设置了未访问的相等节点列表,节点也会从节点列表中删除

编辑:如果有任何代码是失踪,以了解问题,询问,我会编辑

相关代码:

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);
    }
}
公共级酒店
{
公共列表节点列表;
//构造函数加载内容并初始化列表,如此处所示。
公共酒店(ContentManager内容)
{
对于(int i=0;i<5;i++)
{
客房温度=新客房(100+i,内容,新点(64+(i*64),128),新点(2,1));
nodeList.Add(新节点(临时,新点(64+(i*64),128));
}
//在某些节点之间添加边
对于(int i=0;i<4;i++)
{
AddEdge(节点列表[i].Room.RoomId,节点列表[i+1].Room.RoomId,2);
}
来宾=新来宾(内容);
guest.Setpath(100104,节点列表);
}
}
类寻路
{
未经访问的公开名单;
访问公众名单;
私有堆栈_temp=新堆栈();
公共堆栈GetPath(内部startroom、内部finalroom、列表节点列表)
{
未访问=节点列表;
节点startNode=Unvisited.DefaultIfEmpty(null).FirstOrDefault(x=>x.Room.RoomId==startroom);
节点finalNode=Unvisited.DefaultIfEmpty(null).FirstOrDefault(x=>x.Room.RoomId==finalroom);
if(startNode==null | | finalNode==null)
{
WriteLine(“至少一个节点不存在”);
返回null;
}
起始节点距离=0;
节点currentNode=startNode;
而(!IsVisited(currentNode,finalNode))
{
currentNode=未访问的聚合((l,r)=>l.距离
缺陷的可视化表示
没有打开pathfinder,您的问题就在这里:

Unvisited = nodeList;
这就是问题所在,我已经查看了整个解决方案,没有一个地方可以从节点列表中删除节点。从列表中删除的任何内容都是从未访问列表中删除的…:

在该赋值之后,从未访问列表中删除的任何内容都将从节点列表中删除。列表是一种引用类型,所以当您通过赋值更改其值时,实际上是在更改它引用的对象。Unvisited和nodeList在此之后都引用同一个对象。为了避免这种情况,请使用旧列表实例化新列表,而不是将两个列表分配给同一引用:

Unvisited = new List<Node>(nodeList);
Unvisited=新列表(节点列表);

“但由于某种奇怪的原因,当我在节点列表中绘制存储在节点中的纹理时,列出了一些节点(特别是用于跟踪节点之间路径的节点)。”我认为你错过了那句话的结尾;“删除”可能?列出程序中删除节点的每个位置。其中一个正在从错误的列表中删除。现在找出哪一个。你可以考虑改写你的算法来使用不可变的列表;这是一种强大的技术,可以确保您永远不会出现由列表突变引起的bug;没有列表突变。我没有完成那句话。事实上,我的大脑运行得太快了,哈哈。至于Eric的回复,我在代码中的每个地方都发布了从列表中删除节点的信息,只有算法会列出突变。我没有固定列表的经验,在我第二年还是一名学生,所以我想稍后的课程中会教授,我们可能需要看看酒店课程在哪里使用。显示的代码中没有任何内容可以从节点列表中删除。哦,我的天哪!非常感谢。这正是问题所在!我确实从来没有自己初始化过这个列表,因此我从
NodeList
中删除了它。谢谢你的解释:)