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 }