#include "cdualcplexunecolonnethermique.h" #include #include #include #include #include using namespace std; CDualCplexUneColonneThermique::CDualCplexUneColonneThermique(bool internal_silent, bool silent, bool writeToFile) { m_cplex = new CPlexMutable( "DualCalc", CPlexModel::Minimisation, CPlexModel::Linear, internal_silent, silent, writeToFile, writeToFile ); thermiques_ajoutee = false ; } CDualCplexUneColonneThermique::~CDualCplexUneColonneThermique() { } std::vector< euros_par_kWh > CDualCplexUneColonneThermique::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 CDualCplexUneColonneThermique::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 CDualCplexUneColonneThermique::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 CDualCplexUneColonneThermique::ajoute_thermiques() { // définition des zones m_cplex->addZoneVerticale( "production>=demande", H()); m_cplex->addZoneHorizontale( "production thermique", 1); 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) m_cplex->setZoneHorizontale( "production thermique" ); euros coutTherm; for (week_t w=(week_t) 0;waddToObj( 0, 0, 1, CPlexModel::Continuous, coutTherm.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::GreaterThan, EDEM(h).v ); // production des centrales thermiques par semaine (matrices identité) m_cplex->setZoneHorizontale( "production thermique" ); for (week_t h=(week_t)0; haddToZ( h, 0, EDEM(h).v ); // unicité des colonnes nucléaires m_cplex->setZoneVerticale( "unicité colonnes nucléaires" ); for (powerplants2_t i; iaddToRHS( i, CPlexModel::Equals, 1 ); } }