From 687b653f9d7a0d9098a7727945fd552ae38e7dfe Mon Sep 17 00:00:00 2001 From: root <root@clonex.home> Date: Sun, 11 Feb 2024 15:05:27 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20de=20l'algo=20de=20placement=20carbonne?= =?UTF-8?q?=20le=20moins=20co=C3=BBteux=20et=20un=20exemple=20de=20fichier?= =?UTF-8?q?s=20events=20,=20fait=20par=20:=20Karim=20/Adem?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- exempleEvent.txt | 12 ++++++ jsonAlgo.cpp | 108 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 exempleEvent.txt create mode 100644 jsonAlgo.cpp diff --git a/exempleEvent.txt b/exempleEvent.txt new file mode 100644 index 0000000..bdbf3bb --- /dev/null +++ b/exempleEvent.txt @@ -0,0 +1,12 @@ +{"type": "datacenter_announcement", "id": "dcA", "location": "France", "year": 2018, "carbon_intensity": 67, "timestamp": 0} +{"type": "datacenter_announcement", "id": "dcA", "location": "France", "year": 2019, "carbon_intensity": 69, "timestamp": 1} +{"type": "datacenter_announcement", "id": "dcA", "location": "France", "year": 2020, "carbon_intensity": 67, "timestamp": 2} +{"type": "datacenter_announcement", "id": "dcA", "location": "France", "year": 2021, "carbon_intensity": 67, "timestamp": 3} +{"type": "datacenter_announcement", "id": "dcC", "location": "United States", "year": 2021, "carbon_intensity": 379, "timestamp": 4} +{"type": "datacenter_announcement", "id": "dcC", "location": "United States", "year": 2020, "carbon_intensity": 369, "timestamp": 5} +{"type": "datacenter_announcement", "id": "dcC", "location": "United States", "year": 2019, "carbon_intensity": 393, "timestamp": 6} +{"type": "datacenter_announcement", "id": "dcC", "location": "United States", "year": 2018, "carbon_intensity": 412, "timestamp": 7} +{"type": "datacenter_announcement", "id": "dcB", "location": "Morocco", "year": 2021, "carbon_intensity": 631, "timestamp": 8} +{"type": "datacenter_announcement", "id": "dcB", "location": "Morocco", "year": 2020, "carbon_intensity": 642, "timestamp": 9} +{"type": "datacenter_announcement", "id": "dcB", "location": "Morocco", "year": 2019, "carbon_intensity": 627, "timestamp": 10} +{"type": "datacenter_announcement", "id": "dcB", "location": "Morocco", "year": 2018, "carbon_intensity": 627, "timestamp": 11} diff --git a/jsonAlgo.cpp b/jsonAlgo.cpp new file mode 100644 index 0000000..9f9005d --- /dev/null +++ b/jsonAlgo.cpp @@ -0,0 +1,108 @@ +#include <iostream> +#include <fstream> +#include <string> +#include <vector> +#include <limits> +#include <nlohmann/json.hpp> +//Author Karim/Adem +using json = nlohmann::json; + +struct ProfileInfo { + std::string id; + std::string datacenter; + int year; + int carbon_emission; +}; + +std::string extractDatacenterFromId(const std::string& id) { + size_t pos = id.find_last_of('_'); + return pos != std::string::npos ? id.substr(0, pos) : ""; +} + +int extractYearFromId(const std::string& id) { + size_t pos = id.find_last_of('_'); + return pos != std::string::npos ? std::stoi(id.substr(pos + 1)) : -1; +} + +ProfileInfo findOptimalEmissionByYear(const std::vector<ProfileInfo>& profiles, int year) { + ProfileInfo optimalProfile; + int minEmission = std::numeric_limits<int>::max(); + + for (const auto& profile : profiles) { + if (profile.year == year && profile.carbon_emission < minEmission) { + minEmission = profile.carbon_emission; + optimalProfile = profile; + } + } + + return optimalProfile; +} + +ProfileInfo findGlobalOptimalEmission(const std::vector<ProfileInfo>& profiles) { + ProfileInfo optimalProfile; + int minEmission = std::numeric_limits<int>::max(); + + for (const auto& profile : profiles) { + if (profile.carbon_emission < minEmission) { + minEmission = profile.carbon_emission; + optimalProfile = profile; + } + } + + return optimalProfile; +} + +int main() { + std::string filePath = "jsonInput.json"; + std::ifstream inputFile(filePath); + if (!inputFile.is_open()) { + std::cerr << "Erreur lors de l'ouverture du fichier : " << filePath << std::endl; + return -1; + } + + json jsonData; + inputFile >> jsonData; + + std::vector<ProfileInfo> profiles; + + for (auto& profile : jsonData["profiles"].items()) { + std::string emissionStr = profile.value()["carbon_emission"].get<std::string>(); + int emission = std::stoi(emissionStr.substr(0, emissionStr.size() - 2)); // Enlever "kg" et convertir en entier + + ProfileInfo pInfo; + pInfo.id = profile.key(); + pInfo.datacenter = extractDatacenterFromId(pInfo.id); + pInfo.year = extractYearFromId(pInfo.id); + pInfo.carbon_emission = emission; + profiles.push_back(pInfo); + } + + int choice; + std::cout << "Choisissez une option :\n1. Trouver l'empreinte carbone la plus faible pour une année spécifique\n2. Trouver l'empreinte carbone globale la plus faible\nVotre choix : "; + std::cin >> choice; + + if (choice == 1) { + int year; + std::cout << "Entrez l'année : "; + std::cin >> year; + ProfileInfo optimalProfile = findOptimalEmissionByYear(profiles, year); + if (!optimalProfile.id.empty()) { + std::cout << "L'empreinte carbone la plus faible pour " << year << " est en " << optimalProfile.datacenter << " : " << optimalProfile.carbon_emission << "kg\n"; + } else { + std::cout << "Aucune empreinte carbone trouvée pour l'année " << year << ".\n"; + } + } else if (choice == 2) { + ProfileInfo globalOptimalProfile = findGlobalOptimalEmission(profiles); + if (!globalOptimalProfile.id.empty()) { + std::cout << "L'empreinte carbone globale la plus faible est :\n" + << "Datacenter: " << globalOptimalProfile.datacenter << ", Année: " << globalOptimalProfile.year + << ", Empreinte carbone: " << globalOptimalProfile.carbon_emission << "kg\n"; + } else { + std::cout << "Aucune empreinte carbone globale optimale trouvée.\n"; + } + } else { + std::cout << "Option invalide.\n"; + } + + return 0; +} -- GitLab