TP
TP
TP
Le but de ce TP est de se constituer une petite bibliothèque sur les rationnels. Elle nous servira
tout au long de notre implémentation du simplexe dont les calculs ne s’exprimeront ni en entier, ni
en float pour des raisons d’arrondis.
#include <cstdlib>
#include <iostream>
Les rationnels seront donc des nombres de la forme a/b où a est un entier et b est un entier
positif. Ecrire les fonctions suivantes :
1
GLIN606 Programmation linéaire Année 2011-2012
Le but de ce TP est d’afficher les programmes linéaires et les dictionnaires que le simplexe va
engendrer. Dans un premier temps, on se contentera d’un affichage console. Pour le lecteur exigeant,
ne pas hésiter à utiliser Latex, avec un exemple proposé sur la page :
http://www.lirmm.fr/~bessy/PL/accueil.html (section Documents)
Rappelons que le programme linéaire (P ) que l’on veut résoudre est de la forme :
Maximiser cP1 x 1 + · · · + cn x n
n
Sous j=1 aij xj ≤ bi i = 1, . . . , m
x1 , . . . , x n ≥ 0
Tous les coefficients aij , bi et cj sont des rationnels.
Le codage de l’entrée se fait par deux tableaux int objectif[2 ∗ n] et int contraintes[m][2 ∗ n + 2].
La correspondance se fait ainsi :
- Exercice 2 - Dictionnaires.
L’algorithme du simplexe manipule des dictionnaires de la forme :
Ecrire une fonction d’affichage void affichedico(rat dico[m + 1][n + 1],int variables[m + n]).
2
GLIN606 Programmation linéaire Année 2011-2012
void initialisedico(int contraintes[m][2 ∗ n + 2], int objectif[2 ∗ n], rat dico[m + 1][n + 1], int
variables[n + m])
qui initialise les tableaux dico et variables représentant le dictionnaire initial du programme
linéaire (P) donné par les tableaux contraintes et objectif.
- Exercice 6 - Pivoter.
Ecrire une fonction void pivoter(rat dico[m + 1][n + 1], int variables[n + m], int sort, int entr)
qui effectue un pivot de simplexe sur le dictionnaire pour la variable entrante entr et la variable
sortante sort.
- Exercice 7 - Simplexe.
Achever d’implémenter l’algorithme du simplexe en une phase. Votre algorithme devra retourner :
– soit une solution admissible optimale.
– soit le message : La fonction objectif n’est pas bornée.
– soit le message : Le dictionnaire initial de (P ) n’est pas admissible.
3
GLIN606 Programmation linéaire Année 2011-2012
Si tout s’est bien passé aux TP précédents, vous disposez à présent d’un algorithme dont la
sortie est, par exemple :
4
GLIN606 Programmation linéaire Année 2011-2012
Le but de ce TP est d’effectuer quelques calculs avec votre algorithme, ainsi que d’en définir les
limites.
5
GLIN606 Programmation linéaire Année 2011-2012
- TP 5. Le problème d’affectation. -
Le but de ce TP est de résoudre le problème d’affectation (Cf cours, étude de cas 6) de t agents à
t tâches. On se donne un tableau de rationnels assign[t][t] dont chaque entrée assign[i][j] représente
la performance pij de l’agent i à réaliser la tâche j. Le problème est d’assigner une tâche à chaque
agent afin de maximiser la somme des performances des agents à réaliser leurs tâches respectives.
La modélisation de ce problème se fait ainsi : Les variables de décision sont les xij qui représentent
la part de la tâche j réalisée par l’agent i. La fonction à maximiser est la somme des pij xij . Les
contraintes sont :
– Pour chaque agent i fixé, la somme des xij est au plus 1.
– Pour chaque tâche j fixée, la somme des xij est au plus 1.
On voit clairement que la performance maximale sera obtenue en assignant l’agent 1 à la tâche
1 et l’agent 2 à la tâche 2. Mais on va faire le calcul en utilisant le simplexe. La principale difficulté
est d’initialiser le dictionnaire correspondant au programme linéaire. On veut obtenir :
Ceci se fait par l’intermédiaire d’une fonction void dicoinitassign(rat assign[t][t], rat dico[m +
1][n + 1]) qui initialise dico comme dictionnaire initial du problème d’assignation. L’affichage des
variables se fera avec une fonction void affichevar(int i) qui au lieu d’afficher simplement x i
affichera x 11, x 12, x 21, x 22, a 1, a 2, t 1, t 2, pour i variant de 1 à n + m.
6
GLIN606 Programmation linéaire Année 2011-2012
x 11 = 1 -a 1 -x 12
x 22 = 1 -x 21 -a 2
t1 = 0 +a 1 +x 12 -x 21
t2 = 0 -x 12 +x 21 +a 2
z = 8 -3a 1 -x 12 -2x 21 -5a 2
La solution optimale est : x 11= 1 x 12= 0 x 21= 0 x 22= 1.
La valeur de la fonction objectif en cette solution est : 8.
Le nombre de pivots effectues est : 2.
Une fois votre algorithme réalisé, testez-le sur des valeurs aléatoires de assign[t][t]. Quelle taille
t de problèmes peut-on atteindre ? Comparer avec le simplexe sur des programmes aléatoires.
7
GLIN606 Programmation linéaire Année 2011-2012
- TP 6. Quelques directions. -
Maximiser x1 +x2
Sous x1 −x2 ≤1
−x1 +x2 ≤1
x1 , x2 ≥0
La solution pourrait être :
Maximiser x1 +x2
Sous 2x1 +x2 ≤3
x1 +2x2 ≤2
x1 , x2 ≥0
La solution pourrait être :