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_ordering给part全序:
@total_ordering
class part():
[...]
def __lt__(self, other):
return self.number < other.number.
Run Code Online (Sandbox Code Playgroud)
是的,排序列表列表似乎是错误的.内部元素可能更好地是元组,因此您不能意外地修改内容.
pre_sorted包含 的元素的列表也是如此[int, part]。当您对此列表进行排序并有两个具有相同整数值的元素时,它会比较这些part值以尝试确定哪个元素先出现。但是,由于您没有函数来确定一个部分是否小于一个部分,因此它会抛出该错误。
尝试添加一个__lt__(self, other)能够订购零件的功能。
| 归档时间: |
|
| 查看次数: |
27423 次 |
| 最近记录: |