def crossover(self, pcross): for i in xrange(0, self.pop_size, 2): if random() < pcross: (son1, son2) = Crossovers.single_point_crossover(self.internal_pop[i], self.internal_pop[i+1]) self.internal_pop[i] = son1 self.internal_pop[i].needs_eval = True self.internal_pop[i+1] = son2 self.internal_pop[i+1].needs_eval = True
def cruzar_y_mutar(rutaparticula, rutavecino, opcross, opmut): # Por defecto se realizará un crossover Order1 y no mutacion if opcross == 1: # Order1 nuevaruta = Crossovers.Order1(rutaparticula, rutavecino) elif opcross == 2: # Cycle nuevaruta = Crossovers.Cycle(rutaparticula, rutavecino) elif opcross == 3: # Partially mapped crossover nuevaruta = Crossovers.PMX(rutaparticula, rutavecino) else: # Si no es numero de operador valido, se realizar un Order1 nuevaruta = Crossovers.Order1(rutaparticula, rutavecino) # Mutaciones. Por defecto no se realizará la operacion de mutacion # Hay un 10% de probabilidades de realizar una mutacion if random.randint(0, 100) < 15: if opmut == 1: # Inversion nuevaruta = Mutations.Inversion(nuevaruta) elif opmut == 2: # SingleSwap nuevaruta = Mutations.RandomSwap(nuevaruta) return nuevaruta
#import Mutators import time if __name__ == "__main__": size = 100 cross_max_iters = 100000 #mut_max_iters = 1000000 pmut = 0.02 dad = BinaryString.BinaryString(size) mom = BinaryString.BinaryString(size) #print dad #print mom start = time.time() for i in xrange(1, cross_max_iters): (son1, son2) = Crossovers.single_point_crossover(dad, mom) end = time.time() print "single_point_crossover time:", ((end-start)*1000) / cross_max_iters, "ms" #print son1 #print son2 start = time.time() for i in xrange(1, cross_max_iters): (son1, son2) = Crossovers.two_point_crossover(dad, mom) end = time.time() print "two_point_crossover time:", ((end-start)*1000) / cross_max_iters, "ms" start = time.time() for i in xrange(1, cross_max_iters): (son1, son2) = Crossovers.uniform_crossover(dad, mom)