System.ArgumentOutOfRangeException:参数超出范围.最短路径算法中的错误

本文关键字:算法 最短路径 错误 范围 ArgumentOutOfRangeException 参数 System | 更新日期: 2023-09-27 18:29:08

我正试图解决一个问题。此程序包含图形中的所有边。从来源到目的地的最短路径是找出。我有一个名为dotest的函数,如下所示。

 public void dotest()
    {
        List<edge> tlist;
        Int32  x;
        setall();
        Int32 ind;
        foreach (edge e1 in alltest)
        {
            tlist = new List<edge>(alledge);
            ind = 0;
            foreach (edge e2 in tlist)
            {
                if (e2.s == e1.s && e2.d == e1.d)
                {
                    break;
                }
                ind++;

            }
            tlist.RemoveAt(ind);

            x=shortpath(tlist, start, destination);
            if (x != -1)
                Console.WriteLine("{0}", x);
            else
                Console.WriteLine("Infinity");
        }

    }

描述上述代码。代码已包含所有边的列表(所有边或路径)。我有一系列的输入,其中包含要剪切的边的列表,我必须找到新更新的边列表的最短路径。我编译了我的测试用例,其中一些测试用例成功了。但对于一些测试用例,它有错误消息作为.

未处理的异常:System.ArgumentOutOfRangeException:参数超出范围。参数名称:index位于System.Collections.Generic.List 1[ch_2_3_27.Solution+edge].RemoveAt (Int32 index) [0x00000] in :0 at ch_2_3_27.Solution.dotest () [0x00000] in :0 at ch_2_3_27.Solution.Main (System.String[] args) [0x00000] in :0 [ERROR] FATAL UNHANDLED EXCEPTION: System.ArgumentOutOfRangeException: Argument is out of range. Parameter name: index at System.Collections.Generic.List 1[ch_2_3_27.Solution+edge].RemoveAt(Int32索引)[0x0000]中:0在ch_2_3_27.Solution.dotest()[0x0000]中:0在ch_2_3_27.Solution.Main(System.String[]args)[0x0000]中:0

我真的找不出错误,我认为所有其他部分都能正常工作。有人能帮忙吗??

上面的Edge(Edge)是一个成员为s、d、w(source、destination、weight all Int 32)的结构

实际上错误非常明显。您正试图从tlist中删除某个索引处的项。但是,该索引没有值。

如果我猜测的话,我会说只有当tlist中没有任何内容与(e2.s == e1.s && e2.d == e1.d)匹配时才会发生这种情况,所以你最终会在tlist数组的实际索引上得到+1。

为了进一步说明,为了简单起见,我们假设tlist有1个项,那么使用该项的索引将为0。如果If不起作用,则将设置ind++,从而将ind设置为1。当你试图从1的索引中删除时,你会得到错误,因为0索引中只有一个对象,而1索引中没有任何对象

我会把代码改成更像这个的代码

        ind = -1;
        foreach (edge e2 in tlist)
        {
            ind++;
            if (e2.s == e1.s && e2.d == e1.d)
            {
                break;
            }
        }
        if(ind != -1)
            tlist.RemoveAt(ind);

不过,我想说的是,只在if内部执行RemoveAt,这将导致修改后的集合异常,所以我相信这是最好的解决方案。

System.ArgumentOutOfRangeException:参数超出范围.最短路径算法中的错误

我建议创建一个新的边类型列表,并添加要在计算中删除的边类型。然后,一旦完成-迭代您的"删除"列表,并将它们从基本列表中删除。还要确保你有IComparable,这样你就可以比较对象并删除正确的对象。