2017-04-18 100 views
4

我正在用python 3解決一個遺傳算法的問題。我還沒有完成完整的代碼。每當我完成它時,我都會測試一部分代碼。TypeError:實例之間不支持「<」Python

目前我被困在一個錯誤說:

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

+0

我可以建議你下載並使用[命令提示符,它允許複製(https://conemu.github.io/),所以你不需要不必要的屏幕截圖添加到您的問題。 –

回答

6

鑑於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_orderingpart全序:

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

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

,是的,排序列表列表看起來不對。內部元素最好是元組,所以你不能無意中修改內容。

+0

非常感謝!有用! 但是,當我使用operator.itemgetter(0)比較只有第一個元素的健身,那麼如果有相同的健身是什麼python做?它選擇哪個元素? – Zaidur

+0

@Zaidur'sort()'是穩定的,即對於比較相同的兩個元素,原始順序被保留。但請注意,您剛纔使用隨機抽樣創建了一個羣體。 – dhke

2

因此pre_sorted是一個元素列表[int, part]。當對這個列表進行排序並且有兩個具有相同整數值的元素時,它會比較part值以確定哪個值先排在前面。然而,有些你沒有確定零件是否小於一個零件的功能,拋出該錯誤。

嘗試添加一個功能__le__(self, other)訂購部件。

More on operators here

相關問題