... | ... | @@ -68,4 +68,16 @@ Un prestataire est considéré inefficace si la valeur de `localTimeToBeDelivere |
|
|
|
|
|
## Stratégie minimisant les coûts financiers
|
|
|
|
|
|
# Sélection des destinataires voisins |
|
|
\ No newline at end of file |
|
|
Un prestataire est considéré inefficace si la valeur de `localVolumeNormalizedAverageCosts` est plus grande que celle de `averageCostsOfNeighbors`. Ces deux variables sont mis à jour à chaque pas de temps par le reflex `update_average_costs` présent dans le fichier `Observer.gaml`.
|
|
|
|
|
|
Le reflex `update_average_costs` calcul, pour chaque agent destinataire, le coût moyen par livraison sur les `costsMemory` dernières livraison (`costsMemory` étant un paramètre défini globalement dans `Parameters.gaml`). Le coût d'une seule livraison est calculé ainsi :
|
|
|
|
|
|
`volume * (km_route * coûtUnitaire_route + km_fluvial * coûtUnitaire_fluvial + km_maritime * coûtUnitaire_maritime)`
|
|
|
|
|
|
Les variables `km_mode` correspondent au nombre de kilomètres parcourus par la marchandise dans le mode de transport spécifié. Les variables `coûtUnitaire_mode` correspondent au coût de transport d'une seule unité de marchandise sur un seul kilomètre et dans le mode de transport spécifié.
|
|
|
|
|
|
Néanmoins, deux destinataires différents ne peuvent comparer leur prestataire respectif en comparant directement ce coût moyen car les situations de ces deux destinataires peuvent être totalement différentes : par exemple, l'un peut traiter des volumes beaucoup plus important; et ils peuvent aussi se trouver dans des secteurs géographiques très différents (avec des distances de transport également différentes). Cela fausserait donc la comparaison.
|
|
|
|
|
|
Pour résoudre ce problème, on a donc décidé en premier point de normaliser le coût moyen en le divisant par la somme des volumes de marchandises transportées pour un client : il s'agit de la variable `localVolumeNormalizedAverageCosts`.
|
|
|
|
|
|
Et ensuite, on ne compare `localVolumeNormalizedAverageCosts` qu'avec les coûts moyens normalisés des "voisins" du destinataire. La liste de ces voisins est déterminée par la fonction `buildNeighborsList` présente dans `FinalConsignee.gaml`. On se contente de récupérer l'ensemble des destinataires présents à moins de `neighborsDistance` km de l'agent courant. `neighborsDistance` est un paramètre défini globalement dans `Parameters.gaml`. Si la fonction `buildNeighborsList` ne trouve pas d'agent dans ce périmètre, alors elle double la taille du périmètre (puis triple, et ainsi de suite jusqu'à trouver au moins un voisin). Ce coût moyen des voisins correspond donc à la variable `averageCostsOfNeighbors`. |