gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:59:11 24 4
gpt4 key购买 nike

我正在用 python 3 解决遗传算法问题。我还没有完成完整的代码。每当我完成代码的一部分时,我都会对其进行测试。

目前,我遇到了一个错误:

TypeError: '<' not supported between instances of 'part' and '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

最佳答案

鉴于pre_sorted是包含项目的列表列表 [fitness, part] , 每当比较两个具有相同 fitness 的子列表时,它就会发出声音。 .

Python 列表按字典顺序排序,并按元素从左到右进行比较,直到找到不匹配的元素。在您的例子中,第二个元素 ( part ) 仅在两个部分的适应度相同时才被访问。

  • [0, part0] < [1, part1] => 不比较 part0part1因为适应度已经不同了。
  • [0, part0] < [0, part1] => 比较part0part1因为健身是一样的。

建议1

仅按适应度排序:sorted(pre_sorted, key=operator.itemgetter(0))

建议2

阅读 functools.total_ordering 的文档给part总订单:

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

def __lt__(self, other):
return self.number < other.number

是的,对列表的列表进行排序似乎是错误的。内部元素最好是元组,这样您就不会意外修改内容。

关于python - TypeError:实例 Python 之间不支持 '<',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43477958/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com