我最近写了一个在图上进行蚁群优化的程序。
下面的代码有一个我无法理解的错误。
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
数字但以不同的顺序获得 totalProb
和 testTotalProb
。由于添加 double 不是完全关联的操作,因此出现足够的差异会使相等性测试失败。
可能发生的另一件事是在同一个 Double
键上发生冲突。没有什么可以阻止两个节点具有完全相同的加权概率。因此对于初学者,您可以只检查两个集合的大小。
关于java - 在 Java 中迭代集合时递增值时出现奇怪的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31361680/