遗传算法之: One Max Problem

遗传算法之: One Max Problem

OMP问题是一个最大化一个0,1比特串中1的数量的简单问题.

简单描述为: X → = { x 1 , x 2 , x 3 , . . . x N } \overrightarrow{X} = \{x_1, x_2, x_3, ... x_N\} X ={x1,x2,x3,...xN}, 且 x i ∈ { 0 , 1 } x_i \in \{0, 1\} xi{0,1},目标是使下面等式最大化:
F ( X → ) = ∑ i = 1 N x i F(\overrightarrow{X}) = \sum_{i=1}^{N} x_i F(X )=i=1Nxi

这个例子中, N = 100 N = 100 N=100

进化策略1:

  1. 随机生成父比特串
  2. 计算适应度
  3. 随机突变
  4. 计算突变生成子串的适应度
  5. 比较当前子串是否是当前最优
    • 是,继续在此基础上进行突变
    • 否,从父串突变
  6. 直到 F ( X → ) F(\overrightarrow{X}) F(X ) = 100结束

进化策略2:

  1. 随机生成父群
  2. 计算适应度,挑选父群中top n
  3. top n父群进行交叉变异
  4. 计算适应度,选择top n
  5. 循环3, 4
  6. 直到有子串满足结束条件 F ( X → ) = 100 F(\overrightarrow{X}) = 100 F(X )=100

进化策略3:

  1. 在策略2的基础上,交叉后增加,随机突变,丰富交叉样本的多样性

1. 随机突变

import random
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
def generate_sigle_parent(length, geneSet):
    parentGene = np.array([np.random.choice(geneSet) for i in range(length)])
    return parentGene
def get_fitness(gene):
    return np.sum(gene)
def display(gene):
    geneStr = ''.join(map(str, gene))
    fitness = get_fitness(gene)
    print('gene: %s, fitness: %d'%(geneStr, fitness))
def unisexual_mutate(parentGene, geneSet):
    childGene = parentGene.copy()
    index = random.randrange(0, len(parentGene))
    newGene, alternate = random.sample(geneSet, 2)
    if childGene[index] != newGene:
        childGene[index] = newGene
    else:
        childGene[index] = alternate
    return childGene
def evolution_v1(geneSet, target=100):
    gene_list, fitness_list = [], []
    bestGene = generate_sigle_parent(target,geneSet)
    bestFitness = get_fitness(bestGene)
    gene_list.append(bestGene)
    fitness_list.append(bestFitness)
    display(bestGene)
    print('--------first generation---------')
    if bestFitness >= target:
        return bestGene
    while True:
        childGene = unisexual_mutate(bestGene, geneSet)
        fitness = get_fitness(childGene)
        gene_list.append(childGene) # collect
        fitness_list.append(fitness) # collect
        if fitness <= bestFitness:
            continue
        display(childGene)
        if fitness >= target:
            return childGene, gene_list, fitness_list
        bestGene = childGene
        bestFitness = fitness
