void ecrireGraph (char *nom, int k) { FILE *descFic = NULL; ouvrirFichier (nom, &descFic, "w"); ecrireEnTete (descFic, "p cnf ", k); for(int x=1; x<=nb_sommet(); x++) { fprintf(descFic, " %d ", x ); for(int y=0; y<=nb_sommet(); y++) { if( (est_adjacent(x,y)==1) ) { fprintf(descFic, " %d ", y); } } fprintf(descFic, " 0\n"); } fclose (descFic); }
int est_adjacent(int u, int v){ if(0< u && 0<v && u<nb_sommet()+1 && v<nb_sommet()+1){ int i,j; i=u-1; j=v-1; if((i/3==j/3) && ((i/9==j/9) || (i/9==j%3 && j/9==i%3))) return 1; if(i/3==j%3 && i/3==(j/3)%3 && j/3==i%3 && j/3==(i/3)%3) return 1; } return 0; }
int est_adjacent(int u, int v){ if(0< u && 0<v && u<nb_sommet()+1 && v<nb_sommet()+1){ int i,j,index=1; int T[nb_sommet()+1]; for(i=0;i<6-1;i++) for(j=i+1;j<6;j++) { T[index]= (1 << i) + (1 << j); index++; } return (!(T[u] & T[v])); } else return 0; }
void generateur_de_clause(int k){ int nb_var= nb_sommet() * k; int nb_clause=0; //première ligne du fichier de glucose fprintf(fichier,"%s %s %d %s\n","p","cnf",nb_var," "); //chaque_position au moins un sommet for(int j= 1 ; j<=k ; j++) { for(int i = 0; i<nb_sommet()*k; i=i+k){ fprintf(fichier,"%d ",i+j); } fprintf(fichier,"0 \n"); nb_clause++; } //au moins une extrêmité par arrête for(int i=1; i<=nb_sommet(); i++) { for(int j=1; j<=nb_sommet(); j++){ if(est_adjacent(i,j)){ for(int t=0;t<k*nb_sommet();t=t+nb_sommet()){ fprintf(fichier,"%d %d ",i+t,j+t); } fprintf(fichier,"0\n"); nb_clause++; } //pas deux sommets différents a la même position for(int j= 1 ; j<=nb_sommet()*k ; j=j+nb_sommet()) { for(int t=j; t<=j+nb_sommet()-1; t++){ for(int i=t+1; i<=j+nb_sommet()-1; i++){ fprintf(fichier,"-%d -%d 0\n",t,i); nb_clause++; } } } } } //remplissage de l'entête du fichier input de glucose fseek(fichier, 0, SEEK_SET); fprintf(fichier,"%s %s %d %d","p","cnf",nb_var,nb_clause); }
int main(int argc, char* argv[]) { int status; pid_t fork_return; fork_return = fork(); if (fork_return == 0) /* child process */ { int k; printf("Choose K : \n"); scanf("%d", &k); ecrireGraph("Graphe.in", k) ; ecrireComb("Combinaison.in", nb_sommet(), k); exit(0); } else /* parent process */ { wait(&status); char command[50]; strcpy( command, "cat Graphe.in Combinaison.in > Final.in" ); system(command); } }
void ecrireEnTete (FILE *descFic, char *mode, int k) { fprintf (descFic, "%s", mode); fprintf (descFic, "%d %d \n", nb_sommet(), nb_sommet()+comb_cal(k)); }
int comb_cal(int n) { return fact(nb_sommet()) / ( ( fact(n) ) * ( fact(nb_sommet() - n) ) ); }