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)
エラーメッセージ:
出力は(毎回ランダム化されます):
_pre_sorted
_が項目_[fitness, part]
_を持つリストのリストであることを考えると、これは同じfitness
を持つ2つのサブリストを比較するたびに鳴ります。
Pythonリストは辞書式にソートされ、不一致の要素が見つかるまで要素ごとに左から右に比較されます。あなたの場合、2番目の要素(part
)は、2つの部分の適合度が同じ場合にのみアクセスされます。
[0, part0] < [1, part1]
_ =>は、フィットネスが既に異なるため、_part0
_と_part1
_を比較しません。[0, part0] < [0, part1]
_ =>doesフィットネスが同じであるため、_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.
_
そして、ええ、リストのリストのソートは間違っているようです。内側の要素はタプルの方が適切な場合があるため、誤って内容を変更することはできません。
したがって、_pre_sorted
_は_[int, part]
_の要素を持つリストです。このリストをソートし、同じ整数値を持つ2つの要素がある場合、part
値を比較して、どちらが先かを判断しようとします。ただし、一部が一部よりも小さいかどうかを判断する機能がない場合、outはそのエラーをスローします。
関数__le__(self, other)
を追加して、部品を注文してください。