Esempio n. 1
0
        public Form1()
        {
            InitializeComponent();

            beesUpDown.Value       = BeesAlgorithm.getBees();
            bestUpDown.Value       = BeesAlgorithm.getBest();
            eliteUpDown.Value      = BeesAlgorithm.getElite();
            iterationsUpDown.Value = BeesAlgorithm.getIterations();
            bestNeiUpDown.Value    = BeesAlgorithm.getBestNeighbourhood();
            eliteNeiUpDown.Value   = BeesAlgorithm.getEliteNeighbourhood();
            seedCheck.Checked      = BeesAlgorithm.getSeedSaving();

            beesUpDown.Minimum  = bestUpDown.Value;
            bestUpDown.Maximum  = beesUpDown.Value;
            bestUpDown.Minimum  = eliteUpDown.Value;
            eliteUpDown.Maximum = bestUpDown.Value;

            bestNeiUpDown.Maximum  = eliteNeiUpDown.Value;
            eliteNeiUpDown.Minimum = bestNeiUpDown.Value;


            chart1.Series.Clear();

            callbacks = new CallbackFields(firstLabel, finalLabel, improvementLabel, referenceLabel, errorLabel, chart1);
        }
Esempio n. 2
0
        public static void perform(CallbackFields callback)
        {
            try
            {
                clear();
                Console.WriteLine("Running algorithm with parameters:");
                Console.WriteLine("\tIterations: " + ITERATIONS_NUM);
                Console.WriteLine("\tBees: " + N_BEES);
                Console.WriteLine("\tBest: " + N_BEST_SOLUTIONS);
                Console.WriteLine("\tElite: " + N_ELITE);
                Console.WriteLine("\tBest neighbourhood: " + BEST_NEIGHBOURHOOD_SIZE);
                Console.WriteLine("\tElite neighbourhood: " + ELITE_NEIGHBOURHOOD_SIZE);
                Console.WriteLine("\tSeed: " + seed);

                CudafyModule km = CudafyTranslator.Cudafy();

                GPGPU gpu = CudafyHost.GetDevice(CudafyModes.Target, CudafyModes.DeviceId);
                gpu.LoadModule(km);

                ReadValuesFromFile("QAPexample2.txt");

                double[,] dweights   = gpu.Allocate <double>(PROBLEM_SIZE, PROBLEM_SIZE);
                double[,] ddistances = gpu.Allocate <double>(PROBLEM_SIZE, PROBLEM_SIZE);
                int[,] dpermutations = gpu.Allocate <int>(N_BEES, PROBLEM_SIZE);
                double[] dresults = gpu.Allocate <double>(N_BEES);

                int NEIGHBOURHOOD_BEES = N_ELITE * ELITE_NEIGHBOURHOOD_SIZE + N_BEST_SOLUTIONS * BEST_NEIGHBOURHOOD_SIZE;
                hneighbourhoods        = new int[NEIGHBOURHOOD_BEES, PROBLEM_SIZE];
                hnresults              = new double[NEIGHBOURHOOD_BEES];
                int[,] dneighbourhoods = gpu.Allocate <int>(NEIGHBOURHOOD_BEES, PROBLEM_SIZE);
                double[] dnresults = gpu.Allocate <double>(NEIGHBOURHOOD_BEES);

                gpu.CopyToDevice(hweights, dweights);
                gpu.CopyToDevice(hdistances, ddistances);

                //losowa inicjalizacja populacji
                GenerateRandomPermutations(0, N_BEES);

                for (int iteration = 0; iteration < ITERATIONS_NUM; iteration++)
                {
                    gpu.CopyToDevice(hpermutations, dpermutations);
                    gpu.Launch(N_BEES, 1).calcCosts(dweights, ddistances, dpermutations, dresults);
                    gpu.CopyFromDevice(dresults, hresults);

                    //posortowanie permutacji wedlug kosztow
                    hpermutations = GetSortedPermutationsArray(hpermutations, hresults);

                    maxOfIteration[iteration] = hresults[0];

                    if (bestVal > hresults[0])
                    {
                        //zapamietanie najlepszego rozwiazania
                        bestVal = hresults[0];
                        for (int i = 0; i < PROBLEM_SIZE; i++)
                        {
                            bestPerm[i] = hpermutations[0, i];
                        }
                        PrintResult("New best");
                    }

                    bestFitnesses[iteration] = bestVal;

                    //przygotowanie danych do generowania sasiedztwa elity
                    for (int i = 0; i < N_ELITE; i++)
                    {
                        for (int j = 0; j < ELITE_NEIGHBOURHOOD_SIZE; j++)
                        {
                            int row_nr = i * ELITE_NEIGHBOURHOOD_SIZE + j;
                            Array.Copy(hpermutations, i * PROBLEM_SIZE, hneighbourhoods, row_nr * PROBLEM_SIZE, PROBLEM_SIZE);
                        }
                    }

                    //przygotowanie danych do generowania sasiedztwa dobrych rozwiazan
                    for (int i = N_ELITE; i < N_ELITE + N_BEST_SOLUTIONS; i++)
                    {
                        for (int j = 0; j < BEST_NEIGHBOURHOOD_SIZE; j++)
                        {
                            int row_nr = N_ELITE * ELITE_NEIGHBOURHOOD_SIZE + (i - N_ELITE) * BEST_NEIGHBOURHOOD_SIZE + j;
                            Array.Copy(hpermutations, i * PROBLEM_SIZE, hneighbourhoods, row_nr * PROBLEM_SIZE, PROBLEM_SIZE);
                        }
                    }

                    //wygenerowanie sasiedztw (losowe zamiany w permutacjach)
                    for (int i = 0; i < N_ELITE * ELITE_NEIGHBOURHOOD_SIZE + N_BEST_SOLUTIONS * BEST_NEIGHBOURHOOD_SIZE; i++)
                    {
                        int ind1 = random.Next(PROBLEM_SIZE);
                        int ind2 = random.Next(PROBLEM_SIZE);       //TODO zapewnic zeby byly rozne?
                        int tmp  = hneighbourhoods[i, ind1];
                        hneighbourhoods[i, ind1] = hneighbourhoods[i, ind2];
                        hneighbourhoods[i, ind2] = tmp;
                    }

                    //policz wyniki dla sasiedztw
                    gpu.CopyToDevice(hneighbourhoods, dneighbourhoods);
                    gpu.Launch(NEIGHBOURHOOD_BEES, 1).calcCosts(dweights, ddistances, dneighbourhoods, dnresults);
                    gpu.CopyFromDevice(dnresults, hnresults);

                    //posortuj wyniki dla wszystkich sasiedztw
                    hneighbourhoods = GetSortedNeibhbourhoodsArray(hneighbourhoods, hnresults);

                    //wybierz najlepsze permutacje z sasiedztw elity
                    for (int i = 0; i < N_ELITE; i++)
                    {
                        int i_n = i * ELITE_NEIGHBOURHOOD_SIZE;
                        Array.Copy(hneighbourhoods, i_n * PROBLEM_SIZE, hpermutations, i * PROBLEM_SIZE, PROBLEM_SIZE);
                    }

                    //wybierz najlepsze permutacje z sasiedztw dobrych rozwiazan
                    for (int i = N_ELITE; i < N_ELITE + N_BEST_SOLUTIONS; i++)
                    {
                        int i_n = N_ELITE * ELITE_NEIGHBOURHOOD_SIZE + (i - N_ELITE) * BEST_NEIGHBOURHOOD_SIZE;
                        Array.Copy(hneighbourhoods, i_n * PROBLEM_SIZE, hpermutations, i * PROBLEM_SIZE, PROBLEM_SIZE);
                    }

                    //gorsze rozwiazania pomijamy - generujemy nowe losowe permutacje
                    GenerateRandomPermutations(N_ELITE + N_BEST_SOLUTIONS, N_BEES);
                }

                PrintResult("Best");

                callback.setFirstValue(bestFitnesses[0]);
                callback.setFinalValue(bestFitnesses[ITERATIONS_NUM - 1]);
                callback.setImprovementValue((bestFitnesses[0] - bestFitnesses[ITERATIONS_NUM - 1]) / bestFitnesses[0] * 100.0);
                callback.setDatapoints(bestFitnesses, maxOfIteration);
                callback.setReferenceSolution(REFERENCE_SOLUTION);
                callback.setError(Math.Abs(bestFitnesses[ITERATIONS_NUM - 1] - REFERENCE_SOLUTION) / REFERENCE_SOLUTION * 100.0);

                gpu.FreeAll();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
            Console.WriteLine("\nThe end");
        }