2

だから私は、経度と緯度をとって、私が持っている各ルートの距離を計算しようとしています. これを 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

誰かが何か間違ったことを見ることができますか?

4

2 に答える 2

4

問題は、変数に使用intしてfitness2いて、処理できる上限に達していることです。本質的に浮動小数点である大きな数を扱っていることを考えると、double代わりに使用しないのはなぜですか?

表示されている効果は、基本的には演算子で使用+=しているintが、右側がdouble. 演算は を使用して実行されますが、 JLS セクション 5.1.3のルールを使用して にdouble変換されます。これには、結果が大きすぎるか小さすぎる場合のこの手順が含まれます。int

値は大きすぎる必要があり (大きさが大きい正の値または正の無限大)、最初のステップの結果はintor型の表現可能な最大値になりますlong

于 2012-10-08T20:51:29.787 に答える
0

ここでのヒントは、2147483647MAX_INT です。上限に達しています。それが問題であることを確認するために、fitness2 を long に変更してみることができますが、修正としてはお勧めしません。

それがMath.sqrtが扱っているものであるため、doubleを使用することをお勧めします。

編集:これはあなたの質問とは関係ありませんが、赤道から離れると計算がかなり不正確になることに注意してください。経度線が集まっているため、東西方向の距離が誇張されています。これに対する簡単な修正の 1 つは、x 座標を y 座標の平均のコサインでスケーリングすることです。[注: これは、地球が完全な球体であると仮定していますが、そうではありませんが、かなり近くなります]

編集 2 : E8、E9 などは などを意味* 10 ^ 8します* 10 ^ 9。したがって、1.0E9 は 1.0E8 の 10 倍です。

座標はマイクロ度単位です (1 度あたり 1000000)。x1 x2 なども double に変更し、値を 1000000 で割ることができます。

編集 3 : 結果を蓄積するつもりがない場合は、distance2反復ごとにリセットする必要があります。外側のループに移動double fitness2 してみてください。あれは、

ArrayList<Integer> yCoords = new ArrayList<Integer>();

for (List<Integer> eachChromeNew : populationShuffle){
    double fitness2 = 0;
于 2012-10-08T20:54:00.963 に答える