Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <glpk.h>
- #define STRINGLENGTH 30
- // Compilation : gcc -o rouleaux rouleaux.c -I/usr/local/include -lglpk -L/usr/local/lib
- typedef struct Rouleau Rouleau;
- struct Rouleau {
- int quantite;
- int taille;
- };
- Rouleau creer_rouleau(int quantite, int taille){
- Rouleau rouleau;
- rouleau.quantite = quantite;
- rouleau.taille = taille;
- return rouleau;
- }
- void init_matrix(double *matrix_coefs,int nbrouleau){
- int tmp = 1;
- int taille = nbrouleau*nbrouleau;
- matrix_coefs[0] = 0;
- for(int i=1; i<=taille; i++){
- if(i==tmp){
- matrix_coefs[i] = 1;
- tmp = tmp + nbrouleau + 1;
- }
- else
- matrix_coefs[i] = 0;
- }
- }
- void init_row(int *nbr_rows, int nbr_row, int nbr_col){
- int taille = nbr_row*nbr_col;
- nbr_rows[0] = 0;
- for(int i=1; i<=nbr_row; i++){
- for(int j=1; j<=nbr_col; j++){
- nbr_rows[(i-1)*nbr_col+j] = i;
- }
- }
- }
- void init_column(int *nbr_rows, int nbr_row, int nbr_col){
- int taille = nbr_row*nbr_col;
- nbr_rows[0] = 0;
- for(int i=1; i<=nbr_row; i++){
- for(int j=1; j<=nbr_col; j++){
- nbr_rows[(i-1)*nbr_col+j] = j;
- }
- }
- }
- void init_obj_coefs(double *obj_coefs, int nbr_columns){
- obj_coefs[0] = 0;
- for(int i=1; i<=nbr_columns; i++)
- obj_coefs[i] = 1;
- }
- int main(int argc, char *argv[]) {
- if(argc != 2){
- printf("Usage : %s [fichier]\n", argv[0]);
- exit(0);
- }
- int largeur = 0;
- Rouleau *listerouleau;
- int tmp_taile,tmp_quantite;
- int nbrouleau = 0;
- listerouleau = malloc(nbrouleau * sizeof(Rouleau));
- FILE * fichier = fopen(argv[1],"r");
- if (fichier != NULL){
- fscanf(fichier,"%d\n",&largeur);
- while(fscanf(fichier,"%d %d\n",&tmp_quantite,&tmp_taile) == 2){
- nbrouleau++;
- listerouleau = realloc(listerouleau, nbrouleau*sizeof(Rouleau));
- listerouleau[nbrouleau-1] = creer_rouleau(tmp_quantite,tmp_taile);
- }
- }
- printf("Largeur initiale : %d\n",largeur);
- printf("Liste rouleaux :\n");
- for(int i=0; i<nbrouleau; i++){
- printf("\t%d\tRouleaux de largeur %d\n", listerouleau[i].quantite, listerouleau[i].taille);
- }
- int nbr_rows = nbrouleau;
- int nbr_columns = nbrouleau;
- int nbr_coefs = nbr_rows*nbr_columns;
- /* Tableau des coefficients de la matrice */
- double *matrix_coefs;
- matrix_coefs = malloc((nbr_coefs + 1)*sizeof(double));
- init_matrix(matrix_coefs, nbrouleau);
- double z=42;
- do{
- /* Position de chaque coefficient */
- int *row_of_coef = malloc((nbr_coefs + 1)*sizeof(int));
- init_row(row_of_coef, nbr_rows, nbr_columns);
- int *column_of_coef = malloc((nbr_coefs + 1)*sizeof(int));
- init_column(column_of_coef, nbr_rows, nbr_columns);
- /* matrix_coef[i] est le coefficient de la matrice en ligne
- row_of_coefs[i] et en colonne column_of_coefs[i].*/
- double row_bounds[] = {0, 97, 610, 395, 211}; //TODO Une fonction automatique. ne change jamais
- double *obj_coefs = malloc((nbr_columns+1) * sizeof(double));
- init_obj_coefs(obj_coefs, nbr_columns);
- /* création d'un programme linéaire */
- glp_prob *lp;
- lp = glp_create_prob();
- glp_set_prob_name(lp, "example"); /* Nommer le problème est obligatoire */
- glp_set_obj_dir(lp, GLP_MIN); /* Détermine l'objectif MIN ou MAX */
- /* Initialisation du problème */
- /* ajoute des lignes (contraintes) */
- glp_add_rows(lp, nbr_rows);
- for(int row_index = 1; row_index <= nbr_rows; row_index++) {
- char constraint_name[STRINGLENGTH];
- sprintf(constraint_name, "contrainte_PL %d", row_index);
- /* nomme la contrainte */
- glp_set_row_name(lp, row_index, constraint_name);
- glp_set_row_bnds(lp, row_index, GLP_FX, row_bounds[row_index], row_bounds[row_index]);
- }
- /* Ajoute des variables */
- glp_add_cols(lp, nbr_columns);
- for (int column_index = 1 ; column_index <= nbr_columns; column_index++){
- char variable_name[STRINGLENGTH];
- sprintf(variable_name, "x_%d", column_index);
- glp_set_col_name(lp, column_index,variable_name);
- glp_set_col_bnds(lp, column_index, GLP_LO, 0.0, 0.0);
- /* définit le coefficient de la variable dans l'objectif */
- glp_set_obj_coef(lp, column_index, obj_coefs[column_index]);
- }
- /* Chargement de la matrice */
- glp_load_matrix (lp,
- nbr_coefs,
- row_of_coef,
- column_of_coef,
- matrix_coefs);
- /* Lancer la résolution du problème */
- glp_simplex(lp, NULL);
- double *solutiondual = malloc((nbrouleau+1)*sizeof(double));
- solutiondual[0]=0;
- for(int i=1; i<=nbrouleau; i++){
- solutiondual[i] = glp_get_row_dual(lp,i);
- printf("%f ||| ", solutiondual[i]);
- }
- /*sac a dos*/
- glp_prob *sac_a_dos;
- int nbrow = 1;
- int nbcol = nbrouleau;
- int nbcoefs = nbrouleau;
- /* Tableau des coefficients de la matrice */
- double matrix_coefs_sac[] = {0, 45, 36, 31, 14};//TODO
- /* Position de chaque coefficient */
- int row_of_coef_sac[] = {0, 1, 1, 1, 1}; //TODO
- int column_of_coef_sac[] = {0, 1, 2, 3, 4}; //TODO
- /* matrix_coef[i] est le coefficient de la matrice en ligne
- row_of_coefs[i] et en colonne column_of_coefs[i].*/
- double row_bounds_sac[] = {0, 100}; //TODO Une fonction automatique.
- /*obj_coef devient solutiondual*/
- /* création d'un programme linéaire sac a dos*/
- sac_a_dos = glp_create_prob();
- glp_set_prob_name(sac_a_dos, "sac_a_dos"); /* Nommer le problème est obligatoire */
- glp_set_obj_dir(sac_a_dos, GLP_MAX); /* Détermine l'objectif MIN ou MAX */
- /* Initialisation du problème */
- /* ajoute des lignes (contraintes) */
- glp_add_rows(sac_a_dos, nbrow);
- for(int row_index = 1; row_index <= nbrow; row_index++) {
- char constraint_name_sac[STRINGLENGTH];
- sprintf(constraint_name_sac, "contrainte_sac %d", row_index);
- /* nomme la contrainte */
- glp_set_row_name(sac_a_dos, row_index, constraint_name_sac);
- glp_set_row_bnds(sac_a_dos, row_index, GLP_FX, row_bounds_sac[row_index], row_bounds_sac[row_index]);
- }
- /* Ajoute des variables */
- glp_add_cols(sac_a_dos, nbcol);
- for (int column_index = 1 ; column_index <= nbcol; column_index++){
- char variable_name[STRINGLENGTH];
- sprintf(variable_name, "y_%d", column_index);
- glp_set_col_name(lp, column_index,variable_name);
- glp_set_col_bnds(sac_a_dos, column_index, GLP_LO, 0.0, 0.0);
- /* définit le coefficient de la variable dans l'objectif */
- glp_set_obj_coef(sac_a_dos, column_index, solutiondual[column_index]);
- glp_set_col_kind(sac_a_dos, column_index, GLP_IV);
- }
- /* Chargement de la matrice */
- glp_load_matrix (sac_a_dos,
- nbcoefs,
- row_of_coef_sac,
- column_of_coef_sac,
- matrix_coefs_sac);
- /* Lancer la résolution du problème */
- glp_simplex(sac_a_dos, NULL);
- glp_intopt(sac_a_dos,NULL);
- z = glp_mip_obj_val(sac_a_dos);
- printf("solution : z = %f\n",z);
- double recup[nbrouleau];
- for(int i=0; i<nbrouleau; i++){
- recup[i] = (double) glp_mip_col_val(sac_a_dos,i+1);
- printf("%f | ",recup[i]);
- }
- printf("\n");
- if(z<1) {
- glp_delete_prob(lp);
- glp_delete_prob(sac_a_dos);
- }
- else {
- double *tmp_matrix = malloc((nbr_coefs + 1)*sizeof(double));;
- for(int i=0; i<nbr_coefs+1;i++)
- tmp_matrix[i] = matrix_coefs[i];
- matrix_coefs = realloc(matrix_coefs, ((nbr_columns+1)*nbr_rows)*sizeof(double));
- int k=1;
- matrix_coefs[0] = 0;
- for(int i=0; i<nbr_rows;i++){
- for(int j=0; j<nbr_columns; j++){
- matrix_coefs[k] = tmp_matrix[i*nbr_columns+j+1];
- if(j == nbr_columns-1){
- k++;
- matrix_coefs[k] = recup[i];
- }
- k++;
- }
- }
- nbr_columns++;
- nbr_coefs = nbr_rows*nbr_columns;
- glp_delete_prob(lp);
- glp_delete_prob(sac_a_dos);
- }
- free(row_of_coef);
- free(column_of_coef);
- free(obj_coefs);
- free(solutiondual);
- }
- while(z>1);
- /* libération du problème */
- glp_free_env();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement