データとJAVAアリコロニーアルゴリズム

次のいくつかのアリコロニーアルゴリズムの前に、質問の束とは、書き込み一つに決めました。以下のデータ。

 

 

hgghパッケージ;

輸入java.io.BufferedReader;
輸入java.io.FileInputStream;
輸入java.io.FileNotFoundException。
インポートにjava.io.IOException;
輸入java.io.InputStreamReader;
輸入java.util.Randomの。
インポートのjava.util.Vector;

インポートのjavax.naming.InitialContext;

すべてのクラス{パブリック
    静的intは= 31 cityNumある
    静的INT、M = 50;アリの//数
    静的ダブルアルファ= 1; //重要因子フェロモン
    静的二重ベータ= 5; //ヒューリスティック関数重要度因子
    静的ダブルロー= 0.1; //フェロモン蒸発率
    静的ダブルQ = 1; //定数係数
    プライベート静的ダブル[] []の距離 ; // 距離マトリックス
    プライベート静的ダブル[] [] ETA ; // ヒューリスティック関数
    プライベート静的ダブル[] [ 】タウ; //フェロモン
    プライベート静的はint [] []テーブル ; // パステーブル
    itermaxプライベート静的INT = 200;
    プライベート静的ベクトル<整数> =新しい新しいallowedCitiesベクトル<整数>(); //許可都市検索

    プライベート静的倍の長さ[];

    プライベート静的ダブルbestlength [];
    プライベート静的ランダムランダム=新しいランダム(のSystem.currentTimeMillis());

    公共の静的な無効メイン(文字列[]引数)はIOExceptionが{スロー

        //初期距離
        initDistance()。

        初期化する//ヒューリスティック機能
        initEtaを();

        //初期フェロモン
        initTau();

        //初期化パス
        initTable()。

        長さ=新しいダブル[M]。
        bestlength =新しいダブル[M]。

        以下のために(INT I 0 =; I <M、I ++){
            bestlength [I] = Double.MAX_VALUE。
        }
        //迭代
        sovle()。

        以下のために(INT iが= 0; I <M、I ++){
            System.out.printlnは(bestlength [I])。
        }
        二重TEMP = Double.MAX_VALUE。
        以下のために(INT iが= 0; I <M、I ++)
        {
            IF(TEMP> bestlength [I])
            {
                TEMP = bestlength [I]。
            }
        }
        のSystem.out.println(TEMP)。

    }

    プライベート静的ボイドsovle(){
        int型ITER = 0。

        (ITER <= itermax){ながら
            INT [] START =新しいINT [M]。
            以下のために(INT iが= 0; I <start.length; I ++){
                
                int型firstCity =にRandom.nextInt(cityNum)。
                起動[I] = firstCity。
            }

            {(; I <start.length I ++ INTがI = 0)するための
                テーブル[i]が[0] = [i]の開始。
            }

            以下のために(INT I 0 =; I <M、I ++){
                ベクトル<整数> visitedCity =新しいベクトル<整数>();
                visitedCity.add(スタート[I])。

                allowedCities.clear();
                用(int型のk = 0; K <cityNumあり、k ++){
                    allowedCities.add(K)。
                }

                用(INT 1 = J; J <cityNum; J ++){
                    //タブーリスト

                    //は、市内許可
                    allowedCities.removeAll(visitedCity)。

                    //ルーレット選択の
                    int型のターゲット= selectNextCity(visitedCity.lastElement() );

                    //パス割当て
                    テーブル[I] [J] =ターゲット。

                    visitedCity.add(ターゲット)
                }
            }

            //統計的距離
            getToalLength()。

            //更新フェロモン
            updataTau();

            //パスクリア
            )(clearTableを。

            ITER ++;
        }

    }

    プライベートの静的な無効clearTable(){
        initTable();
    }

    プライベートの静的な無効updataTau(){

        ダブル[] [] Delta_Tau =新しいダブル[cityNum] [cityNum]。
        以下のために(; I <cityNum、整数iが0 = I ++){
            ため(INT J = 0; J <cityNum; J ++){
                Delta_Tau [I] [J] = 0;
            }
        }

        以下のために(INT I 0 =; I <M、I ++){
            ため(INT J = 0; J <cityNum - 1; J ++){
                Delta_Tau [表[I] [J] [表[I] [J + 1] ] + = Q /長さ[I]。
            }
            Delta_Tau [テーブル[i]は[cityNum - 1] [表[i]が[0] + = Q /長さ[I]。
        }

        //フェロモン蒸発
        のために(INT I = 0; I <cityNum; I ++) 
        {
            ため(INT J = 0; J <cityNum; J ++){
                タウの[I] [J] =タウの[I]、[J](* 1 -のRho)+ Delta_Tau [I]、[J];
            }
        }
    }

    プライベート静的ボイドgetToalLength(){
        
        (INTはI = 0、I <M、I ++)用{
            長さ[I] = 0;
            (; - ; J ++ 1 J <cityNumのint J = 0){ための
                長さ[I] + =距離[表[I] [J] [表[I] [J + 1]。
            }
            長さ[I] + =距離[テーブル[i]は[cityNum - 1] [表[i]が[0]]。
            IF(長さ[I] <bestlength [I]){
                bestlength [I] =長さ[I]。
            }
        }
    }

    プライベート静的int型のselectNextCity(INT currentCity){
        ダブル[] P =新しいダブル[cityNum]。
        二重の合計= 0;

        //计算分母部分
        (整数I:allowedCities)用{
            和+ = Math.pow(タウ[currentCity] [i.intValue()]、アルファ)
                    * Math.pow(1.0 /距離[currentCity] [i.intValue( )]、ベータ)。
        }

        //確率行列計算
        のための(INT I = 0; I <cityNum; I ++){
            falseにブール=のフラグ;
            (整数J:allowedCities)用{
                IF(I j.intValue ==()){
                    P [I] =( Math.pow(タウの[currentCity] [I]、アルファ)*数学
                            .pow(1.0 /距離[currentCity] [I]、ベータ版))/ SUM;
                    真=へのフラグ;
                    BREAK;
                }
            }
            IF(==内のフラグをfalseに) {
                P [I] = 0.f;
            }
        }
        //ルーレットは、次の都市を選択し
        
        
        、ダブルsleectP random.nextFloat =()
        INT selectCity = 0。
        ダブルSUM1 = 0;
        以下のために(INT iが= 0; I <cityNum; I ++){
            SUM1 + = P [i]は、
            IF(SUM1> = sleectP){
                selectCity = I。
                ブレーク;
            }
        }

        selectCityを返します。
    }

    

    

    プライベート静的ボイドinitTable(){
        テーブル=新しいINT [M] [cityNum]。
        以下のために(; I <M、INT iが0 = I ++){
            ため(INT J = 0; J <cityNum; J ++){
                テーブル[I] [J] = -1。
            }
        }
    }

    プライベート静的ボイドinitTau(){
        タウ=新しいダブル[cityNum] [cityNum]。
        以下のために(; I <cityNum、整数iが0 = I ++){
            ため(INT J = 0; J <cityNum; J ++){
                タウ[I] [J] = 1。
            }
        }
    }

    プライベート静的ボイドinitEta(){
        ETA =新しいダブル[cityNum] [cityNum]。
        以下のために(; I <cityNum、整数iが0 = I ++){
            ため(INT J = 0; J <cityNum; J ++){
                IF(距離[I] [J] == 0){
                    ETA [I] [J] = 10000;
                }他{
                    ETA [I] [J] = 1 /距離[I] [J]。
                }
            }
        }

    }

    プライベートの静的な無効initDistance(){

        距離=新しいダブル[cityNum] [cityNum]。
        ダブル[] X。
        ダブル[] Y。
        文字列strbuff = NULL;
        文字列filename = "C://data.txt";
        BufferedReaderのデータ= NULL;
        試す{
            データ=新しいBufferedReaderの(新しいInputStreamReaderの(
                    新しいFileInputStreamを(ファイル名)))。
        }キャッチ(にFileNotFoundException電子){
            // TODO自動生成されたcatchブロック
            e.printStackTrace();
        }
        距離=新しいダブル[cityNum] [cityNum]。
        X =新しいダブル[cityNum]。
        Yは=新しいダブル[cityNum]。
        {(; I <cityNum I ++ INTがI = 0)するため
            //データ線、データ形式6734 1453 1を読み取る
            試み{
                strBuff data.readLine =();
            }キャッチ(IOExceptionをE){
                // TODO自動生成されたブロックキャッチ
                e.printStackTrace();
            }
            //文字切り出し
            文字列[ ] strcol strbuff.split =( "");
            X [I] =は、Double.valueOf(strcol [1]); // X座標
            、Y [i]は=は、Double.valueOf(strcol [2]); // yは座標
        }
        //距離行列の計算
        距離を擬似ユークリッド距離、10628の最適値として算出され、それは48都市を有し、ここでケーススタディとして使用att48は、距離の計算方法は同じではない、//特定の問題
        (INTため0 = I; I <cityNum - 1; I ++){
            距離[I] [I] = 0.0001; //対角線0
            用(int型J = I + 1、J <cityNum; J ++){
                ダブルRIJ =数学
                        .sqrt(((X [I] - X [J])*(X [I] - X [J])+(Y [I] - Y [J])
                                *(Y [I] - Y [J])))。
                {
                    距離[I] [J] = RIJ。
                    距離[J] [I] =距離[I] [J]。
                }
            }
            距離[cityNum - 1] [cityNum - 1] = 0.0001。
        }
    }
}
 

データパスC://data.txt:

1 1304 2312
2 3639 1315
3 4177 2244
4 3712 1399
5 3488 1535
6 3326 1556
7 3238 1229
8 4196 1004
9 4312 790
10 4386 570
11 3007 1970
12 2562 1756
13 2788 1491
14 2381 1676
15 1332 695
16 3715 1678
17 3918 2179
18 4061 2370
19 3780 2212
20 3676 2578
21 4029 2838
22 4263 2931
23 3429 1908
24 3507 2367
25 3394 2643
26 3439 3201
27 2935 3240
28 3140 3550
29 2545 2357
30 2778 2826
31 2370 2975

公開された12元の記事 ウォンの賞賛6 ビュー20000 +

おすすめ

転載: blog.csdn.net/huaweizte123/article/details/91126003