• 遗传算法求函数最大值
千次阅读
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]

## 主程序

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实现
• 遗传算法求函数极值算是遗传算法的一种最简单的应用，这里就介绍一种简单的，全文基本翻译自codeproject的一篇文章，作者为Luay Al-wesi，软件工程师。例子中的函数为y = -x2+ 5 ，大家可以将其改为其他复杂一些的...
• 遗传算法(Genetic Algorithm, GA) 顾名思义是模仿生物的遗传学机理进行计算模拟最优解的过程。 将生物种群特征与问题进行对应 一个染色体代表问题的一个解（一个染色体含有多个基因） 一个基因代表问题的一个决策...

## 基本思想

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

## 算法流程

### 1. 初始化

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

### 2. 评估个体适应度

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

### 3. 进行自然选择

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

选定一个交配概率pc

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

### 5. 进行变异

• 随机产生变异点
• 根据变异概率阈值pm使原有基因突变

### 终止条件

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

## 目标问题

emmm，是在csdn的必问上看到一个问题，要求寻找目标函数的全局最小值

就打算拿这个试一下

## 算法实现

### 初始化

首先初始化种群，如果是n维输入的话，每个染色体上都应该有n个基因，分别代表 x 1 . . . . . x n x_1.....x_n
这个时候需要先考虑一些如何进行二进制编码。
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'
对应区间内的实数：
x = − 32.77 + x ′ 65.54 2 13 − 1 x = - 32.77 + x'\frac{65.54}{2^{13}-1}
那么有还原的函数

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}
直接使用我们的目标函数，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） 1.可视化函数(用pyecharts) （pyecharts是 国人开发的数据可视化神库！！！） 2.函数的最大值（用遗传算法） 1: 可视化函数 没有安装pyecharts的先打开命令行输入下列命令： ...

# 用遗传算法求函数最大值（python）

### 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

函数图

适应值图

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

...