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

Zai*_*dur 13 python class typeerror python-3.x

我在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)
Run Code Online (Sandbox Code Playgroud)

错误信息: 在此输入图像描述

输出是(每次随机化): 在此输入图像描述

dhk*_*hke 17

鉴于这pre_sorted是一个带有项目的列表列表,[fitness, part]只要将两个子列表与相同的列表进行比较,就会出现这种情况fitness.

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

  • [0, part0] < [1, part1]=>没有比较part0,part1因为健身已经不同了.
  • [0, part0] < [0, part1]=> 确实比较part0,part1因为健身是相同的.

建议1:

仅按健身排序: sorted(pre_sorted, key=operator.itemgetter(0))

建议2:阅读文档functools.total_orderingpart全序:

@total_ordering
class part():
    [...]

    def __lt__(self, other):
        return self.number < other.number.
Run Code Online (Sandbox Code Playgroud)

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


fuz*_*g44 5

pre_sorted包含 的元素的列表也是如此[int, part]。当您对此列表进行排序并有两个具有相同整数值的元素时,它会比较这些part值以尝试确定哪个元素先出现。但是,由于您没有函数来确定一个部分是否小于一个部分,因此它会抛出该错误。

尝试添加一个__lt__(self, other)能够订购零件的功能。

有关运营商的更多信息请参见此处