基于遗传算法的函数极值求取_遗传算法计算二元函数最大值

基于遗传算法的函数极值求取_遗传算法计算二元函数最大值前面在《遗传算法通识》中介绍了基本原理,这里结合实例,看看遗传算法是怎样解决实际问题的。有一个函数:f(x)=x+10sin5x+7cos4xf(x)=x+10\sin5x+7\cos4x求其在区间[-10,10]之间的最大值。下面是该函数的图像:在本例中,我们可以把x作为个体的染色体,函数值f(x)作为其适应度值,适应度越大,个体越优秀,最大的适应度就是我们要求的最大值。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

前面在《遗传算法通识》中介绍了基本原理,这里结合实例,看看遗传算法是怎样解决实际问题的。

有一个函数:

f(x)=x+10sin5x+7cos4x

求其在区间[-10,10]之间的最大值。下面是该函数的图像:
这里写图片描述

在本例中,我们可以把x作为个体的染色体,函数值f(x)作为其适应度值,适应度越大,个体越优秀,最大的适应度就是我们要求的最大值。
直接看代码吧(直接看注释就能看懂)。

# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt

# 适应度函数
def fitness(x):
    return x + 10 * np.sin(5 * x) + 7 * np.cos(4 * x)

# 个体类
class indivdual:
    def __init__(self):
        self.x = 0  # 染色体编码
        self.fitness = 0  # 适应度值

    def __eq__(self, other):
        self.x = other.x
        self.fitness = other.fitness


# 初始化种群
def initPopulation(pop, N):
    for i in range(N):
        ind = indivdual()
        ind.x = np.random.uniform(-10, 10)
        ind.fitness = fitness(ind.x)
        pop.append(ind)

# 选择过程
def selection(N):
    # 种群中随机选择2个个体进行变异(这里没有用轮盘赌,直接用的随机选择)
    return np.random.choice(N, 2)

# 结合/交叉过程
def crossover(parent1, parent2):
    child1, child2 = indivdual(), indivdual()
    child1.x = 0.9 * parent1.x + 0.1 * parent2.x
    child2.x = 0.1 * parent1.x + 0.9 * parent2.x
    child1.fitness = fitness(child1.x)
    child2.fitness = fitness(child2.x)
    return child1, child2


# 变异过程
def mutation(pop):
    # 种群中随机选择一个进行变异
    ind = np.random.choice(pop)
    # 用随机赋值的方式进行变异
    ind.x = np.random.uniform(-10, 10)
    ind.fitness = fitness(ind.x)

# 最终执行
def implement():
    # 种群中个体数量
    N = 20
    # 种群
    POP = []
    # 迭代次数
    iter_N = 500
    # 初始化种群
    initPopulation(POP, N)

# 进化过程
    for it in range(iter_N):
        a, b = selection(N)
        if np.random.random() < 0.75:  # 以0.75的概率进行交叉结合
            child1, child2 = crossover(POP[a], POP[b])
            new = sorted([POP[a], POP[b], child1, child2], key=lambda ind: ind.fitness, reverse=True)
            POP[a], POP[b] = new[0], new[1]

        if np.random.random() < 0.1:  # 以0.1的概率进行变异
            mutation(POP)

        POP.sort(key=lambda ind: ind.fitness, reverse=True)

    return POP


pop = implement()

某一次执行中生成的种群结果:
x= 7.856668536350623 f(x)= 24.8553618344
x= 7.856617137410436 f(x)= 24.8553599496
x= 7.855882244973719 f(x)= 24.855228419
x= 7.858162713580771 f(x)= 24.8549986778
x= 7.854666292636083 f(x)= 24.8545814476
x= 7.8546151621339035 f(x)= 24.8545425164
x= 7.854257103484315 f(x)= 24.8542433686
x= 7.8540369711896485 f(x)= 24.8540364169
x= 7.859755006757047 f(x)= 24.8537223172
x= 7.853295380711855 f(x)= 24.85321014
x= 7.853150338317231 f(x)= 24.853025258
x= 7.865253897257472 f(x)= 24.8422607373
x= 7.865398960184752 f(x)= 24.8418103374
x= 7.83788118828644 f(x)= 24.7909840929
x= 1.6190862308608494 f(x)= 18.1988285173
x= 1.6338610617810327 f(x)= 17.9192791105
x= 2.9228585632615074 f(x)= 16.2933631636
x= 2.95557040313432 f(x)= 16.1223714647
x= -1.2700947285555912 f(x)= 0.575714213108
x= -9.208677771536376 f(x)= -13.4869432732

