#include "cplan.h" #include "cgraphe.h" #include #include #include #include #include using namespace std ; int CPlan::id = 0 ; CPlan::CArc::CArc(const CNoeud & depart, const CNoeud & fin, double _recharge, double _reste, double _cout_reduit, double _cout) : m_depart(&depart), m_fin(&fin) { m_type = depart.m_type ; m_k = depart.m_campaign ; m_date = depart.m_date ; m_date_fin = fin .m_date ; m_recharge = _recharge ; m_cout = _cout ; m_cout_reduit = _cout_reduit ; m_reste = _reste ; } CPlan::CPlan( powerplants2_t i, size_t taille_prod, powerplants2_t nb_centrales) { m_colonne = std::vector( taille_prod + nb_centrales, 0 ); m_colonne[ taille_prod + i ] = 1 ; m_fuel = vector( taille_prod, 0 ) ; m_fuel_tp1 = vector( taille_prod, 0 ) ; m_i = i ; for (week_t h=(week_t)0; h<(week_t)taille_prod; ++h) m_colonne[h] = EMAX(m_i, h); m_cout_reduit = 0 ; m_cout = 0 ; m_reste = 0 ; m_id = id++ ; } void CPlan::set_prod( size_t index, double prod ) { m_colonne[index] = prod ; } void CPlan::push_back( const CNoeud & dep, const CNoeud & fin, double _recharge, double _reste, double _cout_reduit, double _cout ) { m_arcs.push_back(CArc(dep, fin, _recharge, _reste, _cout_reduit, _cout )); m_cout_reduit += _cout_reduit ; m_cout += _cout ; m_reste = _reste ; if (fin.m_type==TYPE_DERNIER) { m_cout -= (CiTp1(m_i)*_reste); m_cout_reduit -= CGraphe::V(m_i); // calcul des ha m_ha.resize(0); for (size_t a=0; a & prod, vector & stock, vector & demande_restante) { for (size_t arc_idx=0; arc_idxm_type==TYPE_BO) { double fuel = arc.m_depart->m_fuel ; for (timestep_t t=week2timestep(arc.m_date); tm_date); ++t) { stock[t] = fuel ; prod[t] = type2(m_i).PB(arc.m_depart->m_campaign, t, fuel); fuel -= prod[t] ; demande_restante[t] -= prod[t] ; } } } } void CPlan::remplis_BO_en_visant_bien(vector & prod, vector & stock, vector & demande_restante) { for (size_t arc_idx=0; arc_idx ideal ; timestep_t tdeb=week2timestep(depart.m_date); timestep_t tfin=week2timestep(fin.m_date); cout << "\nPowerplant " << m_i.v << " k:" << depart.m_campaign.v << " h:" << depart.m_date.v << endl ; if (fin.m_type!=TYPE_DERNIER) { // pour bien viser, on encadre le stock sur chaque t list liste_limits ; liste_limits.push_back( CIntervallesBO(-1,depart.m_fuel,depart.m_fuel) ); for (timestep_t t=tdeb; t & prod, vector & stock, vector & demande_restante) { for (size_t arc_idx=0; arc_idxm_type==TYPE_OUTAGE) { timestep_t t = week2timestep(arc.m_date) ; stock[t] = arc.m_depart->m_fuel ; prod [t] = 0 ; for (++t; tm_date_campaign); ++t) { stock[t] = arc.m_depart->m_fuel_avant_refuel + arc.m_recharge ; prod[t] = 0 ; } } // remplissage des campagnes de production non BO if (arc.m_depart->m_type != TYPE_BO) { double fuel = arc.m_depart->m_fuel_avant_refuel + arc.m_recharge ; // parcours des semaines for (week_t h = arc.m_depart->m_date_campaign; hm_date; ++h) { for (timestep_t t=week2timestep(h); tm_campaign)) ; prod [t] = m_colonne[h] * (EMAX(m_i,t)==0 ? 1 : EMAX(m_i,t) / EMAX(m_i,h)); fuel -= prod[t] ; demande_restante[t] -= prod[t] ; } } } } } void CPlan::remplis_dates_outages( std::vector & dates ) { for (size_t arc_idx=0; arc_idxm_type==TYPE_OUTAGE) dates[arc.m_depart->m_campaign] = arc.m_depart->m_date ; } } void CPlan::remplis_recharges( std::vector & recharges ) { for (size_t arc_idx=0; arc_idxm_type==TYPE_OUTAGE) recharges[arc.m_depart->m_campaign] = arc.m_recharge ; } } ostream & operator <<(ostream & out, CPlan & plan) { #ifdef FICHIER_PLAN ofstream fichier ; char nom[100]; sprintf(nom, "centrale_%02d", (int)plan.m_i); fichier.open(nom, ios_base::app); //fichier.seekp( 0, ios_base::end ); for (size_t h=0; h<(unsigned)H(); h++) { fichier << fixed << setprecision(10) << plan.m_colonne[h]; if (h==(unsigned) (H()-1)) fichier << endl ; else fichier << '\t'; } fichier.close(); #endif out << "***** Plan de production de la centrale " << (int) plan.m_i << " *****" << endl ; for (size_t i = 0; iat(h) ; out << endl ; } out << " revente : " << plan.m_reste << "\tprix : " << CiTp1(plan.m_i)*plan.m_reste << endl; out << " coût total du plan : " << plan.m_cout << endl ; out << " coût réduit de la colonne : " << plan.m_cout_reduit << endl ; return out ; }