#include "filtreavalcplex.h" #include #include #include FiltreAvalCplex::~FiltreAvalCplex() { } FiltreAvalCplex::FiltreAvalCplex() : FiltreAval(), m_cplex( "filtreAval", CPlexModel::Minimisation, CPlexModel::Linear, #ifndef VERBOSE_CPLEX_INTERNAL true, #else false, #endif #ifndef VERBOSE_SOLUTION_STATUS true, #else false, #endif #ifdef WRITE_CPLEX_FILE true, true #else false, false #endif ) { m_type2_prod_max.resize(I()); } euros FiltreAvalCplex::calcule_solution(std::vector x, 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 et récupération de la solution for (scenario_t s = (scenario_t) 0 ; s < S() ; ++s) { // mise-à-jour du problème, partie dépendante du scénario setproblemdata(s) ; // résolution par cplex m_cplex.resolution(); vector deCplex; // remplissage des productions // thermiques for (powerplants1_t j=(powerplants1_t)0; jremplis_stock(reponse[s].prod_nucleaire[i], recharges[i]); } deCplex = m_cplex.getResult( string("coût recharges centrales nucléaires ") ); for (powerplants2_t i=(powerplants2_t)0; iarcs_non_BO().size() ); } m_cplex.addZoneHorizontale( string("restes centrales nucléaires"), I() ); // } m_cplex.addZoneHorizontale( string("coût recharges centrales nucléaires "), I() ); /** fonction objectif et ses contraintes verticales */ // coût des recharges des centrales nucléaires : indépendant des scénarios m_cplex.setZoneHorizontale( string("coût recharges centrales nucléaires ") ); for (powerplants2_t i=(powerplants2_t)0; im_cout + C(i,K_Tp1) * m_plans[i]->m_reste ).v ; double max = min ; m_cplex.addToObj( i, min, max, CPlexModel::Continuous, 1 ); } // prix de revente des stocks des centrales nucléaires : dépend de la quantité de stock restante m_cplex.setZoneHorizontale( string("restes centrales nucléaires") ); for (powerplants2_t i=(powerplants2_t)0; im_reste.v; double max = min; m_cplex.addToObj( i, min, max, CPlexModel::Continuous, - C(i,K_Tp1).v ); } /** autres contraintes verticales : production nucléaire */ for (powerplants2_t i=(powerplants2_t)0; i min; m_plans[i]->remplis_min_max(min, m_type2_prod_max[i]); for ( timestep_t t=(timestep_t) 0; t arcs_non_BO = m_plans[i]->arcs_non_BO(); for (size_t a=0; am_depart->m_fuel_avant_refuel + arcs_non_BO[a]->m_recharge - arcs_non_BO[a]->m_reste).v ); for (timestep_t t=week2timestep(arcs_non_BO[a]->m_depart->m_date_campaign); tm_fin->m_date); ++t) { m_cplex.addToZ( a, t, 1); } } } } /** * mise-à-jour du modèle sur les parties dépendant du scénario */ void FiltreAvalCplex::setproblemdata(scenario_t s) { /** fonction objectif et ses contraintes verticales */ // les coûts thermiques dépendent de la consommation thermique for (powerplants1_t j=(powerplants1_t)0; j