diff --git a/src/master.c b/src/master.c index b092da8..daeec2e 100644 --- a/src/master.c +++ b/src/master.c @@ -1,29 +1,28 @@ #include "master.h" -#include /* C input/output */ -#include /* C standard library */ -#include /* GNU GLPK linear/mixed integer solver */ +#include +#include +#include #include #include "sub.h" -int col_num = 1; -int num_col_sp = 1; - - -static void add_column(glp_prob *lp, float coef) { +static void add_column(glp_prob *lp, float coef, int *num_col) { glp_add_cols(lp, 1); char name[10] = ""; - snprintf(name, sizeof name, "rouleau%d", col_num); - glp_set_col_name(lp, col_num, name); - glp_set_col_bnds(lp, col_num, GLP_LO, 0.0, 0.0); - glp_set_obj_coef(lp, col_num, coef); + snprintf(name, sizeof name, "rouleau%d", *num_col); + glp_set_col_name(lp, *num_col, name); + glp_set_col_bnds(lp, *num_col, GLP_LO, 0.0, 0.0); + glp_set_obj_coef(lp, *num_col, coef); - col_num++; + (*num_col)++; } + int perfect_rolls() { + int num_col = 1; + /* declare variables */ glp_prob *lp; int ia[1 + 1000] = {0}, ja[1 + 1000] = {0}; @@ -41,7 +40,7 @@ int perfect_rolls() { snprintf(name, sizeof name, "taille%d", i); glp_set_row_name(lp, 1, name); glp_set_row_bnds(lp, 1, GLP_LO, bounds[i-1], 0.0); - add_column(lp, 1.0); + add_column(lp, 1.0, &num_col); ia[i] = i; ja[i] = i; ar[i] = 1; @@ -61,7 +60,7 @@ int perfect_rolls() { /* printf("\n"); */ glp_load_matrix(lp, nb_coeffs, ia, ja, ar); - printf("col_num=%d\n", col_num); + printf("Colonne %d\n", num_col); /* solve problem */ glp_simplex(lp, ¶ms); @@ -70,27 +69,30 @@ int perfect_rolls() { y3 = glp_get_row_dual(lp, 3); y4 = glp_get_row_dual(lp, 4); - column_generator(y1, y2, y3, y4, a, num_col_sp); + puts("Résolution du sous-problème."); + column_generator(y1, y2, y3, y4, a); if (a[0] > 1) { - fputs("Après résolution du sous-problème, on ajoute : ", stdout); + printf(" Valeur de l’objectif : %d\n", a[0]); + fputs(" On ajoute : ", stdout); int i = 1; for (i = 1; i < 4; i++) { printf("%d, ", a[i]); } printf("%d\n", a[i]); - add_column(lp, 1.0); + add_column(lp, 1.0, &num_col); for (int i = 1; i < 5; i++) { - /* a[col_num, i] = a[i] */ + /* a[num_col, i] = a[i] */ nb_coeffs++; ia[nb_coeffs] = i; - ja[nb_coeffs] = col_num-1; + ja[nb_coeffs] = num_col-1; ar[nb_coeffs] = a[i]; } } else { break; } + puts("--------------------------------------------------------------------------------"); } /* recover and display results */ diff --git a/src/sub.c b/src/sub.c index e172da0..ce1bd2e 100644 --- a/src/sub.c +++ b/src/sub.c @@ -4,18 +4,18 @@ #include -static void add_column_sp(glp_prob *lp, int num_col_sp) { +static void add_column_sp(glp_prob *lp, int *num_col_sp) { glp_add_cols(lp, 1); char name[10] = ""; - snprintf(name, sizeof name, "rouleau%d", num_col_sp); - glp_set_col_name(lp, num_col_sp, name); - glp_set_col_bnds(lp, num_col_sp, GLP_LO, 0.0, 0.0); - glp_set_obj_coef(lp, num_col_sp, 1.0); - num_col_sp++; + snprintf(name, sizeof name, "rouleau%d", *num_col_sp); + glp_set_col_name(lp, *num_col_sp, name); + glp_set_col_bnds(lp, *num_col_sp, GLP_LO, 0.0, 0.0); + glp_set_obj_coef(lp, *num_col_sp, 1.0); + (*num_col_sp)++; } -void column_generator(int y1, int y2, int y3, int y4, int a[static 4], int num_col_sp) { +void column_generator(int y1, int y2, int y3, int y4, int a[static 4]) { glp_prob *sous_prob; int ia[1 + 1000]; int ja[1 + 1000]; @@ -32,11 +32,11 @@ void column_generator(int y1, int y2, int y3, int y4, int a[static 4], int num_c glp_set_row_name(sous_prob, 1, "taille0"); glp_set_row_bnds(sous_prob, 1, GLP_UP, 0.0, 100.0); - num_col_sp = 1; + int num_col_sp = 1; const double coeffs[] = {45.0, 36.0, 31.0, 14.0}; for (int i = 1; i < 5; i++) { - add_column_sp(sous_prob, num_col_sp); + add_column_sp(sous_prob, &num_col_sp); glp_set_col_kind(sous_prob, i, GLP_IV); ia[i] = 1; ja[i] = i; @@ -61,7 +61,6 @@ void column_generator(int y1, int y2, int y3, int y4, int a[static 4], int num_c a[3] = glp_mip_col_val(sous_prob, 3); a[4] = glp_mip_col_val(sous_prob, 4); - printf("a1 = %d; a2 = %d; a3 = %d; a4 = %d\n", a[1], a[2], a[3], a[4]); /* housekeeping */ glp_delete_prob(sous_prob); //glp_intopt(glp_prob *mip, const glp_iocp *parm); diff --git a/src/sub.h b/src/sub.h index 5b315c3..bf2d669 100644 --- a/src/sub.h +++ b/src/sub.h @@ -2,7 +2,7 @@ #define SUB_H -void column_generator(int y1, int y2, int y3, int y4, int a[static 4], int num_col_sp); +void column_generator(int y1, int y2, int y3, int y4, int a[static 4]); #endif