]> AND Private Git Repository - loba.git/blobdiff - loba_fairstrategy.cpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
modification to fairstrategy
[loba.git] / loba_fairstrategy.cpp
index fd710c2bf60024e6384d3eed820493062e663406..81de9e100a7e0941fbe0974e35d9c56e949cb7f3 100644 (file)
@@ -1,5 +1,5 @@
 #include "loba_fairstrategy.h"
-
+#include <algorithm>
 #include <xbt/log.h>
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(loba);
@@ -8,34 +8,54 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(loba);
  *   load balance with a least-loaded neighbor,
  *   without breaking the ping-pong condition
  */
+
+class compare {
+public : 
+       bool operator()(const neighbor*a, const neighbor*b)     {
+               return a->get_load()>b->get_load();
+       }
+};
+
 double loba_fairstrategy::load_balance(double my_load)
 {
     int imin = -1;
     int imax = -1;
     double min = my_load;
     double max = -1.0;
-    for (unsigned i = 0 ; i < pneigh.size() ; ++i) {
+
+               std::sort(pneigh.begin(),pneigh.end(),compare());
+
+               //print_loads();
+
+               INFO0("list voisins");
+               for(unsigned i=0;i< pneigh.size() ; ++i) {
+                       INFO2("%s %f ", pneigh[i]->get_name(), pneigh[i]->get_load());
+               }
+
+               double sum_sent=0;
+               bool found=true;
+
+               while(found) {
+                       found=false;
+                       for (unsigned i = 0 ; i < pneigh.size() ; ++i) {
         double l = pneigh[i]->get_load();
         if (l >= my_load)
-            continue;
-        if (l < min) {
-            imin = i;
-            min = l;
-        }
-        if (l > max) {
-            imax = i;
-            max = l;
-        }
-    }
-    if (imin != -1) {
-        // found someone
-        double balance = (my_load - max) / 2;
-        DEBUG6("%d:%g %d:%g %g %g", imin, min, imax, max, my_load, balance);
-        pneigh[imin]->set_to_send(balance);
-        return balance;
-    } else {
-        return 0.0;
-    }
+                                       continue;
+                               if(l<my_load+2) {
+                                       found=true;
+                                       pneigh[i]->set_load(l+1);
+                                       pneigh[i]->add_to_send(1);
+                                       INFO1("sent to %s",pneigh[i]->get_name());
+                                       my_load--;
+                                       sum_sent++;
+                               }
+                       }
+               }
+
+
+               
+               return sum_sent;
+    
 }
 
 // Local variables: