目 录
1 绪 论 1
1.1 研究背景及研究意义 1
1.2 国内外研究综述 2
1.2.1 神经网络国内外研究综述 2
1.2.2 遗传算法国内外研究综述 3
1.2.3 神经网络和遗传算法相结合的国内外研究综述 4
1.3 研究思路和方法 5
1.3.1 研究思路 5
1.3.2 研究方法 6
1.4研究计划及预计研究成果 6
2 适应度函数 8
2.1 遗传算法概述 8
2.1.1 遗传算法的基本特征 8
2.1.2 遗传算法流程 8
2.2 常见适应度函数及其作用 9
2.2.1 常见的三种适应度函数 9
2.2.2 适应度函数的作用 10
3 基于神经网络的遗传算法 12
3.1 神经适应度函数的理论分析 12
3.2 神经适应度函数的训练 12
3.3 具体的神经适应度遗传算法 13
3.4 神经适应度遗传算法的具体实现 14
4 验证成果 15
4.1 测试函数 15
4.2 测试适应度函数 15
4.3 测试结果 16
4.4 可视化测试 16
结 论 17
参考文献 18
附 录 21
致 谢 29

图目录
图2.1 简单遗传算法流程图 9
图2.2 神经网络适应度遗传算法模型 11
图3.1 神经网络算法的训练 13

