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:
The Output is (which is randomized every time):
Kenil Vasani
Given that
pre_sorted
is a list of lists with items[fitness, part]
, this croaks whenever comparing two sublists with the samefitness
.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 comparepart0
andpart1
since the fitness is already different.[0, part0] < [0, part1]
=> does comparepart0
andpart1
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
givepart
a total order:And yeah, sorting lists of lists seems wrong. The inner elements might better be tuples, so you cannot accidentally modify the contents.