69 lines
1.7 KiB
C
69 lines
1.7 KiB
C
#include "sub.h"
|
|
|
|
#include <stdio.h>
|
|
#include <glpk.h>
|
|
|
|
|
|
static void add_column_sp(glp_prob *lp, int *num_col_sp, int coeff) {
|
|
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, coeff);
|
|
(*num_col_sp)++;
|
|
}
|
|
|
|
|
|
void column_generator(double y[static 4], int a[static 5]) {
|
|
glp_prob *sous_prob;
|
|
int ia[1 + 1000];
|
|
int ja[1 + 1000];
|
|
double ar[1 + 1000];
|
|
/* double z, x1, x2, x3, x4; */
|
|
|
|
/* create problem */
|
|
sous_prob = glp_create_prob();
|
|
glp_set_prob_name(sous_prob, "rouleaux-parfaits");
|
|
glp_set_obj_dir(sous_prob, GLP_MAX);
|
|
|
|
/* fill problem */
|
|
glp_add_rows(sous_prob, 1);
|
|
glp_set_row_name(sous_prob, 1, "somme<=100");
|
|
glp_set_row_bnds(sous_prob, 1, GLP_UP, 0.0, 100.0);
|
|
|
|
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, y[i-1]); //on prend y1, y2, y3 puis y4 (stockés dans y[0], y[1]...)
|
|
glp_set_col_kind(sous_prob, i, GLP_IV);
|
|
ia[i] = 1;
|
|
ja[i] = i;
|
|
ar[i] = coeffs[i];
|
|
}
|
|
glp_load_matrix(sous_prob, 4, ia, ja, ar);
|
|
|
|
/* solve problem */
|
|
glp_smcp params = {0};
|
|
glp_init_smcp(¶ms);
|
|
params.msg_lev = GLP_MSG_OFF;
|
|
glp_iocp iocp = {0};
|
|
glp_init_iocp(&iocp);
|
|
iocp.msg_lev = GLP_MSG_OFF;
|
|
|
|
glp_simplex(sous_prob, ¶ms);
|
|
glp_intopt(sous_prob, &iocp);
|
|
|
|
a[0] = glp_get_obj_val(sous_prob);
|
|
a[1] = glp_mip_col_val(sous_prob, 1);
|
|
a[2] = glp_mip_col_val(sous_prob, 2);
|
|
a[3] = glp_mip_col_val(sous_prob, 3);
|
|
a[4] = glp_mip_col_val(sous_prob, 4);
|
|
|
|
/* housekeeping */
|
|
glp_delete_prob(sous_prob);
|
|
//glp_intopt(glp_prob *mip, const glp_iocp *parm);
|
|
|
|
}
|