X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/loba.git/blobdiff_plain/fdc3237504c68a8f89faf2c56fa281df7f2bb972..673a449fe2844c664860cd553d83926fb8b66ceb:/loba_fairstrategy.cpp diff --git a/loba_fairstrategy.cpp b/loba_fairstrategy.cpp index fd710c2..4054729 100644 --- a/loba_fairstrategy.cpp +++ b/loba_fairstrategy.cpp @@ -1,41 +1,26 @@ -#include "loba_fairstrategy.h" - #include XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(loba); -/* simple version: - * load balance with a least-loaded neighbor, - * without breaking the ping-pong condition - */ -double loba_fairstrategy::load_balance(double my_load) +#include "loba_fairstrategy.h" + +void loba_fairstrategy::load_balance() { - int imin = -1; - int imax = -1; - double min = my_load; - double max = -1.0; - 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; + pneigh_sort_by_load(std::greater()); + print_loads_p(false, xbt_log_priority_debug); + + const double delta = 0.001; + bool found = true; + while (found) { + found = false; + for (unsigned i = 0 ; i < pneigh.size() ; ++i) { + if (pneigh[i]->get_load() <= get_load() - 2 * delta) { + found = true; + send(pneigh[i], delta); + XBT_DEBUG("sent to %s", pneigh[i]->get_name()); + } } } - 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; - } } // Local variables: