|
|
Les agents `Building` permettent de modéliser les bâtiments associés aux destinataires finaux, mais également, via un mécanisme d'héritage comme en programmation orientée objet, les entrepôts et les fournisseurs. Les bâtiments disposent de nombreuses propriétés et fonctions leur permettant d'entreposer de la marchandise et d'accueillir celle-ci lorsqu'elle arrive à destination.
|
|
|
|
|
|
# Réception d'une livraison
|
|
|
|
|
|
Lorsqu'un agent `Vehicle` arrive à destination il appel la fonction `receiveCommodity` de l'agent `Building` en passant en paramètre la liste des marchandises transportées. Dans le cas où le bâtiment est la destination finale de la marchandise (il peut s'agir d'un entrepôt ou du bâtiment associé au destinataire final), alors ces marchandises sont incluses dans la liste `entering_stocks` sous la forme d'objets de type `AwaitingStock`. Sinon, lorsque le bâtiment correspond à un entrepôt, la marchandise va encore transiter vers un autre bâtiment grâce à un autre véhicule. Dans ce cas la marchandise est ajouté à la liste `comingCommodities`.
|
|
|
|
|
|
## Le bâtiment est la destination finale de la marchandise
|
|
|
|
|
|
Le reflex `processEnteringGoods` s'active une fois par cycle si la liste `entering_stocks` n'est pas vide. Le reflex commence par parcourir `entering_stocks` et va filtrer, via la liste temporaire `toBeIncluded`, les marchandises qui ont eu le temps d'être manutentionnées. Ensuite, le reflex incorpore chaque marchandise dans ses propres stocks.
|
|
|
|
|
|
Si le bâtiment ne trouve pas dans quel stock il doit incorporer une marchandise, cela veut dire qu'on est dans le cas où cette marchandise a été envoyé par un précédent prestataire vers un entrepôt, mais que le contrat entre le prestataire et le client a été rompu avant que la marchandise n'arrive à destination. Dans ce cas le nouveau prestataire est prévenu et se charge de traiter la marchandise "perdue" en l'expédiant au bon endroit.
|
|
|
|
|
|
## Le bâtiment n'est pas la destination finale de la marchandise
|
|
|
|
|
|
Chaque bâtiment possède un (ou plusieurs) reflex de type `manage[type of transport mode]CommingCommodities` : un reflex de ce type existe pour chaque mode de transport auquel le bâtiment est rattaché. Ainsi, ils possède tous au moins le reflex `manageRoadComingCommodities`.
|
|
|
|
|
|
Ces reflex ont un comportement très simple : ils parcourent la liste `comingCommodities` et transfèrent les marchandises vers la liste `leavingCommodities` si elle provient du mode de transport associé au reflex et si la date d'arrivée de celle-ci plus la temps de manutention des marchandises provenant de ce mode est supérieur ou égal à la date courante.
|
|
|
|
|
|
Lorsque d'autres véhicules voudront partir de ce bâtiment pour livrer des marchandises, ils devront les chercher au sein de `leavingCommodities`.
|
|
|
|
|
|
|
|
|
# Traitement des commandes pour expédition de marchandises<a name="processOrders"></a>
|
|
|
|
|
|
Ce comportement est accessible aux bâtiments héritant de `RestockingBuilding` dont le type hérite lui-même de "Building". C'est le reflex `processOrders` qui est au centre de ce comportement.
|
|
|
|
|
|
Les agents `Warehouse` et `Provider` héritent tout deux du `RestockingBuilding`. Néanmoins, les `Provider` redéfinissent le reflex `processOrders` décrit dans `RestockingBuilding` (voir la page consacrée aux [fournisseur](Provider) pour plus de détails).
|
|
|
|
|
|
Le reflex `processOrders` se déclenche automatiquement toutes les `nbStepsBetweenWPO` cycles pour les entrepôts et `nbStepsBetweenPPO` cycles pour les fournisseurs (variables définis globalement dans `Parameters.gaml`) et si la liste `currentOrders` n'est pas vide. Pour éviter des phénomènes de synchronisation entre les bâtiments, on répartit les différents appels grâce à la variable `timeShifting` définie aléatoirement à l'initialisation entre 0 et 23 inclus au sein de chaque bâtiment. La variable `currentOrders` est remplie d'objets `Order` transmis par les `SupplyChainElement` (voir la page sur les [prestataires logistiques](LogisticsServiceProvider)) lorsque les commandes sont passées.
|
|
|
|
|
|
Le reflex parcourt l'ensemble des `Order` de `currentOrders` et pour chacun d'entre eux, va essayer de retrouver le stock correspondant dans lequel il va puiser pour envoyer les marchandises. Le stock correspond si le type de produit et le destinataire final du stock sont conformes à ceux de la commande.
|
|
|
|
|
|
Lorsque le reflex a trouvé le bon stock, il va déduire de celui-ci la quantité indiquée par la commande (bien sûr dans la limite de la quantité présente dans le stock). Un objet `Stock` est créé avec la quantité de marchandise qui doit être envoyé. Cet objet `Stock` est lui-même incorporé dans un nouvel objet `Commodity` qui est transmis à l'agent `ForwardingAgent`. Ce dernier se charge de calculer le plus court chemin entre le bâtiment source (donc le bâtiment qui exécute le reflex `processOrders`) et la destination (donc le bâtiment qui a effectué la commande). Le chemin est stocké dans l'objet `Commodity` qui est lui-même ajouté à la liste `leavingCommodities` dans laquelle les véhicules viendront prendre les marchandises à transporter. |