TypeError:'<'实例Python之间不支持

时间:2017-04-18 16:52:37

标签: python python-3.x class typeerror

我在python 3中解决了遗传算法的问题。我还没有完成完整的代码。每当我完成它时,我会测试一部分代码。

目前我遇到了错误的说法:

  

TypeError:'<' 'part'和'part'实例之间不支持

有趣的是这个错误并不总是显示出来。有时代码运行平稳并显示所需的输出,但有时会显示此错误。

这是什么原因?请帮我。我附加代码和错误消息。我正在使用PyCharm。

import random


class part():
    def __init__(self, number):
        self.number = number
        self.machine_sequence = []

    def add_volume(self, volume):
        self.volume = volume

    def add_machine(self, machine_numbers):
        self.machine_sequence.append(machine_numbers)


def create_initial_population():
    part_family = []

    for i in range(8):
        part_family.append(part(i))

    part_population = []

    for i in range(6):
        part_population.append(random.sample(part_family, len(part_family)))

    for i in part_population:
        for j in i:
            j.add_volume(random.randrange(100, 200))

    return part_population


def fitness(part_family):
    sum_of_boundary = []
    for i in range(0, 8, 2):
        sum_of_boundary.append(sum(j.volume for j in part_family[i:i + 2]))

    fitness_value = 0

    for i in range(len(sum_of_boundary) - 1):
        for j in range(i + 1, len(sum_of_boundary)):
            fitness_value = fitness_value + abs(sum_of_boundary[i] - sum_of_boundary[j])

    return fitness_value


def sort_population_by_fitness(population):
    pre_sorted = [[fitness(x),x] for x in population]
    sort = [x[1] for x in sorted(pre_sorted)]
    for i in sort:
        for j in i:
            print(j.volume, end = ' ')
        print()

    return sort


def evolve(population):
    population = sort_population_by_fitness(population)
    return population


population = create_initial_population()
population = evolve(population)

错误消息: enter image description here

输出是(每次随机化): enter image description here

2 个答案:

答案 0 :(得分:14)

鉴于class NeuralNetwork(): def __init__(self, inputs, hidden1, hidden2, hidden3, outputs, alpha,it_1,it_2,it_3,it_4,it_5): .... self.distance1 = [alpha,hidden1,it_1,'train',0,0,0,0,0] self.distance2 = [alpha,hidden1,it_1,'test',0,0,0,0,0] self.distance3 = [alpha,hidden1,it_1,'dist',0,0,0,0,0] self.distance4 = [alpha,hidden1,it_2,'train',0,0,0,0,0] self.distance5 = [alpha,hidden1,it_2,'test',0,0,0,0,0] self.distance6 = [alpha,hidden1,it_2,'dist',0,0,0,0,0] self.distance7 = [alpha,hidden1,it_3,'train',0,0,0,0,0] self.distance8 = [alpha,hidden1,it_3,'test',0,0,0,0,0] self.distance9 = [alpha,hidden1,it_3,'dist',0,0,0,0,0] self.distance10 = [alpha,hidden1,it_4,'train',0,0,0,0,0] self.distance11 = [alpha,hidden1,it_4,'test',0,0,0,0,0] self.distance12 = [alpha,hidden1,it_4,'dist',0,0,0,0,0] self.distance13 = [alpha,hidden1,it_5,'train',0,0,0,0,0] self.distance14 = [alpha,hidden1,it_5,'test',0,0,0,0,0] self.distance15 = [alpha,hidden1,it_5,'dist',0,0,0,0,0] 是包含商品pre_sorted的列表列表,只要将两个子列表与相同的[fitness, part]进行比较,就会出现这种情况。

Python按字典顺序列出排序,并按元素从左到右进行比较,直到找到不匹配的元素。在您的情况下,仅当两个部分的适合度相同时才访问第二个元素(fitness)。

  • part =&gt;不会比较[0, part0] < [1, part1]part0,因为适应性已经不同了。
  • part1 =&gt; 确实比较[0, part0] < [0, part1]part0,因为健康状况相同。

建议1:

仅按健身排序:part1

建议2:阅读functools.total_ordering给予sorted(pre_sorted, key=operator.itemgetter(0))总订单的文档:

part

是的,排序列表列表似乎是错误的。内部元素可能更好地是元组,因此您不会意外地修改内容。

答案 1 :(得分:2)

所以pre_sorted是一个包含[int, part]元素的列表。当您对此列表进行排序并且具有两个具有相同整数值的元素时,它会比较part值以尝试确定哪个先行。但是,有些人没有确定零件是否小于零件的功能,因此会抛出该错误。

尝试添加功能__le__(self, other)以订购部件。

More on operators here