Python中的随机全局采样遗传算法

1 投票
1 回答
6416 浏览
提问于 2025-04-18 00:35

我有一个遗传算法,目前使用的是轮盘赌选择来生成新的人口(也就是新一代的个体),我想把它改成随机均匀抽样。

我大致有个思路,想知道这个过程是怎么进行的:

pointerDistance = sumFitness/popSize
start = rand.uniform(0, pointerDistance)
for i in xrange(popSize):
    pointers.append(start + i*pointerDistance)
cumulativeFit = 0
newIndiv = 0
for p in pointers:
    while cumulativeFit <= p:
        cumulativeFit += pop[newIndiv].fitness
        newPop[newIndiv] = copy.deepcopy(pop[newIndiv])
        newIndiv += 1

但是我在具体实现随机均匀抽样的时候遇到了困难。有没有人知道哪里可以找到一些伪代码或者示例?

这里简单描述一下随机均匀抽样是什么,并举个例子(不过我不确定这样说是否合适):

http://en.wikipedia.org/wiki/Stochastic_universal_sampling

1 个回答

5

在编程中,有时候我们会遇到一些问题,想要找到解决方案。比如说,有人可能在使用某个工具或库时,遇到了错误或者不明白怎么用。这时候,大家会去一个叫StackOverflow的网站上提问,看看有没有人遇到过类似的问题,或者有没有人能给出解决办法。

在这个网站上,用户可以发布自己的问题,其他人则可以回答这些问题。这样,大家就可以互相帮助,分享经验。这个过程就像是一个大社区,大家一起讨论和解决问题。

所以,如果你在编程时遇到困难,不妨去看看StackOverflow,那里可能有你需要的答案。

def makeWheel(population):
    wheel = []
    total = sum(fitness(p) for p in population)
    top = 0
    for p in population:
        f = fitness(p)/total
        wheel.append((top, top+f, p))
        top += f
    return wheel

def binSearch(wheel, num):
    mid = len(wheel)//2
    low, high, answer = wheel[mid]
    if low<=num<=high:
        return answer
    elif low > num:
        return binSearch(wheel[mid+1:], num)
    else:
        return binSearch(wheel[:mid], num)

def select(wheel, N):
    stepSize = 1.0/N
    answer = []
    r = random.random()
    answer.append(binSearch(wheel, r))
    while len(answer) < N:
        r += stepSize
        if r>1:
            r %= 1
        answer.append(binSearch(wheel, r))
    return answer

撰写回答