#include "cplex.h" #include #ifdef DEBUG_CPLEX #define DEBUG_CPLEX_PRINT(a) std::cout< > vclique(nbColonnes); vector vbc; contrainte14 ( vclique, vbc); //*/ } Cplex::Cplex(const DualAscent& da) { /* Traitement des attributs hors clique */ //Allocation dynamique nbColonnes = da.cost.size(); // nombre de colonnes DEBUG_CPLEX_PRINT("nbColonnes : "< > vclique(nbColonnes); vector vbc; contrainte14 ( vclique, vbc); } void Cplex::contrainte14 (std::vector >& vclique, std::vector& vbc) { #ifdef TEST_CC14 for ( int subset=0 ; subset < 1 ; subset++ ) #else for ( int subset=0 ; subset < CInstance::M((constraint_t) 14) ; subset++ ) #endif { #ifdef TEST_CC14 vector test; test.push_back((powerplants2_t) 0); test.push_back((powerplants2_t) 1);test.push_back((powerplants2_t) 2); vector centralesDuSubset = test; wlen_t Se = (wlen_t) 1; #else vector centralesDuSubset = CInstance::m_constraints14[subset].C(); wlen_t Se = CInstance::m_constraints14[subset].Se() ; #endif int nbCentralesDuSubset = centralesDuSubset.size(); for ( powerplants2_t i=(powerplants2_t) 0 ; i < nbCentralesDuSubset ; i = (powerplants2_t) (i+1) ) { DEBUG_CPLEX_PRINT("powerplant i "< contrainte(nbColonnes, 0); contrainte[idx_colonne] = contrainte[idx_colonneprime] = 1; vclique.push_back(contrainte); vbc.push_back(1); DEBUG_CPLEX_PRINT("\t\t\t\t\t Fin de l'ajout de la contrainte"); } } } } } } } } } void Cplex::contrainte15(vector >& vclique, vector& vbc) { for ( int subset=0 ; subset < CInstance::M((constraint_t) 15) ; subset++ ) { vector centralesDuSubset = CInstance::m_constraints15[subset].C(); wlen_t Se = CInstance::m_constraints15[subset].Se() ; week_t IDm = CInstance::m_constraints15[subset].ID() ; week_t IFm = CInstance::m_constraints15[subset].IF() ; int nbCentralesDuSubset = centralesDuSubset.size(); for ( powerplants2_t i=(powerplants2_t) 0 ; i < nbCentralesDuSubset ; i = (powerplants2_t) (i+1) ) { int idx_i = centralesDuSubset[i]; for ( powerplants2_t iprime= (powerplants2_t) 0 ; iprime < nbCentralesDuSubset ; iprime = (powerplants2_t) (iprime+1) ) { if ( i == iprime ){ continue; } int idx_iprime = centralesDuSubset[iprime]; for ( int i_colonne=0 ; i_colonne < Clique::annuaire[idx_i].size() ; i_colonne++ ) { int idx_colonne = Clique::annuaire[idx_i][i_colonne]; for ( int i_colonneprime=0 ; i_colonneprime < Clique::annuaire[idx_iprime].size() ; i_colonneprime++ ) { int idx_colonneprime = Clique::annuaire[idx_iprime][i_colonneprime]; for ( int k=0 ; k < Clique::dateDebutOutageCampagneK[idx_colonne].size() ; k++ ) { for ( int kprime=0 ; kprime < Clique::dateDebutOutageCampagneK[idx_colonneprime].size() ; kprime++ ) { int DAk = CInstance::type2((powerplants2_t) idx_i).DA((campaign_t) k); int DAkprime = CInstance::type2((powerplants2_t) idx_iprime).DA((campaign_t) kprime); // Ajout du test pour valider la contrainte if ( (IDm - DAk+1 <=Clique::dateDebutOutageCampagneK[idx_colonne][k]) &&( Clique::dateDebutOutageCampagneK[idx_colonne][k]<= IFm ) &&(IDm - DAkprime+1 <=Clique::dateDebutOutageCampagneK[idx_colonneprime][kprime]) &&( Clique::dateDebutOutageCampagneK[idx_colonneprime][kprime]<= IFm ) ) { if ( (Clique::dateDebutOutageCampagneK[idx_colonne][k] - Clique::dateFinOutageCampagneK[idx_colonneprime][kprime] < Se) && (Clique::dateDebutOutageCampagneK[idx_colonneprime][kprime] - Clique::dateFinOutageCampagneK[idx_colonne][k] < Se) ) { vector contrainte(nbColonnes, 0); contrainte[idx_colonne] = contrainte[idx_colonneprime] = 1; vclique.push_back(contrainte); vbc.push_back(1); } } } } } } } } } } void Cplex::contrainte16(vector >& vclique, vector& vbc) { for ( int subset=0 ; subset < CInstance::M((constraint_t) 16) ; subset++ ) { vector centralesDuSubset = CInstance::m_constraints16[subset].C(); wlen_t Se = CInstance::m_constraints16[subset].Se() ; int nbCentralesDuSubset = centralesDuSubset.size(); for ( powerplants2_t i=(powerplants2_t) 0 ; i < nbCentralesDuSubset ; i = (powerplants2_t) (i+1) ) { int idx_i = centralesDuSubset[i]; for ( powerplants2_t iprime= (powerplants2_t) 0 ; iprime < nbCentralesDuSubset ; iprime = (powerplants2_t) (iprime+1) ) { if ( i == iprime ){ continue; } int idx_iprime = centralesDuSubset[iprime]; for ( int i_colonne=0 ; i_colonne < Clique::annuaire[idx_i].size() ; i_colonne++ ) { int idx_colonne = Clique::annuaire[idx_i][i_colonne]; for ( int i_colonneprime=0 ; i_colonneprime < Clique::annuaire[idx_iprime].size() ; i_colonneprime++ ) { int idx_colonneprime = Clique::annuaire[idx_iprime][i_colonneprime]; for ( int k=0 ; k < Clique::dateDebutOutageCampagneK[idx_colonne].size() ; k++ ) { for ( int kprime=0 ; kprime < Clique::dateDebutOutageCampagneK[idx_colonneprime].size() ; kprime++ ) { if ( abs(Clique::dateDebutOutageCampagneK[idx_colonne][k] - Clique::dateDebutOutageCampagneK[idx_colonneprime][kprime]) < Se) { vector contrainte(nbColonnes, 0); contrainte[idx_colonne] = contrainte[idx_colonneprime] = 1; vclique.push_back(contrainte); vbc.push_back(1); } } } } } } } } } void Cplex::contrainte17(vector >& vclique, vector& vbc) { for ( int subset=0 ; subset < CInstance::M((constraint_t) 17) ; subset++ ) { vector centralesDuSubset = CInstance::m_constraints17[subset].C(); wlen_t Se = CInstance::m_constraints17[subset].Se() ; int nbCentralesDuSubset = centralesDuSubset.size(); for ( powerplants2_t i=(powerplants2_t) 0 ; i < nbCentralesDuSubset ; i = (powerplants2_t) (i+1) ) { int idx_i = centralesDuSubset[i]; for ( powerplants2_t iprime= (powerplants2_t) 0 ; iprime < nbCentralesDuSubset ; iprime = (powerplants2_t) (iprime+1) ) { if ( i == iprime ){ continue; } int idx_iprime = centralesDuSubset[iprime]; for ( int i_colonne=0 ; i_colonne < Clique::annuaire[idx_i].size() ; i_colonne++ ) { int idx_colonne = Clique::annuaire[idx_i][i_colonne]; for ( int i_colonneprime=0 ; i_colonneprime < Clique::annuaire[idx_iprime].size() ; i_colonneprime++ ) { int idx_colonneprime = Clique::annuaire[idx_iprime][i_colonneprime]; for ( int k=0 ; k < Clique::dateDebutOutageCampagneK[idx_colonne].size() ; k++ ) { for ( int kprime=0 ; kprime < Clique::dateDebutOutageCampagneK[idx_colonneprime].size() ; kprime++ ) { if ( abs(Clique::dateFinOutageCampagneK[idx_colonne][k] - Clique::dateFinOutageCampagneK[idx_colonneprime][kprime]) < Se) { vector contrainte(nbColonnes, 0); contrainte[idx_colonne] = contrainte[idx_colonneprime] = 1; vclique.push_back(contrainte); vbc.push_back(1); } } } } } } } } } void Cplex::contrainte18(vector >& vclique, vector& vbc) { for ( int subset=0 ; subset < CInstance::M((constraint_t) 18) ; subset++ ) { vector centralesDuSubset = CInstance::m_constraints18[subset].C(); wlen_t Se = CInstance::m_constraints18[subset].Se() ; int nbCentralesDuSubset = centralesDuSubset.size(); for ( powerplants2_t i=(powerplants2_t) 0 ; i < nbCentralesDuSubset ; i = (powerplants2_t) (i+1) ) { int idx_i = centralesDuSubset[i]; for ( powerplants2_t iprime= (powerplants2_t) 0 ; iprime < nbCentralesDuSubset ; iprime = (powerplants2_t) (iprime+1) ) { if ( i == iprime ){ continue; } int idx_iprime = centralesDuSubset[iprime]; for ( int i_colonne=0 ; i_colonne < Clique::annuaire[idx_i].size() ; i_colonne++ ) { int idx_colonne = Clique::annuaire[idx_i][i_colonne]; for ( int i_colonneprime=0 ; i_colonneprime < Clique::annuaire[idx_iprime].size() ; i_colonneprime++ ) { int idx_colonneprime = Clique::annuaire[idx_iprime][i_colonneprime]; for ( int k=0 ; k < Clique::dateDebutOutageCampagneK[idx_colonne].size() ; k++ ) { for ( int kprime=0 ; kprime < Clique::dateDebutOutageCampagneK[idx_colonneprime].size() ; kprime++ ) { if ( abs(Clique::dateFinOutageCampagneK[idx_colonne][k] - Clique::dateDebutOutageCampagneK[idx_colonneprime][kprime]) < Se) { vector contrainte(nbColonnes, 0); contrainte[idx_colonne] = contrainte[idx_colonneprime] = 1; vclique.push_back(contrainte); vbc.push_back(1); } } } } } } } } } void Cplex::contrainte19(vector >& vclique, vector& vbc) { for ( int c19=0 ; c19 < 1 /*CInstance::M((constraint_t) 19)*/ ; c19++ ) { #ifdef TEST_CC19 vector test; test.push_back((powerplants2_t) 0); test.push_back((powerplants2_t) 1);test.push_back((powerplants2_t) 2); vector centralesDuSubset = test; vector > utilisationRessource (10, vector (Cplex::nbColonnes, 0) ) ;// utilisationRessource[w][c] si la colonne c utilise la ressource int nbCentralesDuSubset = centralesDuSubset.size(); int nbRessources = 2; #else vector centralesDuSubset = CInstance::m_constraints19[c19].C(); vector > utilisationRessource (CInstance::H(), vector (Cplex::nbColonnes, 0) ) ;// utilisationRessource[w][c] si la colonne c utilise la ressource int nbCentralesDuSubset = centralesDuSubset.size(); int nbRessources = CInstance::m_constraints19[c19].Q(); #endif for ( int i= 0 ; i < nbCentralesDuSubset ; i++ ) { powerplants2_t idx_i = centralesDuSubset[i]; for ( int i_colonne=0 ; i_colonne < Clique::annuaire[(int) idx_i].size() ; i_colonne++ ) { int idx_colonne = Clique::annuaire[idx_i][i_colonne]; for ( campaign_t k=(campaign_t) 0 ; k < Clique::dateDebutOutageCampagneK[idx_colonne].size() ; k=(campaign_t) (k+1) ) { #ifdef TEST_CC19 int start = 0; int duree = 2; #else int start = CInstance::m_constraints19[c19].L(idx_i,k); int duree = CInstance::m_constraints19[c19].TU(idx_i,k); #endif for ( int w=0 ; (w nbRessources ) { vclique.push_back(utilisationRessource[w]); vbc.push_back(nbRessources); } } } } Cplex::~Cplex() { #ifndef TEST_CC14 #ifndef TEST_CC19 DEBUG_CPLEX_PRINT("deletage de cl"); delete[] cl; DEBUG_CPLEX_PRINT("deletage de ct"); delete[] ct; DEBUG_CPLEX_PRINT("deletage du contenu de dlt, affect et clique"); for ( int i=0 ; i < nbColonnes ; i++ ){ delete[] dlt[i]; delete[] affect[i]; delete[] clique[i]; } DEBUG_CPLEX_PRINT("deletage de dlt"); delete[] dlt; DEBUG_CPLEX_PRINT("deletage de affect"); delete[] affect; DEBUG_CPLEX_PRINT("deletage de clique"); delete[] clique; DEBUG_CPLEX_PRINT("deletage de dt"); delete[] dt; DEBUG_CPLEX_PRINT("deletage de mint"); delete[] mint; DEBUG_CPLEX_PRINT("deletage de maxt"); delete[] maxt; DEBUG_CPLEX_PRINT("deletage de bc"); delete[] bc; #endif #endif }