colonia de hormigas algoritmo JAVA con los datos

Antes de la próxima varias algoritmo de colonia de hormigas, un montón de preguntas y decidió escribir uno. Los datos a continuación.

 

 

hggh empaquetar;

java.io.BufferedReader importación;
java.io.FileInputStream importación;
java.io.FileNotFoundException importación;
java.io.IOException importación;
java.io.InputStreamReader importación;
java.util.Random importación;
java.util.Vector importación;

javax.naming.InitialContext importación;

Todo clase {public
    static int = 31 es cityNum;
    static int m = 50; // número de hormigas
    doble alfa estática = 1; // importancia factor de feromona
    estática doble beta = 5; // función heurística importancia factor de
    estática doble rho = 0,1; // feromona evaporación factor de
    estática doble Q = 1; // coeficiente constante
    estática doble privado [] [] distancia ; // matriz de distancia
    estática doble privado [] [] eta ; // heurística función
    estática doble privado [] [ ] tau; // feromona
    static int privada [] [] tabla ; // tabla de ruta
    privada static int = 200 es itermax;
    estática privada del vector <Integer> = nuevos nuevos allowedCities el vector <Integer> (); // permitir búsqueda urbana

    estático privado de doble longitud [];

    estática privada doble bestlength [];
    private static random = new Random (System.currentTimeMillis ());

    public static void Main (args String []) throws IOException {

        // distancia initialize
        initDistance ();

        // función heurística para inicializar
        initEta ();

        // feromona initialize
        initTau ();

        // camino inicialización
        initTable ();

        Longitud = nuevo doble [m];
        bestlength = new double [m];

        for (int i = 0; i <m; i ++) {
            bestlength [i] = Double.MAX_VALUE;
        }
        //迭代
        sovle ();

        for (int i = 0; i <m; i ++) {
            System.out.println (bestlength [i]);
        }
        Doble temp = Double.MAX_VALUE;
        for (int i = 0; i <m; i ++)
        {
            si (temp> bestlength [i])
            {
                temp = bestlength [i];
            }
        }
        System.out.println (temp);

    }

    estática privada sovle void () {
        int iter = 0;

        mientras que (iter <= itermax) {
            int [] start = new int [m];
            for (int i = 0; i <start.length; i ++) {
                
                int FirstCity = random.nextInt (cityNum);
                iniciar [i] = FirstCity;
            }

            for (int i = 0; i <start.length; i ++) {
                tabla [i] [0] = iniciar [i];
            }

            for (int i = 0; i <m; i ++) {
                Vector <Integer> visitedCity = new Vector <Integer> ();
                visitedCity.add (inicio [i]);

                allowedCities.clear ();
                for (int k = 0; k <cityNum; k ++) {
                    allowedCities.add (k);
                }

                for (int 1 = J;. J <cityNum; J ++) {
                    // lista tabú

                    // permitir que la ciudad
                    allowedCities.removeAll (visitedCity);

                    // ruleta selección de rueda
                    objetivo int = selectNextCity (visitedCity.lastElement () );

                    // camino asignación
                    tabla [i] [j] = objetivo;

                    visitedCity.add (objetivo);
                }
            }

            // distancia estadística
            getToalLength ();

            // actualización feromona
            updataTau ();

            // despejar el camino
            clearTable ();

            iter ++;
        }

    }

    estática privada clearTable void () {
        initTable ();
    }

    estática privada updataTau void () {

        double [] [] Delta_Tau = new double [cityNum] [cityNum];
        for (int i = 0; i <cityNum; i ++) {
            for (int j = 0; j <cityNum; j ++) {
                Delta_Tau [i] [j] = 0;
            }
        }

        for (int i = 0; i <m; i ++) {
            for (int j = 0; j <cityNum - 1; j ++) {
                Delta_Tau [Tabla de [i] [j]] [Tabla de [i] [j + 1] ] + = Q / longitud [i];
            }
            Delta_Tau [Tabla de [i] [cityNum - 1]] [Tabla de [i] [0]] + = Q / longitud [i];
        }

        // feromona evaporación
        for (int i = 0; I <cityNum; i ++) 
        {
            for (int J = 0; J <cityNum; J ++) {
                de tau [i] [j] = de tau [i] [j] * ( . 1 - Rho) + Delta_Tau [i] [j];
            }
        }
    }

    private static void getToalLength () {
        
        for (int i = 0; i <m; i ++) {
            Longitud [i] = 0;
            for (int j = 0; j <cityNum - 1; j ++) {
                Longitud [i] + = distancia [Tabla de [i] [j]] [Tabla de [i] [j + 1]];
            }
            Longitud [i] + = distancia [Tabla de [i] [cityNum - 1]] [Tabla de [i] [0]];
            si (longitud [i] <bestlength [i]) {
                bestlength [i] = longitud [i];
            }
        }
    }

    int estática privado selectNextCity (int currentCity) {
        double [] p = new double [cityNum];
        doble suma = 0;

        //计算分母部分
        para (entero i: allowedCities) {
            suma + = Math.pow (tau [currentCity] [i.intValue ()], alfa)
                    * Math.pow (1,0 / distancia [currentCity] [i.intValue ( )], beta);
        }

        // probabilidad cálculo de matriz
        for (int i = 0; I <cityNum; i ++) {
            Bandera Boolean = En false;
            para (entero J: allowedCities) {
                si (i j.intValue == ()) {
                    P [i] = ( Math.pow (de tau [currentCity] [I], Alpha) * el Math
                            .pow (1,0 / Distancia [currentCity] [I], Beta)) / SUM;
                    En la bandera a tRUE =;
                    PAUSA;
                }
            }
            IF (== En la bandera a falso) {
                P [i] = 0.f;
            }
        }
        // ruleta seleccionar el siguiente ciudad
        
        
        doble sleectP random.nextFloat = ();
        int selectCity = 0;
        doble sum1 = 0;
        for (int i = 0; i <cityNum; i ++) {
            sum1 + = p [i];
            si (sum1> = sleectP) {
                selectCity = i;
                descanso;
            }
        }

        volver selectCity;
    }

    

    

    private static void initTable () {
        tabla = new int [m] [cityNum];
        for (int i = 0; i <m; i ++) {
            for (int j = 0; j <cityNum; j ++) {
                tabla [i] [j] = -1;
            }
        }
    }

    estático privado initTau void () {
        tau = new double [cityNum] [cityNum];
        for (int i = 0; i <cityNum; i ++) {
            for (int j = 0; j <cityNum; j ++) {
                tau [i] [j] = 1;
            }
        }
    }

    private static void initEta () {
        eta = new double [cityNum] [cityNum];
        for (int i = 0; i <cityNum; i ++) {
            for (int j = 0; j <cityNum; j ++) {
                si (distancia [i] [j] == 0) {
                    eta [i] [j] = 10000;
                } Else {
                    eta [i] [j] = 1 / distancia [i] [j];
                }
            }
        }

    }

    estática privada initDistance void () {

        distancia = new double [cityNum] [cityNum];
        doble X;
        duplicar [] y;
        Cadena strbuff = null;
        Cadena de nombre de archivo = "c: //data.txt";
        Datos BufferedReader = NULL;
        try {
            datos = new BufferedReader (nuevo InputStreamReader (
                    nuevo FileInputStream (filename)));
        } Catch (FileNotFoundException e) {
            // TODO generada automáticamente capturas bloque
            e.printStackTrace ();
        }
        Distancia = new double [cityNum] [cityNum];
        x = new double [cityNum];
        y = nuevo doble [cityNum];
        for (int i = 0; i <cityNum; i ++) {
            // leer la línea de datos, un formato de datos 6734 1453 1
            el try {
                strBuff data.readLine = ();
            } el catch (IOException e) {
                // el autogenerado TODO Bloquear la captura
                e.printStackTrace ();
            }
            // carácter segmentación
            String [ ] strcol strbuff.split = ( "");
            X [I] = Double.valueOf (. strcol [1]); // coordenada X
            y [i] = Double.valueOf (strcol [2]); // y coordenada
        }
        // calcular la matriz de distancia
        cuestiones // específicos, los métodos de cálculo de la distancia no son los mismos, aquí es att48 utilizado como un estudio de caso, tiene 48 ciudades, la distancia se calcula como la distancia pseudo-euclidiana, el valor óptimo de 10.628
        for (int 0 = I; I <cityNum - 1;. I ++) {
            Distancia [I] [I] = 0,0001; // diagonal 0
            for (int j = i + 1; j <cityNum; j ++) {
                doble rij = Math
                        .sqrt (((x [i] - x [j]) * (x [i] - x [j]) + (y [i] - y [j])
                                * (y [i] - y [j])));
                {
                    Distancia [i] [j] = rij;
                    distancia [j] [i] = distancia [i] [j];
                }
            }
            Distancia [cityNum - 1] [cityNum - 1] = 0,0001;
        }
    }
}
 

Ruta de datos 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 2,179
18 4 061 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

Publicado 12 artículos originales · ganado elogios 6 · Vistas a 20000 +

Supongo que te gusta

Origin blog.csdn.net/huaweizte123/article/details/91126003
Recomendado
Clasificación