void keyboard_CB(unsigned char key, int x, int y) { // fprintf(stderr,"key=%d\n",key); switch(key) { case 27 : exit(1); break; case 'z' : I_zoom(img,2.0); break; case 'Z' : I_zoom(img,0.5); break; case 'i' : I_zoomInit(img); break; case 'q' : Supprime(img); break; // texturing //case 's' : I_Black_And_White(img); break; // Affichage en noir et blanc de l'image case 's' : Creer_PPM(img,0); break; case 'd' : I_Binarisation_auto(img); break; // Binarisation par seuil de 0.5 case 'f' : Creer_PPM(ZoneCarte(img),0); break; case 'g' : carte = ZoneCarte(img); detection_carte = DetectionCarte(carte); printf("Valeur trouvée : %d\n",detection_carte); break; case 'h' : numero_fichier = 1; printf("Entrez le nombre d'images à parcourir\n"); scanf("%d", &nombre_images); for(i=1;i<=nombre_images;i++) { sprintf(nom_fichier,"data/%08d.jpg",numero_fichier); curr_img = I_read(nom_fichier); carte = ZoneCarte(curr_img); detection_carte = DetectionCarte(carte); printf("Image numéro %d, Valeur trouvée : %d\n", i, detection_carte); if (detection_carte > 30000) { Creer_PPM(carte,numero_fichier); I_tesseract(carte); Creer_PPM2(carte,numero_fichier); printf("Image numéro %d créée\n",numero_fichier); } free(curr_img); free(carte); numero_fichier++; } break; case 't' : I_tesseract(img); break; // Transformation pour ameliorer la detection de tesseract //case 'f' : matrice_composante = I_Composante_4Connexe_Pile(img); break; // Matrice de composantes 4-connexes //case 'g' : matrice_composante = I_Composante_8Connexe_Pile(img); break; // Matrice de composantes 8-connexes default : fprintf(stderr,"keyboard_CB : %d : unknown key.\n",key); } glutPostRedisplay(); }
void LR(int *M, int m, int n, TypeCellule **U, TypeCellule** PI,int l, int d) { int i,j; int picked=0; // le numero du job que on selecte apairtir du U int k=0,it=0,at=0,xi=INT_MAX; //k est le nb des jobs qui est dans PI, it est idletime, at=C_m+C_lamda, xi est le resultat de la fonction d'index int K[m]; //initiale du K, K est une tableau de 3 , K[i] pour machine i int J[m]; // pour calculer le Cm pour le job courant float Lamda[m],moyenne; //Lamda est un tableau du 3, pour calculer le Cm pour le job lamda (qui est le moyenne des job U-{j}) TypeCellule * L=NULL; //U est une liste pour les jobs dont l'ordre est pas encore déterminé TypeCellule * p=NULL,* pp=NULL, *ppp=NULL; //pointeurs servent à l'itération for(i=0;i<m;i++)K[i]=0; k=0; for(i=0;i<n;i++)*U=Append(*U,i,1000); p=*U; while(p!=NULL) //pour chaque element dans U { j=p->job[0]; //job[0] est le numero du job courant, job[1] est Cm du job courant it=0; at=0; for(i=0;i<m;i++) //initiation du tableau J { J[i]=*(M+i*n+j); Lamda[i]=0; } pp=*U; moyenne=0; //nb des jobs (sauf job j) dans U /*l'initiation du tableau Lamda*/ while(pp!=NULL) { if(pp->job[0]==j)pp=pp->suivant; else { moyenne++; for(i=0;i<m;i++) { Lamda[i]+=(int)(*(M+i*n+pp->job[0])); } pp=pp->suivant; } } if(moyenne>0) { for(i=0;i<m;i++) { Lamda[i]=Lamda[i]/moyenne; } } /* Fin de l'initiation du tableau Lamda*/ /*Mis a jour du tableau J et tableau Lamda*/ J[0]+=K[0]; Lamda[0]+=J[0]; for(i=1;i<m;i++) { if(K[i]<J[i-1]) { it+=(m*(J[i-1]-K[i]))/((i+1)+k*(m-i-1)/(n-2)); //on calcule le idle time for job j J[i]+=J[i-1]; //mis a jour le temps de finir pour le job j dans la machine i } else { it+=(m*0)/((i+1)+k*(m-i-1)/(n-2)); J[i]=K[i]+J[i]; } if(J[i]<Lamda[i-1])Lamda[i]+=Lamda[i-1]; else Lamda[i]+=J[i]; } at=J[m-1]+Lamda[m-1]; ////mis a jour le temps de finir pour le job lamda dans la machine i p->job[1]=(n-k-2)*it+at; p=p->suivant; } L = Tri(*U); ppp=L; for(i=0;i<l;i++) { if(ppp->suivant!=NULL) ppp=ppp->suivant; } picked=ppp->job[0]; Liveration(&L); L = NULL; /*mis a jour du tableau K*/ K[0]=(int)*(M+0*n+picked); //tableau K conserve le Ci de les k jobs (dont l'ordre est determine) for(i=1;i<m;i++) { if(K[i]<K[i-1])K[i]=K[i-1]+(int)(*(M+i*n+picked)); else K[i]=(int)(*(M+i*n+picked)); } *U=Supprime(*U,picked); //on supprime le job selecté dans U *PI=Append(*PI,picked,K[m-1]); //on ajoute le job seletcé dans PI k++; // l'algo commence while(k<d) { xi=INT_MAX; p=*U; while(p!=NULL) //pour chaque element dans U { j=p->job[0]; //job[0] est le numero du job courant, job[1] est Cm du job courant it=0; at=0; for(i=0;i<m;i++) //initiation du tableau J { J[i]=*(M+i*n+j); Lamda[i]=0; } pp=*U; moyenne=0; //nb des jobs (sauf job j) dans U /*l'initiation du tableau Lamda*/ while(pp!=NULL) { if(pp->job[0]==j)pp=pp->suivant; else { moyenne++; for(i=0;i<m;i++) { Lamda[i]+=(int)(*(M+i*n+pp->job[0]));//M[i][pp->job[0]]; } pp=pp->suivant; } } if(moyenne>0) { for(i=0;i<m;i++) { Lamda[i]=Lamda[i]/moyenne; } } /* Fin de l'initiation du tableau Lamda*/ /*Mis a jour du tableau J et tableau Lamda*/ J[0]+=K[0]; Lamda[0]+=J[0]; for(i=1;i<m;i++) { if(K[i]<J[i-1]) { it+=(m*(J[i-1]-K[i]))/((i+1)+k*(m-i-1)/(n-2)); //on calcule le idle time for job j J[i]+=J[i-1]; //mis a jour le temps de finir pour le job j dans la machine i } else { it+=(m*0)/((i+1)+k*(m-i-1)/(n-2)); J[i]=K[i]+J[i]; } if(J[i]<Lamda[i-1])Lamda[i]+=Lamda[i-1]; else Lamda[i]+=J[i]; } at=J[m-1]+Lamda[m-1]; ////mis a jour le temps de finir pour le job lamda dans la machine i p->job[1]=(n-k-2)*it+at; if(p->job[1]<xi) { xi=p->job[1]; //on calcule le resultat de la fonction d'index picked=j; // on prend le job qui a le plus petite valeur du xi } p=p->suivant; //on passe à la job suivant qui est dans U } /*mis a jour du tableau K*/ /*Modif Comme LR.c OK*/ K[0]+=(int)(*(M+0*n+picked)); //tableau K conserve le Ci de les k jobs (dont l'ordre est determine) /*fin comme lr.c*/ for(i=1;i<m;i++) { if(K[i]<K[i-1]) { K[i]=K[i-1]+(int)(*(M+i*n+picked)); } else K[i]=K[i]+(int)(*(M+i*n+picked)); } *U=Supprime(*U,picked); //on supprime le job selecté dans U *PI=Append(*PI,picked,K[m-1]); //on ajoute le job seletcé dans PI k++; } }