diff --git a/TP4.c b/TP4.c index eb71d76806268fcf6b88863009e013f53a384798..58f6757bda82af1efb631a9f3543fe34c1a60ae2 100644 --- a/TP4.c +++ b/TP4.c @@ -25,7 +25,8 @@ unsigned long randlu() } // génère un double aléatoire entre 0 et 1 -double randdproba() { +double randdproba() +{ return (double)rand() / (double)RAND_MAX; } @@ -49,54 +50,62 @@ void Fisher_Yates(unsigned long *tab, unsigned long size) } } -adjlist* generate_random_benchmark(unsigned long nb_nodes, double p, double q) { - if (q > p) { +adjlist *generate_random_benchmark(unsigned long nb_nodes, double p, double q) +{ + if (q > p) + { printf("paramètres de génération erronés (q > p)\nrelancez une génération\n"); exit(1); } // création du graphe à 400 noeuds et 4 communautés de 100 - // (proba p d'avoir un lien entre deux noeuds d'une même communauté) - // (proba q d'avoir un lien entre deux noeuds de deux communautés) + // (proba p d'avoir un lien entre deux noeuds d'une même communauté) + // (proba q d'avoir un lien entre deux noeuds de deux communautés) unsigned long e1 = nb_nodes; - adjlist *ret = (adjlist*) malloc(sizeof(adjlist)); + adjlist *ret = (adjlist *)malloc(sizeof(adjlist)); ret->n = nb_nodes; ret->e = 0; - ret->edges=malloc(e1*sizeof(adjlist)); + ret->edges = malloc(e1 * sizeof(adjlist)); int add_edge = 0; // création des arêtes - for (unsigned long n1 = 0; n1 < nb_nodes; n1 += 1) { - for (unsigned long n2 = n1 + 1; n2 < nb_nodes; n2 += 1) { + for (unsigned long n1 = 0; n1 < nb_nodes; n1 += 1) + { + for (unsigned long n2 = n1 + 1; n2 < nb_nodes; n2 += 1) + { add_edge = 0; - if (n1%4 == n2%4) { // n1 et n2 dans la même communauté - if (p >= randdproba()) { + if (n1 % 4 == n2 % 4) + { // n1 et n2 dans la même communauté + if (p >= randdproba()) + { add_edge = 1; } } - else { // n1 et n2 dans deux communautés différentes - if (q >= randdproba()) { + else + { // n1 et n2 dans deux communautés différentes + if (q >= randdproba()) + { add_edge = 1; } } - if (add_edge) { + if (add_edge) + { ret->edges[ret->e].s = n1; ret->edges[ret->e].t = n2; - if (++(ret->e)==e1) { + if (++(ret->e) == e1) + { e1 += nb_nodes; - ret->edges=realloc(ret->edges,e1*sizeof(edge)); + ret->edges = realloc(ret->edges, e1 * sizeof(edge)); } } } } - // création de la matrice d'adjacence associée mkadjlist(ret); return ret; } - int ajuste_label(adjlist *g, unsigned long *label, unsigned long *label_count, unsigned long node) { @@ -240,10 +249,12 @@ void output_graphe(adjlist *g, unsigned long *label, char *filename) for (unsigned long k = 0; k < tmp_nb_node; k++) { fprintf(ptr, "%li [", k); - if (label == NULL) { + if (label == NULL) + { fprintf(ptr, "color=black"); } - else { + else + { switch (label[k]) { case 0: @@ -285,7 +296,6 @@ void output_graphe(adjlist *g, unsigned long *label, char *filename) break; } } - fprintf(ptr, "]\n"); } @@ -307,27 +317,28 @@ void output_graphe(adjlist *g, unsigned long *label, char *filename) void output_graphe_clusters(char *filename, unsigned long size, double p, double q) { - if (size%4 != 0) { + if (size % 4 != 0) + { printf("not a multiple of 4\n"); return; } - unsigned long cluster_size = size/4; - + unsigned long cluster_size = size / 4; FILE *ptr; ptr = fopen(filename, "w"); fprintf(ptr, "graph D {\n"); - fprintf(ptr, "newrank=true;\n"); - // premier cluster fprintf(ptr, "subgraph cluster_0 {\nnode [color = red];\n"); - for (unsigned long i = 0; i < cluster_size; i += 1) { - for (unsigned long j = i+1; j < cluster_size; j += 1) { - if (p >= randdproba()) { + for (unsigned long i = 0; i < cluster_size; i += 1) + { + for (unsigned long j = i + 1; j < cluster_size; j += 1) + { + if (p >= randdproba()) + { fprintf(ptr, "%lu -- %lu;\n", i, j); } } @@ -336,10 +347,12 @@ void output_graphe_clusters(char *filename, unsigned long size, double p, double // second cluster fprintf(ptr, "subgraph cluster_1 {\nnode [color = blue];\n"); - fprintf(ptr, "rank=same\n"); - for (unsigned long i = cluster_size; i < 2*cluster_size; i += 1) { - for (unsigned long j = i+1; j < 2*cluster_size; j += 1) { - if (p >= randdproba()) { + for (unsigned long i = cluster_size; i < 2 * cluster_size; i += 1) + { + for (unsigned long j = i + 1; j < 2 * cluster_size; j += 1) + { + if (p >= randdproba()) + { fprintf(ptr, "%lu -- %lu;\n", i, j); } } @@ -348,9 +361,12 @@ void output_graphe_clusters(char *filename, unsigned long size, double p, double // troisieme cluster fprintf(ptr, "subgraph cluster_2 {\nnode [color = green];\n"); - for (unsigned long i = 2*cluster_size; i < 3*cluster_size; i += 1) { - for (unsigned long j = i+1; j < 3*cluster_size; j += 1) { - if (p >= randdproba()) { + for (unsigned long i = 2 * cluster_size; i < 3 * cluster_size; i += 1) + { + for (unsigned long j = i + 1; j < 3 * cluster_size; j += 1) + { + if (p >= randdproba()) + { fprintf(ptr, "%lu -- %lu;\n", i, j); } } @@ -359,22 +375,57 @@ void output_graphe_clusters(char *filename, unsigned long size, double p, double // dernier cluster fprintf(ptr, "subgraph cluster_3 {\nnode [color = orange];\n"); - for (unsigned long i = 3*cluster_size; i < 4*cluster_size; i += 1) { - for (unsigned long j = i+1; j < 4*cluster_size; j += 1) { - if (p >= randdproba()) { + for (unsigned long i = 3 * cluster_size; i < 4 * cluster_size; i += 1) + { + for (unsigned long j = i + 1; j < 4 * cluster_size; j += 1) + { + if (p >= randdproba()) + { fprintf(ptr, "%lu -- %lu;\n", i, j); } } } fprintf(ptr, "}\n"); - + fprintf(ptr, "%lu -- %lu [color = white];\n", cluster_size - 1, 2 * cluster_size); + fprintf(ptr, "%lu -- %lu [color = white];\n", 2 * cluster_size - 1, 3 * cluster_size); + + for (unsigned long i = 0; i < cluster_size; i += 1) + { + for (unsigned long j = cluster_size; j < 4 * cluster_size; j += 1) + { + if (q >= randdproba()) + { + fprintf(ptr, "%lu -- %lu;\n", i, j); + } + } + } + for (unsigned long i = cluster_size; i < 2 * cluster_size; i += 1) + { + for (unsigned long j = 2 * cluster_size; j < 4 * cluster_size; j += 1) + { + if (q >= randdproba()) + { + fprintf(ptr, "%lu -- %lu;\n", i, j); + } + } + } + for (unsigned long i = 2 * cluster_size; i < 3 * cluster_size; i += 1) + { + for (unsigned long j = 3 * cluster_size; j < 4 * cluster_size; j += 1) + { + if (q >= randdproba()) + { + fprintf(ptr, "%lu -- %lu;\n", i, j); + } + } + } + fprintf(ptr, "}"); fclose(ptr); return; } - // ----------------------------------------------------------------------------------------------------------------------------------------- int main(int argc, char **argv) @@ -382,38 +433,23 @@ int main(int argc, char **argv) if (argc < 2) { printf("un argument est attendu\n"); - srand(time(NULL)); - // TEST ZONE - printf("vous entrez dans le zone de test \\o/ \n"); - adjlist *test = generate_random_benchmark(100, 0.5, 0.01); - output_adjlist(test, "./inst_test_100_5_01.txt"); - free(test); - - test = generate_random_benchmark(400, 0.5, 0.01); - output_adjlist(test, "./inst_test_400_5_01.txt"); - free(test); - - test = generate_random_benchmark(4000, 0.5, 0.01); - output_adjlist(test, "./inst_test_4000_5_01.txt"); - free(test); - - test = generate_random_benchmark(4000, 0.8, 0.2); - output_adjlist(test, "./inst_test_4000_8_2.txt"); - free(test); - - test = generate_random_benchmark(4000, 0.7, 0.4); - output_adjlist(test, "./inst_test_4000_7_4.txt"); - free(test); - printf("random graphe généré\n"); - // unsigned long *samuh = malloc(400 * sizeof(unsigned long)); - // for (int i = 0; i < 400; i += 1) { - // samuh[i] = i%4; - // } - // output_graphe(test, samuh, "./bench_5_1.dot"); - - - output_graphe_clusters("test.dot", 100, 0.6, 0); + srand(time(NULL)); + // TEST ZONE + printf("vous entrez dans le zone de test \\o/ \n"); + + printf("random graphe généré\n"); + + adjlist *test = generate_random_benchmark(40, 0.8, 0.05); + output_adjlist(test, "./small_test.txt"); + // free(test); + + unsigned long *samuh = malloc(400 * sizeof(unsigned long)); + for (int i = 0; i < 400; i += 1) { + samuh[i] = i%4; + } + output_graphe(test, samuh, "./test.dot"); + // output_graphe_clusters("test.dot", 40, 0.6, 0.01); return 1; } diff --git a/small_test.txt b/small_test.txt index 2fc6308314ec75fd5019cc2266ba380f8a993df8..e3a0c2f5672926c075c1c120b0aaa26d314e7e60 100644 --- a/small_test.txt +++ b/small_test.txt @@ -1,25 +1,169 @@ -# Blablabla -# Maison -# Nodes: 334863 Edges: 925872 -# FromNodeId ToNodeId -0 1 -0 2 -0 3 -0 4 -1 2 -1 3 -2 3 -3 6 -4 5 -4 6 -4 7 -5 6 -5 7 -6 7 -8 9 -8 10 -8 11 -8 12 -8 13 -10 11 -12 13 \ No newline at end of file +0 4 +0 8 +0 12 +0 16 +0 20 +0 24 +0 28 +0 32 +0 36 +1 4 +1 9 +1 13 +1 17 +1 21 +1 29 +1 33 +1 37 +2 6 +2 10 +2 14 +2 22 +2 26 +2 30 +2 34 +2 38 +3 7 +3 11 +3 15 +3 19 +3 23 +3 31 +3 39 +4 8 +4 12 +4 16 +4 20 +4 28 +4 29 +4 32 +5 13 +5 21 +5 25 +5 29 +5 33 +5 37 +6 10 +6 14 +6 18 +6 22 +6 26 +6 30 +6 34 +7 11 +7 15 +7 23 +7 27 +7 31 +7 35 +7 39 +8 12 +8 16 +8 20 +8 22 +8 24 +8 28 +8 32 +9 10 +9 21 +9 27 +9 29 +9 33 +10 14 +10 18 +10 22 +10 26 +10 30 +10 34 +10 38 +11 15 +11 19 +11 23 +11 27 +11 29 +11 31 +11 35 +11 39 +12 16 +12 17 +12 20 +12 24 +12 28 +12 32 +12 36 +13 16 +13 17 +13 21 +13 25 +13 29 +13 33 +13 35 +13 37 +14 18 +14 22 +14 26 +14 30 +14 34 +15 19 +15 22 +15 27 +15 31 +15 35 +15 39 +16 28 +16 32 +16 36 +17 25 +17 33 +17 37 +18 22 +18 26 +18 28 +18 30 +18 34 +19 20 +19 23 +19 31 +19 35 +19 39 +20 24 +20 28 +20 36 +21 25 +21 29 +21 33 +21 35 +21 37 +22 26 +22 30 +22 33 +22 34 +22 38 +23 31 +23 35 +23 37 +23 39 +24 26 +24 28 +24 32 +24 36 +25 29 +25 33 +25 37 +26 28 +26 30 +26 31 +26 34 +26 38 +27 32 +27 35 +28 32 +28 36 +29 33 +29 37 +30 34 +32 36 +33 37 +34 38 +35 39 +36 37