DEAP / deap

Distributed Evolutionary Algorithms in Python
http://deap.readthedocs.org/
GNU Lesser General Public License v3.0
5.77k stars 1.12k forks source link

sortLogNondominated and sortNondominated are not returning same fronts #266

Closed khalibartan closed 6 years ago

khalibartan commented 6 years ago

Hi, I was comparing the fronts returned by sortLogNondominated and sortNondominated, they were not same. Here is the snippet:

from emo import *

class Fitness():
    def __init__(self, x1, y1):
        self.wvalues = (x1, y1)
        self.values = (x1, y1)
        self.weights = (1, 1)
    def dominates(self, other):
        not_equal = False
        for sw, ow in zip(self.wvalues, other.wvalues):
            if sw > ow:
                return False
            elif sw < ow:
                not_equal = True
        return not_equal

class Individual():
    def __init__(self, x1, y1):
        self.fitness = Fitness(x1,y1)

individuals = []

individuals.append(Individual(0.31, 6.10))

individuals.append(Individual(0.43, 6.79))

individuals.append(Individual(0.22, 7.09))

individuals.append(Individual(0.59, 7.85))

individuals.append(Individual(0.66, 3.65))

individuals.append(Individual(0.83, 4.23))

mapping = {}

for i, individual in enumerate(individuals):
    mapping[individual] = i+1

individuals.append(Individual(0.21, 5.90))

individuals.append(Individual(0.79, 3.97))

individuals.append(Individual(0.51, 6.51))

individuals.append(Individual(0.27, 6.93))

individuals.append(Individual(0.58, 4.52))

individuals.append(Individual(0.24, 8.54))

for i, individual in enumerate(individuals[6:]):
    mapping[individual] = chr(ord('a')+i)

def print_front(fronts, mapping):

    for front in fronts:
        for ind in front:
            print mapping[ind],
        print ''

    return

print_front(sortLogNondominated(individuals, 12), mapping)
print_front(sortNondominated(individuals, 12), mapping)

Note: I was just trying to use the implementation of algorithm.

Outputs are:

6 4 f 
b e c 2 d 3 
5 1 
a 
a 5 e 
3 1 d b 
f 2 c 6 
4 

The output of sortNondominated matches with that of example given in Kalyanmoy Deb Multi-Objective Optimization Using Evolutionary Algorithms, section 6.2.2 , but the output of sortLogNondominated doesn't.

fmder commented 6 years ago

You Fitness class seems to be at cause. Try this one

from __future__ import print_function

from deap import base
from deap import creator
from deap.tools.emo import *

creator.create("Fitness", base.Fitness, weights=(1, 1))
creator.create("Individual", list, fitness=creator.Fitness)

def Individual(x, y, id):
    ind = creator.Individual()
    ind.fitness.values = (x, y)
    ind.id = id
    return ind

individuals = list()
individuals.append(Individual(0.31, 6.10, "a"))
individuals.append(Individual(0.43, 6.79, "b"))
individuals.append(Individual(0.22, 7.09, "c"))
individuals.append(Individual(0.59, 7.85, "d"))
individuals.append(Individual(0.66, 3.65, "e"))
individuals.append(Individual(0.83, 4.23, "f"))
individuals.append(Individual(0.21, 5.90, "g"))
individuals.append(Individual(0.79, 3.97, "h"))
individuals.append(Individual(0.51, 6.51, "i"))
individuals.append(Individual(0.27, 6.93, "j"))
individuals.append(Individual(0.58, 4.52, "k"))
individuals.append(Individual(0.24, 8.54, "l"))

def print_front(fronts):
    for front in fronts:
        for ind in front:
            print(ind.id, end="")
        print()
    print()
    return

print_front(sortLogNondominated(individuals, 12))
print_front(sortNondominated(individuals, 12))

which outputs:

fdl
hkibjc
ea
g

dfl
bijkhc
ae
g
fmder commented 6 years ago

Looks like you inverted the not_equal = True and return False statements.

khalibartan commented 6 years ago

@fmder Oh sorry! Actually, I was using minimization objective and wrote the function according to it. Thanks.