#include "filtreAval.h" #include #include #include #include #include #include #include #include using namespace std; FiltreAval::FiltreAval() { valeurObjectif=(euros)0; m_plans.resize(I(), NULL); reponse.resize(S()); recharges.resize(I(), vector(K())); for (scenario_t s = (scenario_t) 0 ; s < S() ; ++s) { reponse[s].costPourScenario = (euros)0 ; reponse[s].prod_nucleaire.resize(I(), vector(T(), (kWh)0)); // I vecteurs de production nucléaire reponse[s].stock .resize(I(), vector(T()+(tlen_t)1, (kWh)0)); // I vecteurs de stock nucléaire reponse[s].prod_thermique.resize(J(), vector(T(), (kWh)0)); // J vecteurs de production thermique reponse[s].prod_nucleaire_totale.resize(T(), (kWh)0); reponse[s].prod_thermique_totale.resize(T(), (kWh)0); } } euros FiltreAval::calcule_solution(vector x, double, bool) { //Récupération des colonnes sélectionnées for( size_t i =0 ; im_i] = CPlan::getPlan(x[i]); } // vérification : on doit avoir un plan par centrale nucléaire for (size_t i=0; iremplis_recharges( recharges[i] ) ; //Boucle sur les scénarios for (scenario_t s = (scenario_t) 0 ; s < S() ; ++s) { vector demande_restante(T()); // recopie de la demande dans demande_restante for (timestep_t t=(timestep_t)0; tremplis_BO_en_visant_bien( reponse[s].prod_nucleaire[i], reponse[s].stock[i], demande_restante ); // remplissage des productions non forcées for (size_t i=0; iremplis_campagnes_non_BO( reponse[s].prod_nucleaire[i], reponse[s].stock[i], demande_restante ); // calcul de la production nucléaire totale for (size_t i=0; im_cout ; // fuel restant dans les centrales nucléaires for (size_t i=0; im_reste ; // calcul de la production thermique totale for (timestep_t t=(timestep_t)0; t tri_el ; typedef multimap tri_powerplant ; typedef tri_powerplant::iterator tri_it ; tri_powerplant coutProd; for ( powerplants1_t j=(powerplants1_t) 0 ; j < J() ; ++j ) { coutProd.insert(tri_el( type1(j).C(t, s), j )); reponse[s].prod_thermique[j][t] = EMIN(j, t, s); resteAProduire -= EMIN(j, t, s) ; } // Parcours des centrales thermiques par coût croissant pour déterminer la production de chacune for ( tri_it it=coutProd.begin(); it != coutProd.end() && resteAProduire > (kWh)0; it++ ) { powerplants1_t & j = it->second ; kWh prodCentraleSupplementaire = min(resteAProduire, EMAX(j, t, s) - EMIN(j, t, s)); resteAProduire -= prodCentraleSupplementaire; reponse[s].prod_thermique[j][t] += prodCentraleSupplementaire; } if ( resteAProduire > (kWh) 0 ) { throw string("Impossible de satisfaire toute la demande"); } } // calcul du coût de la production thermique for (timestep_t t=(timestep_t)0; t(timestep_t)0) ofs << "\t"; ofs << reponse[s].prod_nucleaire[i][t] ; } ofs << endl; } ofs.close(); } } void FiltreAval::printOutput(std::ofstream& ofs, time_t heureDebut) { /** * Section main */ ofs << fixed << setprecision(10) ; ofs << "begin main" << endl; ofs << "team_identifier " << CTeamId::getTeamId() << endl; time_t rawtime; tm * ptm; time ( &rawtime ); ptm = gmtime ( &rawtime ); ofs << "solution_time_date " << printIntSurDeuxChiffres(ptm->tm_mday) << "/" << printIntSurDeuxChiffres(1+ptm->tm_mon) << "/" << printIntSurQuatreChiffres(1900+ptm->tm_year) << " " << printIntSurDeuxChiffres(ptm->tm_hour) << ":" << printIntSurDeuxChiffres(ptm->tm_min) << ":" << printIntSurDeuxChiffres(ptm->tm_sec) << endl; time_t tempsEcoule = time (NULL) - heureDebut; //hh:mm:ss int heures = tempsEcoule / 3600; int minutes = (tempsEcoule / 60) % 60; int secondes = (tempsEcoule % 60) ; ofs << "solution_running_time " << printIntSurDeuxChiffres(heures) << ":" << printIntSurDeuxChiffres(minutes) << ":" << printIntSurDeuxChiffres(secondes) << endl; ofs << "data_set " << CInstance::params().getInstanceName() << endl; ofs << "cost " << valeurObjectif << endl; ofs << "end main" <m_id << endl ; #endif ofs << "name " << type2(i).m_name << endl; ofs << "index " << (int) i << endl; ofs << "outage_dates"; vector dates_outages( K(), (week_t) -1 ); m_plans[i]->remplis_dates_outages( dates_outages ) ; for ( campaign_t k=(campaign_t) 0 ; k < K() ; k = ++k ) ofs << " " << dates_outages[k] ; ofs << endl ; ofs << "reloaded_fuel" ; for ( campaign_t k=(campaign_t) 0 ; k < K() ; k = ++k ) ofs << " " << recharges[i][k] ; ofs << endl ; } ofs << "end outages" << endl; /** * Section power_output */ ofs << "begin power_output" << endl; for ( scenario_t s = (scenario_t) 0; s < S(); ++s ) { ofs << "scenario " << s << endl; /** * types 1 */ ofs << "begin type1_plants" << endl; for (powerplants1_t j = (powerplants1_t) 0; j99) throw string("chiffre invalide"); char s[3]; sprintf(s,"%02d",chiffre); return s; } string printIntSurQuatreChiffres(int chiffre) { if (chiffre<0 or chiffre>9999) throw string("chiffre invalide"); char s[5]; sprintf(s,"%04d",chiffre); return s; } powerplants2_t col2powerplant2(const vector& colonne) { for ( size_t c=(size_t) H() ; c < colonne.size() ; c++ ) { if ( colonne[c] == 1 ) { return (powerplants2_t) (c-H()+1); } } //Si on arrive ici, c'est qu'il n'y a pas de 1 sur la colonne cerr << "Colonne non attribuée" << endl; return (powerplants2_t) -1; }