得到的最优解结果为:
x= 7.856668536350623 f(x)= 24.8553618344
从图像上看符合要求。其结果图像如下,红色点表示种群中个体的位置。

# 绘图代码
def func(x):
    return x + 10 * np.sin(5 * x) + 7 * np.cos(4 * x)
x = np.linspace(-10, 10, 10000)
y = func(x)
scatter_x = np.array([ind.x for ind in pop])
scatter_y = np.array([ind.fitness for ind in pop])
plt.plot(x, y)
plt.scatter(scatter_x, scatter_y, c='r')
plt.show()

这里写图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/194361.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • HTML的表单元�

    HTML的表单元�

    2021年12月7日
    37
  • Flashfxpv.3.5.4注册码

    Flashfxpv.3.5.4注册码在安装好任意版本的Flashfxp之后,只要在注册栏中,全盘粘贴一下文字就可以了^_^——–FlashFXPRegistrationDataSTART——–FLASHFXPwQAOlhkgwQAAAAC6W5MNJwTnsl73nIraAU149tnCQS0hmZU3GGBQG1FtoSp5x0mUgA7bFW0qr0fKk2KCA+v2CCrFbF+q

    2022年7月26日
    16
  • 最权威的成都Java培训机构排名榜单公布啦,学Java必看[通俗易懂]

    最权威的成都Java培训机构排名榜单公布啦,学Java必看[通俗易懂]目前,市面上的Java培训机构已经是多到数不胜数,但量大并不代表优质,鱼龙混杂的现象普遍存在。对于怎样选择靠谱的成都Java培训机构,大家心里几乎是没有什么概念可言的。其中,不乏有跟风的同学。这种情况下做出的选择是非常盲目的,并且效果也不会太好。我们在选择时既要对培训机构进行详细的咨询和了解,又要掌握培训班内的学习状态,最后选择适合自己的。那么截止到现在,综合了成都Java培训机构的教学环境、教学形式、师资力量、口碑、规模等等,得出了成都Java培训机构排名榜单,注:仅供参考。1.成都动力.

    2022年7月8日
    45
  • java-计算器模板及源码

    java-计算器模板及源码java-计算器模板及源码计算器实现了大部分基础功能:基本运算,菜单栏选项,并且拓展了普通型和科学兴选项等等,读者可以在此基础上进行修改和拓展。其他具体实现方法可以看源码,里面有详细的概述,代码框架清晰。读者在阅读和引用过程中,如有问题欢迎评论区留言和私信交流。运行环境:win10EclipseIDEforJavaDevelopers-2020-06下面是计算器的视图:importjava.awt.*;importjava.awt.event.ActionEvent;im

    2022年7月19日
    11
  • 大疆网上测评题库_大疆校招笔试实录

    大疆网上测评题库_大疆校招笔试实录大疆笔试的体验很好,没有很为难应聘者,还有着自己鲜明的特点,我认为值得一说,特此写笔经记录一下,顺便攒攒RP,第一次笔经就献给大疆啦~笔试网站是大疆自己搭建的(UI设计炒鸡好看!!!),我猜题目也是大疆HR团队自己出的。从这点来看,大疆对人才的把控很严格,必须是自己经手选出来的人。整套笔试题目共有90道题,给了1.5个小时完成,题型包括态度行为题、行业知识题、工作情景题,以及略有升级的行测题。其中…

    2022年6月15日
    260
  • java调用HTTP接口(Get请求和Post请求)

    java调用HTTP接口(Get请求和Post请求)前提:一个Http接口:http://172.83.38.209:7001/NSRTRegistration/test/add.do?id=8888888&name=99999999id和name是传入的参数浏览器访问接口:java代码调用Http接口代码如下(代码中注释分为两部分:处理get请求和post请求):packagecom.inspur.OKHTTP…

    2022年5月24日
    814

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号