所以我试图通过取长和纬度来计算每条路线的距离。我将它添加到arrayList,然后移动到下一个路由。它似乎是计算前3个的路线,但后来似乎只是继续添加第3个元素。
谁能看到我做错了什么? 这是一个非常大的功能
ArrayList<Integer> xCoords = new ArrayList<Integer>();
ArrayList<Integer> yCoords = new ArrayList<Integer>();
int fitness2 = 0;
for (List<Integer> eachChromeNew : populationShuffle){
for (int n =0; n < eachChromeNew.size();n++){
xCoords.add(geoPoints.get(n).getLongitudeE6());
yCoords.add(geoPoints.get(n).getLatitudeE6());
}
for (int c = 0; c < xCoords.size();c++){
if(c != xCoords.size()-1)
{
int x1 = xCoords.get(c);
int y1 = xCoords.get(c + 1);
int x2 = yCoords.get(c);
int y2 = yCoords.get(c + 1);
fitness2 += Math.sqrt((Math.pow(x2 - x1,2) + Math.pow(y2 - y1, 2)));
}
fitnessArrayTest.add(fitness2);
}
System.out.println("Fitness Test is: = " +fitness2);
}
这是输出
10-08 21:43:10.715: I/System.out(26785): Fitness Test is: = 669448211
10-08 21:43:10.715: I/System.out(26785): Fitness Test is: = 2092025460
10-08 21:43:10.720: I/System.out(26785): Fitness Test is: = 2147483647
10-08 21:43:10.720: I/System.out(26785): Fitness Test is: = 2147483647
10-08 21:43:10.720: I/System.out(26785): Fitness Test is: = 2147483647
10-08 21:43:10.720: I/System.out(26785): Fitness Test is: = 2147483647
修改
所以在将它改为像建议的双倍之后似乎稍微有效但似乎只是在几次之后稳步增加。这就是我的意思:
1
0-08 21:56:07.275: I/System.out(28729): Fitness Test is: = 6.694724656380861E8
10-08 21:56:07.275: I/System.out(28729): Fitness Test is: = 2.0921019557100217E9
10-08 21:56:07.275: I/System.out(28729): Fitness Test is: = 4.267888470215804E9
10-08 21:56:07.275: I/System.out(28729): Fitness Test is: = 7.196832009155435E9
10-08 21:56:07.280: I/System.out(28729): Fitness Test is: = 1.0878932572528923E10
10-08 21:56:07.280: I/System.out(28729): Fitness Test is: = 1.5314190160336267E10
10-08 21:56:07.280: I/System.out(28729): Fitness Test is: = 2.050260477257744E10
10-08 21:56:07.285: I/System.out(28729): Fitness Test is: = 2.644417640925244E10
10-08 21:56:07.285: I/System.out(28729): Fitness Test is: = 3.313890507036129E10
10-08 21:56:07.285: I/System.out(28729): Fitness Test is: = 4.0586790755903984E10
10-08 21:56:07.285: I/System.out(28729): Fitness Test is: = 4.878783346588052E10
10-08 21:56:07.285: I/System.out(28729): Fitness Test is: = 5.774203320029091E10
10-08 21:56:07.285: I/System.out(28729): Fitness Test is: = 6.744938995913514E10
10-08 21:56:07.285: I/System.out(28729): Fitness Test is: = 7.790990374241312E10
10-08 21:56:07.290: I/System.out(28729): Fitness Test is: = 8.912357455012492E10
这些E8,E9和E10出现在数字的末尾是什么?
修改
在马丁建议将它除以1000000之后,我得到了更好的答案范围,但是我知道另一个,并且希望是最后一个问题。这就是每次健身都会增加,而我所期待的是随机顺序。这是新输出
10-08 22:18:49.990: I/System.out(2576): Fitness Test is: = 669.4690141960474
10-08 22:18:49.995: I/System.out(2576): Fitness Test is: = 2092.0939129186613
10-08 22:18:49.995: I/System.out(2576): Fitness Test is: = 4267.874696167842
10-08 22:18:49.995: I/System.out(2576): Fitness Test is: = 7196.8113639435915
10-08 22:18:49.995: I/System.out(2576): Fitness Test is: = 10878.903916245905
10-08 22:18:50.000: I/System.out(2576): Fitness Test is: = 15314.152353074784
10-08 22:18:50.005: I/System.out(2576): Fitness Test is: = 20502.556674430216
10-08 22:18:50.005: I/System.out(2576): Fitness Test is: = 26444.116880312213
10-08 22:18:50.005: I/System.out(2576): Fitness Test is: = 33138.83297072078
10-08 22:18:50.005: I/System.out(2576): Fitness Test is: = 40586.70494565593
10-08 22:18:50.010: I/System.out(2576): Fitness Test is: = 48787.73280511766
10-08 22:18:50.010: I/System.out(2576): Fitness Test is: = 57741.916549105954
10-08 22:18:50.010: I/System.out(2576): Fitness Test is: = 67449.25617762083
10-08 22:18:50.010: I/System.out(2576): Fitness Test is: = 77909.75169066226
10-08 22:18:50.010: I/System.out(2576): Fitness Test is: = 89123.40308823026
10-08 22:18:50.010: I/System.out(2576): Fitness Test is: = 101090.21037032483
10-08 22:18:50.010: I/System.out(2576): Fitness Test is: = 113810.17353694596
10-08 22:18:50.015: I/System.out(2576): Fitness Test is: = 127283.29258809367
10-08 22:18:50.015: I/System.out(2576): Fitness Test is: = 141509.56752376774
现在有人能看到任何错误吗?
答案 0 :(得分:4)
问题是你正在使用int
作为fitness2
变量,并且你正在达到它可以处理的上限。鉴于您正在处理具有固有浮点的大数字,为什么不使用double
呢?
您所看到的效果是一种奇特的效果组合,主要是因为您在+=
运算符上使用int
但右侧是double
。算术使用double
执行,但随后使用JLS section 5.1.3的规则转换回int
,当结果太大或太小时,包括此步骤:
值必须太大(大幅度或正无穷大的正值),第一步的结果是类型
int
或long
的最大可表示值。
答案 1 :(得分:0)
这里的提示是2147483647
是MAX_INT。你达到了上限。您可以尝试将fitness2更改为long以确认问题,但我不建议将其作为修复。
我建议使用double,因为Math.sqrt正在处理它。
编辑:这与您的问题无关,但请注意,当您离开赤道时,您的计算将非常不准确。经度线束起来,所以你会在东西方向上夸大距离。一个简单的解决方法是使用y坐标平均值的余弦来缩放x坐标。 [注意:这假设地球是一个完美的球体,它不是,但它会让你非常接近]
编辑2 :E8,E9等意味着* 10 ^ 8
,* 10 ^ 9
等等。因此1.0E9比1.0E8大10倍。
您的坐标为微度(每度1000000)。您可能希望将x1 x2等更改为双倍,并将值除以1000000。
编辑3 :如果您不想累积结果,则需要在每次迭代之间重置distance2
。尝试将double fitness2
移动到外部循环中。也就是说,
ArrayList<Integer> yCoords = new ArrayList<Integer>();
for (List<Integer> eachChromeNew : populationShuffle){
double fitness2 = 0;