next up previous contents
suivant: Vigenere monter: Corrigés des programmes précédent: Prise en main de   Table des matières

Le plus beau métier du monde

notes.c


#include<stdio.h>
#include"glpk.h"

#define N 10

double sommeTab(double* t, int n)
{
  if (n == 0)
    return 0.;
  return *t + sommeTab(t+1, n-1);
}

void question1(double *notesPartiel, double* notesCC1, double* notesCC2) 
{
  double coeffs[4];
  int rows[4], cols[4];
  LPX* lp;
  int k = 1;
  lp = lpx_create_prob();
  lpx_set_obj_dir(lp, LPX_MAX);
  lpx_add_cols(lp, 3);
  lpx_set_obj_coef(lp, 1, sommeTab(notesPartiel, N)/N);
  lpx_set_obj_coef(lp, 2, sommeTab(notesCC1, N)/N);
  lpx_set_obj_coef(lp, 3, sommeTab(notesCC2, N)/N); 
  for(k = 1 ; k <= 3 ; k++)
    lpx_set_col_bnds(lp, k, LPX_DB, 0.0, 1.0);
  lpx_add_rows(lp, 1);  
  lpx_set_row_bnds(lp, 1, LPX_UP, 0.0, 1.0);
  for(k = 1 ; k <= 3 ; k++)
    {
      rows[k]=1; cols[k]=k; coeffs[k] = 1.0 ; 
    }
  lpx_load_matrix(lp, 3, rows, cols, coeffs);
  lpx_simplex(lp);
  lpx_get_obj_val(lp);
  for(k = 1 ; k <= 3 ; k++)
    printf("coeff %d is %lf\n", k, lpx_get_col_prim(lp, k)); 
  lpx_delete_prob(lp);
}

void question2(double *notesPartiel, double* notesCC1, double* notesCC2) 
{
  double coeffs[4];
  int rows[4], cols[4];
  LPX* lp;
  int k = 1;
  lp = lpx_create_prob();
  lpx_set_obj_dir(lp, LPX_MAX);
  lpx_add_cols(lp, 3);
  lpx_set_obj_coef(lp, 1, sommeTab(notesPartiel, N)/N);
  lpx_set_obj_coef(lp, 2, sommeTab(notesCC1, N)/N);
  lpx_set_obj_coef(lp, 3, sommeTab(notesCC2, N)/N); 
  lpx_set_col_bnds(lp, 1, LPX_DB, 0.5, 1.0);
  for(k = 2 ; k <= 3 ; k++)
    lpx_set_col_bnds(lp, k, LPX_DB, 0.1, 1.0);
  lpx_add_rows(lp, 1);  
  lpx_set_row_bnds(lp, 1, LPX_UP, 0.0, 1.0);
  for(k = 1 ; k <= 3 ; k++)
    {
      rows[k]=1; cols[k]=k; coeffs[k] = 1.0 ; 
    }
  lpx_load_matrix(lp, 3, rows, cols, coeffs);
  lpx_simplex(lp);
  lpx_get_obj_val(lp);
  for(k = 1 ; k <= 3 ; k++)
    printf("coeff %d is %lf\n", k, lpx_get_col_prim(lp, k));
  lpx_delete_prob(lp);
}

void question3(double *notesPartiel, double* notesCC1, double* notesCC2) 
{
  double coeffs[4*(N+1) + 1];
  int rows[4*(N+1) + 1], cols[4*(N+1) + 1];
  LPX* lp;
  int eleveIndex, coeffIndex = 1, i;
  lp = lpx_create_prob();
  lpx_set_obj_dir(lp, LPX_MAX);
  lpx_add_cols(lp, 4);
  lpx_set_obj_coef(lp, 1, 1.);
  lpx_set_col_bnds(lp, 1, LPX_FR, 0.0, 0.0);
  lpx_set_col_bnds(lp, 2, LPX_DB, 0.5, 1.);
  lpx_set_col_bnds(lp, 3, LPX_DB, 0.1, 1.);
  lpx_set_col_bnds(lp, 4, LPX_DB, 0.1, 1.);
  lpx_add_rows(lp, N+1);
  for(eleveIndex = 0 ; eleveIndex < N ; eleveIndex++)
    {
      rows[coeffIndex]=eleveIndex + 1; 
      cols[coeffIndex]=1; 
      coeffs[coeffIndex] = 1.0 ; 
      coeffIndex++;
      rows[coeffIndex]=eleveIndex + 1; 
      cols[coeffIndex]=2; 
      coeffs[coeffIndex] = -*(notesPartiel + eleveIndex) ; 
      coeffIndex++;    
      rows[coeffIndex]=eleveIndex + 1; 
      cols[coeffIndex]=3; 
      coeffs[coeffIndex] = -*(notesCC1 + eleveIndex) ; 
      coeffIndex++;
      rows[coeffIndex]=eleveIndex + 1; 
      cols[coeffIndex]=4;  
      coeffs[coeffIndex] = -*(notesCC2 + eleveIndex) ; 
      coeffIndex++;
      lpx_set_row_bnds(lp, eleveIndex + 1, LPX_UP, 0.0, 0.0);
    }
  for(i = 2; i <= 4; i++)
    {
      rows[coeffIndex] = N+1 ; 
      cols[coeffIndex] = i; 
      coeffs[coeffIndex] = 1.0 ; 
      coeffIndex++;
    }
  lpx_set_row_bnds(lp, N+1, LPX_DB, 0.0, 1.0);
  lpx_load_matrix(lp, coeffIndex - 1, rows, cols, coeffs);
  lpx_simplex(lp);
  lpx_get_obj_val(lp);
  for(i = 2 ; i <= 4 ; i++)
    printf("coeff %d is %lf\n", i-1, lpx_get_col_prim(lp, i));
  lpx_print_prob(lp, "question3.lpx");
  lpx_delete_prob(lp);
}

int main()
{
  double notesPartiel[N] = {10, 13,  2, 4.5,  9, 12, 16,  8, 5, 12};
  double notesCC1[N] =     {11, 16, 11,   8, 10, 11, 11,  6, 4, 13};
  double notesCC2[N] =     { 9, 18,  7,   8, 11, 3,  13, 10, 7, 19};
  printf("QUESTION 1\n----------\n");
  question1(notesPartiel, notesCC1, notesCC2);
  printf("QUESTION 2\n----------\n");
  question2(notesPartiel, notesCC1, notesCC2);
  printf("QUESTION 3\n----------\n");
  question3(notesPartiel, notesCC1, notesCC2);
 return 0;
}


next up previous contents
suivant: Vigenere monter: Corrigés des programmes précédent: Prise en main de   Table des matières
klaus 2010-08-05