|
|
Le `ForwardingAgent` modélise un transitaire : c'est à dire un acteur capable d'organiser le transport de marchandises entre une source et une destination.
|
|
|
Le `🆃 ForwardingAgent` modélise un transitaire : c'est à dire un acteur capable d'organiser le transport de marchandises entre une source et une destination.
|
|
|
|
|
|
Dans la simulation, il n'y a qu'un seul agent de ce type. Son comportement principal consiste à calculer des plus courts chemins au sein d'un réseau de transport *multi-modal*. Par la même occasion, lorsqu'il effectue ce calcul, il réserve auprès d'agents `Transporter` les véhicules qui seront utilisés lors du transport.
|
|
|
Dans la simulation, il n'y a qu'un seul agent de ce type. Son comportement principal consiste à calculer des plus courts chemins au sein d'un réseau de transport *multi-modal*. Par la même occasion, lorsqu'il effectue ce calcul, il réserve auprès d'agents `🆃 Transporter` les véhicules qui seront utilisés lors du transport.
|
|
|
|
|
|
La fonction qui permet de rechercher des plus courts chemins s'appelle `compute_shortest_path`. Cette fonction n'est pas directement codée dans le fichier `ForwardingAgent.gaml`, puisqu'elle est définie dans le plugin GAMA `transport.organizer`. Ce plugin déclare une nouvelle `skill` du nom `TransportOrganizer` et que le `ForwardingAgent` possède.
|
|
|
La fonction qui permet de rechercher des plus courts chemins s'appelle `🅵 compute_shortest_path`. Cette fonction n'est pas directement codée dans le fichier `🆃 ForwardingAgent.gaml`, puisqu'elle est définie dans le plugin GAMA `transport.organizer`. Ce plugin déclare une nouvelle `skill` du nom `TransportOrganizer` et que le `🆃 ForwardingAgent` possède.
|
|
|
|
|
|
|
|
|
# Initialisation de l'agent
|
... | ... | @@ -11,29 +11,39 @@ Pour fonctionner correctement, l'agent a besoin de certaines informations qu'il |
|
|
|
|
|
D'une part, il a besoin de référencer les transporteurs. On a un transporteur pour chaque mode de transport. Il y a donc :
|
|
|
|
|
|
* `transporter_road` pour le routier.
|
|
|
* `transporter_river` pour le fluvial.
|
|
|
* et `transporter_maritime` pour le maritime.
|
|
|
* `🆅 transporter_road` pour le routier.
|
|
|
* `🆅 transporter_river` pour le fluvial.
|
|
|
* et `🆅 transporter_maritime` pour le maritime.
|
|
|
|
|
|
Cette partie s'effectue directement dans la fonction `init` de l'agent.
|
|
|
Cette partie s'effectue directement dans la fonction `🅵 init` de l'agent.
|
|
|
|
|
|
Ensuite, il faut transmettre le réseau de transport. Celui-ci se compose des différents modes inclus dans la simulation. Mais il faut également indiquer comment ces modes sont interconnectés. Pour cela, dans le reflex `second_init` du fichier `Main.gaml`, on utilise la méthode `add_mode` afin d'ajouter un mode de transport. Cette méthode prend en paramètre :
|
|
|
Ensuite, il faut transmettre le réseau de transport. Celui-ci se compose des différents modes inclus dans la simulation. Mais il faut également indiquer comment ces modes sont interconnectés. Pour cela, dans le reflex `🅵 second_init` du fichier `🅶 Main.gaml`, on utilise la méthode `🅵 add_mode` afin d'ajouter un mode de transport. Cette méthode prend en paramètre :
|
|
|
|
|
|
* le graphe correspondant au mode de transport à ajouter
|
|
|
* le nom de ce mode
|
|
|
* la liste des bâtiments logistiques qui sont connectés à ce réseau
|
|
|
|
|
|
En interne, le `ForwardingAgent` va donc maintenir un graphe dont les différents modes de transport sont interconnectés entre eux par les bâtiments logistiques.
|
|
|
En interne, le `🆃 ForwardingAgent` va donc maintenir un graphe dont les différents modes de transport sont interconnectés entre eux par les bâtiments logistiques.
|
|
|
|
|
|
# Le calcul de plus court chemin
|
|
|
|
|
|
L'appel à la fonction `compute_shortest_path` s'effectue au moment de la création d'un objet `Commodity` (voir la page [Bâtiments logistiques](Building#processOrders) pour plus de détail à ce sujet) et nécessite de lui passer ces quatre paramètres :
|
|
|
L'appel à la fonction `🅵 compute_shortest_path` s'effectue au moment de la création d'un objet `🆃 Commodity` (voir la page [Bâtiments logistiques](Building#processOrders) pour plus de détail à ce sujet) et nécessite de lui passer ces quatre paramètres :
|
|
|
|
|
|
* le bâtiment d'origine de la marchandise.
|
|
|
* la destination de la marchandise.
|
|
|
* La stratégie employée pour déterminer le plus court chemin : soit `travel_time` pour le plus court chemin en terme de temps, soit `financial_costs` pour le plus court chemin en terme de coûts financiers.
|
|
|
* l'objet `Commodity` a transporté.
|
|
|
* l'objet `🆃 Commodity` a transporté.
|
|
|
|
|
|
`compute_shortest_path` consiste à exécuter un algorithme de Dijsktra modifié sur le graphe multi-modal. L'algorithme est modifié car il est capable de prendre en compte les dates de départ des véhicules quittant les bâtiments (y compris les nœuds multi-modaux intermédiaires).
|
|
|
`🅵 compute_shortest_path` consiste à exécuter un algorithme de Dijsktra modifié sur le graphe multi-modal. L'algorithme est modifié car il est capable de prendre en compte les dates de départ des véhicules quittant les bâtiments (y compris les nœuds multi-modaux intermédiaires).
|
|
|
|
|
|
Une fois le plus court chemin déterminé, `compute_shortest_path` s'occupe également de réserver les différents véhicules nécessaires au transport. La réservation consiste à appeler la fonction `registerDepartureDate` de la classe `TransporterSkill` du plugin `transport.organizer` (voir la page [Transporters](Transporters) pour plus de détails quant à cette fonction). |
|
|
\ No newline at end of file |
|
|
Une fois le plus court chemin déterminé, `🅵 compute_shortest_path` s'occupe également de réserver les différents véhicules nécessaires au transport. La réservation consiste à appeler la fonction `🅵 registerDepartureDate` de la classe `TransporterSkill` du plugin `transport.organizer` (voir la page [Transporters](Transporters) pour plus de détails quant à cette fonction).
|
|
|
|
|
|
# Légende
|
|
|
|
|
|
`🅵 fonctions`
|
|
|
|
|
|
`🆃 type d'agent`
|
|
|
|
|
|
`🆅 variable`
|
|
|
|
|
|
`🅶 Fichier contenant des variables et/ou des fonctions globales` |
|
|
\ No newline at end of file |