我有一种执行轮盘赌选择的方法。
action_to_execute=self.weighted_choice_sub(phermone_list)
def weighted_choice_sub(self,weights):
'''performs weighted selection or roulette wheel selection on a list
and returns the index selected from the list'''
rnd = random.random() * sum(weights)
for i, w in enumerate(weights):
rnd -= w
if rnd < 0:
return i
在时间它什么都不返回,因为它返回None
而不是索引。这意味着条件rnd < 0
永远不会是True
。
(Pdb) phermone_list
[5e-324, 5e-324, 5e-324, 5e-324, 1.5e-323, 5e-3 1.5e-323, 2.5e-323, 5e-324]
(Pdb) action_to_execute
(Pdb) type(action_to_execute)
<type 'NoneType'>
我无法理解发生了什么,以及如何解决它。我认为它与传递的列表中的极低值有关。
更新(调试运行):
(Pdb) phermone_list
[5e-324, 5e-324, 5e-324, 5e-324, 5e-324, 5e-324, 5e-324, 5e-324, 5e-324]
def weighted_choice_sub(self,weights):
'''performs weighted selection or roulette wheel selection on a list
and returns the index selected from the list'''
rnd = random.random() * sum(weights)
print "____"
for i, w in enumerate(weights):
print (i,w)
rnd -= w
print rnd
if rnd < 0:
return i
(0, 5e-324)
3.95252516673e-323
(1, 5e-324)
3.45845952089e-323
(2, 5e-324)
2.96439387505e-323
(3, 5e-324)
2.47032822921e-323
(4, 5e-324)
1.97626258336e-323
(5, 5e-324)
1.48219693752e-323
(6, 5e-324)
9.88131291682e-324
(7, 5e-324)
4.94065645841e-324
(8, 5e-324)
0.0