This commit is contained in:
Laurent Fainsin 2021-11-18 17:49:43 +01:00
commit 5e2d153d9e
21 changed files with 998 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
solveurGLPK

132
docs/rapport.md Normal file
View file

@ -0,0 +1,132 @@
# Rapport de TP de Recherche Opérationnelles
<u>Instructions:</u>
- Ce qui à motivé votre choix de format (lp ou mod/dat) de la modélisation
- Quelques détails sur les points clés et non triviaux de votre modélisation (ce que représentent vos variables de décisions, une contrainte élaborée...)
- Une courte argumentation de ladéquation du résultat avec linstance résolue (la solution obtenue fait-elle sens dans le contexte défini par lénoncé ?)
- Quelques éléments danalyse, par exemple :
- Pour PL : Les matrices de ces exemples sont-elles creuses ? (Dans la pratique, il est fréquent quune contrainte ne rassemble que de 5 à 10 variables.)
## Exercice 1 : Des voitures
```bash
glpsol --lp exo1/voitures.lp -o exo1/voitures.sol
```
- Nous avons choisi d'utiliser un `.lp` pour résoudre ce problème puisque celui-ci est simple et ses données ne changent pas.
- Voici comment nous avons choisi de modéliser le problème:
- `nS` $\in \N$ modélise le nombre de voiture Standard produit par semaine.
- `nL` $\in \N$ modélise le nombre de voiture de Luxe produit par semaine.
- On cherche à maximiser `Benefice`.
- `CapaciteParking` modélise la surface maximale du parking.
- `TempsTravail` modélise le temps de travail maximal de employés.
- `LimiteLuxe` limite le nombre de voiture de Luxe produisable.
- On obtient comme solution: `nS` = 645 et `nL` = 426. Ce resultat est cohérent.
## Exercice 2 : Gestion de personnel
```bash
glpsol -m exo2/personnel.mod -d exo2/personnel.dat -o exo2/personnel.sol
```
- Nous avons choisi de modéliser ce problème en utilisant un `.mod` et un `.dat` puisque l'input de matrices de se fait plus simplement dans un `.dat`. De plus, il est dépendant de N donc il est suceptible d'évoluer doncs seul le fichier `.dat` sera à modifier car le fichier `.mod` est plus général.
- Voici comment nous avons choisi de modéliser le problème:
- $($`perm`$)_{i,j} \in M_2(\{0,1\})$ modélise l'association d'un travail à une personne.
- `perm` modélise les association qui doivent être uniques ; donc c'est une matrice de permutation. (ie. chaque ligne et chaque colonne ne doit contenir un seul 1)
- Pour les données que l'on a fournis, on obtient la solution :
$\left(
\begin{array}{cccc}
1 & 0 & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 0 & 1
\end{array}
\right)$
Cette solution est bien la meilleur solution car chaque personne est associé au travail ou il est le plus efficace en vu des paramètres que nous avions posés.
## Exercice 3 : En bourse
```bash
glpsol --lp exo3/bourse.lp -o exo3/bourse.sol
```
- Nous avons choisi d'utiliser un `.lp` pour résoudre ce problème puisque celui-ci est simple et ses données ne changent pas.
- Voici comment nous avons choisi de modéliser le problème:
- `p1` modélise le produit financier n°1: *Crédits commerciaux*
- `p2` modélise le produit financier n°2: *Obligations de sociétés*
- `p3` modélise le produit financier n°3: *Stocks d'Or*
- `p4` modélise le produit financier n°4: *Stocks de Platine*
- `p5` modélise le produit financier n°5: *Titres hypotécaires*
- `p6` modélise le produit financier n°6: *Prếts de construction*
- On cherche à maximiser `Interets`.
- `SommeP` contraint d'investir l'ensemble du budget.
- `InvestissementProduit_i` limite l'investissement dans un même produit à 25%.
- `Risque` limite le risque global de l'investisement à 2,0.
- `MetauxPrecieuxMin` contraint d'investir au moins 30% dans les métaux précieux.
- `CreditsMin` contraint d'investir au moins 45% dans les crédits commerciaux et obligations.
- On obtient comme solution:
- `p1` = 0.2
- `p2` = 0.25
- `p3` = 0.107692
- `p4` = 0.192308
- `p5` = 0.25
- `p6` = 0
## Exercice 4 : En optimisation pour l'e-commerce
```bash
glpsol -m exo4/ecommerce.mod -d exo4/ecommerce.dat -o exo4/ecommerce.sol
```
- Nous avons choisi de modéliser ce problème en utilisant un `.mod` et un `.dat` puisque l'input de matrices de se fait plus simplement dans un `.dat`. De plus, il est dépendant de N donc il est suceptible d'évoluer doncs seul le fichier `.dat` sera à modifier car le fichier `.mod` est plus général.
- Voici comment nous avons choisi de modéliser le problème:
- $($`coef`$)_{i,j,k} \in M_3(\R_+)$ modélise l'association d'un trvail à une personne.
- Chaque coefficient de `coef` doit être compris entre 0 et 1 puisque ce sont des proportions.
- La somme des coefficients de `coef` selon l'axe k doit faire 1.
- La répartions des commandes ne doit pas dépasser la limite des stocks.
- On obtient la solution : (C'est la répartition de chaque fluides de chaque commande sur chaque magasin)
$
\left(
\begin{array}{c}
\left(
\begin{array}{c}
3/4 \\
1/4 \\
0
\end{array}
\right) &
\left(
\begin{array}{c}
1 \\
0 \\
0
\end{array}
\right) \\
\left(
\begin{array}{c}
1 \\
0 \\
0
\end{array}
\right) &
\left(
\begin{array}{c}
1/3 \\
1/3 \\
1/3
\end{array}
\right)
\end{array}
\right)
$
Cette solution est bien la meilleur solution car chaque personne est associé au travail ou il est le plus efficace en vu des paramètres que nous avions posés.
## Exercice bonus : Des composants
```bash
glpsol -m exobonus/bonus.mod -d exobonus/bonus.dat -o exobonus/bonus.sol
```
marche pas mais on a cherché `;(`

28
exemple/DataCimentAll.dat.txt Executable file
View file

@ -0,0 +1,28 @@
# Autres donnŽes possibles pour
# le probl<62>me de fabrication
# de ciment
data;
set CIMENTS :=
11
22;
set MACHINES :=
Four2
Broyeuse2;
param dureefab: 11 22 :=
Four2 40 12
Broyeuse2 20 30;
param capacite :=
Four2 360
Broyeuse2 480;
param benefparciment :=
11 500
22 700;
end;

39
exemple/ModelCiment.mod.txt Executable file
View file

@ -0,0 +1,39 @@
# GLPK model file created by SUN for RO teaching
############################### Model ###############################
############################### Sets ###############################
set CIMENTS;
set MACHINES;
################### Variables ###################
var Q{i in CIMENTS}, >=0;
# or binary ?;
################### Constants: Data to load #########################
param benefparciment{i in CIMENTS};
param capacite{i in MACHINES};
param dureefab{i in MACHINES, j in CIMENTS};
################### Constraints ###################
s.t. RespectCapaciteDeChaqueMachine{j in MACHINES}:
sum{i in CIMENTS} dureefab[j,i] * Q[i] = capacite[j];
###### Objective ######
maximize BeneficeTotal:
sum{i in CIMENTS} Q[i]* benefparciment[i];
end;

View file

@ -0,0 +1,66 @@
# GLPK model file created by SUN for RO teaching
############################### Model ###############################
############################### Sets ###############################
set CIMENTS;
set MACHINES;
################### Variables ###################
var Q{i in CIMENTS}, >=0;
# or binary ?;
################### Constants: Data to load #########################
param benefparciment{i in CIMENTS};
param capacite{i in MACHINES};
param dureefab{i in MACHINES, j in CIMENTS};
################### Constraints ###################
s.t. RespectCapaciteDeChaqueMachine{j in MACHINES}:
sum{i in CIMENTS} dureefab[j,i] * Q[i] <= capacite[j];
###### Objective ######
maximize BeneficeTotal:
sum{i in CIMENTS} Q[i]* benefparciment[i];
#end;
#default data
data;
set CIMENTS :=
1
2;
set MACHINES :=
Four
Broyeuse;
param dureefab: 1 2 :=
Four 40 12
Broyeuse 20 30;
param capacite :=
Four 360
Broyeuse 480;
param benefparciment :=
1 50
2 70;
end;

10
exemple/PbCiment.lp.txt Executable file
View file

@ -0,0 +1,10 @@
\* Problem: Fabrication de ciment *\
Maximize
Benefice: + 50 Q1 + 70 Q2
Subject To
CapaciteduFour: + 40 Q1 + 12 Q2 <= 360
CapacitedeBroyage: + 20 Q1 + 30 Q2 <= 480
End

21
exo1/voitures.lp Normal file
View file

@ -0,0 +1,21 @@
\* Problème : Des voitures *\
\* nS modélise le nombre de voiture Standard produit par semaine *\
\* nL modélise le nombre de voiture de Luxe produit par semaine *\
\* On cherche à maximiser le bénéfice de l'usine *\
Maximize
Benefice: + 10000 nL + 9000 nS
\* Les voitures sont garées sur un parking, on ne prend pas en compte les contraintes géométriques *\
\* L'équipe peut fournir 60 heures de travail par semaine *\
\* L'usine ne peut produire plus de 800 voitures de luxe *\
Subject To
CapaciteParking: + 10 nL + 20 nS <= 15000
TempsTravail: + 6 nL + 5 nS <= 6000
LimiteLuxe: nL <= 800
Integer
nL
nS
End

30
exo1/voitures.sol Normal file
View file

@ -0,0 +1,30 @@
Problem:
Rows: 3
Columns: 2 (2 integer, 0 binary)
Non-zeros: 5
Status: INTEGER OPTIMAL
Objective: Benefice = 10284000 (MAXimum)
No. Row name Activity Lower bound Upper bound
------ ------------ ------------- ------------- -------------
1 CapaciteParking
14970 15000
2 TempsTravail 6000 6000
3 LimiteLuxe 645 800
No. Column name Activity Lower bound Upper bound
------ ------------ ------------- ------------- -------------
1 nL * 645 0
2 nS * 426 0
Integer feasibility conditions:
KKT.PE: max.abs.err = 0.00e+00 on row 0
max.rel.err = 0.00e+00 on row 0
High quality
KKT.PB: max.abs.err = 0.00e+00 on row 0
max.rel.err = 0.00e+00 on row 0
High quality
End of output

27
exo2/personnel.dat Normal file
View file

@ -0,0 +1,27 @@
# Données associé au problème de gestionnaire de personnel pour N = 4
data;
# Nom des différentes personnes
set PERSONNELS :=
p1
p2
p3
p4;
# Nom des différents travaux
set TRAVAUX :=
t1
t2
t3
t4;
# Cout de chaque travail réalisé par chaque personne
param Cout: p1 p2 p3 p4 :=
t1 1 2 3 4
t2 2 3 1 4
t3 2 1 3 4
t4 4 2 3 1;
end;

33
exo2/personnel.mod Normal file
View file

@ -0,0 +1,33 @@
############################ Model ##################################
############################ Sets ##################################
set PERSONNELS;
set TRAVAUX;
######################### Variables ################################
var perm{i in TRAVAUX, j in PERSONNELS}, binary;
################## Constants: Data to load #########################
param Cout{i in TRAVAUX, j in PERSONNELS};
######################## Constraints ###############################
# Chaque Travail doit être affecté a une unique Personne
s.t. RespectUnTravailParPersonne{i in TRAVAUX}:
sum{j in PERSONNELS} perm[i,j] = 1;
# Chaque Personne doit être affectée à un unique Travail
s.t. RespectUnePersonneParTravail{j in PERSONNELS}:
sum{i in TRAVAUX} perm[i,j] = 1;
######################## Objective #################################
minimize CoutTotal:
sum{i in TRAVAUX, j in PERSONNELS} Cout[i, j] * perm[i, j];
end;

57
exo2/personnel.sol Normal file
View file

@ -0,0 +1,57 @@
Problem: personnel
Rows: 9
Columns: 16 (16 integer, 16 binary)
Non-zeros: 48
Status: INTEGER OPTIMAL
Objective: CoutTotal = 4 (MINimum)
No. Row name Activity Lower bound Upper bound
------ ------------ ------------- ------------- -------------
1 RespectUnTravailParPersonne[t1]
1 1 =
2 RespectUnTravailParPersonne[t2]
1 1 =
3 RespectUnTravailParPersonne[t3]
1 1 =
4 RespectUnTravailParPersonne[t4]
1 1 =
5 RespectUnePersonneParTravail[p1]
1 1 =
6 RespectUnePersonneParTravail[p2]
1 1 =
7 RespectUnePersonneParTravail[p3]
1 1 =
8 RespectUnePersonneParTravail[p4]
1 1 =
9 CoutTotal 4
No. Column name Activity Lower bound Upper bound
------ ------------ ------------- ------------- -------------
1 perm[t1,p1] * 1 0 1
2 perm[t1,p2] * 0 0 1
3 perm[t1,p3] * 0 0 1
4 perm[t1,p4] * 0 0 1
5 perm[t2,p1] * 0 0 1
6 perm[t2,p2] * 0 0 1
7 perm[t2,p3] * 1 0 1
8 perm[t2,p4] * 0 0 1
9 perm[t3,p1] * 0 0 1
10 perm[t3,p2] * 1 0 1
11 perm[t3,p3] * 0 0 1
12 perm[t3,p4] * 0 0 1
13 perm[t4,p1] * 0 0 1
14 perm[t4,p2] * 0 0 1
15 perm[t4,p3] * 0 0 1
16 perm[t4,p4] * 1 0 1
Integer feasibility conditions:
KKT.PE: max.abs.err = 0.00e+00 on row 0
max.rel.err = 0.00e+00 on row 0
High quality
KKT.PB: max.abs.err = 0.00e+00 on row 0
max.rel.err = 0.00e+00 on row 0
High quality
End of output

34
exo3/bourse.lp Normal file
View file

@ -0,0 +1,34 @@
\* Problème: En Bourse *\
\* p1 modélise le produit financier n°1: Crédits commerciaux *\
\* p2 modélise le produit financier n°2: Obligations de sociétés *\
\* p3 modélise le produit financier n°3: Stocks d'Or *\
\* p4 modélise le produit financier n°4: Stocks de Platine *\
\* p5 modélise le produit financier n°5: Titres hypotécaires *\
\* p6 modélise le produit financier n°6: Prếts de construction *\
\* On cherche à maximiser les intérêts de DELTA *\
Maximize
Interets: + 0.07 p1 + 0.10 p2 + 0.19 p3 + 0.12 p4 + 0.8 p5 + 0.14 p6
\* Les varibales sont des proportions donc la somme vaut 1 *\
\* Les variables doivent respecter la limite de 25% *\
\* Le risque total doit être inférieur à 2.0 *\
\* Il doit y avoir au moins 30% de l'investissement qui est placé dans les métaux précieux *\
\* Au moins 45% des investissements doivent être placés dans les crédits commerciaux *\
Subject To
SommeP: + 1 p1 + 1 p2 + 1 p3 + 1 p4 + 1 p5 + 1 p6 = 1
InvestissementProduit1 : + 1 p1 <= 0.25
InvestissementProduit2 : + 1 p2 <= 0.25
InvestissementProduit3 : + 1 p3 <= 0.25
InvestissementProduit4 : + 1 p4 <= 0.25
InvestissementProduit5 : + 1 p5 <= 0.25
InvestissementProduit6 : + 1 p6 <= 0.25
Risque: + 1.7 p1 + 1.2 p2 + 3.7 p3 + 2.4 p4 + 2.0 p5 + 2.9 p6 <= 2.0
MetauxPrecieuxMin: + 1 p3 + 1 p4 >= 0.3
CreditsMin: + 1 p1 + 1 p2 >= 0.45
End

55
exo3/bourse.sol Normal file
View file

@ -0,0 +1,55 @@
Problem:
Rows: 10
Columns: 6
Non-zeros: 22
Status: OPTIMAL
Objective: Interets = 0.2825384615 (MAXimum)
No. Row name St Activity Lower bound Upper bound Marginal
------ ------------ -- ------------- ------------- ------------- -------------
1 SommeP NS 1 1 = -0.00923077
2 InvestissementProduit1
B 0.2 0.25
3 InvestissementProduit2
NU 0.25 0.25 0.0569231
4 InvestissementProduit3
B 0.107692 0.25
5 InvestissementProduit4
B 0.192308 0.25
6 InvestissementProduit5
NU 0.25 0.25 0.701538
7 InvestissementProduit6
B 0 0.25
8 Risque NU 2 2 0.0538462
9 MetauxPrecieuxMin
B 0.3 0.3
10 CreditsMin NL 0.45 0.45 -0.0123077
No. Column name St Activity Lower bound Upper bound Marginal
------ ------------ -- ------------- ------------- ------------- -------------
1 p1 B 0.2 0
2 p2 B 0.25 0
3 p3 B 0.107692 0
4 p4 B 0.192308 0
5 p5 B 0.25 0
6 p6 NL 0 0 -0.00692308
Karush-Kuhn-Tucker optimality conditions:
KKT.PE: max.abs.err = 2.22e-16 on row 8
max.rel.err = 4.44e-17 on row 8
High quality
KKT.PB: max.abs.err = 5.55e-17 on row 9
max.rel.err = 4.27e-17 on row 9
High quality
KKT.DE: max.abs.err = 2.78e-17 on column 3
max.rel.err = 1.98e-17 on column 3
High quality
KKT.DB: max.abs.err = 0.00e+00 on row 0
max.rel.err = 0.00e+00 on row 0
High quality
End of output

43
exo4/ecommerce.dat Normal file
View file

@ -0,0 +1,43 @@
# Données associé au problème de l'e-commerce
data;
# Les demandes
set DEMANDES :=
d1
d2;
# Les fluides
set FLUIDES :=
f1
f2;
# Les magasins
set MAGASINS :=
m1
m2
m3;
# Fluides demandés par commande
param fluidesParCommandes: f1 f2 :=
d1 2 0
d2 1 3;
# Stocks de fluides par magasin
param stockMagasin: f1 f2 :=
m1 2.5 1
m2 1 2
m3 2 1;
# Coûts unitares par entrepôt
param coutUnitaires: f1 f2 :=
m1 1 1
m2 2 3
m3 3 2;
# Coûts d'exédition d'un colis entre chaque paire (demande, magasin)
param coutExpedition: m1 m2 m3 :=
d1 1 0 0
d2 0 2 1;
end;

44
exo4/ecommerce.mod Normal file
View file

@ -0,0 +1,44 @@
############################ Model ##################################
############################ Sets ##################################
set DEMANDES;
set FLUIDES;
set MAGASINS;
######################### Variables ################################
var coef{i in DEMANDES, j in FLUIDES, k in MAGASINS}, >=0;
################## Constants: Data to load #########################
param fluidesParCommandes{i in DEMANDES, j in FLUIDES};
param stockMagasin{k in MAGASINS, j in FLUIDES};
param coutUnitaires{k in MAGASINS, j in FLUIDES};
param coutExpedition{i in DEMANDES, k in MAGASINS};
######################## Constraints ###############################
# Les proportions doivent être comprises entre 0 et 1
s.t. ProportionZeroUn{i in DEMANDES, j in FLUIDES, k in MAGASINS}:
coef[i, j, k] <= 1;
# La somme des proportions doit faire 1
s.t. ProportionTotalUn{i in DEMANDES, j in FLUIDES}:
sum{k in MAGASINS} coef[i, j, k] = 1;
# La répartions des commandes ne doit pas dépasser la limite des stocks
s.t. RespectDesStocks{j in FLUIDES, k in MAGASINS}:
sum{i in DEMANDES} coef[i, j, k] * fluidesParCommandes[i, j] <= stockMagasin[k, j];
######################## Objective #################################
minimize CoutTotal:
sum{i in DEMANDES, j in FLUIDES, k in MAGASINS} (coutUnitaires[k, j] * coef[i, j, k] + coef[i, j, k] * coutExpedition[i, k]);
end;

101
exo4/ecommerce.sol Normal file
View file

@ -0,0 +1,101 @@
Problem: ecommerce
Rows: 23
Columns: 12
Non-zeros: 45
Status: OPTIMAL
Objective: CoutTotal = 5.25 (MINimum)
No. Row name St Activity Lower bound Upper bound Marginal
------ ------------ -- ------------- ------------- ------------- -------------
1 ProportionZeroUn[d1,f1,m1]
B 0.75 1
2 ProportionZeroUn[d1,f1,m2]
B 0.25 1
3 ProportionZeroUn[d1,f1,m3]
B 0 1
4 ProportionZeroUn[d1,f2,m1]
B 1 1
5 ProportionZeroUn[d1,f2,m2]
B 0 1
6 ProportionZeroUn[d1,f2,m3]
B 0 1
7 ProportionZeroUn[d2,f1,m1]
NU 1 1 -0.5
8 ProportionZeroUn[d2,f1,m2]
B 0 1
9 ProportionZeroUn[d2,f1,m3]
B 0 1
10 ProportionZeroUn[d2,f2,m1]
B 0.333333 1
11 ProportionZeroUn[d2,f2,m2]
B 0.333333 1
12 ProportionZeroUn[d2,f2,m3]
B 0.333333 1
13 ProportionTotalUn[d1,f1]
NS 1 1 = 2
14 ProportionTotalUn[d1,f2]
NS 1 1 = 1
15 ProportionTotalUn[d2,f1]
NS 1 1 = 2
16 ProportionTotalUn[d2,f2]
NS 1 1 = 3
17 RespectDesStocks[f1,m1]
NU 2.5 2.5 -0.5
18 RespectDesStocks[f1,m2]
B 0.5 1
19 RespectDesStocks[f1,m3]
B 0 2
20 RespectDesStocks[f2,m1]
NU 1 1 -0.666667
21 RespectDesStocks[f2,m2]
B 1 2
22 RespectDesStocks[f2,m3]
NU 1 1 -0.333333
23 CoutTotal B 5.25
No. Column name St Activity Lower bound Upper bound Marginal
------ ------------ -- ------------- ------------- ------------- -------------
1 coef[d1,f1,m1]
B 0.75 0
2 coef[d1,f1,m2]
B 0.25 0
3 coef[d1,f1,m3]
NL 0 0 1
4 coef[d1,f2,m1]
B 1 0
5 coef[d1,f2,m2]
NL 0 0 2
6 coef[d1,f2,m3]
NL 0 0 1
7 coef[d2,f1,m1]
B 1 0
8 coef[d2,f1,m2]
B 0 0
9 coef[d2,f1,m3]
NL 0 0 1
10 coef[d2,f2,m1]
B 0.333333 0
11 coef[d2,f2,m2]
B 0.333333 0
12 coef[d2,f2,m3]
B 0.333333 0
Karush-Kuhn-Tucker optimality conditions:
KKT.PE: max.abs.err = 4.44e-16 on row 20
max.rel.err = 1.48e-16 on row 20
High quality
KKT.PB: max.abs.err = 0.00e+00 on row 0
max.rel.err = 0.00e+00 on row 0
High quality
KKT.DE: max.abs.err = 0.00e+00 on column 0
max.rel.err = 0.00e+00 on column 0
High quality
KKT.DB: max.abs.err = 0.00e+00 on row 0
max.rel.err = 0.00e+00 on row 0
High quality
End of output

77
exo4/ecommerce2.sol Normal file
View file

@ -0,0 +1,77 @@
Problem: ecommerce
Rows: 11
Columns: 12
Non-zeros: 33
Status: OPTIMAL
Objective: CoutTotal = 5.25 (MINimum)
No. Row name St Activity Lower bound Upper bound Marginal
------ ------------ -- ------------- ------------- ------------- -------------
1 ProportionTotalUn[d1,f1]
NS 1 1 = 2
2 ProportionTotalUn[d1,f2]
NS 1 1 = 1
3 ProportionTotalUn[d2,f1]
NS 1 1 = 2
4 ProportionTotalUn[d2,f2]
NS 1 1 = 3
5 RespectDesStocks[f1,m1]
NU 2.5 2.5 -0.5
6 RespectDesStocks[f1,m2]
B 0.5 1
7 RespectDesStocks[f1,m3]
B 0 2
8 RespectDesStocks[f2,m1]
NU 1 1 -0.666667
9 RespectDesStocks[f2,m2]
B 1 2
10 RespectDesStocks[f2,m3]
NU 1 1 -0.333333
11 CoutTotal B 5.25
No. Column name St Activity Lower bound Upper bound Marginal
------ ------------ -- ------------- ------------- ------------- -------------
1 coef[d1,f1,m1]
B 0.75 0 1
2 coef[d1,f1,m2]
B 0.25 0 1
3 coef[d1,f1,m3]
NL 0 0 1 1
4 coef[d1,f2,m1]
B 1 0 1
5 coef[d1,f2,m2]
NL 0 0 1 2
6 coef[d1,f2,m3]
NL 0 0 1 1
7 coef[d2,f1,m1]
NU 1 0 1 -0.5
8 coef[d2,f1,m2]
B 0 0 1
9 coef[d2,f1,m3]
NL 0 0 1 1
10 coef[d2,f2,m1]
B 0.333333 0 1
11 coef[d2,f2,m2]
B 0.333333 0 1
12 coef[d2,f2,m3]
B 0.333333 0 1
Karush-Kuhn-Tucker optimality conditions:
KKT.PE: max.abs.err = 4.44e-16 on row 8
max.rel.err = 1.48e-16 on row 8
High quality
KKT.PB: max.abs.err = 0.00e+00 on row 0
max.rel.err = 0.00e+00 on row 0
High quality
KKT.DE: max.abs.err = 0.00e+00 on column 0
max.rel.err = 0.00e+00 on column 0
High quality
KKT.DB: max.abs.err = 0.00e+00 on row 0
max.rel.err = 0.00e+00 on row 0
High quality
End of output

101
exo4/ecommerce3.sol Normal file
View file

@ -0,0 +1,101 @@
Problem: ecommerce
Rows: 23
Columns: 12
Non-zeros: 45
Status: OPTIMAL
Objective: CoutTotal = 8 (MINimum)
No. Row name St Activity Lower bound Upper bound Marginal
------ ------------ -- ------------- ------------- ------------- -------------
1 ProportionZeroUn[d1,f1,m1]
B 0.75 1
2 ProportionZeroUn[d1,f1,m2]
B 0.25 1
3 ProportionZeroUn[d1,f1,m3]
B 0 1
4 ProportionZeroUn[d1,f2,m1]
B 1 1
5 ProportionZeroUn[d1,f2,m2]
B 0 1
6 ProportionZeroUn[d1,f2,m3]
B 0 1
7 ProportionZeroUn[d2,f1,m1]
NU 1 1 -3
8 ProportionZeroUn[d2,f1,m2]
B 0 1
9 ProportionZeroUn[d2,f1,m3]
B 0 1
10 ProportionZeroUn[d2,f2,m1]
B 0.333333 1
11 ProportionZeroUn[d2,f2,m2]
B 0.333333 1
12 ProportionZeroUn[d2,f2,m3]
B 0.333333 1
13 ProportionTotalUn[d1,f1]
NS 1 1 = 2
14 ProportionTotalUn[d1,f2]
NS 1 1 = 2
15 ProportionTotalUn[d2,f1]
NS 1 1 = 4
16 ProportionTotalUn[d2,f2]
NS 1 1 = 5
17 RespectDesStocks[f1,m1]
NU 2.5 2.5 < eps
18 RespectDesStocks[f1,m2]
B 0.5 1
19 RespectDesStocks[f1,m3]
B 0 2
20 RespectDesStocks[f2,m1]
NU 1 1 -1.33333
21 RespectDesStocks[f2,m2]
B 1 2
22 RespectDesStocks[f2,m3]
NU 1 1 -0.666667
23 CoutTotal B 8
No. Column name St Activity Lower bound Upper bound Marginal
------ ------------ -- ------------- ------------- ------------- -------------
1 coef[d1,f1,m1]
B 0.75 0
2 coef[d1,f1,m2]
B 0.25 0
3 coef[d1,f1,m3]
NL 0 0 1
4 coef[d1,f2,m1]
B 1 0
5 coef[d1,f2,m2]
NL 0 0 1
6 coef[d1,f2,m3]
NL 0 0 < eps
7 coef[d2,f1,m1]
B 1 0
8 coef[d2,f1,m2]
NL 0 0 < eps
9 coef[d2,f1,m3]
B 0 0
10 coef[d2,f2,m1]
B 0.333333 0
11 coef[d2,f2,m2]
B 0.333333 0
12 coef[d2,f2,m3]
B 0.333333 0
Karush-Kuhn-Tucker optimality conditions:
KKT.PE: max.abs.err = 4.44e-16 on row 20
max.rel.err = 1.48e-16 on row 20
High quality
KKT.PB: max.abs.err = 0.00e+00 on row 0
max.rel.err = 0.00e+00 on row 0
High quality
KKT.DE: max.abs.err = 0.00e+00 on column 0
max.rel.err = 0.00e+00 on column 0
High quality
KKT.DB: max.abs.err = 0.00e+00 on row 0
max.rel.err = 0.00e+00 on row 0
High quality
End of output

18
exobonus/bonus.dat Normal file
View file

@ -0,0 +1,18 @@
# Données associé au problème de gestionnaire de personnel pour N = 4
data;
set POSITIONS :=
p1
p2
p3
p4;
param Distances: p1 p2 p3 p4 :=
p1 0 1 2 3
p2 1 0 1 2
p3 2 1 0 1
p4 3 2 1 0;
end;

59
exobonus/bonus.mod Normal file
View file

@ -0,0 +1,59 @@
#
# 0 1 2 3 5
# 1 0 1 2 3
# 2 1 0 1 2
# 3 2 1 0 1
# 4 3 2 1 0
#
# 0 1 0 0 0
# 0 0 1 0 0
# 1 0 0 0 0
# 0 0 0 0 1
# 0 0 0 1 0
#
# 0 0 0 1 0
# 0 0 1 0 0
# 0 0 0 0 1
# 0 1 0 0 0
# 1 0 0 0 0
#
# 4 2 3 5 1
#
# GLPK model file created by SUN for RO teaching
############################### Model ###############################
############################### Sets ###############################
set POSITIONS;
################### Variables ###################
var cycle{i in POSITIONS, j in POSITIONS}, binary;
################### Constants: Data to load #########################
param Distances{i in POSITIONS, j in POSITIONS};
################### Constraints ###################
# Matrice de permutation
s.t. RespectUnTravailParPersonne{i in POSITIONS}:
sum{j in POSITIONS} cycle[i, j] = 1;
s.t. RespectUnePersonneParTravail{j in POSITIONS}:
sum{i in POSITIONS} cycle[i, j] = 1;
# Pas de sous cycle
s.t. SousCycle1{(i in POSITIONS, j in POSITIONS):(i <= j and i < 4)}:
sum{k in POSITIONS, l in POSITIONS: i <= k <= j, i <= l <= j} cycle[k, l] <= (j - i + 1);
###### Objective ######
minimize CoutTotal:
sum{i in TRAVAUX, j in PERSONNELS} Cout[i, j] * cycle[i, j];
end;

22
script.sh Normal file
View file

@ -0,0 +1,22 @@
mkdir solveurGLPK
cd solveurGLPK
mkdir sources
cd sources
wget ftp://ftp.gnu.org/gnu/glpk/glpk-5.0.tar.gz
tar -xzvf glpk-5.0.tar.gz
cd glpk-5.0
./configure --disable-shared
make
#make --jobs=4
make check
cd ../..
mkdir executables
cp sources/glpk-5.0/examples/glpsol executables/.
cp sources/glpk-5.0/doc/glpk.pdf executables/.
cp sources/glpk-5.0/doc/gmpl.pdf executables/.
cd executables
./glpsol --help