#include "filtreAval.h" #include "../cteamid.h" #include #include #include using namespace std; FiltreAval::FiltreAval(vector &x , DualAscent& da ) { int nbrCol = da.A.size(); static timestep_t week_length = (timestep_t)( T()/H() ); map*> colonnesSelectionnees; double coutColonneNuc = 0; valeurObjectif=0; //Récupération des colonnes sélectionnées for( int i =0 ; i1-EPSILON_FILTRE ) { powerplants2_t numPowerplant = col2powerplant2(*(da.A[i])); pair* > p(numPowerplant, da.A[i]); colonnesSelectionnees.insert(p); coutColonneNuc += da.cost[i]; annuaireColonnesSelectionnees.insert(pair( numPowerplant, i)); } } //Boucle sur les scénarios for (scenario_t s = (scenario_t) 0 ; s < S() ; s=(scenario_t) (s+1)) { //Traitement semaine par semaine detailProdParScenario menu; menu.costPourScenario = coutColonneNuc; for (week_t w = (week_t) 0; w < H() ; w = (week_t) (w+1) ) { vector demDeLaSemaine ; double somDemSemaine = 0; //Boucle préliminaire sur chaque timestep de la semaine afin de déterminer la proportion de la demande for (timestep_t t = (timestep_t) (w * week_length); t<(timestep_t)(w*week_length+week_length); t=(timestep_t) (t+1)) { double demande = CInstance::DEM(t,s) ; demDeLaSemaine.push_back( demande ); somDemSemaine += demande ; } //Boucle principale sur chaque timestep de la semaine afin de déterminer les productions vector prodNucDuTimestep ; for (timestep_t t = (timestep_t) (w * week_length); t<(timestep_t)(w*week_length+week_length); t=(timestep_t) (t+1)) { //Boucle sur les centrales nucléaire afin de déterminer leurs productions double prodNuclSommeePourLeTimestep = 0; for (powerplants2_t i = (powerplants2_t) 1;i<=I();i=(powerplants2_t) (i+1) ) { double prodNucDuTimestepDuneCentrale = (*(colonnesSelectionnees[i]))[w] * demDeLaSemaine[t-w*week_length]/somDemSemaine ; prodNucDuTimestep.push_back(prodNucDuTimestepDuneCentrale); prodNuclSommeePourLeTimestep += prodNucDuTimestepDuneCentrale; } menu.prodNucParTimestep.push_back(prodNucDuTimestep); menu.prodNuclSommeeParTimestep.push_back(prodNuclSommeePourLeTimestep); //Détermination de la production thermique sommée menu.prodThermSommeeParTimestep.push_back(CInstance::DEM(t, s) - prodNuclSommeePourLeTimestep); //Détermination de la production thermique de chaque centrale //Boucle préliminaire sur les centrales thermiques pour récupérer PMIN et trier en fonction du coût double resteAProduire = menu.prodThermSommeeParTimestep.back(); multimap coutProd; // ex : coutProd[100] => liste des centrales qui ont un cout de production unitaire de 100 vector prodThermDuTimestep ; for ( powerplants1_t j=(powerplants1_t) 0 ; j < J() ; j = (powerplants1_t) (j+1) ) { coutProd.insert(pair(CInstance::type1(j).C(t, s), j)); prodThermDuTimestep.push_back(CInstance::type1(j).EMIN(t, s)); resteAProduire -= CInstance::type1(j).EMIN(t, s); menu.costPourScenario += CInstance::type1(j).EMIN(t, s) * CInstance::type1(j).C(t, s); } //Boucle principale sur les centrales thermiques déterminer le production de chacune for ( multimap::iterator it=coutProd.begin() ; it != coutProd.end() && resteAProduire > 0; it++ ) { double prodCentraleSupplementaire = min(resteAProduire, CInstance::type1(it->second).EMAX(t, s)-CInstance::type1(it->second).EMIN(t, s)); resteAProduire -= prodCentraleSupplementaire; prodThermDuTimestep[it->second] += prodCentraleSupplementaire; menu.costPourScenario += prodCentraleSupplementaire * CInstance::type1(it->second).C(t, s); } if ( resteAProduire > 0 ) { cerr<<"Impossible de satisfaire toute la demande"<tm_mday)<<"/"<tm_mon); ofs<<"/"<tm_year)<<" "<tm_hour)<<":"; ofs<tm_min)<<":"<tm_sec)<::iterator it = annuaireColonnesSelectionnees.begin() ; it != annuaireColonnesSelectionnees.end() ; it++ ) { ofs<<"name "<first-1) ).m_name<first-1) ).i<first]].size();k++) { ofs<<" "<first]][k] ; } ofs<first]].size();k++) { ofs<<" "<first]][k] ; } ofs<& colonne) { for ( int i=H() ; i < colonne.size() ; i++ ) { if ( colonne[i] == 1 ) { return (powerplants2_t) (i-H()+1); } } //Si on arrive ici, c'est qu'il n'y a pas de 1 sur la colonne cerr<<"Colonne non attribuée"<