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

Private GIT Repository
Added Least Load Neighbors and another bulk algorithm
authorAberrahmane Sider <ar.sider@univ-bejaia.dz>
Mon, 2 May 2011 14:12:17 +0000 (15:12 +0100)
committerAberrahmane Sider <ar.sider@univ-bejaia.dz>
Mon, 2 May 2011 14:12:17 +0000 (15:12 +0100)
loba_bulk.cpp
options.cpp

index 9af50cf0f22c3b4ec1d695dcdfdee97c252318d3..f5ec64ecfc0ffe9520e735364ebe75402f14d4bf 100644 (file)
@@ -1,4 +1,5 @@
 #include <xbt/log.h>
 #include <xbt/log.h>
+#include <math.h>
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(loba);
 
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(loba);
 
@@ -6,8 +7,81 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(loba);
 
 void loba_bulk::load_balance()
 {
 
 void loba_bulk::load_balance()
 {
-    // write code here...
-    xbt_die("Load-balancing algorithm \"bulk\" not implemented!");
+       float myLoad = get_load();
+
+       unsigned NbNwMinLoad = 0;
+       unsigned NbNwLowerLoad = 0;
+       unsigned NbNeighbours = pneigh.size();
+
+       double *S = new double[NbNeighbours];
+       for (unsigned i = 0; i < NbNeighbours; i++) 
+               S[i] = 0.0;
+       //What is the minimum and maximum load under myLoad?
+       float minLoad = myLoad;
+       for (unsigned i = 0; i < NbNeighbours; i++) {
+               if (pneigh[i]->get_load() < minLoad) {
+                       minLoad = pneigh[i]->get_load();
+               }
+               if (pneigh[i]->get_load() < myLoad) {
+                       NbNwLowerLoad++;
+               }
+       }
+       for (unsigned i = 0; i < NbNeighbours; i++)
+               if (pneigh[i]->get_load() == minLoad)
+                       NbNwMinLoad++;
+
+       float maxLoad = minLoad;
+       for (unsigned i = 0; i < NbNeighbours; i++) {
+               if (pneigh[i]->get_load() > minLoad && pneigh[i]->get_load() < myLoad)
+                       if (maxLoad < pneigh[i]->get_load())
+                               maxLoad = pneigh[i]->get_load();
+       }
+
+       double alpha = 0.0;
+
+       if (NbNwLowerLoad && NbNwMinLoad < NbNwLowerLoad) //There is one or many neighbors with minimum load but not all neighbors have minimum load
+               alpha = (1. / ((double) NbNwMinLoad + 2));
+       if (NbNwMinLoad == NbNwLowerLoad) //All neighbors have minimum load
+               alpha = (1. / ((double) NbNwMinLoad + 1));
+       float myS = 0.;
+       //There exist underloaded neighbors
+       if (NbNwMinLoad && myLoad != 0.0) {
+               for (unsigned i = 0; i < NbNeighbours; i++) {
+                       if (pneigh[i]->get_load() == minLoad) {
+                               S[i] = floor(alpha * (myLoad - minLoad));
+                               myS +=  S[i];
+                       } else {
+                               if (pneigh[i]->get_load() < myLoad) {
+                                       S[i] = floor(alpha * (myLoad - pneigh[i]->get_load()));
+                                       myS +=  S[i];
+                               }
+                       }
+               }
+               //Check assumption 4.2 (b) page 520
+               bool HaveToCorrectS = false;
+               for (unsigned i = 0; i < NbNeighbours; i++) {
+                       if (pneigh[i]->get_load() < myLoad) { //
+                               //Condition 4.6
+                               if ((myLoad - myS) < (pneigh[i]->get_load() + S[i])) {
+                                       HaveToCorrectS = true;
+                               }
+                       }
+               }
+               if (HaveToCorrectS) {
+                               for (unsigned i = 0; i < NbNeighbours; i++) {
+                                       while (((myLoad - myS) < pneigh[i]->get_load() + S[i]) && (S[i] > 0)) {
+                                               myS -= 1.0;
+                                               S[i] -= 1.0;
+                                       }
+                               }
+               }
+       }//End there are underloaded neighbors;
+       for (unsigned i = 0 ; i < NbNeighbours ; i++) {
+                send(pneigh[i], S[i]);
+                XBT_DEBUG("sent to %s", pneigh[i]->get_name());
+        }
+
+       delete[] S;
 }
 
 // Local variables:
 }
 
 // Local variables:
index 9b1344aade28af3378c0f5cd6e6d615b41589f8b..3e0f92d764a29cc695522d5a3dd770e99481a6c8 100644 (file)
@@ -13,6 +13,7 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(main);
 #include "loba_besteffort.h"
 #include "loba_bulk.h"
 #include "loba_fairstrategy.h"
 #include "loba_besteffort.h"
 #include "loba_bulk.h"
 #include "loba_fairstrategy.h"
+#include "loba_lln.h"
 #include "loba_makhoul.h"
 #include "loba_makhoul2.h"
 #include "loba_simple.h"
 #include "loba_makhoul.h"
 #include "loba_makhoul2.h"
 #include "loba_simple.h"
@@ -80,10 +81,12 @@ namespace opt {
     {
         NOL_INSERT("besteffort", "balance with best effort strategy",
                    loba_besteffort);
     {
         NOL_INSERT("besteffort", "balance with best effort strategy",
                    loba_besteffort);
-        NOL_INSERT("bulk", "describe your algorithm here...",
+        NOL_INSERT("bulk", "A multi-load-units assignation rule without ordering...",
                    loba_bulk);
         NOL_INSERT("fairstrategy", "balance with fair strategy",
                    loba_fairstrategy);
                    loba_bulk);
         NOL_INSERT("fairstrategy", "balance with fair strategy",
                    loba_fairstrategy);
+        NOL_INSERT("lln", "Balance with less loaded neighbors without ordering-bulk method",
+                   loba_lln);
         NOL_INSERT("makhoul", "balance with Makhoul's PhD algorithm",
                    loba_makhoul);
         NOL_INSERT("makhoul2", "balance with Makhoul's source code",
         NOL_INSERT("makhoul", "balance with Makhoul's PhD algorithm",
                    loba_makhoul);
         NOL_INSERT("makhoul2", "balance with Makhoul's source code",