精华内容
下载资源
问答
  • 遗传算法求函数最大值
    千次阅读
    2019-07-11 20:19:38

    遗传算法求函数最大值

    目标函数

    f ( x ) = 11 s i n ( 6 x ) + 7 c o s ( 5 x ) , x ∈ [ − π , π ] f(x) = 11sin(6x)+7cos(5x), x\in[-\pi,\pi] f(x)=11sin(6x)+7cos(5x),x[π,π]

    主程序

    clc,clear,close all
    
    lb = -1;
    ub = 2;
    f = @(x) 11 * sin(6*x) + 7 * cos(5*x);
    
    popsize = 20;
    chromlength = 16;
    
    pc = 0.7;
    pm = 0.02;
    generation = 20;
    
    pop = initpop(popsize,chromlength);
    
    fplot(f,[lb,ub])
    hold on
    BestIndividual = zeros(generation,1);
    BestFitness = zeros(generation,1);
    for i = 1:generation
        [~,phenotype] = gene2pheno(pop,f,lb,ub,chromlength);
        fitvalue = fitness(phenotype,popsize);
        pop = select(pop,fitvalue);
        pop = crossover(pop,pc);
        pop = mutate(pop,pm);
        [BestIndividual(i),BestFitness(i)] = FindBest(pop,f,lb,ub,chromlength);
        disp(['第',num2str(i),'代'])
        disp(['最大值点:',num2str(BestIndividual(i))])
        disp(['最大值:',num2str(BestFitness(i))])
        plot(BestIndividual(i),BestFitness(i),'r*')
    
    end
    

    matlab自带遗传算法工具箱调用及结果比较

    f2 = @(x) -f(x) ;   
    [x,fval] = ga(f2,1,[],[],[],[],lb,ub) %matlab自带遗传算法工具箱
    plot(x,-fval,'gd')
    

    相关函数

    初始化种群

    function pop = initpop(popsize, chromlength)
    	pop = round(rand(popsize,chromlength));
    end
    

    逆转录(2进制到目标函数值)

    逆转录基因

    function pop2 = decodebinary(pop)
    	py = size(pop,2);
    	pop1 = pop*2.^(0:(py-1))';
    	pop2 = sum(pop1,2);
    end
    

    逆转录染色体

    function pop2 = decodechrom(pop,spoint,genelength)
    	pop1 = pop(:,spoint:spoint + genelength - 1);
    	pop2 = decodebinary(pop1);
    end
    

    计算基因型和表现型(10进制函数自变量及函数值)

    function [genetype,phenotype] = gene2pheno(pop,f,lb,ub,chromlength)
    	temp1 = decodechrom(pop,1,chromlength);
    	genetype = lb + (ub-lb)/(2^chromlength-1) *temp1;
    	phenotype = f(genetype);
    end
    

    计算适应度

    function fitvalue = fitness(phenotype)
    	Cmin = 0;
    	fitvalue = phenotype + Cmin;
    	fitvalue(fitvalue < 0) = 0;
    end
    

    种群变化

    复制

    function newpop = select(pop,fitvalue)
    	fitvalue = cumsum(fitvalue/sum(fitvalue));
    	px = size(pop,1);
    	
    	newpop = pop;
    	
    	SelectRate = sort(rand(px,1));
    	
    	FitIdx = 1;
    	NewIdx = 1;
    	
    	while NewIdx <= px
    	    if SelectRate(NewIdx) < fitvalue(FitIdx)
    	        newpop(NewIdx,:) = pop(FitIdx,:);
    	        NewIdx = NewIdx + 1;
    	    else
    	        FitIdx = FitIdx + 1;
    	    end
    	end
    end
    

    交叉

    function newpop = crossover(pop,pc)
    	[px,py] = size(pop);
    	newpop = pop;
    	for i = 1:2:px-1
    	    if rand < pc
    	        cpoint = ceil(rand * py);
    	        newpop(i,cpoint+1:end) = pop(i+1,cpoint+1:end);
    	        newpop(i+1,cpoint+1:end) = pop(1,cpoint+1:end);
    	    end
    	end
    end
    

    变异

    function newpop = mutate(pop,pm)
    	[px,py] = size(pop);
    	newpop = pop;
    	for i = 1:px
    	    if(rand < pm)
    	        mpoint = ceil(rand * py);
    	        newpop(i,mpoint) = ~pop(i,mpoint);
    	    end
    	end
    end
    

    求种群最适个体

    function [BestIndividual,BestFitness] = FindBest(pop,f,lb,ub,chromlength)
    	[genetype,phenotype] = gene2pheno(pop,f,lb,ub,chromlength);
    	[BestFitness, BestIdx] = max(phenotype);
    	BestIndividual = genetype(BestIdx);
    end
    
    
    更多相关内容
  • python遗传算法求解函数极值问题
  • 通过遗传算法求函数极值,包含其原理、代码、以及示例图片注:需要相应的算法库
  • python遗传算法求函数极值
  • 利用遗传算法求多元函数最大值的matlab算法
  • """遗传算法实现求函数极大—Zjh""" import numpy as np import random import matplotlib.pyplot as plt class Ga(): """出二进制编码的长度""" def __init__(self): self.boundsbegin = -2 self.boundsend...
  • 用C++实现的遗传算法求函数最大值,可运行
  • 遗传算法以一种群体中的所有个体为对象,并利用随机化...参数编码、初始群体的设定、适应度函数的设计、遗传操作设计、控制参数设定五个要素组成了遗传算法的核心内容,此程序利用Python实现遗传算法求函数最值问题。
  • 遗传算法(Genetic Algorithms,GA)是一种基于自然选择和自然遗传机制的搜索算法,它是一种有效的解决最优化问题的方法,属于一种进化算法。本实验要求采用简单遗传算法求解如下一元函数最大值
  • 通过遗传算法求解函数最大值,matlab程序实现
  • 该资源主要是对于人工智能当中一个经典课题--遗传算法求解函数最大值,其中包含对于该算法的C#代码实例,并且可以直接在visual studio运行,有需要的欢迎下载!!
  • 通过采用遗传算法实现函数全局最优的极值计算。采用matlab语言编写完成,可以直接运行,包含图形的绘制
  • 利用遗传算法求解函数最大值,多次运行代码会发现遗传算法的局部寻优特点。
  • java语言遗传算法求函数最大值
  • Python遗传算法求一元函数最大值前言代码后记参考文献 前言 最近接触遗传算法,参考了众多例子,有些又不尽然对,所以自己边理解边修改,然后写出了下面这堆传说中的屎山。。。 PS1:遗传算法原理啥的太多了,就不...
  • 遗传算法求函数最值.的matlab实现
  • 简单遗传算法求函数极值C代码

    热门讨论 2011-02-27 17:35:25
    遗传算法求函数极值算是遗传算法的一种最简单的应用,这里就介绍一种简单的,全文基本翻译自codeproject的一篇文章,作者为Luay Al-wesi,软件工程师。例子中的函数为y = -x2+ 5 ,大家可以将其改为其他复杂一些的...
  • python简易实现遗传算法求函数极值

    千次阅读 2020-06-14 22:12:30
    遗传算法(Genetic Algorithm, GA) 顾名思义是模仿生物的遗传学机理进行计算模拟最优解的过程。 将生物种群特征与问题进行对应 一个染色体代表问题的一个解(一个染色体含有多个基因) 一个基因代表问题的一个决策...

    基本思想

    遗传算法(Genetic Algorithm, GA)
    顾名思义是模仿生物的遗传学机理进行计算模拟最优解的过程。
    将生物种群特征与问题进行对应
    一个染色体代表问题的一个解(一个染色体含有多个基因)
    一个基因代表问题的一个决策变量
    多个个体构成一个种群,多组解构成解的种群。
    我们使问题解的种群不断的优胜劣汰,像自然界的自然选择一般,直到最后剩下一个获胜的最优解,便结束了问题的求解。

    算法流程

    1. 初始化

    随机生成一个种群。其中基因需要编码。
    常用的编码方式有二进制编码法,浮点编码法,符号编码法。
    今天先来做个二进制编码法,其解码、编码、交叉、变异等操作简单易行,但是由于随机性,局部搜索能力较差。
    “与人类的染色体不同,我们假设只有“0”和“1”两种碱基,因此只需要将我们的决策变量进行二进制编码即可获得基因序列。”

    2. 评估个体适应度

    可以直接用函数值作为适应度,我们要找最小值嘛。

    3. 进行自然选择

    • 计算出适应度综合 Σ f i \Sigma f_i Σfi
    • 计算出相对适应度大小 f i / Σ f i f_i/\Sigma f_i fi/Σfi
    • 产生随机出,确定各个个体被选中的次数

    4. 进行组合交叉

    选定一个交配概率pc

    • 群体随机配对
    • 随机设定交叉点
    • 互换染色体部分基因

    5. 进行变异

    • 随机产生变异点
    • 根据变异概率阈值pm使原有基因突变
      在这里插入图片描述

    终止条件

    可以设置若干迭代次数作为终止条件。

    目标问题

    emmm,是在csdn的必问上看到一个问题,要求寻找目标函数的全局最小值
    在这里插入图片描述
    就打算拿这个试一下

    算法实现

    初始化

    首先初始化种群,如果是n维输入的话,每个染色体上都应该有n个基因,分别代表 x 1 . . . . . x n x_1.....x_n x1.....xn
    这个时候需要先考虑一些如何进行二进制编码。
    x的范围是-32.77到32.77,我选用13位二进制数来编码。

    将一个二进制串代表的二进制数转化为十进制数:
    ( b 0 . . . . . . b n ) = ( Σ i = 0 n b i 2 i ) = x ′ (b_0......b_n)=(\Sigma^n_{i=0}b_i2^i)=x' (b0......bn)=(Σi=0nbi2i)=x
    对应区间内的实数:
    x = − 32.77 + x ′ 65.54 2 13 − 1 x = - 32.77 + x'\frac{65.54}{2^{13}-1} x=32.77+x213165.54
    那么有还原的函数

    def translation(L):#将二进制编码还原为变量
        n = 0
        for i in range(13):
            n += L[i]*pow(2,i)
        
        return -32.77 + n * (65.54/k)
    

    适应度函数与自然选择

    这里用比较简单的选择方法,每个个体被选中的概率都是自身的适应度除以总适应度的和。
    α i = F i Σ F \alpha_i = \frac{F_i}{\Sigma F} αi=ΣFFi
    直接使用我们的目标函数,emmm好像不太成,这样的话越小的值适应度越小了,理论上应该是适应度越大才对。

    def f(x):#目标函数
        n = len(x)
        return -20*np.exp(-0.2*np.sqrt(1/n*sum(np.power(x,2))))\
            -np.exp(1/n*sum(np.cos(2*pi*x))) + 20
    

    不过那也好说,我们可以找出来所有个体的最大值,然后用这个值减去各个个体的函数值作为其适应度,这样最大的一个的适应度就是0,自然死亡。

    def fitness(popular):
        fit = [0] * len(popular)
        n = len(popular[0])//13 #数据维度
        maxfit = -1e5
        for i in range(popular):
            x = []
            for j in range(n):
                x.append(translation(i[j:j+13]))
            fit[i] = f(np.array(x))
            if fit[i] > maxfit:
                maxfit = fit[i]
        for i in range(len(fit)):
            fit[i] = maxfit - fit[i]
        return fit
    

    接下来就是轮盘赌了,计算出所有的适应度然后根据概率判断新的种群中的个体

    
    def choose(popular):#进行自然选择
        popular_len = len(popular)#个体个数
        survival_rate = []
        for i in range(popular_len):
            survival_rate.append(random.random())
        
        fit = fitness(popular)#每个个体的存活率
        best_individual = popular[fit.index(max(fit))]#保存下当前种群最优个体(其实写这里不太会)
        survival_rate.sort()
        fitin = 0
        newin = 0
        newpopular = popular
    
        # 开始轮盘赌
        # 结束之后,适应度更高的个体在新种群中应该更多
        while newin < popular_len:
            if survival_rate[newin] < fit[fitin]:
                newpopular[newin] = popular[fitin]
                newin += 1#旋转轮盘
            else:
                fitin += 1#旋转轮盘
        popular = newpopular
        return best_individual
    

    交叉

    取交叉率pc=0.5

    def crossover(popular,pc):#pc为交叉率
        popular_len=len(popular)
    
        for i in range(popular_len-1):
            crosspoint = random.randint(0,len(popular[0]))#随机生成交叉点
            # 一个个体染色体长度为len(popular[0]),crosspoint为交换位置
            #接下来我们让第i个个体和第i+1个个体发生交叉
            t1 =[]
            t2= []
            t1.extend(popular[i][0:crosspoint])#i的前半段
            t1.extend(popular[i+1][crosspoint:-1])#i+1的后半段
            t2.extend(popular[i+1][0:crosspoint])#i+1的前半段
            t2.extend(popular[i][crosspoint:-1])#i的后半段
            # 放回种群
            popular[i] = t1 
            popular[i+1] = t2
    

    变异

    取变异率0.01吧

    def mutation(popular,pm):#pm为变异率
        popular_len=len(popular)
        chromosome_len = len(popular[0])
        for i in range(popular_len):
            if random.random()>pm:#大于阈值则发生变异
                mutation_point = random.randint(0,chromosome_len-1)
                #发生变异
                if popular[i][mutation_point] == 1:
                    popular[i][mutation_point] = 0
                else:
                    popular[i][mutation_point] = 1

    最后连起来实现迭代

    def GA(n):
        ## 初始化种群
        popular_size = 100#种群大小
        chromosome_length = n*13#染色体大小
        popular = []
        for i in range(popular_size):
            individual = []
            for j in range(chromosome_length):#生成随机基因
                individual.append(random.randint(0,1))
            popular.append(individual)#向种群添加一个个体
        # 种群初始化完成
        best_individual = []
        for i in range(200):#迭代200次
            best_individual.append( choose(popular) ) #保存下最优个体
            crossover(popular,0.5)
            mutation(popular,0.01)
        solutions = []#解的迭代过程
        for i in best_individual:
            s = []
            for j in range(n):
               s.append(translation( i[13*j:13*j+13] ))
            #还原为了十进制数   
            solutions.append(s)
        return solutions#保存的是各次迭代发现的最优解,最后一个是结果
    
    

    代码

    python代码

    展开全文
  • 遗传算法求函数最大值(python)

    千次阅读 2021-11-14 10:37:19
    遗传算法求函数最大值(python) 1.可视化函数(用pyecharts) (pyecharts是 国人开发的数据可视化神库!!!) 2.函数的最大值(用遗传算法) 1: 可视化函数 没有安装pyecharts的先打开命令行输入下列命令: ...

    用遗传算法求函数最大值(python)

    step1.可视化函数(pyecharts)

    step2.求函数的最大值(遗传算法)

    在这里插入图片描述

    1: 可视化函数

    没有安装pyecharts的先打开命令行输入下列命令:

    pip install pyecharts
    

    把官方文档https://pyecharts.org里的demo拿来修改一下即可:
    实际上需要我们编写的只有create_data()这个函数!
    在这里插入图片描述

    代码如下:

    import numpy as
    展开全文
  • 主程序主程序如下:clearclcpopsize = 30; % 种群规模chromlength = 10; % 染色体长度pc = 0.5; % 交叉概率pm = 0.05; % 变异概率maxgen = 20; % 最大迭代数lx = 5; ux ...

    主程序

    主程序如下:

    clear

    clc

    popsize = 30; % 种群规模

    chromlength = 10; % 染色体长度

    pc = 0.5; % 交叉概率

    pm = 0.05; % 变异概率

    maxgen = 20; % 最大迭代数

    lx = 5; ux = 10;

    bestfit = zeros(1, maxgen);

    bestobjvalue = zeros(2, maxgen);

    % 优化

    pop = initpop(popsize, chromlength);

    objvalue = calobjvalue(pop, lx, ux);

    fitvalue = calfitvalue(objvalue,'max');

    for i = 1:maxgen

    pop = selection(pop, fitvalue); % 选择

    pop = crossover(pop, pc); % 交叉

    pop = mutation(pop, pm); % 变异

    objvalue = calobjvalue(pop, lx, ux);

    fitvalue = calfitvalue(objvalue, 'max');

    bestindex = bestindividual(pop, fitvalue, 'max');

    x = calx(pop, lx, ux);

    bestfit(1, i) = fitvalue(bestindex);

    bestobjvalue(1, i) = x(bestindex);

    bestobjvalue(2, i) = objvalue(bestindex);

    % fprintf('bestX: %f, bestY: %f\n', bestobjvalue(1, i), bestobjvalue(2, i));

    end

    figure(1);

    fplot(@(x) 9 .* sin(5 .* x) + 8 .* cos(4 .* x), [lx, ux]);

    hold on;

    plot(bestobjvalue(1,:), bestobjvalue(2,:),'bo');

    xlabel('x');

    ylabel('y=9sin(5x)+8cos(4x)');

    title('函数图');

    grid on;

    hold off;

    figure(2);

    plot(1:maxgen, bestfit(1,:));

    xlabel('进化代数');

    ylabel('最优适应度值');

    title('最优适应度值图');

    grid on;

    bestX = bestobjvalue(1, end);

    bestY = bestobjvalue(2, end);

    fprintf('bestX: %f, bestY: %f\n', bestX, bestY);

    执行结果

    执行结果:bestX: 7.859238, bestY: 16.995125

    5c0384d0c87b

    函数图

    5c0384d0c87b

    适应值图

    展开全文
  • 遗传算法求解函数 F(x1 x2)=100(x1^2-x2^2+(1-x1^2; 的最大值 (MATLAB) %Generic Algorithm for function f(x1,x2) optimum 最大值 clear all; close all; %Parameters Size=80; G=100; CodeL=10; umax=2.048; umin=...
  • 简单的遗传算法求函数最大值,VS2013编程,C++语言,可供参考
  • 这个代码是在三元函数求极值上的代码上改写的,如果你看了我遗传算法求三元函数的代码,你就不用下了,代码大部分不变,改的不多,你基本自己就能改出来了。
  • 运用遗传算法求解图中函数最大值(约为38.8503…) 解决步骤: 1.确定编码方案——二进制编码,长度33位。 2.初始化种群:使用计算机在0~1之间产生随机数K,并按照数K的 值初始化基因位: 0≤K,基因为置为1,...
  • 用标准遗传算法求函数最大值

    千次阅读 2021-09-16 17:31:13
    题:用标准遗传算法求函数f(x)=x+10sin(5x)+7cos(4x)的最大值,其中x的取值范围为[0,10].只是一个有多个局部极值函数 仿真过程: (1)初始化种群数目NP=50,染色体二进制编码长度L=20,最大进化代数G=100,交叉...
  • 今天小编就为大家分享一篇Python实现遗传算法(二进制编码)求函数最优方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 遗传算法求函数极值.doc

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,046
精华内容 5,618
关键字:

遗传算法求函数最大值