public void ProcessStrategy()
        {
            //TestGPU.ActionWithClosure();
            sw.Reset();
            sw.Start(); // début de la mesure

            //Génération de la HeatMap
            heatMap.InitHeatMapData();

            //On construit le heatMap en mode multi-résolution :
            //On commence par une heatmap très peu précise, puis on construit une heat map de taille réduite plus précise autour du point chaud,
            //Puis on construit une heatmap très précise au cm autour du point chaud.
            double optimizedAreaSize;
            PointD OptimalPosition = new PointD(0, 0);
            PointD OptimalPosInBaseHeatMapCoordinates = heatMap.GetBaseHeatMapPosFromFieldCoordinates(new PointD(0, 0));

            ParallelCalculateHeatMap(heatMap.BaseHeatMapData, heatMap.nbCellInBaseHeatMapWidth, heatMap.nbCellInBaseHeatMapHeight, (float)heatMap.FieldLength, (float)heatMap.FieldHeight, (float)robotDestination.X, (float)robotDestination.Y);
            //gpuDll.GpuGenerateHeatMap("GPU_DLL_CUDA.dll", heatMap.BaseHeatMapData, heatMap.nbCellInBaseHeatMapWidth, heatMap.nbCellInBaseHeatMapHeight, (float)heatMap.FieldLength, (float)heatMap.FieldHeight, (float)robotDestination.X, (float)robotDestination.Y);
            //ParallelCalculateHeatMap(heatMap.BaseHeatMapData, heatMap.nbCellInBaseHeatMapWidth, heatMap.nbCellInBaseHeatMapHeight, (float)heatMap.FieldLength, (float)heatMap.FieldHeight, (float)robotDestination.X, (float)robotDestination.Y);

            double[] tabMax      = new double[heatMap.nbCellInBaseHeatMapHeight];
            int[]    tabIndexMax = new int[heatMap.nbCellInBaseHeatMapHeight];
            Parallel.For(0, heatMap.nbCellInBaseHeatMapHeight, i =>
                         //for (int i =0; i< heatMap.nbCellInBaseHeatMapHeight;i++)
            {
                tabMax[i]      = 0;
                tabIndexMax[i] = 0;
                for (int j = 0; j < heatMap.nbCellInBaseHeatMapWidth; j++)
                {
                    if (heatMap.BaseHeatMapData[i, j] > tabMax[i])
                    {
                        tabMax[i]      = heatMap.BaseHeatMapData[i, j];
                        tabIndexMax[i] = j;
                    }
                }
            });

            //Recherche du maximum
            double max      = 0;
            int    indexMax = 0;

            for (int i = 0; i < heatMap.nbCellInBaseHeatMapHeight; i++)
            {
                if (tabMax[i] > max)
                {
                    max      = tabMax[i];
                    indexMax = i;
                }
            }

            int maxYpos = indexMax;              // indexMax % heatMap.nbCellInBaseHeatMapWidth;
            int maxXpos = tabIndexMax[indexMax]; // indexMax / heatMap.nbCellInBaseHeatMapWidth;

            OptimalPosInBaseHeatMapCoordinates = new PointD(maxXpos, maxYpos);

            OptimalPosition = heatMap.GetFieldPosFromBaseHeatMapCoordinates(OptimalPosInBaseHeatMapCoordinates.X, OptimalPosInBaseHeatMapCoordinates.Y);

            //Si la position optimale est très de la cible théorique, on prend la cible théorique
            double seuilPositionnementFinal = 0.1;

            if (Toolbox.Distance(new PointD(robotDestination.X, robotDestination.Y), new PointD(OptimalPosition.X, OptimalPosition.Y)) < seuilPositionnementFinal)
            {
                OptimalPosition = robotDestination;
            }


            OnHeatMap(robotId, heatMap);
            SetDestination(new Location((float)OptimalPosition.X, (float)OptimalPosition.Y, (float)robotOrientation, 0, 0, 0));

            //heatMap.Dispose();
            sw.Stop(); // Fin de la mesure
            //for (int n = 0; n < nbComputationsList.Length; n++)
            //{
            //    Console.WriteLine("Calcul Strategy - Nb Calculs Etape " + n + " : " + nbComputationsList[n]);
            //}
            //Console.WriteLine("Temps de calcul de la heatMap de stratégie : " + sw.Elapsed.TotalMilliseconds.ToString("N4")+" ms"); // Affichage de la mesure
        }