next up previous contents
Next: Interprétation des paramètres Up: Moteur "AROPAj" Previous: Moteur "AROPAj"

  
Noyau

AROPAj désigne un ensemble "SHELL" conçu autour d'un noyau générateur définissant le modèle en faisant appel au générateur de programmes et matrices (MGG) et au solveur (SCICONIC).

Les fichiers du noyau principal sont :
- ./aropa?/comm/aro.mgg (langage MGG, proche du FORTRAN)
- ./aropa?/comm/aroN.dat (définition des indices)
- ./aropa?/comm/intern.f (appelle la base de paramètres)

Conçu autour de ce noyau generateur, le "Shell" est un assemblage de groupements de commande UNIX et de programmes FORTRAN permettant de réaliser tout un ensemble d'opérations de manière aussi homogène que possible. Le principe de base est la "modulabilité, qui doit permettre d'ajouter des modules de programmes linéaires (i.e. un nouveau module d'alimentation animale, un bloc "effet de serre"), ou plus simplement des activités, contraintes, paramètres nouveaux (i.e. une taxe sur les charges), une option supplémentaire de politique agricole ou environnementale (i.e. une politique de limitation des primes). Il s'agit également d'extrapoler le modèle à des groupes types d'exploitants ou des pays nouveaux (cf le programme EUROTOOLS).

En application de ce principe, il s'agit de proposer une nomenclature des paramètres, variables, contraintes, et un mode d'indexation des groupes et des activités respectant ce principe de modulabilité. Les fichiers eux-mêmes, qu'il s'agisse de leur contenu ou de leur nom, doivent respecter ce principe.

Le coeur du système est le générateur de programmes et de matrices qui définit la maquette d'ensemble pour tous pays, tous groupes, tous modules tels qu'ils ont été prédéfinis. Le fichier 'aro.mgg' décrit en "langage" MGG tous les paramètres du problème de génération de matrices, ces paramètres définissant les coefficients Eij associés à la contrainte (ou variable duale) "i" et à l'activité (ou variable primale) "j". Si $\mu$ est le vecteur des paramètres, la matrice (m+1 x n+1) à m+1 lignes (indexées de 0 à m, comprenant l'objectif) et n+1 colonnes (indexées de 0 à n, comprenant le second membre) du PL associée à l'objectif "OBJ", aux contraintes "CTi", aux activités "ACj" et au "second membre "SMS" est telle que:

                  AC1   AC2   ...   ACj   ...   ACn         SMS
        --------|-----|-----|-----|-----|-----|-----|
         OBJ    | E01               E0j         E0n
        --------|-----|-----|-----|-----|-----|-----|

        --------|-----|-----|-----|-----|-----|-----|     |-----|
         AC1      E11               E1j         E1n   <=    E10
        --------|-----|-----|-----|-----|-----|-----|     |-----|
         ...
        --------|-----|-----|-----|-----|-----|-----|     |-----|
         ACi      Ei1               Eij         Ein   <=    Ei0
        --------|-----|-----|-----|-----|-----|-----|     |-----|
         ...
        --------|-----|-----|-----|-----|-----|-----|     |-----|
         ACm      Em1               Emj         Emn   <=    Em0
        --------|-----|-----|-----|-----|-----|-----|     |-----|

avec Eij = Eij(µ), 0<=i<=m, 0<=j<=n.

Dans 'aro.mgg', on distingue les sections "PARAMETERS" comportant la liste des paramètres, "VARIABLES" comportant la liste des variables primales, "PROBLEM" définissant l'objectif d'un PL générique, "SUBJECT TO" comportant la liste et la définition des contraintes. Les éléments de chacune de ces sections offrent toutes possibilités d'indexation. La définition des contraintes fait apparaître les coefficients, explicités dans la section "ELEMENTS". Lorsque ces coefficients sont des fonctions compliquées des paramètres, ils font appel à des "functions FORTRAN" spécifiées dans la section "FUNCTIONS".

Les éléments de chacune des sections précédentes sont donnés dans un ordre lexicographique, la définition de chacun étant précédé d'une ligne de commentaire:
- c:P: désigne un paramètre
- c:A: désigne une activité primale
- c:C: désigne une contrainte
- c:E: désigne un "coefficient" (intersection "ligne / colonne")
- c:F: désigne une fonction (i.e. une "function" FORTRAN)

En termes d'indice, en général "I" désigne une activité animale, "J" une activité végétale, "K" un groupe type d'exploitation, "L" un sous-groupe". On utilise également les indices "M" et "N" pour d'autres catégories d'activité ou contrainte (par exemple, "N" est utilisé pour les variables d'alimentation animale).

Donnons un exemple. La production de lait ne peut dépasser le produit du rendement laitier par l'effectif de vaches laitières (l'animal VL étant indexé par '35'). La séquence MGG correspondante est la suivante :

