#include "cdualcplex.h" #include #include #include #include #include using namespace std; CDualCplex::CDualCplex( bool internal_silent, bool silent, bool writeToFile ) : CDualCalc() { m_cplex = new CPlexMutable( "DualCalc", CPlexModel::Minimisation, CPlexModel::Linear, internal_silent, silent, writeToFile, writeToFile ); ajoute_thermiques(); } CDualCplex::~CDualCplex() { delete m_cplex ; } /// Fonction à appeler pour le calcul des Ui Vi vector CDualCplex::calculeDuals() const { vector duals( H() + I() ); m_cplex->resolution(); for (scenario_t s; s cplex_duals = m_cplex->getDuals(string("production=demande scenario ") + s); for (week_t h; h cplex_duals = m_cplex->getDuals( "unicité colonnes nucléaires" ); for (powerplants2_t i; iaddLigne( string("production=demande scenario ") + s, H()); for (powerplants1_t j=(powerplants1_t)0; jaddColonne( string("production thermique centrale ")+j+" scenario "+s, H()); } m_cplex->addLigne( "unicité colonnes nucléaires", I()); // fonction objectif // coeff: coût de la production thermique unitaire par semaine / nbre de scenarios // variables associées : énergie produite, continue (entre pmin et pmax) for (scenario_t s=(scenario_t)0; ssetColonne( string("production thermique centrale ")+j+" scenario "+s ); for ( week_t h=(week_t) 0; haddToObj( h, EMIN(j,s,h).v, EMAX(j,s,h).v, CPlexModel::Continuous, C(j,s,h).v / S() ); } } // remplissage de Z // satisfaction de la demande for (scenario_t s=(scenario_t)0; ssetLigne( string("production=demande scenario ")+s); // partie droite : demande, opérateur = for (week_t h=(week_t) 0; haddToRHS( h, CPlexModel::Equals, EDEM(s,h).v ); // production des centrales thermiques par semaine (matrices identité) for (powerplants1_t j=(powerplants1_t)0; jsetColonne( string("production thermique centrale ")+j+" scenario "+s ); for (week_t h=(week_t)0; haddToZ( h, h, 1 ); } } // unicité des colonnes nucléaires m_cplex->setLigne( "unicité colonnes nucléaires" ); for (powerplants2_t i; iaddToRHS( i, CPlexModel::Equals, 1 ); } } /// ajout d'un plan de production nucléaire void CDualCplex::ajoutcolonne(CPlan* cplan) { // ajout du plan à la liste des plans m_plans.push_back(cplan); // ajout de la zone horizontale pour la colonne m_cplex->addColonne( string("centrale_") + cplan->m_i +"_plan_" +cplan->m_id, 1); // fonction objectif : coût du plan m_cplex->setColonne( string("centrale_") +cplan->m_i +"_plan_" +cplan->m_id ); m_cplex->addToObj( 0, 0, INFINI, CPlexModel::Continuous, cplan->m_cout.v ); // Z : partie production for (scenario_t s=(scenario_t)0; ssetLigne( string("production=demande scenario ")+s); for (week_t h=(week_t)0; haddToZ( h, 0, cplan->m_colonne[h].v ); } // Z : partie sélection de colonne m_cplex->setLigne( "unicité colonnes nucléaires" ); m_cplex->addToZ( cplan->m_i, 0, 1 ); } /// retrait d'un plan de production nucléaire void CDualCplex::retraitColonne(const CPlan* plan) { size_t indice = std::find(m_plans.begin(), m_plans.end(), plan) - m_plans.begin() ; m_cplex->removeZoneHorizontale( string("centrale_") +plan->m_i +"_plan_" +plan->m_id ); m_plans.erase( m_plans.begin()+indice ); } vector CDualCplex::getReducedCosts() const { vector cr( m_plans.size() ); for (size_t p=0; pgetReducedCosts(string("centrale_") +m_plans[p]->m_i +"_plan_"+m_plans[p]->m_id)[0]; } return cr; } double CDualCplex::getObjectiveValue() const { return m_cplex->getObjectiveValue() ; }