单性遗传(随机突变)
best_gene, gene_log1, fitness_log1 = evolution_v1(geneSet=[0, 1], target=100)
gene: 1100011100001110000011011110110100001100100101100001111010011111100001101100001011000001111110000110, fitness: 49
--------first generation---------
gene: 1100011100001110000011011110110100001100100101100001111010011111100001101100001011010001111110000110, fitness: 50
gene: 1100011100001110000011011110110100001100100101101001111010011111100001101100001011010001111110000110, fitness: 51
gene: 1100011100001110000011011110110100001100100101101001111010011111110001101100001011010001111110000110, fitness: 52
gene: 1100011100001110000011011110110100001100100101101001111010011111110001101100001011010001111110100110, fitness: 53
gene: 1100011100001110000011011110110100001100100101101001111010011111110001101110001011010001111110100110, fitness: 54
gene: 1100011100001110000011011110110100001100100101101001111010011111110001101110101011010001111110100110, fitness: 55
gene: 1100011100001110010011011110110100001100100101101001111010011111110001101110101011010001111110100110, fitness: 56
gene: 1100011110001110010011011110110100001100100101101001111010011111110001101110101011010001111110100110, fitness: 57
gene: 1100011110001110110011011110110100001100100101101001111010011111110001101110101011010001111110100110, fitness: 58
gene: 1100011110001110110011011110110101001100100101101001111010011111110001101110101011010001111110100110, fitness: 59
gene: 1100011110001110110011011110110101001100100101101001111010011111110001101110101011010001111110100111, fitness: 60
gene: 1100011110011110110011011110110101001100100101101001111010011111110001101110101011010001111110100111, fitness: 61
gene: 1100011110011110110011011110111101001100100101101001111010011111110001101110101011010001111110100111, fitness: 62
gene: 1100011110011110111011011110111101001100100101101001111010011111110001101110101011010001111110100111, fitness: 63
gene: 1100011110011110111011011110111111001100100101101001111010011111110001101110101011010001111110100111, fitness: 64
gene: 1100011110011110111011011110111111001100100101101001111010011111110001111110101011010001111110100111, fitness: 65
gene: 1100011110011110111011011110111111011100100101101001111010011111110001111110101011010001111110100111, fitness: 66
gene: 1100011110011110111011111110111111011100100101101001111010011111110001111110101011010001111110100111, fitness: 67
gene: 1100011110011110111011111110111111011101100101101001111010011111110001111110101011010001111110100111, fitness: 68
gene: 1100011110011110111011111110111111011101100101111001111010011111110001111110101011010001111110100111, fitness: 69
gene: 1100011110011110111011111110111111011101110101111001111010011111110001111110101011010001111110100111, fitness: 70
gene: 1100011110011110111011111110111111011101111101111001111010011111110001111110101011010001111110100111, fitness: 71
gene: 1100011110011110111011111110111111011101111101111001111010011111110101111110101011010001111110100111, fitness: 72
gene: 1100011110011110111111111110111111011101111101111001111010011111110101111110101011010001111110100111, fitness: 73
gene: 1100011110011110111111111110111111011101111101111001111010011111110101111110101011010001111110101111, fitness: 74
gene: 1100011110011110111111111110111111011101111101111001111010011111110101111110101011010011111110101111, fitness: 75
gene: 1100011110011110111111111110111111011101111101111001111010011111110101111110101111010011111110101111, fitness: 76
gene: 1100011110011110111111111110111111111101111101111001111010011111110101111110101111010011111110101111, fitness: 77
gene: 1100011110011110111111111110111111111101111101111001111010011111111101111110101111010011111110101111, fitness: 78
gene: 1100011110011111111111111110111111111101111101111001111010011111111101111110101111010011111110101111, fitness: 79
gene: 1100011110011111111111111110111111111101111101111001111010011111111101111110101111010011111110111111, fitness: 80
gene: 1100111110011111111111111110111111111101111101111001111010011111111101111110101111010011111110111111, fitness: 81
gene: 1100111110011111111111111110111111111101111101111001111010011111111101111110101111010111111110111111, fitness: 82
gene: 1100111110011111111111111110111111111101111101111001111010011111111101111110101111110111111110111111, fitness: 83
gene: 1101111110011111111111111110111111111101111101111001111010011111111101111110101111110111111110111111, fitness: 84
gene: 1101111110011111111111111110111111111101111111111001111010011111111101111110101111110111111110111111, fitness: 85
gene: 1101111110011111111111111110111111111101111111111001111010011111111101111110111111110111111110111111, fitness: 86
gene: 1101111110011111111111111110111111111101111111111001111010011111111111111110111111110111111110111111, fitness: 87
gene: 1101111110011111111111111110111111111101111111111001111011011111111111111110111111110111111110111111, fitness: 88
gene: 1101111110011111111111111110111111111101111111111001111011111111111111111110111111110111111110111111, fitness: 89
gene: 1111111110011111111111111110111111111101111111111001111011111111111111111110111111110111111110111111, fitness: 90
gene: 1111111110011111111111111110111111111101111111111011111011111111111111111110111111110111111110111111, fitness: 91
gene: 1111111110011111111111111110111111111101111111111011111111111111111111111110111111110111111110111111, fitness: 92
gene: 1111111110011111111111111110111111111111111111111011111111111111111111111110111111110111111110111111, fitness: 93
gene: 1111111110011111111111111110111111111111111111111011111111111111111111111110111111110111111111111111, fitness: 94
gene: 1111111111011111111111111110111111111111111111111011111111111111111111111110111111110111111111111111, fitness: 95
gene: 1111111111011111111111111110111111111111111111111011111111111111111111111110111111111111111111111111, fitness: 96
gene: 1111111111011111111111111110111111111111111111111011111111111111111111111111111111111111111111111111, fitness: 97
gene: 1111111111111111111111111110111111111111111111111011111111111111111111111111111111111111111111111111, fitness: 98
gene: 1111111111111111111111111111111111111111111111111011111111111111111111111111111111111111111111111111, fitness: 99
gene: 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, fitness: 100
进化过程

