java - 在 Java 中迭代集合时递增值时出现奇怪的错误

标签 java debugging collections

我最近写了一个在图上进行蚁群优化的程序。

下面的代码有一个我无法理解的错误。

    Map<Node, Edge> nodesLinkedToCurrentNode = a.getCurrentNode().getLinkedNodes();

    TreeMap<Double, Node> probabilitiesForNodes = new TreeMap<>();
    double totalProb = 0d;

    for (Node n : graph.values()) {
        if (!a.getVisited().contains(n)) {
            //For each node that has not yet been visited
            //calculate it's weighted probabily
            double weightedProbability
                    = (Math.pow(nodesLinkedToCurrentNode.get(n).getPheremoneLevel(), RPI))
                    * (Math.pow((double) 1 / nodesLinkedToCurrentNode.get(n).getDistance(), RHI));
            totalProb += weightedProbability;

            //Map the node to its probability
            probabilitiesForNodes.put(weightedProbability, n);
        }
    }

    double testTotalProb = 0d;
    for (Double d : probabilitiesForNodes.keySet()) {
        testTotalProb += d;
    }
    if (testTotalProb != totalProb) { <----------How can this happen??
        System.out.println("Why?");
        totalProb = testTotalProb;
    }

那个 if 语句一直在执行,我不明白为什么。

我只是递增一个值,但出于某种原因,它没有正确递增。

I made the project open source, if you want to check it out

The java file with the code in it

我用下面的代码复制了这个错误:

    TreeMap<Double, String> probabilitiesForNodes = new TreeMap<>();
    double totalProb = 0d;

    for (int i = 1; i < 10; i++) {
        //For each node that has not yet been visited
        //calulate it's weighted probabily
        double weightedProbability
                = (Math.pow(0.7 + 1 / i, 2))
                * (Math.pow((double) 1 / 30, i));
        totalProb += weightedProbability;

        String sudoNode = "node" + i;

        //Map the node to its probability
        probabilitiesForNodes.put(weightedProbability, sudoNode);
    }

    double testTotalProb = 0d;
    for (Double d : probabilitiesForNodes.keySet()) {
        testTotalProb += d;
    }
    if (testTotalProb != totalProb) {
        System.out.println("Why?");
        totalProb = testTotalProb;
    }

最佳答案

您正在处理 double 数字,因此您应该预料到这一点。具体来说,您通过迭代添加相同的 double 数字但以不同的顺序获得 totalProbtestTotalProb。由于添加 double 不是完全关联的操作,因此出现足够的差异会使相等性测试失败。

可能发生的另一件事是在同一个 Double 键上发生冲突。没有什么可以阻止两个节点具有完全相同的加权概率。因此对于初学者,您可以只检查两个集合的大小。

关于java - 在 Java 中迭代集合时递增值时出现奇怪的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31361680/

相关文章:

java - Java 中的链接字符串

c# - 在 VS 调试器中获取方法的返回值

c++ - 从gdb中模板类的成员函数打印静态变量

php - 从集合中查询关系值

java - 使用 Stack 检查括号是否平衡?

java - 我已经安装了两个服务器apache 和Tomcat。我如何删除 http ://example. com :8080 to normal url or http://example. com/folder 或 http ://example. com

java - 如何在不丢失数据包的情况下通过打洞 (STUN) UDP 发送大文件?

c++ - 索引数组快速排序调试

java - 在搜索特定值时静默捕获 ClassCastException 是否安全?

Java:测试集合中的重复对象