dans la section "PARAMETERS" :

-------------------------------------------------------------------------------
c:P: rlait(k)      : rendement lait                                    (kl/VL)#
 RLAIT(K)

...

c:P: plait(k)      : prix du lait                                        (F/l)#
 PLAIT(K)

...

c:P: popul(k,l)    : effectif total du sous-groupe k , l                (1000)#
 POPUL(K,L)
-------------------------------------------------------------------------------

dans la section "VARIABLES" :

-------------------------------------------------------------------------------
c:A: ANI(I,K,L)    : Activites animales troupeau i (total)             (tetes)#
 ANI(I,K,L)  '***IIKKL' NOT IF (valnl10(i)*popul(k,l).EQ.0.)

...

c:A: XOLAI(K,L)    : production lait bovin                              (f*kl)#
 XOLAI(K,L)  '*****KKL' NOT IF (POPUL(K,L).EQ.0.)
-------------------------------------------------------------------------------

dans la section "SUBJECT TO" :

-------------------------------------------------------------------------------
c:C: POLAI(K,L)    : Production lait bovin                               (f*l)#
* POLAI      '*****KKL' NOT IF (PLAIT(K).EQ.0..OR.POPUL(K,L).EQ.0.)
                      XOLAI(K,L)
 - SUM(I1)      ROL * ANI(I1,K,L)
 .LE. 0.0
FOR ALL K
FOR ALL L
FOR I1.EQ.35
-------------------------------------------------------------------------------

dans la section "ELEMENTS" :

-------------------------------------------------------------------------------
c:E: rol           : POLAI(K,L) x XOLAI(K,L)                                  #
      ROL=0.0
     0IF (I.EQ.35) ROL = RLAIT(K)
-------------------------------------------------------------------------------

dans la section "FUNCTIONS" :

-------------------------------------------------------------------------------
c:F: valnl10()     : ANI(I,K,L), A(N,i,K,L), TUN(I,K,L), bacy, bagy, bcuy     #
      function valnl10(ii)
      valnl10 = 1.  
      if (ii.eq.6) valnl10=0.
      if (ii.ge.15.and.ii.le.20) valnl10 =0.
      if (ii.ge.29.and.ii.le.30) valnl10 =0.
      if (ii.ge.37.and.ii.le.40) valnl10 =0.
      if (ii.ge.42.and.ii.le.44) valnl10 =0.
c  autres "absents" implicites sur aroN.dat
      return
      end
-------------------------------------------------------------------------------

Si on avait souhaité lier la production laitière au mode d'alimentation des vaches laitières, on devrait sans doute faire appel à une "FUNCTION" pour définir l'"ELEMENT" 'ROL', dans la mesure où la relation nécessite plusieurs lignes de commande.

Rappelons le principe général de fonctionnement du "moteur". Dans un premier temps, l'appel au logiciel MGG "génère" les programmes qui permettront de générer les matrices au format standard MPS. La seconde étape est la génération proprement dite des matrices après affectation des valeurs des paramètres dans l'expression des coefficients. cette étape est en particulier fondée sur l'appel par MGG de la subroutine 'intern.f' (instruction "CALL INTERN" dans le programme 'aro.mgg'). La troisième étape est l'appel au solveur SCICONIC.

Lors de la 2ème étape, on construit les matrices au format MPS dans des fichiers qui auront en général (dans l'environnement "AROPA") un préfixe "mggf" et une extension '.pl'. Après résolution du PL, la solution est obtenue dans un fichier dont le nom aura la même racine que le nom de la matrice MPS et l'extension '.sortie'.

la nomenclature utilisée pour la définition des variables et des contraintes est directement utilisée dans les fichiers de résultats bruts, après que l'on ait fait appel au solveur SCICONIC. Les variables primales seront détaillées en section "COLUMNS", les duales en section "ROWS". La valeur de l'objectif est donné en tête de fichier ('OBJECTIVE') et rappelée en section "ROWS" (avec le nom correspondant déterminé dans le fichier 'aro.mgg').

Enfin, on notera que l'indexation des activités du modèle doit être conforme à l'indexation proposée sur le fichier 'aroN.dat'. Ce fichier est en fait sous-exploité du fait que l'édition de rapport (i.e. la gestion des résultats) relève du "shell AROPAj" et non des facilités offertes par MGG. Néanmoins les incompatibilités entre 'aro.mgg' et 'aroN.dat' ou les insuffisances (défaut de définition sur 'aroN.dat') ont été à l'origine d'erreurs (compilation, résultats). On notera que le changement d'ordinateur (de SUN à HP) et le changement des versions MGG et SCICONIC ont révélé quelques problèmes à ce niveau.


next up previous contents
Next: Interprétation des paramètres Up: Moteur "AROPAj" Previous: Moteur "AROPAj"
Pierre-Alain Jayet
2004-02-13