#include "DA.h" #include static double s_infini = std::numeric_limits::infinity() ; using namespace std; // constructeur //entree::entree() //{}; vector DualAscent::calculePoids() const { // dimension du probleme int n,m; n= cost.size(); m= b.size(); vector q (n); double qj; for (int j =0;j DualAscent::DAcalc(const vector &lambda, vector &L,const vector &q ) const { // dimension du probleme int n=(int) cost.size(); int m=(int) b.size(); // Calcul des Lj for (int j =0;j DualAscent::EcritureCplex(const vector &w, const char *fichier) const { // Ecriture modele Cplex int n = cost.size(); int m = b.size(); // Reperage des contraintes saturees vector Q; double som_; for (int j=0;j= 0." << endl; fileout << "End" << endl; fileout.close(); return Q; } double DualAscent::updateLambda(const vector &S, vector & lambda,const vector &w, double pas) const { int m=(int) b.size(); double denominateur =0; double Zd=0; for (int i=0;i DualAscent::sousgrad(vector &Xtest, const vector &w, const vector &lambda, const vector &L, const vector &q) const { int m = b.size(); int n = cost.size(); double min_, minmem; vector s (m); //vector > index; vector index (m); vector X (n); // vector "jmin"; int jmin; for (int i =0;i0) { min_ = min(minmem,(cost[j] - L[j])/q[j]); if (minmem>min_) { jmin=j; // jmin.clear(); // jmin.push_back(min_); minmem=min_; } // else if (minmem==min_) // { // cout << minmem << endl; // jmin.push_back(min_); // } } } index[i]=jmin;// probleme si plusieurs colonnes a même cout // index.push_back(jmin); } // for (int c = 0;c < index.size();c++) // { cout << index[c].size() << " ";}cout << endl; vector B (n,0), Btest (n,0); for (int i = 0;i X ; for (int j = 0;j &lambda, bool BorneSup, const char* titre) const { int iter = 0,lastchange; vector u; bool impression = false; int Niter = 50000; char fichier[20], test[20]; double pas = 1; double Zd, Zdmem; vector q, s, Xmem, lambdamem, umem; vectorZdmax (Niter); vector L (cost.size()); vector X (cost.size()); q = calculePoids(); //------------Recherche d'une upper bound ---------- double UB = 0; if (!BorneSup) { BorneSup = testUB();} if (BorneSup) { UB = recherche_UB(); cout << "upper bound = " << UB << endl; } while (iter < Niter) { if (impression) { cout << "Iteration " << iter << endl;} u = DAcalc(lambda,L,q); Zd=0; //////////////////// Solution 2 //// s = sousgrad(X,u,lambda, L, q); double NormS = 0, denom; for (size_t i =0;i 20) {pas=pas*0.99; lastchange = iter;} iter+=1; /////////////////// solution 1 //////// /* strcpy(fichier,titre); int taille = sprintf(test,"%d",iter); strcat(fichier,test); Q = EcritureCplex(E,w,fichier); if (Q.size()==1) { cout << "colonne dans Q : " << Q[0] << endl; ligne = S[Q[0]]; for (int i = 0;i < ligne.size();i++) {cout << ligne[i] << " " ;} cout << endl; Zd = updateLambda(E,ligne,lambda,w,pas); Zdmem=max(Zdmem,Zd); Zdmax.push_back(Zd); cout << "lambda" << iter+1 << ": "; for(int i =0;i> a ; ligne = S[a]; // exit(0); Zd = updateLambda(E,ligne,lambda,w,1); Zdmem = max(Zdmem, Zd); Zdmax.push_back(Zd); cout << "lambda" << iter+1 << ": "; for(int i =0;i choix (n,false); vector SumProd (m,0); for (int k = b.size()-1;k>=0;k--) { if (SumProd[k]>b[k]) {;}//cout << "kok : " << k << endl;} else { bool STOP = false; int compteur = 0 , index_min=-1;; double cost_min = 10000000; while (!STOP) { if (!choix[compteur]) { // cout << compteur< 0) { if (cost[compteur] < cost_min) { index_min=compteur; cost_min=cost[compteur]; // cout << "index_min_temp " << compteur << " de cout " << cost_min<< endl; } } } compteur++; // cout << "---------------"<=0) { // cout << "Pour ligne " << k << " ajout colonne " << index_min << endl; choix[index_min]=true; UB += cost_min; //cout << "UB : " << UB << endl; for (int aa=0;aa=b[k]); // cout << "stop " << STOP << endl; // cout << "compteur " << compteur << endl; } } } } for (int t=0;tb[compteur]); STOP = (!out); compteur++; if (compteur==b.size()) { STOP = true; } } // cout << out << endl; return out; }