admin管理员组文章数量:1582706
Recently, Rosy has been enthusiastic about studying Intelligent Algorithms to solve classification problems. And Now, Rosy will present some tips on it.
Basic Process:
step1: Create an Initial Population
step2: Calculate the Fitness Value of Each chromosome
step3: Selection
step4: Cross
step5: Variation
step6: Calculate the Fitness Value of Each chromosome
step7: Meet the Stop Conclution?
step8: If Meet the Step7,End; Else Cycle the Process (Step3-Step7).
Important Operators:
Selection Operator
(1)Fitness Proportionate Selection, FPS:
This is a roulette, and there is only one choice point.
(2)Stochastic Universal Sampling, SUS:
Unlike SUS, it has m equally spaced selection points.
(3)Sorting based Selection Strategy, SSS
First, the chromosomes are sorted according to a certain rule
Then, selected according to a certain rule.
Cross Operator
(1)Single Point Crossing, SPC
Only one single point is selected for crossing.
(2)A Two-Point Crossing and a K-Point Crossing, TPKP
Two or K points are selected for crossing.
(3)Uniform Cross Method, UCM
Randomly select 50% to cross.
(4)Crossover of Ordered Lists, COL
For example, business travel issues are crossed.
(5)Ordered Crossover, OC
Select the parent->Identify intersection->Replicator segment->Populate the remaining genes->Generate the second child generation->Complete cross operation.
Variation Operator
(1)Inversion Variation, IV
Randomly select genes and invert them.
(2)Cross Variation, CV
Mutate and swap.
(3)Reverse Variation, RV
The order is reversed.
(4)Recombination Variation, RV
Random selection order.
Codes
The codes came from: Hands-On Genetic Algorithms with Python.
from deap import base
from deap import creator
from deap import tools
import random
import matplotlib.pyplot as plt
import seaborn as sns
# problem constants:
ONE_MAX_LENGTH = 100 # length of bit string to be optimized
# Genetic Algorithm constants:
POPULATION_SIZE = 200
P_CROSSOVER = 0.9 # probability for crossover
P_MUTATION = 0.1 # probability for mutating an individual
MAX_GENERATIONS = 50
# set the random seed:
RANDOM_SEED = 42
random.seed(RANDOM_SEED)
toolbox = base.Toolbox()
# create an operator that randomly returns 0 or 1:
toolbox.register("zeroOrOne", random.randint, 0, 1)
# define a single objective, maximizing fitness strategy:
creator.create("FitnessMax", base.Fitness, weights=(1.0,))
# create the Individual class based on list:
creator.create("Individual", list, fitness=creator.FitnessMax)
#creator.create("Individual", array.array, typecode='b', fitness=creator.FitnessMax)
# create the individual operator to fill up an Individual instance:
toolbox.register("individualCreator", tools.initRepeat, creator.Individual, toolbox.zeroOrOne, ONE_MAX_LENGTH)
# create the population operator to generate a list of individuals:
toolbox.register("populationCreator", tools.initRepeat, list, toolbox.individualCreator)
# fitness calculation:
# compute the number of '1's in the individual
def oneMaxFitness(individual):
return sum(individual), # return a tuple
toolbox.register("evaluate", oneMaxFitness)
# genetic operators:
# Tournament selection with tournament size of 3:
toolbox.register("select", tools.selTournament, tournsize=3)
# Single-point crossover:
toolbox.register("mate", tools.cxOnePoint)
# Flip-bit mutation:
# indpb: Independent probability for each attribute to be flipped
toolbox.register("mutate", tools.mutFlipBit, indpb=1.0/ONE_MAX_LENGTH)
# Genetic Algorithm flow:
def main():
# create initial population (generation 0):
population = toolbox.populationCreator(n=POPULATION_SIZE)
generationCounter = 0
# calculate fitness tuple for each individual in the population:
fitnessValues = list(map(toolbox.evaluate, population))
for individual, fitnessValue in zip(population, fitnessValues):
individual.fitness.values = fitnessValue
# extract fitness values from all individuals in population:
fitnessValues = [individual.fitness.values[0] for individual in population]
# initialize statistics accumulators:
maxFitnessValues = []
meanFitnessValues = []
# main evolutionary loop:
# stop if max fitness value reached the known max value
# OR if number of generations exceeded the preset value:
while max(fitnessValues) < ONE_MAX_LENGTH and generationCounter < MAX_GENERATIONS:
# update counter:
generationCounter = generationCounter + 1
# apply the selection operator, to select the next generation's individuals:
offspring = toolbox.select(population, len(population))
# clone the selected individuals:
offspring = list(map(toolbox.clone, offspring))
# apply the crossover operator to pairs of offspring:
for child1, child2 in zip(offspring[::2], offspring[1::2]):
if random.random() < P_CROSSOVER:
toolbox.mate(child1, child2)
del child1.fitness.values
del child2.fitness.values
for mutant in offspring:
if random.random() < P_MUTATION:
toolbox.mutate(mutant)
del mutant.fitness.values
# calculate fitness for the individuals with no previous calculated fitness value:
freshIndividuals = [ind for ind in offspring if not ind.fitness.valid]
freshFitnessValues = list(map(toolbox.evaluate, freshIndividuals))
for individual, fitnessValue in zip(freshIndividuals, freshFitnessValues):
individual.fitness.values = fitnessValue
# replace the current population with the offspring:
population[:] = offspring
# collect fitnessValues into a list, update statistics and print:
fitnessValues = [ind.fitness.values[0] for ind in population]
maxFitness = max(fitnessValues)
meanFitness = sum(fitnessValues) / len(population)
maxFitnessValues.append(maxFitness)
meanFitnessValues.append(meanFitness)
print("- Generation {}: Max Fitness = {}, Avg Fitness = {}".format(generationCounter, maxFitness, meanFitness))
# find and print best individual:
best_index = fitnessValues.index(max(fitnessValues))
print("Best Individual = ", *population[best_index], "\n")
# Genetic Algorithm is done - plot statistics:
sns.set_style("whitegrid")
plt.plot(maxFitnessValues, color='red')
plt.plot(meanFitnessValues, color='green')
plt.xlabel('Generation')
plt.ylabel('Max / Average Fitness')
plt.title('Max and Average Fitness over Generations')
plt.show()
if __name__ == '__main__':
main()
版权声明:本文标题:Genetic Algorithm 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1727895698a1136769.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论