在这里插入图片描述

2.随机交叉

def generate_parents_group(length, geneSet, group_size=10):
    parentGeneGroup = [np.array([np.random.choice(geneSet) for i in range(length)]) for i in range(group_size)]
    return parentGeneGroup

贪心选择

def select_topN_gene(GeneGroup, topn=5):
    fitness_list =[-1*get_fitness(gene) for gene in GeneGroup]
    sorted_index = np.argsort(fitness_list)
    selected_Gene = [GeneGroup[i] for i in sorted_index[:topn]]
    return selected_Gene
import itertools
def bisexual_mutate(GeneGroup, alpha=0.3):   
    childGenes = []
    for couple in itertools.combinations(GeneGroup, 2):
        childGene = couple[0].copy()
        length = len(childGene)
        random_location = random.sample(list(np.arange(length)), int(length*alpha))
        childGene[random_location] = couple[1][random_location] # 交叉
        childGenes.append(childGene)
    return childGenes
def evolution_v2(geneSet, target=100, group_size=10, topN=5, alpha=0.5):
    gene_list = []
    mean_fitness = []
    max_fitness = []
    ParentGeneGroup = generate_parents_group(target, geneSet,group_size)
    #ParentGeneGroup = bisexual_mutate(ParentGeneGroup,alpha=0.2)
    selectedPGroup = select_topN_gene(ParentGeneGroup, topN)
    for gene in selectedPGroup:
        display(gene)
    print('Selected Gene Group')
    first_fitness = [get_fitness(gene) for gene in selectedPGroup]
    gene_list.append(selectedPGroup)
    mean_fitness.append(np.mean(first_fitness))
    max_fitness.append(np.max(first_fitness))
    # 
    for fitness in first_fitness:
        if fitness >= target:
            return selected_group
    #while True:
    for i in range(500):
        # 生成下一代
        childGeneGroup = bisexual_mutate(selectedPGroup,alpha=alpha)
        # 筛选
        selectedCGroup = select_topN_gene(childGeneGroup)
        gene_list.append(selectedCGroup) # collect
        # 上一代和下一代平均适应度进行比较
        mean_c_fitness = np.mean([get_fitness(gene) for gene in selectedCGroup])
        mean_p_fitness = np.mean([get_fitness(gene) for gene in selectedPGroup])
        max_c_fitness = np.max([get_fitness(gene) for gene in selectedCGroup])
        mean_fitness.append(mean_c_fitness)
        max_fitness.append(max_c_fitness)
        if mean_c_fitness <= mean_p_fitness:
            continue
        print('Selected Gene Mean Fitness :%f'%mean_c_fitness)
        if max_c_fitness >= target:
            return selectedCGroup, gene_list, mean_fitness
        selectedPGroup = selectedCGroup
    return selectedCGroup, gene_list, mean_fitness
