web-dev-qa-db-ja.com

TypeError: '<'はインスタンス間でサポートされていませんPython

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

12
Zaidur

_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.
_

そして、ええ、リストのリストのソートは間違っているようです。内側の要素はタプルの方が適切な場合があるため、誤って内容を変更することはできません。

17
dhke

したがって、_pre_sorted_は_[int, part]_の要素を持つリストです。このリストをソートし、同じ整数値を持つ2つの要素がある場合、part値を比較して、どちらが先かを判断しようとします。ただし、一部が一部よりも小さいかどうかを判断する機能がない場合、outはそのエラーをスローします。

関数__le__(self, other)を追加して、部品を注文してください。

演算子の詳細はこちら

2
fuzzything44