20 algorithm roulette-wheel-selection genetic-algorithm evolutionary-algorithm
任何人都可以为轮盘选择功能提供一些伪代码吗?我将如何实现这一点:我真的不明白如何阅读这个数学符号.我想要通用算法.
Dan*_*yer 44
其他答案似乎假设您正在尝试实施轮盘赌游戏.我认为你在询问进化算法中的轮盘赌选择.
假设您有10个项目可供选择,您可以通过生成0到1之间的随机数进行选择.将范围0到1分成10个非重叠段,每个段与10个项目之一的适合度成比例.例如,这可能如下所示:
0 - 0.3 is item 1
0.3 - 0.4 is item 2
0.4 - 0.5 is item 3
0.5 - 0.57 is item 4
0.57 - 0.63 is item 5
0.63 - 0.68 is item 6
0.68 - 0.8 is item 7
0.8 - 0.85 is item 8
0.85 - 0.98 is item 9
0.98 - 1 is item 10
Run Code Online (Sandbox Code Playgroud)
这是你的轮盘赌轮.你的0到1之间的随机数是你的旋转.如果随机数是0.46,则所选项目是项目3.如果它是0.92,那么它是项目9.
noi*_*oio 10
这是一些python代码:
def roulette_select(population, fitnesses, num):
""" Roulette selection, implemented according to:
<http://stackoverflow.com/questions/177271/roulette
-selection-in-genetic-algorithms/177278#177278>
"""
total_fitness = float(sum(fitnesses))
rel_fitness = [f/total_fitness for f in fitnesses]
# Generate probability intervals for each individual
probs = [sum(rel_fitness[:i+1]) for i in range(len(rel_fitness))]
# Draw new population
new_population = []
for n in xrange(num):
r = rand()
for (i, individual) in enumerate(population):
if r <= probs[i]:
new_population.append(individual)
break
return new_population
Run Code Online (Sandbox Code Playgroud)
首先,生成您分配的百分比数组,p[1..n]
假设总数是所有百分比的总和。
然后得到一个 1 到总数之间的随机数,比方说 r
现在,lua中的算法:
local c = 0
for i = 1,n do
c = c + p[i]
if r <= c then
return i
end
end
Run Code Online (Sandbox Code Playgroud)
有两个步骤:首先创建一个包含轮盘上所有值的数组。这可以是一个包含颜色和数字的二维数组,或者您可以选择将 100 添加到红色数字。
然后简单地生成一个介于 0 或 1(取决于您的语言是否从 0 或 1 开始对数组索引进行编号)和数组中最后一个元素之间的随机数。
大多数语言都有内置的随机数函数。在VB中,VBScript
函数是RND()
. 在 JavaScript 中是Math.random()
从数组中的该位置获取值,您就得到了随机轮盘赌号码。
最后注意:不要忘记为随机数生成器提供种子,否则每次运行程序时都会得到相同的抽奖序列。