#bestGroup, GeneGroup_list, Avg_fitness = evolution_v2(geneSet, alpha=0.1)  # alpha 交叉系数
result_1 = evolution_v2(geneSet, alpha=0.1)  # alpha 交叉系数
Selected Gene Group
Selected Gene Mean Fitness :57.400000
Selected Gene Mean Fitness :59.600000
Selected Gene Mean Fitness :60.800000
Selected Gene Mean Fitness :62.600000
Selected Gene Mean Fitness :64.400000
Selected Gene Mean Fitness :67.000000
Selected Gene Mean Fitness :68.000000
Selected Gene Mean Fitness :68.400000
Selected Gene Mean Fitness :69.000000
Selected Gene Mean Fitness :69.200000
Selected Gene Mean Fitness :69.800000
Selected Gene Mean Fitness :70.000000
result_2 = evolution_v2(geneSet, alpha=0.2)  # alpha 交叉系数
Selected Gene Group
Selected Gene Mean Fitness :56.000000
Selected Gene Mean Fitness :59.000000
Selected Gene Mean Fitness :62.400000
Selected Gene Mean Fitness :66.400000
Selected Gene Mean Fitness :69.400000
Selected Gene Mean Fitness :70.400000
Selected Gene Mean Fitness :71.000000
Selected Gene Mean Fitness :71.200000
Selected Gene Mean Fitness :71.800000
Selected Gene Mean Fitness :72.000000
result_3 = evolution_v2(geneSet, alpha=0.3)  # alpha 交叉系数
Selected Gene Group
Selected Gene Mean Fitness :58.400000
Selected Gene Mean Fitness :62.600000
Selected Gene Mean Fitness :65.200000
Selected Gene Mean Fitness :67.200000
Selected Gene Mean Fitness :70.200000
Selected Gene Mean Fitness :71.000000
Selected Gene Mean Fitness :72.600000
Selected Gene Mean Fitness :73.000000
Selected Gene Mean Fitness :73.800000
Selected Gene Mean Fitness :74.000000
result_4 = evolution_v2(geneSet, alpha=0.4)  # alpha 交叉系数
Selected Gene Group
Selected Gene Mean Fitness :55.600000
Selected Gene Mean Fitness :58.000000
Selected Gene Mean Fitness :59.200000
Selected Gene Mean Fitness :61.400000
Selected Gene Mean Fitness :65.400000
Selected Gene Mean Fitness :67.400000
Selected Gene Mean Fitness :69.800000
Selected Gene Mean Fitness :70.800000
Selected Gene Mean Fitness :71.200000
Selected Gene Mean Fitness :71.600000
Selected Gene Mean Fitness :72.000000
result_5 = evolution_v2(geneSet, alpha=0.5)  # alpha 交叉系数
Selected Gene Group
Selected Gene Mean Fitness :54.600000
Selected Gene Mean Fitness :55.200000
Selected Gene Mean Fitness :58.600000
Selected Gene Mean Fitness :60.200000
Selected Gene Mean Fitness :61.600000
Selected Gene Mean Fitness :64.800000
Selected Gene Mean Fitness :65.600000
Selected Gene Mean Fitness :66.600000
Selected Gene Mean Fitness :66.800000
Selected Gene Mean Fitness :67.800000
Selected Gene Mean Fitness :68.400000
Selected Gene Mean Fitness :69.000000
Selected Gene Mean Fitness :69.200000
Selected Gene Mean Fitness :70.600000
Selected Gene Mean Fitness :70.800000
Selected Gene Mean Fitness :71.000000
Selected Gene Mean Fitness :71.200000
Selected Gene Mean Fitness :71.600000
Selected Gene Mean Fitness :72.000000
result_6 = evolution_v2(geneSet, alpha=0.6)  # alpha 交叉系数
Selected Gene Group
Selected Gene Mean Fitness :56.000000
Selected Gene Mean Fitness :57.800000
Selected Gene Mean Fitness :59.400000
Selected Gene Mean Fitness :60.800000
Selected Gene Mean Fitness :62.000000
Selected Gene Mean Fitness :64.800000
Selected Gene Mean Fitness :66.000000
Selected Gene Mean Fitness :67.600000
Selected Gene Mean Fitness :69.200000
Selected Gene Mean Fitness :69.600000
Selected Gene Mean Fitness :71.000000
Selected Gene Mean Fitness :72.600000
Selected Gene Mean Fitness :72.800000
Selected Gene Mean Fitness :73.400000
Selected Gene Mean Fitness :73.800000
Selected Gene Mean Fitness :74.000000
result_7 = evolution_v2(geneSet, alpha=0.7)  # alpha 交叉系数
Selected Gene Group
Selected Gene Mean Fitness :55.000000
Selected Gene Mean Fitness :57.600000
Selected Gene Mean Fitness :58.600000
Selected Gene Mean Fitness :59.600000
Selected Gene Mean Fitness :61.200000
Selected Gene Mean Fitness :63.600000
Selected Gene Mean Fitness :64.800000
Selected Gene Mean Fitness :66.600000
Selected Gene Mean Fitness :67.400000
Selected Gene Mean Fitness :68.400000
Selected Gene Mean Fitness :68.600000
Selected Gene Mean Fitness :69.000000
Selected Gene Mean Fitness :70.200000
Selected Gene Mean Fitness :71.200000
Selected Gene Mean Fitness :71.600000
Selected Gene Mean Fitness :72.200000
Selected Gene Mean Fitness :72.400000
Selected Gene Mean Fitness :72.800000
Selected Gene Mean Fitness :73.000000
result_8 = evolution_v2(geneSet, alpha=0.8)  # alpha 交叉系数
Selected Gene Group
Selected Gene Mean Fitness :52.400000
Selected Gene Mean Fitness :54.600000
Selected Gene Mean Fitness :55.400000
Selected Gene Mean Fitness :56.200000
Selected Gene Mean Fitness :57.200000
Selected Gene Mean Fitness :58.800000
Selected Gene Mean Fitness :59.200000
Selected Gene Mean Fitness :59.400000
Selected Gene Mean Fitness :60.200000
Selected Gene Mean Fitness :61.200000
Selected Gene Mean Fitness :61.600000
Selected Gene Mean Fitness :62.400000
Selected Gene Mean Fitness :63.200000
Selected Gene Mean Fitness :63.600000
Selected Gene Mean Fitness :64.000000
Selected Gene Mean Fitness :64.200000
Selected Gene Mean Fitness :64.400000
Selected Gene Mean Fitness :64.800000
Selected Gene Mean Fitness :65.200000
Selected Gene Mean Fitness :65.600000
Selected Gene Mean Fitness :66.000000
Selected Gene Mean Fitness :66.200000
Selected Gene Mean Fitness :66.400000
Selected Gene Mean Fitness :66.600000
Selected Gene Mean Fitness :67.000000
result_9 = evolution_v2(geneSet, alpha=0.9)  # alpha 交叉系数
Selected Gene Group
Selected Gene Mean Fitness :52.200000
Selected Gene Mean Fitness :53.400000
Selected Gene Mean Fitness :54.400000
Selected Gene Mean Fitness :54.800000
Selected Gene Mean Fitness :56.200000
Selected Gene Mean Fitness :57.000000
Selected Gene Mean Fitness :57.400000
Selected Gene Mean Fitness :58.200000
Selected Gene Mean Fitness :59.000000
Selected Gene Mean Fitness :59.800000
Selected Gene Mean Fitness :60.000000
Selected Gene Mean Fitness :61.000000
Selected Gene Mean Fitness :62.400000
Selected Gene Mean Fitness :62.800000
Selected Gene Mean Fitness :63.800000
Selected Gene Mean Fitness :64.200000
Selected Gene Mean Fitness :64.400000
Selected Gene Mean Fitness :64.600000
Selected Gene Mean Fitness :64.800000
Selected Gene Mean Fitness :65.000000
Selected Gene Mean Fitness :65.200000
Selected Gene Mean Fitness :65.400000
Selected Gene Mean Fitness :65.600000
Selected Gene Mean Fitness :65.800000
Selected Gene Mean Fitness :66.400000
Selected Gene Mean Fitness :66.800000
Selected Gene Mean Fitness :67.000000

