#ifndef DA_H_INCLUDED #define DA_H_INCLUDED #include #include #include #include #include #include #include #include #include "../instance/indices.h" #include "../instance/cinstance.h" #include "../instance/cinstancereduite.h" #include "cgraphe.h" #include "cplan.h" #include "clique.h" #include "../cplx/cplex.h" using namespace std; class Cplex; class DualAscent { public : // Matrice A de taille 260 + 51 X nombre de colonnes vector< vector * > A ; vector > recharge; //recharge[col][k] = quantité refuelée à la k-ème campagne, sur la col-ième colonne double a(int i, int j) const { return (*A[i])[j];} // vecteur de cout des colonnes vector cost ; // fuel remaining vector reste; // reste[col] = fuel restant en fin de scénar // vecteur de demande de production + affectation des colonnes vector b ; // fonction DualAscent(vector dem, powerplants2_t nb_centrales) { b = dem ; b.resize( dem.size() + nb_centrales , 1 ); double coutTherm = 0; for (week_t i=(week_t) 0;i vide; ajoutcolonne(&b, coutTherm, vide, 0); } // destructeur ~DualAscent() {} protected: void ajoutcolonne( vector * colonne, double cou, std::vector& arcs, double resteCol ) { A.push_back(colonne); cost.push_back(cou); vector quantiteRefuelee; for ( int i=0 ; i < arcs.size() ; i++ ) { if ( arcs[i].m_type == TYPE_OUTAGE ) { quantiteRefuelee.push_back(arcs[i].m_recharge); } } recharge.push_back(quantiteRefuelee); reste.push_back(resteCol); } public: void ajoutcolonne(CPlan* cplan){ Clique::ajoutcolonne(cplan, A.size()); ajoutcolonne(&cplan->m_colonne, cplan->m_cout, cplan->m_arcs, cplan->m_reste); } // void print(); void boucle(vector& u, vector & lambda, bool& BorneSup, const char*x=NULL) const;// Fonction à appeler calcul des Ui Vi private: vector calculePoids() const; vector DAcalc (const vector & ,vector &, const vector &) const; // vector EcritureCplex(const vector &, const char *) const; // double updateLambda(const vector &, vector &,const vector &, double ) const; vector sousgrad(vector &, const vector &,const vector &, const vector &,const vector &) const; // operateur binaire // bool epsiqual( const double &, const double &) const; // Recherche de borne sup upper bound bool testUB () const ; double recherche_UB () const ; /** * Supprime la colonne correspondant à la centrale thermique. * À n'appeler qu'une unique fois, juste après la génération de colonne, * et juste avant la préparation des données pour CPlex * * Appelé par la classe CPlex */ public: void vireColonneThermique(); //friend Cplex::Cplex(DualAscent& ); //TODO : faire que ça marche, pour pouvoir privater la méthode précédente //temp : méthode de debug void testL(const vector& L, const string& mes) const { for ( int i=0 ; i < L.size() ; i++ ) { if ( !isfinite(L[i]) || L[i]!=L[i] ) { cerr<