Python3.4遗传算法,除法丢弃剩余绑定

2024-09-30 08:35:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用python编写一个简单的遗传算法,当我试图找到一组单倍体的平均适应度时,它给我的结果是去掉剩余部分,我不明白它为什么要这样做。以下是完整的来源

import random

def generate_random_haploid(haploid_length):
    haploid = []
    for x in range(haploid_length):
        haploid.append(random.randint(0,1))

    return haploid

def crossover_haploid(haploid_1, haploid_2):
    locus = random.randint(1, len(haploid_1))

    for x in range(locus - 1):
        haploid_1[x] = haploid_2[x]

    for x in range(len(haploid_2) - locus):
        haploid_2[x + locus] = haploid_1[x + locus]

    return [haploid_1, haploid_2]

def crossover_diploid(diploid_1, diploid_2):
    children_1, children_2 = crossover_haploid(diploid_1[0], diploid_1[1]), crossover_haploid(diploid_2[0], diploid_2[1])
    return crossover_haploid(children_1[0], children_2[1])

def flipbit(bit):
    if bit == 1:
        bit = 0
    elif bit == 0:
        bit = 1
    return bit

def mutate_haploid(haploid, mutate_prob):
    for x in haploid:
        if random.randint(0, mutate_prob) <= mutate_prob:
            haploid[x] = flipbit(haploid[x])

    return haploid

def average_fitness(haploid_list):
    return sum(haploid_list[0]) / len(haploid_list)

def fitness(haploid):
    fitness = 0
    for x in range(len(haploid)):
        if haploid[x] == 1:
            fitness += 1
    return fitness

def print_haploid(haploid):
    print(haploid, "Fitness: ", fitness(haploid))

x = generate_random_haploid(4)
y = generate_random_haploid(4)
print_haploid(x)
print_haploid(y)
print("-------------------------------")
children = crossover_haploid(x, y)
print_haploid(children[0])
print_haploid(children[1])
print("-------------------------------")
print("Parent Fitness: ", average_fitness([x, y]) )
print("-------------------------------")
print("Children Fitness: ", average_fitness([children[0], children[1]]) )

Tags: inforlenreturndefbitrangerandom
1条回答
网友
1楼 · 发布于 2024-09-30 08:35:09

这是因为python integer要截短到最小值。你有很多选择来解决这个问题:

>>> 5 / 2
2

选项1

将其中一个值强制转换为float,python将自动向上转换所有其他int类型

^{pr2}$

对代码的更正:

def average_fitness(haploid_list):
    return float(sum(haploid_list[0])) / len(haploid_list)

方案2

将此添加到脚本的顶部

from __future__ import division

现在,5 / 2将生成2.5,并且您不需要如选项1所示更改您的average_fitness方法。__future__是指python3,其中/操作符默认执行浮点除法。通过导入该特性,现在您将在代码中到处使用float除法运算符/,而不是python2的int除法运算符

选项3

您可以将/替换为//运算符

>>> 5 / 2
2

>>> 5 // 2
2.5

对代码的更正:

def average_fitness(haploid_list):
    return float(sum(haploid_list[0])) // len(haploid_list)

相关问题 更多 >

    热门问题