... | ... | @@ -6,7 +6,7 @@ Chaque prestataire gère un réseau d'approvisionnement. Ce réseau est constitu |
|
|
|
|
|
L'ajout d'un nouveau client s'effectue via la fonction `getNewCustomer`. Cette fonction permet de créer (ou de mettre à jour) la variable `supplyChain`.
|
|
|
|
|
|
Cette variable est du type `SupplyChain`. Il s'agit d'un graphe dont la structure est quasiment arborescente. Les nœuds de ce graphe sont du type `SupplyChainElement`. Une `SupplyChain` possède un élément racine et chaque `SupplyChainElement` possède zéro ou plusieurs "père(s)" (la liste`fathers` dans le fichier `SupplyChain.gaml`), et zéro ou plusieurs "fils" (la liste `sons` dans `SupplyChain.gaml`).
|
|
|
Cette variable est du type `SupplyChain`. Il s'agit d'un graphe dont la structure est quasiment arborescente (mais pas nécessairement car on peut observer des cycles). Les nœuds de ce graphe sont du type `SupplyChainElement`. Une `SupplyChain` possède un élément racine et chaque `SupplyChainElement` possède zéro ou plusieurs "père(s)" (la liste`fathers` dans le fichier `SupplyChain.gaml`), et zéro ou plusieurs "fils" (la liste `sons` dans `SupplyChain.gaml`).
|
|
|
|
|
|
À l'initialisation, on commence par créer un agent `SupplyChainElement` (SCE) qui correspond à l'élément racine et on lui assigne le fournisseur associé au prestataire.
|
|
|
|
... | ... | @@ -18,6 +18,8 @@ Ensuite on crée 3 autres agents SCE auquel on leur associe, en fonction du SCE, |
|
|
|
|
|
Enfin on connecte (via les listes `fathers` et `sons`) le SCE fournisseur avec le SCE national, lui-même connecté avec le SCE local, lui-même connecté avec le SCE destinataire.
|
|
|
|
|
|
Une `SupplyChain` possède également des "feuilles" : il s'agit de la liste `leafs` qui contient l'ensemble des SCE correspondant aux destinataires finaux gérés par le prestataire.
|
|
|
|
|
|
La manière de sélectionner les entrepôts dépend de la stratégie définie. Plusieurs cas sont possibles. L'utilisateur peut indiquer que tous les prestataires partagent la même stratégie (via la variable booléenne `isLocalSelectingWarehouseStrategies` du fichier `Parameters.gaml`). Si tel est la cas, les prestataires utiliseront la stratégie définie dans `globalSelectingWarehouseStrategies` de `Parameters.gaml`. Sinon, les prestataires choisiront, lors de leur initialisation, l'une des stratégies proposées dans la variable `possibleSelectingWarehouseStrategies` de `Parameters.gaml`. Une fois qu'un prestataire a choisi une stratégie, il n'en changera pas pendant toute la durée de la simulation.
|
|
|
|
|
|
Ci-dessous, voici une description des quatre stratégies possibles. On notera toutefois auparavant que toutes les stratégies présentées filtrent toutes les entrepôts en disqualifiant systématiquement les entrepôts n'ayant pas la capacité d'entreposage nécessaire. De plus, pour les entrepôts nationaux, on en choisit un nouveau uniquement si on ne peut trouver un entrepôt national ayant assez de place disponible parmi les entrepôts nationaux faisant déjà parti du réseau d'approvisionnement.
|
... | ... | @@ -47,5 +49,23 @@ Cette stratégie commence par ne conserver que les `numberWarehouseSelected` ent |
|
|
|
|
|
# Réapprovisionnement des stocks
|
|
|
|
|
|
Je n'évoque dans cette partie que la vérification des stocks et la création des commandes. Je parle du mécanisme de traitement des commandes dans les pages [bâtiments logistiques](Buildings) et [fournisseur](Provider).
|
|
|
|
|
|
Le reflex `testRestockNeeded` se charge de démarrer régulièrement le processus de contrôle de stocks du réseau d'approvisionnement du prestataire.
|
|
|
|
|
|
Ce reflex ne s'exécute que tous les `nbStepsbetweenTRN` cycles. `nbStepsbetweenTRN` est un paramètre défini globalement dans `Parameters.gaml` (en général on utilise la valeur 24). Pour éviter des phénomènes de synchronisation entre les prestataires, on répartit les différents appels sur un journée grâce à la variable `timeShifting` définie aléatoirement à l'initialisation entre 0 et 23 inclus au sein de chaque prestataire.
|
|
|
|
|
|
Le reflex `testRestockNeeded` se contente de faire appeler la fonction `recursiveTests` par chacune des "feuilles" du réseau d'approvisionnement (c'est à dire chaque SCE associé à un destinataire).
|
|
|
|
|
|
Cette fonction `recursiveTests` va vérifier l'état des stocks du SCE appelant. Si le niveau d'un stock est trop faible, alors, le SCE crée un objet `Order` correspondant à une commande de marchandise. Un stock est jugé trop faible si : `la quantité du stock < (sa quantité maximale * le seuil de réapprovisionnement du prestataire)`. Lorsqu'une commande est passée, le stock est marqué afin qu'on ne passe pas plusieurs commandes avant la réception du réapprovisionnement.
|
|
|
|
|
|
Le seuil de réapprovisionnement est une variable sous la forme d'un pourcentage que possède localement chaque prestataire. Néanmoins, l'utilisateur peut choisir si les prestataires doivent partager la même valeur de seuil via le booléen `localThreshold`. S'il est vrai, alors, à l'initialisation, chaque prestataire choisit une valeur comprise entre `minlocalThreshold` et `maxlocalThreshold` (en général valant respectivement 5% et 20%). S'il est faux, alors les prestataires choisissent tous la valeur définie par `globalThreshold`.
|
|
|
|
|
|
`localThreshold`, `minlocalThreshold`, `maxlocalThreshold` et `globalThreshold` sont tous des paramètres globaux définis dans `Parameters.gaml`.
|
|
|
|
|
|
Une fois qu'un SCE a vérifié l'ensemble de ses stocks et créé les objets `Order` associés à ses éventuelles commandes, alors il fait appeler la fonction `recursiveTests` à chacun des SCE contenus dans sa liste `fathers`. Le SCE transmet par la même occasion la liste de ses commandes à ses "pères". Les SCE "pères" sauront si c'est à eux de traiter une commande si le SCE "fils" apparait dans sa liste `sons`.
|
|
|
|
|
|
Ce processus récursif s'arrête lorsqu'il atteint l'élément racine du réseau d'approvisionnement. Puisque l'élément racine est le fournisseur, il n'a pas besoin de passer de commandes mais est capable de générer de nouvelles quantités de marchandises.
|
|
|
|
|
|
# Perte d'un client
|
|
|
|