run.py → inputs.py → fleet_results.py → outputs.py.
Domaine et unités
UnFleetNeed.key identifie un besoin de service : région, établissement, distance annuelle, heures de ralenti, sous-type et véhicule initial. Chaque besoin représente un véhicule, sans pondération d’échantillon. Les options d’acquisition décrivent ICE, BEV et PHEV.
Distance, rendement, seuil kilométrique et entretien doivent employer la même unité. Aucune conversion kilomètres/milles n’est faite. La division des émissions par suppose des facteurs en grammes. Les séries monétaires sont additionnées sans conversion de devise ni inflation.
Classeur et valeurs par défaut
Les feuilles requises sontInputs, Annual Inputs, Global Data, Vehicle Specs, EV Availability, Maintenance Costs, Basic Fleet Info et les trois Replacement Costs (ICE), (BEV), (PHEV).
Inputs lit StartYear, EndYear, Horizon, GHG_Penalty et NumPHEV_Cycles. Les colonnes annuelles reconnues par Y?2... acceptent des années et des noms comme Y2026. La région all fournit les prix, intensités et valeurs carbone de repli. Le choix d’une série régionale dépend de sa première année de coût; les valeurs absentes ultérieures ne sont pas complétées individuellement.
L’importateur utilise 250 jours travaillés : son test WorkingDays sur des noms déjà convertis en minuscules empêche la substitution attendue avec les en-têtes usuels. La construction programmatique de FleetNeed utilise 365 jours par défaut. Les deux parcours ne sont donc pas équivalents.
Les multiplicateurs de pénalité sont 1,035 pour l’âge et le kilométrage, et 1,01 pour ICE. L’affectation globale early_rep évalue bool("EarlyRep_Allowed"), toujours vrai; la sélection vérifie l’autorisation propre au besoin. ghg_penalty et phev_cycles sont lus mais ne multiplient pas l’énergie annuelle dans _calc_usage_costs.
Années
Les coûts vont destart_year à horizon + max_ret_age, inclusivement. Les indicateurs d’achat incluent horizon, mais les décisions parcourent range(start_year, horizon) et excluent cette dernière année. end_year détermine le début de la pénalité ICE après étude. La comparaison additionne les coûts sur toute la série, sans actualisation.
Énergie et coûts d’utilisation
Poser , et la demande électrique quotidienne non contrainte .- ICE : et .
- BEV : ; toute la demande électrique est desservie même au-delà de la capacité de batterie. La disponibilité de recharge ne limite pas la faisabilité dans ce calcul.
- PHEV : si , conduite et ralenti sont électriques. Sinon, avec , poser , , et si . Le ralenti reste électrique. Une batterie non positive provoque une erreur.
Retraite et pénalités synthétiques
Le cycle récurrent est . L’admissibilité initiale utilise le minimum entre l’âge restant et . Un achat réinitialise l’échéancier. Un cycle nul rend la division de pénalité invalide. L’âge de pénalité est ; le kilométrage augmente depuis la valeur initiale. Les dépassements utilisent strictement>. Avec indiquant le dépassement d’au moins un seuil, les multiplicateurs d’âge/kilométrage applicables et le coût de remplacement de même motorisation :
Pour ICE, et :
La référence électrique est BEV, sinon PHEV. Ces pénalités influencent le choix sans constituer une dépense réelle. Le multiplicateur ICE répété appartient au calcul implémenté.
Sélection annuelle
Initialiser la stratégie de conservation, puis les essais de remplacement de même motorisation et de motorisations alternatives. Pour chaque année, actualiser les coûts d’achat, d’utilisation et de pénalité en conservant les décisions précédemment acceptées. L’économie candidate est :total_cost_mat comprend investissement, énergie, entretien, carbone et pénalités. Trier les besoins et parcourir les économies en ordre décroissant. Acheter seulement si l’économie est strictement positive, le remplacement anticipé ou dû est autorisé, et les plafonds permettent l’achat. Les égalités suivent l’ordre NumPy sans règle métier explicite.
Le plafond global est round(pourcentage × nombre / 100). Le plafond par sous-type suit cette règle sauf qu’une valeur brute positive inférieure à un devient un; zéro reste zéro. Sans plafond global, la limite égale la taille de la flotte. Il s’agit d’un classement annuel glouton, pas d’une optimisation simultanée pluriannuelle.
Validation des séries d’entrée
check_inputs exige prix/intensités des combustibles, limites par sous-type et prix d’acquisition jusqu’à une année après la dernière année de coût, soit horizon + max_ret_age + 1. Le calcul d’utilisation s’arrête une année plus tôt. Une limite par sous-type absente journalise une erreur et poursuit via AttributeError; une série trop courte provoque ValueError. Un kilométrage initial manquant devient zéro avec avertissement.
Sorties et validation
StudyResults.replacement_strategies contient les matrices véhicule × année de coûts, carburant, électricité, émissions et pénalités, ainsi que les achats/remplacements et les options. no_penalty_cost_mat exclut les pénalités. Les rapports comprennent résumés, plans de remplacement, coûts/émissions et énergie de recharge par établissement. Cette dernière est en kWh annuels, pas en puissance de borne ni en profil horaire.
Exemple BEV : , , , , donnent 4 100 kWh/an. À 0,15 monnaie/kWh, le coût est 615/an. À 100 g/kWh, les émissions sont 0,41 tCO2e/an. Ces valeurs ne sont pas des défauts.
Contrôler énergie, coûts réels séparés des pénalités, arrondis des plafonds, bornes annuelles, échéanciers et reproductibilité de l’ordre. Les tests couvrent utilisation, économies, plafonds et pénalités. Des options d’acquisition absentes provoquent des erreurs explicites; des colonnes manquantes, divisions par zéro ou années incompatibles peuvent échouer directement dans pandas ou l’arithmétique.