suivant: Vigenere
monter: Corrigés des programmes
précédent: Prise en main de
Table des matières
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;
}
suivant: Vigenere
monter: Corrigés des programmes
précédent: Prise en main de
Table des matières
klaus
2010-08-05