3 Programmation linéaire en nombres entiers paramétrée
Nous présentons ici la façon dont l'interface à PIP a été réalisée et
ce qu'elle apporte en facilité d'utilisation.
3.1 PIP
PIP est l'acronyme de Parameterized Integer Programming ou
programmation linéaire paramétrée en nombres entiers. Cet outil permet
de calculer le minimum lexicographique d'un domaine polyédrique
paramétré.
La solution d'un tel problème est représentée par un QUAST (Quasi
Affine Selection Tree), c'est-à-dire un arbre de sélection dont les
prédicats sont des inégalités affines et les feuilles des listes de
formes affines ou ^ signifiant qu'il n'y a pas de solution pour
la branche considérée. Une branche de QUAST définit un domaine de
paramètres et la valeur du minimum lexicographique du polyèdre pour
des paramètres à valeurs dans ce domaine.
Étant donné que PIP peut travailler en nombres entiers, pour exprimer
la solution, on peut avoir besoin de divisions entières. Pour
conserver des formes affines dans les prédicats de sélection et les
feuilles, PIP peut introduire des << nouveaux paramètres >> définis
comme la division entière d'une forme affine par un entier.
Voici un exemple d'utilisation de PIP tiré de [16] :
minimiser (i, j) tels que
toutes les variables et tous les paramètres étant positifs ou nuls.
Voici sous quelle forme il est traité par PIP :
problème posé |
réponse |
((commentaire)
2 3 4 0 -1 1
(#[-1 0 0 0 1 0]
#[0 -1 0 0 0 1]
#[-2 -1 0 -1 2 1]
#[2 1 0 1 -2 -1])
()
)
|
((commentaire -1 )
(if #[ -1 2 1 0]
(if #[ 1 -2 0 0]
(list #[ 0 0 0 0]
#[ -1 2 1 0])
(newparm 3 (div #[ 1 0 0 0] 2))
(if #[ -1 0 1 2 0]
(list #[ 0 1 0 -1 0]
#[ -1 0 1 2 0])
()))
()))
|
L'interprétation de la réponse est
|
si -m+2n+p³ 0 |
alors |
|
si m-2n³ 0 |
alors [0,
-m+2n+p] |
sinon |
|
si -m+p+2(m/2)³ 0 |
alors [n-(m/2),
-m+p+2(m/2)] |
sinon ^ |
|
|
|
|
|
|
sinon ^ |
|
.
(2) |
3.2 Limitations de PIP
Comme on peut le voir sur l'exemple précédent, la syntaxe utilisée
n'est pas très lisible, bien qu'efficace pour le calcul. Une autre
limitation de PIP , qui tient à l'algorithme utilisé (et qui garantit
une solution), est que toutes les variables et tous les paramètres
sont considérés à valeurs positives. Ce qui peut amener l'utilisateur
à faire des changements de variables pour pouvoir résoudre son
problème. De même il est facile en utilisant cette même méthode
de faire calculer à PIP des maxima lexicographiques et des minima
et des maxima de fonctions objectives affines.
3.3 Interface à PIP
Ce que SPPoC propose dans son interface répond aux problèmes évoqués
ci-dessus. En effet, la syntaxe proposée est complètement symbolique
comme on peut le voir dans la version SPPoC de notre
exemple1 :
# let p = PIP.make <:s<i<=n, j<=p, 2*i+j=2*n+p-m>>
(Question.min_lex <:v<i, j>>);;
val p : SPPoC.PIP.t =
Solve : MIN(i, j)
Under the constraints :
{i <= n, j <= p, 2*i+j+m = 2*n+p}
# PIP.solve_pos p;;
- : SPPoC.EQuast.t =
Parameters :
np1 = m mod 2
Quast :
if m <= 2*n+p then
if m >= 2*n then
[0; -m+2*n+p]
else if np1 <= p then [(-m+2*n+np1)/2; -np1+p] else _|_
else _|_
Le résultat obtenu est de forme légèrement différente (mais
équivalente, bien sûr) de celle qui a été obtenue en utilisant PIP directement (voir équation (2)) car SPPoC représente les
nouveaux paramètres sous forme de modulos plutôt que sous forme de
divisions entières. Cela a pour effet de simplifier les expressions
obtenues et en particulier de faciliter les changements de variables.
Cette constatation est empirique et sa cause en est encore mal
comprise.
1
Les changements de variables pour se libérer de la contrainte de
positivité et permettre les maxima et les fonctions objectives sont
faits automatiquement. Par exemple, pour calculer le maximum de i-j
sur le domaine -n£ i £ n, 0£ j £ n-i, n³ 10, il suffit
d'écrire:
# PIP.solve (PIP.make <:s<-n<=i<=n; 0<=j<=n-i; n>=10>>
(Question.max_fun <:f<i-j>>));;
- : SPPoC.EQuast.t = [n]
Le dialogue entre SPPoC et PIP se fait à travers un appel de
fonction C2. SPPoC autorise aussi la
manipulation des QUAST et permet ainsi l'enchaînement de calculs avec
plusieurs appels à PIP . Pour une description des opérations possibles
sur les QUAST, voir la section 6.4. Le chapitre
7.1 présente une utilisation intensive de cette
interface où plusieurs dizaines d'appels à PIP sont nécessaires pour
produire un résultat.