#include "filtreavalcplexrestelibre.h" #include #include #include FiltreAvalCplexResteLibre::FiltreAvalCplexResteLibre() : FiltreAvalCplex() { } FiltreAvalCplexResteLibre::~FiltreAvalCplexResteLibre() { } void FiltreAvalCplexResteLibre::setproblemdata() { /** définition des zones */ m_cplex.addZoneVerticale( string("production=demande"), T()); for (powerplants1_t j=(powerplants1_t)0; jarcs_non_BO().size() ); if (m_plans[i]->arcs_non_BO().back()->m_fin->m_type == TYPE_DERNIER) m_cplex.addZoneVerticale( string("dernier arc : production + reste = stock après recharge ")+i, 1 ); } 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; const CPlan::CArc & dernier_arc = m_plans[i]->m_arcs.back(); if (dernier_arc.m_depart->m_type != TYPE_BO) { min = sup(BO(i,dernier_arc.m_depart->m_campaign)).v; max = (dernier_arc.m_depart->m_fuel_avant_refuel + dernier_arc.m_recharge).v ; } 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_date_campaign); tm_fin->m_date); ++t) { m_cplex.addToZ( a, t, 1); prod_max += EMAX(i,t); } if (arcs_non_BO[a]->m_fin->m_type != TYPE_DERNIER) m_cplex.addToRHS( a, CPlexModel::Equals, (arcs_non_BO[a]->m_depart->m_fuel_avant_refuel + arcs_non_BO[a]->m_recharge - arcs_non_BO[a]->m_reste).v ); else { m_cplex.addToRHS( a, CPlexModel::Range, prod_max.v, - MMAX(i,arcs_non_BO[a]->m_depart->m_campaign).v ); } } } /// III - dernier arc : stock initial = production + reste for (powerplants2_t i=(powerplants2_t)0; im_arcs.back(); if (dernier_arc.m_depart->m_type != TYPE_BO) { m_cplex.setZoneVerticale( string("dernier arc : production + reste = stock après recharge ")+i ); // production m_cplex.setZoneHorizontale( string("production nucléaire centrale ")+i); for (timestep_t t=week2timestep(dernier_arc.m_depart->m_date_campaign); tm_arcs.back().m_depart->m_fuel_avant_refuel + m_plans[i]->m_arcs.back().m_recharge).v ); } } } /** * mise-à-jour du modèle sur les parties dépendant du scénario */ void FiltreAvalCplexResteLibre::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