Vous êtes sur la page 1sur 6

Programmation linéaire avec R

Nous allons voir dans ce TP l’utilisation de librairies R pour la résolution de programmes


linéaires.

1 Programme linéaire
Exemple
Reprenons notre premier exemple : une petite entreprise familiale qui désire fabriquer de la crème
glacée et du beurre à partir du lait produit par leurs vaches. Les prix sont fixés à 5F par litre de
crème glacée et 4F par Kg de beurre. Le profit (à maximiser) se calcule donc ainsi :

M axZ = 5x + 4y

Nous avons les contraintes suivantes : La production hebdomadaire des vaches est de 22 litres ;
Pour faire 1 Kg de beurre, il faut 2 litres de lait tandis que pour faire 1 litre de crème glacée,
cela exige 3 litres de lait ; On entrepose les produits dans un réfrigérateur qui ne peut contenir
plus que 6 litres de crème glacée ; Il faut 1 heure pour produire de 4 litres de crème glacée et 1
Kg de beurre. La famille dispose d’au plus 6 heures par semaine.


 3x + 2y ≤ 22
x≤6

x
+Y ≤6
 4


x, y ≤ 0

1.1 Librairie boot


Cette librairie est dédiée aux méthodes de bootstrap mais contient aussi une fonction sim-
plex() permettant la résolution de problème (simple) de programmation linéaire.
library(boot)
Dans cette fonction, pour notre exemple, nous devons donné trois valeurs :
un vecteur (z ici) contenant les coefficients pour la fonction à maximiser ; une matrice conte-
nant (A ici) les coefficients de chaque variable pour chaque contrainte ; un vecteur (b ici) contenant
les valeurs à ne pas dépasser pour les contraintes. Il faut notre que les paramètres A1 et b1 cor-
respondent à des contraintes de type ≤. Il est possible d’indiquer des contraintes de type ≤ avec
A2 et b2, et des contraintes de type = avec A3 et b3.
z = c(5, 4)
A = matrix(c(3, 1, 1/4, 2, 0, 1), 3, 2)
b = c(22, 6, 6)
result = simplex(
a = z,
A1 = A,
b1 = b,
maxi = TRUE
)

1
result$value
## b
## 40
result$soln
## x1 x2
## 4 5
result
##
## Linear Programming Results
##
## Call : simplex(a = z, A1 = A, b1 = b, maxi = TRUE)
##
## Maximization Problem with Objective Function Coefficients
## x1 x2
## 5 4
##
##
## Optimal solution has the following values
## x1 x2
## 4 5
## The optimal value of the objective function is 40.

1.2 Librairie ompr


Cette librairie est beaucoup plus complète et est réellement dédié à la résolution de pro-
blème de programmation linéaire. Pour la partie résolution, elle utilise la librairie ROI qui sert
d’infrastructure pour les problèmes d’optimisation en général.

library(magrittr)
library(ompr)
## Warning: package ’ompr’ was built under R version 3.5.3
library(ompr.roi) # interface vers la librairie ROI
## Warning: package ’ompr.roi’ was built under R version 3.5.3
library(ROI)
## Warning: package ’ROI’ was built under R version 3.5.2
## ROI: R Optimization Infrastructure
## Registered solver plugins: nlminb, glpk.
## Default solver: auto.
library(ROI.plugin.glpk) # un solveur en particulier
## Warning: package ’ROI.plugin.glpk’ was built under R version 3.5.2

La librairie magrittr est ici utilisée pour mettre en place des pipes qui sont très intéressants
dans ce cadre. On déclare ici les variables (avec les limites connues), puis la fonction objectif, et
les contraintes. Nous appliquons directement à la fin la résolution à l’aide du solveur glpk
result <- MILPModel() %>%
add_variable(x1, type = "continuous") %>%
add_variable(x2, type = "continuous", lb = 0) %>%
set_bounds(x1, lb = 0) %>%
set_objective(5 * x1 + 4 * x2, "max") %>%

2
add_constraint(3 * x1 + 2 * x2 <= 22) %>%
add_constraint(x1 <= 6) %>%
add_constraint(x1 / 4 + x2 <= 6) %>%
solve_model(with_ROI(solver = "glpk"))
result
## Status: optimal
## Objective value: 40
get_solution(result, x1)
## x1
## 4
get_solution(result, x2)
## x2
## 5
Si nous disposons de vecteurs et de variables comme dans le cas précédent, nous pouvons auto-
matiser un peu avec les fonctions
sum_expr()

pour réaliser une somme et colwise() qui permet d’indiquer les coefficients à associer à chaque
variable. Pour les contraintes, nous passons par une boucle pour ajouter chacune d’entre elles.
model <- MILPModel() %>%
add_variable(x[i], i = 1:2, lb = 0, type = "continuous") %>%
set_objective(sum_expr(colwise(z) * x[i], i = 1:2))
for (j in 1:3) {
model <- model %>%
add_constraint(sum_expr(colwise(A[j,i]) * x[i], i = 1:2) <= b[j])
}
result = model %>%
solve_model(with_ROI(solver = "glpk"))
result
## Status: optimal
## Objective value: 40
solution = get_solution(result, x[i])
solution
## variable i value
## 1 x 1 4
## 2 x 2 5

2 Programmation linéaire en nombre entier


Exemple
Supposons qu’une famille qui fabrique de la crème glacé et du beurre. Modifions la contrainte sur
la quantité de lait disponible. On suppose maintenant que la production est réduite à 20 litres
de lait.
Les solutions obtenues nous indiquent qu’il faut produire 3,2 litres de crème glacée et 5,2
litres de beurre. Mais s’il n’est possible que de faire des valeurs entières, on se réduirait à 3 litres
de crème et 5 litres de beurre (pour un profit de 35).

