diff --git a/VendServer/VendServer.py b/VendServer/VendServer.py index a009da7cd672815218fd3681d701de4e1fa6d424..09626973d7c785acf2c3402782646ef67ced0866 100755 --- a/VendServer/VendServer.py +++ b/VendServer/VendServer.py @@ -288,23 +288,33 @@ def reset_idler(v, vstatus, t = None): def choose_idler(): global idlers, idler - iiindex = 0 - average_affinity = 10 # guessing here... - if idler and idler.__class__ != GreetingIdler: - iiindex = idlers.index(idler) - - iilen = len(idlers) - - move = int(random()*len(idlers)*average_affinity) + 1 + # Implementation of the King Of the Hill algorithm from; + # http://eli.thegreenplace.net/2010/01/22/weighted-random-generation-in-python/ + + #def weighted_choice_king(weights): + # total = 0 + # winner = 0 + # for i, w in enumerate(weights): + # total += w + # if random.random() * total < w: + # winner = i + # return winner + # + + total = 0 + winner = None + + for choice in idlers: + weight = choice.affinity() + total += weight + if random() * total < weight: + winner = choice - while move >= 0: - iiindex += 1 - iiindex %= iilen - idler = idlers[iiindex] - move -= idler.affinity() + idler = winner - idler.reset() + if idler: + idler.reset() def idle_step(vstatus): global idler