#include <ctype.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <math.h>
#include <stdbool.h>
// Définition des structures nécessaires
typedef struct IP_problem {
int nv; // Nombre de variables
int nc; // Nombre de contraintes
double *x; // Solution
double *cost; // Coûts
char *c_type; // Type des variables
double *up_bound; // Bornes supérieures
double *low_bound; // Bornes inférieures
char **var_name; // Noms des variables
double *rhs; // Partie droite des contraintes
char *sense; // Sens des contraintes
int *rmatbeg; // Début des contraintes
int *rmatind; // Indices des contraintes
double *rmatval; // Valeurs des contraintes
int nz; // Nombre de non-zéros
char **const_name; // Noms des contraintes
int solstat; // Statut de la solution
double objval; // Valeur de l'objectif
} IP_problem;
typedef struct dataSet {
int n; // Nombre d'objets
int b; // Capacité
int g; // Capacité secondaire
int *c; // Valeurs des objets
int *a; // Poids des objets
int *f; // Poids secondaires des objets
IP_problem master; // Problème maître
} dataSet;
// Fonction pour obtenir le temps actuel
double getTime() {
struct timeval tv;
gettimeofday(&tv, NULL);
return tv.tv_sec + tv.tv_usec * 1e-6;
}
// Fonction de résolution avec CPLEX (simulation ici)
void solve_1DKP(dataSet *data) {
// Simulation d'une solution optimale
data->master.objval = 100.0; // Exemple de valeur optimale
}
// Fonction de programmation dynamique pour le 1DKP
int dynamicProgramming1DKP(int capacity, int *weights, int *values, int n) {
int i, w;
int **dp
= (int **)malloc((n
+ 1) * sizeof(int *)); for (i = 0; i <= n; i++) {
dp
[i
] = (int *)malloc((capacity
+ 1) * sizeof(int)); }
// Initialisation
for (i = 0; i <= n; i++) {
for (w = 0; w <= capacity; w++) {
if (i == 0 || w == 0) {
dp[i][w] = 0;
} else if (weights[i - 1] <= w) {
dp[i][w] = fmax(values[i - 1] + dp[i - 1][w - weights[i - 1]], dp[i - 1][w]);
} else {
dp[i][w] = dp[i - 1][w];
}
}
}
int result = dp[n][capacity];
// Libération de la mémoire
for (i = 0; i <= n; i++) {
}
return result;
}
int main(int argc, char **argv) {
int rval = 0;
char c;
char instance_file[1024];
snprintf(instance_file
, 1024, "%s", "instance3.csv");
while ((c = getopt(argc, argv, "F:h")) != EOF) {
switch (c) {
case 'F':
snprintf(instance_file
, 1024, "%s", optarg
); break;
case 'h':
fprintf(stderr
, "Usage: ./TP2 [options]\nOptions:\n\n"); fprintf(stderr
, "******** INSTANCE DATA ********\n"); fprintf(stderr
, "\t-F Instance file name to load............................(default %s).\n", instance_file
); break;
default:
}
}
// Initialisation des données
dataSet data;
data.n = 5; // Exemple : 5 objets
data.b = 10; // Capacité du sac
data.
c = (int *)malloc(data.
n * sizeof(int)); data.
a = (int *)malloc(data.
n * sizeof(int)); data.
f = (int *)malloc(data.
n * sizeof(int));
// Exemple de valeurs et poids
data.c[0] = 10; data.a[0] = 2;
data.c[1] = 20; data.a[1] = 3;
data.c[2] = 30; data.a[2] = 4;
data.c[3] = 40; data.a[3] = 5;
data.c[4] = 50; data.a[4] = 9;
double start, end;
// Résolution avec CPLEX
start = getTime();
solve_1DKP(&data);
end = getTime();
printf("Résultat CPLEX : %.2f\n", data.
master.
objval); printf("Temps CPLEX : %.4f sec\n", end
- start
);
// Résolution avec la programmation dynamique
start = getTime();
int dp_result = dynamicProgramming1DKP(data.b, data.a, data.c, data.n);
end = getTime();
printf("Résultat DP : %d\n", dp_result
); printf("Temps DP : %.4f sec\n", end
- start
);
// Comparaison des résultats
if (dp_result == (int)data.master.objval) {
printf("Les solutions sont identiques.\n"); } else {
printf("Les solutions diffèrent.\n"); }
// Libération de la mémoire
return rval;
}