最近在学Python和演化算法,写写轮盘赌算法。
算法本身的话,我看书上写挺好的就拍了一张:
代码:
里面的数组是30城市TSP问题得到的数据。
import numpy as np
def roulette(probability):
probabilityTotal = np.zeros(len(probability))
probabilityTmp = 0
for i in range(len(probability)):
probabilityTmp += probability[i]
probabilityTotal[i] = probabilityTmp
randomNumber=np.random.rand()
result=0
for i in range(1, len(probabilityTotal)):
if randomNumber<probabilityTotal[0]:
result=0
print("random number:",randomNumber,"<index 0:",probabilityTotal[0])
break
elif probabilityTotal[i - 1] < randomNumber <= probabilityTotal[i]:
result=i
print("index ",i-1,":",probabilityTotal[i-1],"<random number:",randomNumber,"<index ",i,":",probabilityTotal[i])
return result
probability=[0.39897898,0.05301439,0.03615747,0.02251049,0.02993633,0.02285509,0.01361222,0.03879427,0.01937278,0.0274668,0.02173864,0.03050861,0.01137698,0.00821177,0.01364433,0.01546327,0.05063628,0.03238738,0.03441008,0.01896785,0.01343442,0.01250853,0.00500341,0.01080083,0.01227628,0.00865885,0.01000899,0.01326119,0.0140035]
result=np.zeros(100).astype(int)
count=np.zeros(100).astype(int)
for i in range(100):
print("loop",i)
result[i]=roulette(probability)
count[result[i]]+=1
print("result:",result)
print("count:",count)
运算结果(运行100次)
[p0,p0+p1,…,p0+p1+…+p29]的结果
随机数的位置(以运行的第100次为例)
运行100次后的结果
统计了一下每个位置出现的概率,发现其实出现概率和原始概率(p0,p1…,pn)的占比分布是相近的
Over.