3
result <- MILPModel() %>%
add_variable(x1, type = "continuous") %>%
add_variable(x2, type = "continuous", lb = 0) %>%
set_bounds(x1, lb = 0) %>%
set_objective(5 * x1 + 4 * x2, "max") %>%
add_constraint(3 * x1 + 2 * x2 <= 20) %>%
add_constraint(x1 <= 6) %>%
add_constraint(x1 / 4 + x2 <= 6) %>%
solve_model(with_ROI(solver = "glpk"))
result
## Status: optimal
## Objective value: 36.8
get_solution(result, x1)
## x1
## 3.2
get_solution(result, x2)
## x2
## 5.2
En ajoutant comme contrainte que les variables sont entières, nous obtenons un meilleur résultat
que précédemment avec un gain de 36 (pour 4 litres de crème glacée et 4 litres de beurre).
result <- MILPModel() %>%
add_variable(x1, type = "integer") %>%
add_variable(x2, type = "integer", lb = 0) %>%
set_bounds(x1, lb = 0) %>%
set_objective(5 * x1 + 4 * x2, "max") %>%
add_constraint(3 * x1 + 2 * x2 <= 20) %>%
add_constraint(x1 <= 6) %>%
add_constraint(x1 / 4 + x2 <= 6) %>%
solve_model(with_ROI(solver = "glpk"))
result
## Status: optimal
## Objective value: 36
get_solution(result, x1)
## x1
## 4
get_solution(result, x2)
## x2
## 4

4
PROJET A RENDRE LE 25 JUILLET 2020
Par mail : ali.essoham@ugb.edu.sn

Publicité
Une entreprise dispose d’un budget publicitaire de 4800 F pour le lancement de son nouveau
produit. Sa campagne publicitaire utilisera à la fois des spots télévisés et des pages dans la
presse quotidienne. On pense que chaque minute de télévision va atteindre 100 000 nouveaux
spectateurs et chaque page dans un journal va être lue par 80 000 nouveaux lecteurs. Une minute
de télévision coûte 800 et une page dans un journal 600. La direction de l’entreprise souhaite
diffuser au moins trois minutes de spot et une page dans un journal. Son objectif est de maximiser
le nombre total de cibles (spectateurs et lecteurs).
1. Modéliser ce problème en programme linéaire.
2. Représenter l’espace des solutions réalisables.
3. Quelle est la combinaison optimale si le budget est augmenté de 4800 à 6000 ?
4. Quelle est la décision optimale s’il n’y a pas de contrainte de temps de télévision ?

Fabrication d’huile d’olives


Une entreprise fabrique trois qualités différentes d’huile d’olive. Les quantités maximales
pouvant être vendues chaque mois ainsi que les prix de vente sont données dans la table suivante :
Produit Ventes maximales Prix de vente (en litres) (en =C/litre) Huile A 3000 4 Huile B
3000 6 Huile C 2000 10
L’entreprise paie 1000 F pour une tonne d’olives. Chaque tonne d’olives fournit soit 300 litres
d’huile A soit 200 litres d’huile B (les coûts de ces transformations ne sont pas modélisés). Chaque
litre d’huile A peut être rafiné pour produire 6 dl d’huile B et 3 dl d’huile C. Le coût d’un tel
rafinement est de 0.5 F par litre. De même, chaque litre d’huile B peut être rafiné pour obtenir
8 dl d’huile C. Le coût de ce rafinement et de 0.3 F par litre.
Formuler un programme linéaire afin d’aider l’entreprise à déterminer un plan de production
mensuel maximisant son profit.

Compagnie aérienne
Une compagnie aérienne, en pleine expansion, est en train d’organiser son service clientèle
et a besoin de savoir le nombre d’employés dont elle aura besoin pour les prochaines années.
L’équipe RO doit donc étudier les besoins pour déterminer le nombre minimum de personnel
nécessaire afin de satisfaire les demandes des clients. Basé sur l’ordonnancement des vols, un
nouveau planning du personnel est préparé pour les différents créneaux horaires de la journée.
Les informations nécessaires pour la planification sont données dans le tableau suivant.

5
Créneaux Poste 1 Poste 2 Poste 3 Poste 4 Poste 5 Nb min pers
6h-8h X 48
8h-10h X X 79
10h-12h X X 65
12h-14h X X X 87
14h-16h X X 64
16h-18h X X 73
18h-20h X X 82
20h-22h X 43
22h-24h X X 52
24h-6h X 15
Coût/1j,1p 170F 160F 175F 180F 195F
Chaque employé doit travailler 8h par jour et 5 jours par semaine. Les postes autorisés com-
prennent les créneaux suivants (montré aussi dans le tableau par des croix) :

– Poste 1 : 6h à 14h
– Poste 2 : 8h à 16h
– Poste 3 : 12h à 20h
– Poste 4 : 16h à 24h
– Poste 5 : 22h à 6h
Pour chaque poste, le coût associé est donné dans la dernière ligne du tableau (Coût/1j,1p : Coût
pour une journée, pour une personne).
La question est de savoir combien d’employés il faut affecter dans chaque poste, chaque jour,
afin de minimiser le coût total du personnel et en respectant le nombre minimum du personnel
nécessaire (dernière colonne dans le tableau).
1. Modéliser ce problème en programme linéaire.
2. Trouver les contraintes redondantes.
3. Donner la solution optimale

Vous aimerez peut-être aussi