VRP-System / Evolution.py
Evolution.py
Raw
from Selection import selection
from EV import evolution as EV
from random import randint, sample

def crossOver(parents,randIndividuals,cities):
    '''Return population composed of parents, children and some random individuals'''
    population = EV.includeParents(parents)
    for p in parents:

        parent1 = p[0]
        parent2 = p[1]

        r = randint(1 , len(p[0])-1)
        
        child1 = parent1[:r]
        child2 = parent2[:r]

        for i in range(r,len(parent1)):
            if parent2[i] not in child1:
                child1 += parent2[i]
            elif parent2[i] != ' ':
                child1 += '*'
            else:
                child1 += parent2[i]
            
            if parent1[i] not in child2:
                child2 += parent1[i]
            elif parent1[i] != ' ':
                child2 += '*'
            else:
                child2 += parent1[i]

        cities1 = EV.filterCities(child1,cities)
        cities2 = EV.filterCities(child2,cities)

        list1 = list(child1)
        list2 = list(child2)

        for x in range(r,len(child1)):
            if child1[x] == '*':
                c = cities1[0]
                list1[x] = c
                cities1.remove(c)

            if child2[x] == '*':
                c = cities2[0]
                list2[x] = c
                cities2.remove(c)

        child1 = ''.join(list1)
        child2 = ''.join(list2)

        population.append(child1)
        population.append(child2)

    population =  EV.includeRands(population , randIndividuals)

    return population
    
def randomIndividuals(pop,rate):
    rate = int(rate * len(pop[0]))
    individuals = sample(pop[0],rate)
    indices = [individuals.index(i) for i in individuals]
    return [individuals,indices]

def mutate(population,rate=0.25):
    '''Return partially Inversed individual according to mutation rate'''
    indices = randomIndividuals(population,rate)[1]
    for i in indices:
        s = population[i]
        s = EV.reflect(s)
        population[i] = s
     
    return population

def evolve(population,mutation_rate=0.45):
    selected = selection(population,0.20, 0.20) 
    parents = selected[0]
    randIndividuals = selected[1]
    cities = EV.getCities(parents)

    population = crossOver(parents,randIndividuals,cities)
    
    mutate(population,mutation_rate)
    
    return population