当前位置: 首页 > 知识库问答 >
问题:

ValueError:在处理上述异常期间,位数必须大于零,否则会发生另一个异常

姬俊驰
2023-03-14

我正在尝试实现遗传算法,程序在第一代后终止。。不知道为什么。。代码如下。。提出的异常是。。

文件"C:\用户\伊山\AppData\本地\程序\Python\Python36\lib\random.py",第255行,选择i=自己。_randbelow(len(seq))文件"C:\用户\伊山\AppData\本地\程序\Python\Python36\lib\random.py",第232行,_randbelowr=getrandbit(k)#0

在处理上述异常期间,发生了另一个异常:

回溯(最后一次调用):文件“C:/Users/Eshan/Desktop/model/simple_ga.py”,第87行,ga()文件“C:/Users/Eshan/Desktop/model/simple_ga.py”,第32行,ga代理=交叉(代理)文件“C:/Users/Eshan/Desktop/model/simple_ga.py”,第62行,交叉父1=随机选择(代理)文件“C:\Users\Eshan\AppData\Local\Programs\Python\Python36\lib\random.py”,第257行,在选项raise INDEXROR(“不能从空序列中选择”)中,INDEXROR:不能从空序列中选择

进程已完成,退出代码为1

from fuzzywuzzy import fuzz
import random
import string


class Agent:
    def __init__(self, length):

        self.string = ''.join(random.choice(string.ascii_letters) for _ in range(length))
        self.fitness = -1

    def __str__(self):
        return 'String: ' + str(self.string) + ' Fitness: ' + str(self.fitness)


in_str = 'string-python'
in_str_len = len(in_str)
population = 20
generations = 1000


def ga():

    agents = init_agents(population, in_str_len)

    for generation in range(generations):

        print('Generation: ' + str(generation))

        agents = selection(agents)
        agents = fitness(agents)
        agents = crossover(agents)
        agents = mutation(agents)

        if any(agent.fitness >= 90 for agent in agents):
            print('Threshod met!')
            exit(0)


def init_agents(population, length):
    return [Agent(length) for _ in range(population)]


def fitness(agents):
    for agent in agents:
        agent.fitness = fuzz.ratio(agent.string, in_str)

    return agents


def selection(agents):

    agents = sorted(agents, key=lambda agent: agent.fitness, reverse=True)
    print('\n'.join(map(str, agents)))
    agents = agents[:int(0.2 * len(agents))]
    return agents


def crossover(agents):
    offspring = []
    for _ in range(int((population - len(agents)) / 2)):
        parent1 = random.choice(agents)
        parent2 = random.choice(agents)
        child1 = Agent(in_str_len)
        child2 = Agent(in_str_len)
        split = random.randint(0, in_str_len)
        child1.string = parent1.string[0:split] + parent2.string[split:in_str_len]
        child2.string = parent2.string[0:split] + parent1.string[split:in_str_len]
        offspring.append(child1)
        offspring.append(child2)

    return agents


def mutation(agents):

    for agent in agents:
        for idx, param in enumerate(agent.string):
            if random.uniform(0.0, 1.0) <= 0.1:
                agent.string = agent.string[0:idx] + random.choice(string.ascii_letters) + agent.string[idx+1:in_str_len]

    return agents

if __name__ == '__main__':
    in_str = 'string-python'
    in_str_len = len(in_str)
    ga()

共有1个答案

狄灵均
2023-03-14

看起来您的代理是空的,因此当您执行parent1=random.choice(agents)时,会出现您看到的错误,因为您无法从空列表中进行随机选择。

 类似资料:
  • 我在下面尝试捕获JSON解析错误: 为什么在处理上述异常时,打印出另一个异常,以及如何解决它?

  • 在中传递时,我得到以下错误: 回溯(最近一次呼叫最后一次): 文件“C:/Classify/classifier.py”,第95行,在 列车平均值,测试平均值,cms=列车模型(X,y,“ceps”,plot=True) 列车模型中第47行的文件“C:/Classify/classifier.py” clf.fit(X_train,y_train)文件“C:\Python27\lib\site p

  • Apache Camel中是否有任何内置机制来延迟上次路由处理过程中发生异常时的下一次路由触发时间? 例如,如果我有一条路由: null

  • 有人能简单地解释一下如何将我的域对象添加到apachemq可信对象吗。已经仔细阅读了apache教程,其中说需要将脚本添加到/bin/env,但我的bin文件夹中没有env文件。谢谢 2016-04-08 16:55:49错误提示控制器:23-控制器方面:方法例外-

  • 1.【强制】不要捕获Java类库中定义的继承自RuntimeException的运行时异常类,如:IndexOutOfBoundsException / NullPointerException,这类异常由程序员预检查来规避,保证程序健壮性。 正例:if(obj != null) {...} 反例:try { obj.method() } catch(NullPointerException e)

  • 问题内容: 异常处理中的块究竟执行什么功能? 问题答案: 它包含应始终执行的代码,无论是否发生异常。 例如,如果您打开了一个文件,则应在块中将其关闭,以确保始终关闭该文件。如果在块中将其关闭,则较早的异常将导致执行直接跳到该块并跳过关闭文件。 有关更多详细信息,请参见Java教程。