bonjour, j'ai un exercice a faire en GNU MathProg, dont l'énoncé est :

Une grande entreprise désire ouvrir des nouveaux entrepôts pour desservir ses centrales d’achat. Chaque nouvelle
implantation d’un entrepôt a un coût fixe et permet de livrer les centrales d’achat à proximité du site. Chaque
livraison effectuée a donc un coût qui dépend de la distance à parcourir. On dispose de 12 sites pour construire les
entrepôts et de 12 centrales d’achat à desservir. Le tableau ci-dessous donne le coût (en k=C) de livraison d’une
centrale d’achat (en ligne) par un des entrepôts (en colonne). Certaines livraisons impossibles dont matérialisées par N.
1 2 3 4 5 6 7 8 9 10 11 12
1 100 80 50 50 60 100 120 90 60 70 65 110
2 120 90 60 70 65 110 140 110 80 80 75 130
3 140 110 80 80 75 130 160 125 100 100 80 150
4 160 125 100 100 80 150 190 150 130 N N N
5 190 150 130 N N N 200 180 150 N N N
6 200 180 150 N N N 100 80 50 50 60 100
7 100 80 50 50 60 100 120 90 60 70 65 110
8 120 90 60 70 65 110 140 110 80 80 75 130
9 140 110 80 80 75 130 160 125 100 100 80 150
10 160 125 100 100 80 150 190 150 130 N N N
11 190 150 130 N N N 200 180 150 N N N
12 200 180 150 N N N 100 80 50 50 60 100

Par ailleurs, pour chaque entrepôt, on dispose des informations suivantes : un coût fixe de construction à inclure
dans la fonction objectif et une capacité limitée. De plus, on connaît la demande de chaque client de manière
précise. Ces informations sont regroupées dans le tableau ci-dessous. Dans tous les cas, la demande des clients doit
être satisfaite, mais une centrale d’achat peut être livrée par plusieurs entrepôts.

Entrepôt: 1 2 3 4 5 6 7 8 9 10 11 12
Coût : 3500 9000 10000 4000 3000 9000 9000 3000 4000 10000 9000 3500
Capacité: 300 250 100 180 275 300 200 220 270 250 230 180

Client : 1 2 3 4 5 6 7 8 9 10 11 12
Demande: 120 80 75 100 110 100 90 60 30 150 95 120

Quels entrepôts ouvrir pour minimiser le coût total de leur construction et des livraisons qu’ils devront assurer ?
Afin de répondre à cette question, nous avons posé ce problème sous la forme d’un programme linéaire,

min z= (somme de i à n) fi*yi + (somme de i à n)(somme de j à m) cij*xij
s.c. xij  <= 1
(somme de i à n) xij = 1
(somme de j à m) djxij <= cai*yi

dans lequel fi représente le coût de l’ouverture de l’entrepôt i et cij le coût de livraison d’un client j par un entrepôt i.

1. Résoudre le problème posé en modélisant le problème avec GNU MathProg.
Il sera important de faire une écriture implicite de la modélisation en utilisant deux fichiers (un pour la modélisation écrite sous une forme implicite, un pour les données du problème).Une mise en place judicieuse de cette séparation des données sera un critère important pour la notation.

2. Quelle est la solution optimale ? Quelle est sa valeur ?

j'ai donc fais ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# Déclaration des ensembles utilisés
 
 
 
	param tailleY; # nombre d'entrepots
 
	set Y := 1..tailleY; # ensemble des indices des entrepots
 
 
 
	set X dimen 2; #satisfaction
 
 
 
	param obj{Y,X}; # coefficients de la fonction objectif
 
	param coeffcontr{X}; # coefficients des membres de gauche des contraintes
 
	param mdroite{X,Y}; # coefficients des membres de droite
 
 
 
# Declaration d’un tableau de variables binaires
 
 
 
	var y{Y} binary;
 
	var x{X} >= 0;
 
 
 
# Fonction objectif
 
 
 
	minimize cout : sum{i in Y} obj[i]*y[i] + sum{i,j in X} obj[i]*obj[j]*x[ij];
 
 
 
# Contraintes
 
 
 
	s.t. cont1 : x[ij] <= 1;
 
	s.t. cont2 : sum{i in X} obj[i]*x[ij]= 1;
 
	s.t. cont3 : sum{j in X} obj[j]*x[ij]<= y[i];
 
 
 
# Resolution 
 
 
 
	solve;
 
 
 
# Affichage des resultats
 
 
 
	display : y; # affichage "standard" des variables
 
	display : "objectif : ", sum{i in Y} obj[i]*y[i] + sum{i,j in X} obj[i]*obj[j]*x[ij];
 
 
 
# Donnees numeriques
 
 
 
	data;
 
 
 
	param tailleY := 12;
 
	set Y := 1 2 3 4 5 6 7 8 9 10 11 12;
 
 
 
	set X := (1,1) (1,2) (1,3) (1,4) (1,5) (1,6) (1,7) (1,8) (1,9) (1,10) (1,11) (1,12) (2,1) (2,2) (2,3) (2,4) (2,5) (2,6) (2,7) (2,8) (2,9) (2,10) (2,11) 		(2,12) (3,1) (3,2) (3,3) (3,4) (3,5) (3,6) (3,7) (3,8) (3,9) (3,10) (3,11) (3,12) (4,1) (4,2) (4,3) (4,4) (4,5) (4,6) (4,7) (4,8) (4,9) (4,10) (4,11) 			(4,12) (5,1) (5,2) (5,3) (5,4) (5,5) (5,6) (5,7) (5,8) (5,9) (5,10) (5,11) (5,12) (6,1) (6,2) (6,3) (6,4) (6,5) (6,6) (6,7) (6,8) (6,9) (6,10) (6,11) 			(6,12) (7,1) (7,2) (7,3) (7,4) (7,5) (7,6) (7,7) (7,8) (7,9) (7,10) (7,11) (7,12) (8,1) (8,2) (8,3) (8,4) (8,5) (8,6) (8,7) (8,8) (8,9) (8,10) (8,11) 			(8,12) (9,1) (9,2) (9,3) (9,4) (9,5) (9,6) (9,7) (9,8) (9,9) (9,10) (9,11) (9,12) (10,1) (10,2) (10,3) (10,4) (10,5) (10,6) (10,7) (10,8) (10,9) 			(10,10) (10,11) (10,12) (11,1) (11,2) (11,3) (11,4) (11,5) (11,6) (11,7) (11,8) (11,9) (11,10) (11,11) (11,12) (12,1) (12,2) (12,3) (12,4) (12,5) 			(12,6) (12,7) (12,8) (12,9) (12,10) (12,11) (12,12);
 
 
 
	param obj := 1 ;
mais je suis bloquée à param obj à cause de la double somme dans la fonction objectif. Pourriez vous m'aider ?