#ifndef DA_H_INCLUDED #define DA_H_INCLUDED #include #include #include #include #include "cplan.h" #include "dualcalc.h" class DualAscent : public CDualCalc { public : // Matrice A de taille 260 + 51 X nombre de colonnes std::vector< std::vector * > A ; std::vector > recharge; //recharge[col][k] = quantité refuelée à la k-ème campagne, sur la col-ième colonne kWh a(int i, int j) const { return (*A[i])[j];} // vecteur de cout des colonnes std::vector cost ; // fuel remaining std::vector reste; // reste[col] = fuel restant en fin de scénar // vecteur de demande de production + affectation des colonnes std::vector b ; // vecteur de production MAX remplie par toutes les centrales nucléaires si elles fonctionnaient toutes à PMAX + affectation colonne std::vector b_EMAX ; // mêmes informations pour la colonne themique std::vector * therm_A ; std::vector therm_recharge ; euros therm_cost ; kWh therm_reste ; protected: void ajoutcolonne( std::vector * colonne, euros cou, std::vector& arcs, kWh resteCol ); public: DualAscent(std::vector dem, powerplants2_t nb_centrales); virtual void ajoutcolonne(CPlan* cplan); /// retrait d'un plan de production nucléaire virtual void retraitColonne(const CPlan* cplan); /// Fonction à appeler pour le calcul des Ui Vi std::vector calculeDuals() const; /// récupération des coûts réduits pour les classes utilisant cplex) virtual std::vector getReducedCosts() const { return std::vector(m_plans.size());} private: mutable std::vector m_u; mutable std::vector m_lambda; mutable euros m_UB; std::vector calculePoids() const; std::vector DAcalc (const std::vector & lambda, std::vector & L, const std::vector & q) const; std::vector sousgrad(std::vector & x, const std::vector & u,const std::vector & lambda, const std::vector & L, const std::vector & q) const; // Recherche de borne sup upper bound bool testUB () const ; euros recherche_UB () const ; euros recherche_UB2 (const std::vector &q) 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() ; void remetColonneThermique(); //temp : méthode de debug void testL(const std::vector& L, const std::string& mes) const { for ( size_t i=0 ; i < L.size() ; i++ ) { if ( (L[i]==INFINI) || L[i]!=L[i] ) { std::cerr<