1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
   | double distance(double ville1[][2], double ville2[][2], short i, short j)
{
double calcX,calcY,calc;
 
calcX = ville1[i][0]-ville2[j][0]; 			//distance entre les abscisses/ordonnées des points
calcY = ville1[i][1]-ville2[j][1];
calc = sqrt((pow(calcX,2) + pow(calcY,2))); //distance total entre 2 points
return calc;
}
 
 
 
void rech_loc(double ville[][2])
{
double II1, JJ1, IJ, I1J1, val, taille=0, best, essai, essai_faire, temp=8000, temp_min=5, dE;
short i, I=0, I1, J=0, J1, flag=0;			 //vecteur I et J
 
essai = pow((VILLE/2),2);
 
for(i=0;i<VILLE;i++)					 //save de lancien parcour
       {
        ville_dep[i][0]=ville[i][0];
        ville_dep[i][1]=ville[i][1];
        }
 
while(temp > temp_min)
        {
        for(essai_faire=0;essai_faire < essai;essai_faire++)
                {
                best=energie(ville);
 
                while(!flag)
                        {
                        I=rand() %VILLE-1;
                        J=rand() %VILLE-1;
 
                        if (I!=J)
                                flag=1;
                        }
 
                        I1=I+1;
                        J1=J+1;
 
                val = ville[I1][0];							//maj du tableau des points
                ville[I1][0] = ville[J][0];
                ville[J][0] = val;
 
                val = ville[I1][1];
                ville[I1][1] = ville[J][1];
                ville[J][1] = val;
 
                taille=energie(ville);
 
                dE=taille-best;							   //delta de l'"energie" finale apres modification
 
                if(dE<0 || recuit(dE, temp))
                        {
                        CanvasClear (VCOM, VCOM_CANVAS, VAL_ENTIRE_OBJECT);
                        for(i=0;i<VILLE-1;i++)		  //retrace le nouveau chemin
                                {
 
				//Sleep(500);
 
                                CanvasDrawLine (VCOM, VCOM_CANVAS,
                                        MakePoint(ville[i][0], ville[i][1]),
                                        MakePoint(ville[i+1][0], ville[i+1][1]));
 
                                CanvasDrawRect (VCOM, VCOM_CANVAS,
                                        MakeRect (ville[i][1],ville[i][0],3,3),
                                        VAL_DRAW_INTERIOR);
 
                                }
                        for(i=0;i<VILLE;i++)					 //save du nouveau parcour
                                {
                                ville_dep[i][0]=ville[i][0];
                                ville_dep[i][1]=ville[i][1];
                                }
 
                        }
                    else
			{
                        for(i=0;i<VILLE;i++)
                                {
                                ville[i][0]=ville_dep[i][0];		  //chargement de l'ancien parcour
                                ville[i][1]=ville_dep[i][1];
                                }
                         }
 
 
                SetCtrlVal (VCOM, VCOM_DISTANCE, best);
                }
        temp = temp * 0.999;
        SetCtrlVal (VCOM, VCOM_TEMP, temp);	
        }
 
}
 
 
double energie(double ville[][2])
{
int i;
double energie=0;
for(i=0;i<VILLE-1;i++)
        energie=energie + distance(ville,ville,i,i+1);
energie = energie + distance(ville, ville, VILLE-1, 0);
return energie;
}
 
 
double recuit(double dE, double temp)
{
double aleat;
 
aleat = (rand()%1000)*0.001;
if(aleat <= exp(-dE/temp))
        return 1;
else
        return 0;
} | 
Partager