进化过程
在这里插入图片描述

从上图可以看出,进化过程陷入了局部最优,尽管尝试的不同的交叉比例,仍是没有改善,下面是经过选择后的TopN Gene图谱
在这里插入图片描述

这个图也说明,在单纯的交叉变异下,经过几轮进化后,父辈的基因基本趋于一致了,所以继续交叉下去是徒劳,很难到达最优.为了克服这个问题,继续尝试策略3,在交叉后进行突变.

3.交叉+突变

def cross_mutate(GeneGroup,alpha=0.3):
    childGenes = []
    for couple in itertools.combinations(GeneGroup, 2):
        childGene = couple[0].copy()
        length = len(childGene)
        random_location = random.sample(list(np.arange(length)), int(length*alpha))
        childGene[random_location] = couple[1][random_location] # 交叉
        childGene = unisexual_mutate(childGene, [0, 1])
        childGenes.append(childGene)
    return childGenes
def evolution_v3(geneSet, target=100, group_size=10, topN=5, alpha=0.5):
    gene_list = []
    mean_fitness = []
    max_fitness = []
    ParentGeneGroup = generate_parents_group(target, geneSet,group_size)
    #ParentGeneGroup = bisexual_mutate(ParentGeneGroup,alpha=0.2)
    selectedPGroup = select_topN_gene(ParentGeneGroup, topN)
    for gene in selectedPGroup:
        display(gene)
    print('Selected Gene Group')
    first_fitness = [get_fitness(gene) for gene in selectedPGroup]
    gene_list.append(selectedPGroup)
    mean_fitness.append(np.mean(first_fitness))
    max_fitness.append(np.max(first_fitness))
    # 
    for fitness in first_fitness:
        if fitness >= target:
            return selected_group
    #while True:
    for i in range(500):
        # 生成下一代
        childGeneGroup = cross_mutate(selectedPGroup,alpha=alpha)
        # 筛选
        selectedCGroup = select_topN_gene(childGeneGroup)
        gene_list.append(selectedCGroup) # collect
        # 上一代和下一代平均适应度进行比较
        mean_c_fitness = np.mean([get_fitness(gene) for gene in selectedCGroup])
        mean_p_fitness = np.mean([get_fitness(gene) for gene in selectedPGroup])
        max_c_fitness = np.max([get_fitness(gene) for gene in selectedCGroup])
        mean_fitness.append(mean_c_fitness)
        max_fitness.append(max_c_fitness)
        if mean_c_fitness <= mean_p_fitness:
            continue
        print('Selected Gene Mean Fitness :%f'%mean_c_fitness)
        if max_c_fitness >= target:
            return selectedCGroup, gene_list, mean_fitness, max_fitness
        selectedPGroup = selectedCGroup
    return selectedCGroup, gene_list, mean_fitness, max_fitness