表目录
表4.1 测试函数运行的结果 14
1.3 研究思路和方法
1.3.1 研究思路
对很多问题,精确的适应度函数并不适用。自动编程中代码的自动生成是个很好的例子,我们很难区分两种代码哪个更好。又比如生成一张美丽的面孔,我们很难用一个公式来计算面孔的美丽程度。即使有精确表示的问题,如函数的最小值,用函数本身作为适应度也不一定科学。我们的目标是能用配备神经适应度函数的遗传算法解决这些难以用传统遗传算法表示和解决的问题。同时提高传统遗传算法可以表示的问题的解决效率。
一旦用神经网络代替显式的函数。我们就要面临这些问题:选择哪种神经网络,这样的神经适应度函数如何训练?具体讲,如何构造训练用的样本,用什么方法训练?对选定的样本还要给出适应度,这个适应度可以用人的经验来判断,这样的话基因进化的最大环境就是人的经验。对于那些有明确函数表达的问题,可以同时参考又显式适应度函数给出的值。
除了构造出配备神经适应度函数的遗传算法,还要证明新算法比传统算法更好。至少证明新算法能解决传统算法处理不了的问题。引入神经网络也可能使算法变复杂,增加更多的计算步骤,因此需要提高新算法的计算效率。这也是必须面对的问题。程序设计也变得复杂,如何将两种算法融合在一起是程序设计的关键。
一旦证明基于神经网络的遗传算法比传统遗传算法有很多优点,我们将进一步进行改进。比如不是一开始训练完神经网络,因为这会使神经网络发挥不出最大作用。相反,可以每当迭代完若干次后,以产生的后代为样本对神经网络进行训练。
1.3.2 研究方法
理论方法主要继承自现有的数学理论,如随机过程、实分析、泛函分析等,研究算法收敛性。数值实验通过编程进行。写出经过理论验证的算法,然后用计算机语言实现。除了实现算法,我们用可视化方法形象地展示进化的的过程,对算法有直观的认识会使我们有新的发现,还可与传统方法比较。
1.4研究计划及预计研究成果
1.4.1 研究计划
第一阶段:在网上、图书馆收集各种数据、文献;理清论文研究目标和基本研究思路;制定研究的详细计划。 认真阅读一些入门性教材,有一定的了解过后,阅读一些相关领域的经典论文和著作,如Holland的《在自然和人工系统中的自适应》。此外,阅读一些理论数学书籍,如概率论、随机过程、泛函分析等。
第二阶段:积累知识之后,购买一系列文具、设备,展开记录。将记录结果记录下来,供以后整理研究。研究的主要课题包括,神经网络取代显式适应度函数之后算法的设计,以及神经网络的训练算法和样本选取。
第三阶段:对新算法进行理论分析,得出相关定理。从理论上证明算法的可靠性。和导师交流。整理笔记,构思论文结构,形成写作框架;撰写论文初稿修改论文,并进一步修改完善。
第四阶段:学习编程语言及其第三方库。编写程序,实现算法及程序的可视化。将运行结果作为提高算法性能的证据。
最后,完成论文写作。论文的主题包括:算法的设计和理论研究,算法的比较和改进,算法的应用。
1.4.2 预计研究成果
通过训练新的适应度函数,设计出更高效的遗传算法,解决传统算法解决不了的问题,消除对问题做精确化表达的依赖。这种算法除了能应用于优化以外,还可以更真实地模拟生物进化,给生物学研究带来启发。
用Python、MATLAB等计算机语言实现算法,并制作GUI界面实现可视化或者虚拟现实系统。最后以论文的形式将研究结果表现出来。

  def mycx(ind1, ind2):
        if np.random.random()<.5:
            cxpoint1 = random.randint(1, c)
            cxpoint2 = random.randint(1, c - 1)
            if cxpoint2 >= cxpoint1:
                cxpoint2 += 1
            else: # Swap the two cx points
                cxpoint1, cxpoint2 = cxpoint2, cxpoint1
            for k in range(8):
                ind1[k][cxpoint1:cxpoint2], ind2[k][cxpoint1:cxpoint2] = ind2[k][cxpoint1:cxpoint2], ind1[k][cxpoint1:cxpoint2]
        else:
            ind1, ind2 = tools.cxTwoPoint(ind2, ind1)
        return ind1, ind2

    toolbox.register("mate", mycx)

    # 定义神经网络适应度函数,定义相应算法
    ann = neupy.algorithms.MinibatchGradientDescent(
    neupy.layers.Input(r*c) > neupy.layers.Sigmoid(15, weight=neupy.init.Constant()) > neupy.layers.Linear(1, weight=neupy.init.Constant()), step=0.2, shuffle_data=True)

    # ann = neupy.algorithms.Adadelta(
    # [
    #     neupy.layers.Input((1, r, c)),

    #     neupy.layers.Convolution((32, 3, 3)) > neupy.layers.BatchNorm() > neupy.layers.Relu(),
    #     neupy.layers.Convolution((48, 3, 3)) > neupy.layers.BatchNorm() > neupy.layers.Relu(),
    #     neupy.layers.MaxPooling((2, 2)),

    #     neupy.layers.Convolution((64, 3, 3)) > neupy.layers.BatchNorm() > neupy.layers.Relu(),
    #     neupy.layers.MaxPooling((2, 2)),

    #     neupy.layers.Reshape(),
    #     neupy.layers.Linear(1024) > neupy.layers.BatchNorm() > neupy.layers.Relu(),
    #     neupy.layers.Softmax(1),
    # ],

    # error='categorical_crossentropy',
    # step=1.0,
    # shuffle_data=True,

    # reduction_freq=8,
    # addons=[neupy.algorithms.StepDecay],
    # )
    # ann.architecture()

    aga = vcga.AdaptiveGA(algorithms.eaSimple, epochs=20)
    # nga = NeuralGA(algorithm=aga, ann=ann)

    # 初始化种群
    pop = toolbox.population(n=200)

    def dist(ind1, ind2):
        return LA.norm(np.array(ind1)-np.array(ind2))

    def cluster(pop):
        popc = [pop[0]]
        for ind1 in pop[1:]:
            for ind2 in popc:
                if dist(ind1, ind2)<6.4:
                    break
            else:
                popc.append(ind1)
        return popc

    popcopy = cluster(pop)
    # nga(pop, toolbox, cxpb=0.8, mutpb=0.4, ngen=2, verbose=False)

    # 查看最优个体
    # bestind = tools.selBest(pop, 1)[0]
    # print('\nindividual:')
    # print('\n'.join(''.join('*' if a == 1 else ' ' for a in row) for row in bestind))
    # print('fitness:%.4f'%nga.evaluate(bestind))

    root = tk.Tk()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