轮盘赌选择算法

20 algorithm roulette-wheel-selection genetic-algorithm evolutionary-algorithm

任何人都可以为轮盘选择功能提供一些伪代码吗?我将如何实现这一点:我真的不明白如何阅读这个数学符号.我想要通用算法.

Dan*_*yer 44

其他答案似乎假设您正在尝试实施轮盘赌游戏.我认为你在询问进化算法中的轮盘赌选择.

这是一些实现轮盘赌选择的Java代码.

假设您有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)


gra*_*ray 5

首先,生成您分配的百分比数组,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)


Bor*_*att 4

有两个步骤:首先创建一个包含轮盘上所有值的数组。这可以是一个包含颜色和数字的二维数组,或者您可以选择将 100 添加到红色数字。

然后简单地生成一个介于 0 或 1(取决于您的语言是否从 0 或 1 开始对数组索引进行编号)和数组中最后一个元素之间的随机数。

大多数语言都有内置的随机数函数。在VB中,VBScript函数是RND(). 在 JavaScript 中是Math.random()

从数组中的该位置获取值,您就得到了随机轮盘赌号码。

最后注意:不要忘记为随机数生成器提供种子,否则每次运行程序时都会得到相同的抽奖序列。