#include "cdualcplexscenariomoyen.h" #include #include #include #include #include using namespace std; CDualCplexScenarioMoyen::CDualCplexScenarioMoyen(bool internal_silent, bool silent, bool writeToFile) { m_cplex = new CPlexMutable( "DualCalc", CPlexModel::Minimisation, CPlexModel::Linear, internal_silent, silent, writeToFile, writeToFile ); ajoute_thermiques(); } CDualCplexScenarioMoyen::~CDualCplexScenarioMoyen() { } std::vector< euros_par_kWh > CDualCplexScenarioMoyen::calculeDuals() const { vector duals( H() + I() ); m_cplex->resolution(); vector cplex_duals = m_cplex->getDuals("production=demande"); for (week_t h; hgetDuals( "unicité colonnes nucléaires" ); for (powerplants2_t i; iaddZoneHorizontale( string("production nucléaire plan ")+cplan->m_id, 1); // fonction objectif : coût du plan m_cplex->setZoneHorizontale( string("production nucléaire plan ")+cplan->m_id ); m_cplex->addToObj( 0, 0, 1, CPlexModel::Continuous, cplan->m_cout.v ); // m_cplex->addToObj( 0, 0, INFINI, CPlexModel::Continuous, cplan->m_cout.v ); // Z : partie production m_cplex->setZoneVerticale("production=demande"); for (week_t h=(week_t)0; haddToZ( h, 0, cplan->m_colonne[h].v ); // Z : partie sélection de colonne m_cplex->setZoneVerticale( "unicité colonnes nucléaires" ); m_cplex->addToZ( cplan->m_i, 0, 1 ); } /// retrait d'un plan de production nucléaire void CDualCplexScenarioMoyen::retraitColonne(const CPlan* plan) { size_t indice = std::find(m_plans.begin(), m_plans.end(), plan) - m_plans.begin() ; m_cplex->removeZoneHorizontale( string("production nucléaire plan ")+plan->m_id ); m_plans.erase( m_plans.begin()+indice ); } vector CDualCplexScenarioMoyen::getReducedCosts() const { vector cr( m_plans.size() ); for (size_t p=0; pgetReducedCosts(string("production nucléaire plan ")+m_plans[p]->m_id)[0]; } return cr; } void CDualCplexScenarioMoyen::ajoute_thermiques() { // définition des zones m_cplex->addZoneVerticale( "production=demande", H()); for (powerplants1_t j=(powerplants1_t)0; jaddZoneHorizontale( string("production thermique centrale ")+j, H()); m_cplex->addZoneVerticale( "unicité colonnes nucléaires", I()); // fonction objectif // coeff: coût de la production thermique unitaire par semaine // variables associées : énergie produite, continue (entre pmin et pmax) for (powerplants1_t j=(powerplants1_t)0; jsetZoneHorizontale( string("production thermique centrale ")+j ); for ( week_t h=(week_t) 0; haddToObj( h, EMIN(j,h).v, EMAX(j,h).v, CPlexModel::Continuous, C(j,h).v ); } // remplissage de Z // satisfaction de la demande m_cplex->setZoneVerticale( "production=demande"); // partie droite : demande, opérateur = for (week_t h=(week_t) 0; haddToRHS( h, CPlexModel::Equals, EDEM(h).v ); // production des centrales thermiques par semaine (matrices identité) for (powerplants1_t j=(powerplants1_t)0; jsetZoneHorizontale( string("production thermique centrale ")+j ); for (week_t h=(week_t)0; haddToZ( h, h, 1 ); } // unicité des colonnes nucléaires m_cplex->setZoneVerticale( "unicité colonnes nucléaires" ); for (powerplants2_t i; iaddToRHS( i, CPlexModel::Equals, 1 ); } }