Makhoul's algorithm... several versions for source code... ========================================================== powwow:/home/makhoul# find . -name Fusion.cc -exec md5sum {} + powwow:/home/makhoul# find . -name Fusion.cc -ls 238d74aac45bec21460e151295598764 ./Desktop/A.Makhoul/DiffusOMNET/Fusion.cc --- 5541828 8 -rw-r--r-- 1 makhoul and 6631 mai 14 2007 ./Desktop/A.Makhoul/DiffusOMNET/Fusion.cc ,---- | void BRITENode::updateLoad(){ | | double deltaSum = 0.; | double deltaMin = this->load; | for (int i = 0; i < gateSize("out"); i++) { | double delta1 = this->load - neighborsLoad[i]; | if (delta1 > epsilonDelta) { | delta[i] = delta1; | deltaSum += delta1; | if (deltaMin > delta1) | deltaMin = delta1; | } else | delta[i] = 0; | } | double alpha = deltaMin / (deltaMin + deltaSum); | for (int i = 0; i < gateSize("out"); i++) { | double transfer = alpha * delta[i]; | totalSend[i] += transfer; | this->load -= transfer; | | } | } `---- 8f5c3e7c5358626bc06726d888d912af ./Desktop/A.Makhoul/Abdallah-Makhoul/Recherche/Diffus-OMNET/Fusion.cc 8f5c3e7c5358626bc06726d888d912af ./Desktop/AbdallahMakhoul/Recherche/Diffus-OMNET/Fusion.cc --- 5540991 8 -rw-r--r-- 1 makhoul and 8001 juin 12 2007 ./Desktop/A.Makhoul/Abdallah-Makhoul/Recherche/Diffus-OMNET/Fusion.cc 6497742 8 -rw-r--r-- 1 makhoul and 8001 juin 12 2007 ./Desktop/AbdallahMakhoul/Recherche/Diffus-OMNET/Fusion.cc ,---- | void BRITENode::updateLoad(){ | | double deltaSum = 0.; | double deltaMin = this->load; | for (int i = 0; i < gateSize("out"); i++) { | double delta1 = this->load - neighborsLoad[i]; | if (delta1 > epsilonDelta) { | delta[i] = delta1; | deltaSum += delta1; | if (deltaMin > delta1) | deltaMin = delta1; | } else | delta[i] = 0; | } | double alpha = deltaMin / (deltaMin + deltaSum); | for (int i = 0; i < gateSize("out"); i++) { | double transfer = alpha * delta[i]; | totalSend[i] += transfer; | this->load -= transfer; | | } | } `---- d0b4ef1a4553ff1c9c408390818cf925 ./FusionOmnet/Fusion.cc --- 5516053 12 -rw-r--r-- 1 makhoul and 9732 juil. 13 2007 ./FusionOmnet/Fusion.cc ,---- | void BRITENode::updateLoad(){ | totalSent = 0.; | const double alpha = 1.0 / (gateSize("out") + 1); | const double epsilon = 1.0e-4; | | int nDelta = 0; | for (int i = 0; i < gateSize("out"); i++) { | double d = this->load - neighborsLoad[i]; | if (d > epsilon) { | Delta[nDelta].delta = d; | Delta[nDelta].index = i; | nDelta++; | } | } | | std::sort(Delta, Delta + nDelta, DeltaCompDec()); | | double neighborLoadMax = 0.0; // maximum load of neighbors to which | // something has been sent | for (int i = 0; i < nDelta; i++) { | int index = Delta[i].index; | double delta = this->load - neighborsLoad[index]; | if (delta <= epsilon) | break; | | #if 0 | delta = Delta[i].delta; // does not work well... | #endif | | double transfer = alpha * delta; | double transferMax = | std::min(this->load - neighborLoadMax, | (this->load - neighborsLoad[index]) / 2.0); | | if (transfer > transferMax) // ping-pong violated? | transfer = transferMax; | | totalSend[index] += transfer; | this->load -= transfer; | | double newNeighborLoad = neighborsLoad[index] + transfer; | if (newNeighborLoad > neighborLoadMax) | neighborLoadMax = newNeighborLoad; | } | | // double transfer = alpha * Delta[i].delta; | // if((this->load - totalSent) >= neighborsLoad[Delta[i].index] + transfer) | // break; | // else { | // totalSend[i] += transfer; | // this->load -= transfer; | // totalSent+=transfer; | // } | // } | | // double deltaMax = 1.0e-3; // we consider only positive deltas | // int iMax = -1; // invalid value | // for (int i = 0; i < gateSize("out"); i++) { | // Delta[i].delta = this->load - neighborsLoad[i]; | // if (Delta[i].delta > deltaMax) { | // deltaMax = Delta[i].delta; | // iMax = Delta[i].index; | // } | // } | | // if (iMax != -1) { | // double transfer = alpha * Delta[iMax].delta; | // totalSend[iMax] += transfer; | // this->load -= transfer; | // } | } `---- 69f9baf76eb24e0e6cfa539d21c9b6f6 ./Bureau/Fusion.cc 69f9baf76eb24e0e6cfa539d21c9b6f6 ./Bureau/Simulations-Fusion-Omnet/Fusion.cc 69f9baf76eb24e0e6cfa539d21c9b6f6 ./Desktop/A.Makhoul/Abdallah-Makhoul/Recherche/Simulations-Fusion-Omnet/Fusion.cc 69f9baf76eb24e0e6cfa539d21c9b6f6 ./Desktop/AbdallahMakhoul/Recherche/Simulations-Fusion-Omnet/Fusion.cc 69f9baf76eb24e0e6cfa539d21c9b6f6 ./Simulations-Fusion-Omnet/Fusion.cc --- 5516032 12 -rw-r--r-- 1 makhoul and 11160 nov. 7 2008 ./Bureau/Fusion.cc 5524854 12 -rw-r--r-- 1 makhoul and 11160 nov. 7 2008 ./Bureau/Simulations-Fusion-Omnet/Fusion.cc 5541114 12 -rw-r--r-- 1 makhoul and 11160 nov. 28 2007 ./Desktop/A.Makhoul/Abdallah-Makhoul/Recherche/Simulations-Fusion-Omnet/Fusion.cc 6497957 12 -rw-r--r-- 1 makhoul and 11160 nov. 28 2007 ./Desktop/AbdallahMakhoul/Recherche/Simulations-Fusion-Omnet/Fusion.cc 5516082 12 -rw-r--r-- 1 makhoul and 11160 nov. 7 2008 ./Simulations-Fusion-Omnet/Fusion.cc ,---- | void BRITENode::updateLoad(){ | totalSent = 0.; | const double alpha = 1.0 / (gateSize("out") + 1); | const double epsilon = par("erreur"); | | int nDelta = 0; | for (int i = 0; i < gateSize("out"); i++) { | double d = this->load - neighborsLoad[i]; | if (d > epsilon) { | Delta[nDelta].delta = d; | Delta[nDelta].index = i; | nDelta++; | } | } | | std::sort(Delta, Delta + nDelta, DeltaCompDec()); | | double neighborLoadMax = 0.0; // maximum load of neighbors to which | // something has been sent | for (int i = 0; i < nDelta; i++) { | int index = Delta[i].index; | double delta = this->load - neighborsLoad[index]; | if (delta <= epsilon) | break; | | #if 0 | delta = Delta[i].delta; // does not work well... | #endif | | double transfer = alpha * delta; | double transferMax = | std::min(this->load - neighborLoadMax, | (this->load - neighborsLoad[index]) / 2.0); | | if (transfer > transferMax) // ping-pong violated? | transfer = transferMax; | | totalSend[index] += transfer; | this->load -= transfer; | | double newNeighborLoad = neighborsLoad[index] + transfer; | if (newNeighborLoad > neighborLoadMax) | neighborLoadMax = newNeighborLoad; | } | | // double transfer = alpha * Delta[i].delta; | // if((this->load - totalSent) >= neighborsLoad[Delta[i].index] + transfer) | // break; | // else { | // totalSend[i] += transfer; | // this->load -= transfer; | // totalSent+=transfer; | // } | // } | | // double deltaMax = 1.0e-3; // we consider only positive deltas | // int iMax = -1; // invalid value | // for (int i = 0; i < gateSize("out"); i++) { | // Delta[i].delta = this->load - neighborsLoad[i]; | // if (Delta[i].delta > deltaMax) { | // deltaMax = Delta[i].delta; | // iMax = Delta[i].index; | // } | // } | | // if (iMax != -1) { | // double transfer = alpha * Delta[iMax].delta; | // totalSend[iMax] += transfer; | // this->load -= transfer; | // } | } `----