bestGeneGroup, gene_list, mean_fitness, max_fitness = evolution_v3(geneSet=[0, 1], alpha=0.3)
gene: 1011111010100111000010110011011110100100010101011011110110111001101001101111101101000101010110111101, fitness: 59
gene: 0111111001011001101110101101101100011000111011011011010000000011101010111101110000001111111111011001, fitness: 58
gene: 0110010010000101110000110101011000001111110011101111110010011101111110101111100110010010010101000110, fitness: 54
gene: 0110010100000110110111011001111010011100111010110101001110000110111110111101101010011101000000010001, fitness: 53
gene: 0101011111000011000101011111010011111110101001111010000001000000001001101111111010000100111110101011, fitness: 53
Selected Gene Group
Selected Gene Mean Fitness :58.800000
Selected Gene Mean Fitness :62.200000
Selected Gene Mean Fitness :67.200000
Selected Gene Mean Fitness :69.600000
Selected Gene Mean Fitness :70.400000
Selected Gene Mean Fitness :73.200000
Selected Gene Mean Fitness :74.400000
Selected Gene Mean Fitness :76.000000
Selected Gene Mean Fitness :78.200000
Selected Gene Mean Fitness :80.600000
Selected Gene Mean Fitness :81.800000
Selected Gene Mean Fitness :82.600000
Selected Gene Mean Fitness :82.800000
Selected Gene Mean Fitness :84.000000
Selected Gene Mean Fitness :84.200000
Selected Gene Mean Fitness :85.000000
Selected Gene Mean Fitness :85.800000
Selected Gene Mean Fitness :87.200000
Selected Gene Mean Fitness :87.800000
Selected Gene Mean Fitness :88.200000
Selected Gene Mean Fitness :88.800000
Selected Gene Mean Fitness :90.200000
Selected Gene Mean Fitness :90.800000
Selected Gene Mean Fitness :91.000000
Selected Gene Mean Fitness :91.800000
Selected Gene Mean Fitness :92.200000
Selected Gene Mean Fitness :92.400000
Selected Gene Mean Fitness :92.600000
Selected Gene Mean Fitness :93.400000
Selected Gene Mean Fitness :93.800000
Selected Gene Mean Fitness :94.200000
Selected Gene Mean Fitness :94.600000
Selected Gene Mean Fitness :94.800000
Selected Gene Mean Fitness :95.200000
Selected Gene Mean Fitness :95.600000
Selected Gene Mean Fitness :96.000000
Selected Gene Mean Fitness :96.200000
Selected Gene Mean Fitness :96.400000
Selected Gene Mean Fitness :97.200000
Selected Gene Mean Fitness :97.400000
Selected Gene Mean Fitness :97.600000
Selected Gene Mean Fitness :97.800000
Selected Gene Mean Fitness :98.200000
Selected Gene Mean Fitness :98.400000
Selected Gene Mean Fitness :98.800000

