From: Mark Tearle Date: Sat, 13 Dec 2014 13:00:48 +0000 (+0800) Subject: Modify idler selection algorithm X-Git-Url: https://git.ucc.asn.au/?a=commitdiff_plain;h=37efb139eefe5da374701c9c1669d1e38aba38f3;p=uccvend-vendserver.git Modify idler selection algorithm --- diff --git a/VendServer/VendServer.py b/VendServer/VendServer.py index a009da7..0962697 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