Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TypeError: '<' not supported between instances Python

Tags:

I am solving a problem with genetic algorithm in python 3. I have not completed the full code yet. I test a part of the code whenever I complete it.

At present, I am stuck with an error saying:

TypeError: '<' not supported between instances of 'part' and 'part'

The interesting thing is, this error does not always show. Sometimes the code runs smoothly and show the desired output, but sometimes it shows this error.

What is the reason for this?

I am attaching the code and the error message.
I am using 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) 

the error message: enter image description here

The Output is (which is randomized every time): enter image description here

like image 636
Zaidur Avatar asked Apr 18 '17 16:04

Zaidur


People also ask

How do I fix TypeError not supported between instances of List and int?

The Python "TypeError: '<' not supported between instances of 'list' and 'int'" occurs when we use a comparison operator between values of type list and int . To solve the error, access the list at a specific index or compare the list's length to an integer.

Is not supported between instances of?

The Python "TypeError: '>' not supported between instances of 'method' and 'int'" occurs when we use a comparison operator between a method and an integer. To solve the error, make sure to call the method with parentheses, e.g. my_method() . Here is an example of how the error occurs. Copied!


2 Answers

Given that pre_sorted is a list of lists with items [fitness, part], this croaks whenever comparing two sublists with the same fitness.

Python lists sort lexicographically and are compared element-wise left to right until a mismatching element is found. In your case, the second element (part) is only accessed if the fitness of two parts is the same.

  • [0, part0] < [1, part1] => does not compare part0 and part1 since the fitness is already different.
  • [0, part0] < [0, part1] => does compare part0 and part1 since the fitness is the same.

Suggestion 1

Sort only by fitness: sorted(pre_sorted, key=operator.itemgetter(0))

Suggestion 2

Read the documentation for functools.total_ordering give part a total order:

@total_ordering class part():     [...]      def __lt__(self, other):         return self.number < other.number 

And yeah, sorting lists of lists seems wrong. The inner elements might better be tuples, so you cannot accidentally modify the contents.

like image 142
dhke Avatar answered Oct 06 '22 01:10

dhke


So pre_sorted is a list with elements of [int, part]. When you sort this list and have two elements with the same integer value, it then compares the part values to try to determine which goes first. However, since you have no function for determining if a part is less than a part, it throws that error.

Try adding a function __lt__(self, other) to be able to order parts.

More on operators here

like image 32
fuzzything44 Avatar answered Oct 06 '22 01:10

fuzzything44