进化过程
在这里插入图片描述

很明显,增加随机突变后,只需要更少的进化就达到了target.

对比

在这里插入图片描述

在这里插入图片描述

单个Gene的随机突变虽然也能到达目标,但是需要很长时间的进化,在之前的"Hello World"中,也是基于个体突变,但是这个不是完整遗传算法,算是精简版,策略3也不是完全的遗传算法,在选择过程中没有基于概率选择,而是采取了贪心的策略,每次都选择绝对的topN,交叉过程中也没有严格遵循遗传算法,而是选择了随机交叉.不过这些细节都不重要.重要的是,单纯的交叉可能会陷入局部最优,单纯突变可能要很多代的进化才行,交叉+突变可以缩短进化的时间.

遗传算法(Genetic Algorithm, GA)是一种模拟自然选择过程的优化搜索算法[^1]。在Python中,我们可以用它来解决旅行商问题(Traveling Salesman Problem, TSP)。以下是一个基本的遗传算法解决TSP问题的示例: 1. **初始化**:创建一个初始种群,每个个体代表一个可能的解决方案(路线),通常通过随机生成。 ```python import random def generate_route(n_cities): route = [i for i in range(1, n_cities + 1)] random.shuffle(route) return route initial_population = [generate_route(n_cities) for _ in range(population_size)] ``` 2. **适应度评估**:计算每个个体(路线)的总距离,作为其适应度。 ```python def fitness(route, distance_matrix): total_distance = sum(distance_matrix[i][route[i % len(route)]] for i in range(len(route))) return 1 / total_distance fitness_values = [fitness(route, distance_matrix) for route in initial_population] ``` 3. **选择**:基于适应度选择部分个体进入下一代。常用的选择策略有轮盘赌选择(roulette wheel selection)或锦标赛选择(tournament selection)。 4. **交叉**:通过交叉操作结合父母的基因,产生新的个体。常用的交叉方式有单点交叉(one-point crossover)。 ```python def single_point_crossover(parent1, parent2, crossover_point): child1 = parent1[:crossover_point] + parent2[crossover_point:] child2 = parent2[:crossover_point] + parent1[crossover_point:] return child1, child2 ``` 5. **变异**:对新产生的个体进行变异,增加多样性。如交换两个位置的操作(uniform crossover 或 bit-flip mutation)。 6. **重复**:直到达到停止条件(如迭代次数或适应度阈值),或者新一代的最优解优于上一代。 ```python while not stopping_condition: next_generation = [] ... (selection, crossover, and mutation steps are performed here ...) # 检查是否有新的最优解 if any(fitness(new_gen, distance_matrix) > best_fitness for new_gen in next_generation): best_solution = max(next_generation, key=fitness) ``` 这个框架展示了遗传算法的基本概念和实施步骤,但实际应用时需要细化并调整参数以获得更好的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值