遗传算法求函数极值

遗传算法求函数极值
遗传算法求函数极值

智能优化算法第一次作业

--------------遗传算法洪文杰S151000853 问题:用遗传算法求解f(x)=xsin(10π*x)+2.0的最大值,x取[-1,2].

一、分析:遗传算法基本思路

二、实例简介

1. 产生初始种群

s1= 13 (01101)

s2= 24 (11000)

s3= 8 (01000)

s4= 19 (10011)

2. 计算适应度

假定适应度为f(s)=s^2 ,则

f (s1) = f(13) = 13^2 = 169 f (s2) = f(24) = 24^2 = 576 f (s3) = f(8) = 8^2 = 64

f (s4) = f(19) = 19^2 = 361

3. 选择

染色体的选择概率为:

染色体的累计概率为:

根据上面的式子,可得到:

例如设从区间[0, 1]中产生4个随机数: r1 = 0.450126, r2 = 0.110347 r3 = 0.572496, r4 = 0.98503

4. 交叉

基本遗传算法(SGA)中交叉算子采用单点交叉算子。单点交叉运算

5. 变异

6. 至下一代,适应度计算→选择→交叉→变异,直至满足终止条件

三、解决问题

四、实验结果

源代码:

/*问题:用遗传算法求解f(x)=xsin(10π*x)+2.0的最大值,x取[-1,2].*/ /*洪文杰2016-3-9. 智能优化算法第一次作业*/

#include

//#includ

#include

#include

#include

#include

using namespace std;

#define NUMBER 50//种群规模

#define GENE_NUMBER 10000//迭代次数

int Unit[NUMBER][30];//初始种群

int Unit_choose[NUMBER][30];//选择、交叉、变异后的种群

int Number[NUMBER];//被选择的个体编号

float Fitness[NUMBER];//适应度

float select_probability[NUMBER];//选择概率

float accumula_probability[NUMBER] ;//积累概率

float f_max=0.0;//最大值

float f_x=0.0;//最大值对应的自变量

int hwj_coding(int start,int end);//编码

void hwj_initial_population(int num);//产生初始种群

void hwj_fitness(int num);//适应度计算

void hwj_choose();//选择个体

int hwj_binary_search(int l, int r,float temp);//查找选择

//void hwj_N_M(int a[],int b[],int N, int M);//从M个数中选N个不一样的数void hwj_cross(int num,float cross);//交叉后的得到种群

void hwj_aberrance(int num,float aberrance);//变异后的得到的种群

void hwj_max(int num);//找到最适应的个体

int main(){

int strat,end;//区间

int Num;//编码大小

float cross=0.8;//交叉概率

float aberrance = 0.04;//变异概率

int key=1;

cout<<"请输入求解区间:"<

cin>>strat>>end;

Num=hwj_coding(strat,end);

cout<<"Num:"<

// cout<<"--------------------------1-----------------"<

hwj_initial_population(Num);

// cout<<"--------------------------2初始种群-----------------"<

for(int j=0;j

cout<

}

cout<

}

*/

while(key!=GENE_NUMBER){

hwj_fitness(Num);

// cout<<"--------------------------3适应度-----------------"<

// for(int i=0;i

// cout<

// }

hwj_choose();

// cout<<"--------------------------4被选择的个体-----------------"<

for(int j=0;j

cout<

}

cout<

}

*/

hwj_cross(Num,cross);

/* cout<<"--------------------------5交叉后的种群-----------------"<

for(int i=0;i

for(int j=0;j

cout<

}

cout<

}

*/

hwj_aberrance(Num,aberrance);

/* cout<<"--------------------------6变异后的种群-----------------"<

for(int i=0;i

for(int j=0;j

cout<

}

cout<

}

*/

key++;

hwj_max(Num);

}

cout<<"最大值是对应的x值是:"<

cout<

cout<<"最大值为:"<

return 0;

}

int hwj_coding(int start,int end){//种群编码

float precision;

int temp=2;

int sum;

int N=1;

cout<<"请输入精度范围:"<

cin>>precision;

if(precision==0){

cout<<"对不起精度不能为零:"<

return 0;

}

else{

sum=(end-start)/precision;

cout<<"sum:"<

while(temp

temp*=2;

N++;

}

return N;

}

}

void hwj_initial_population(int num){//生成初始种群srand(time(NULL));

for(int i=0;i

for(int j=0;j

Unit[i][j]=rand()%2;

}

}

}

void hwj_fitness(int num){//计算适应度

float sum;

int temp;

for(int i=0;i

temp=1;

sum=0.0;

for(int j=num-1;j>=0;j--){

sum+=Unit[i][j]*temp;

temp*=2.0;

}

Fitness[i]=sum*3/(temp-1.0)-1.0;

// cout<

// cout<<"--------------+++++";

Fitness[i]=Fitness[i]*sin(10*3.1415926*Fitness[i])+2.0;

// cout<

}

}

int hwj_binary_search(int l,int r,float temp){

for(int i=0;i

if(temp<=accumula_probability[i]&&temp>accumula_probability[i-1]){

return i;

}

}

return -1;

}

void hwj_choose(){//选择个体

float sum=0.0;

float temp;

int i;

for(i=0;i

sum+=Fitness[i];

}

select_probability[0]=Fitness[0]/sum;

temp=accumula_probability[0]=select_probability[0];

for(i=1;i

select_probability[i]=Fitness[i]/sum;

temp+=select_probability[i];

accumula_probability[i]=temp;

// cout<

}

for(i=0;i

// srand(time(NULL));

temp=(rand()%1000000)/1000000.0;

// cout<

Number[i]=hwj_binary_search(0,NUMBER,temp);

// cout<

for(int j=0;j

Unit_choose[i][j]=Unit[Number[i]][j];

}

}

}

/*void hwj_N_M(int a[],int b[],int N,int M){//从M个数中选N个不一样的数int i=1;

srand(time(NULL));

a[0]=rand()%M;

b[a[0]]=1;

while(i!=N){

a[i]=rand()%M;

if(b[a[i]]==0){

i++;

b[a[i]]=1;

cout<

}

}

// cout<

}*/

void hwj_cross(int num,float cross){//交叉后的得到种群int num_cross=NUMBER*cross;

int k;//交叉点

int i , j;

if(num_cross%2!=0){

num_cross=num_cross+1;

}//需要交叉的个体数

int cro[NUMBER];//被交叉的个体编号

int temp[NUMBER];//是否交叉数组一览

for(i=0;i

cro[i]=-1;

temp[i]=0;

}

// hwj_N_M(cro,temp,num_cross,NUMBER);

srand(time(NULL));

cro[0]=rand()%NUMBER;

temp[cro[0]]=1;

i=1;

while(i!=num_cross){

cro[i]=rand()%NUMBER;

if(temp[cro[i]]==0){

temp[cro[i]]=1;

i++;

}

}

// for(int i=0;i

// cout<

// }

// cout<

for(i=0;i

srand(time(NULL));

k=rand()%num;

for(j=0;j

if(j<=k){

Unit[i][j]=Unit_choose[cro[num_cross-i]][j];

Unit[i+num_cross/2][j]=Unit_choose[cro[i]][j];

}

else{

Unit[i][j]=Unit_choose[cro[i]][j];

Unit[i+num_cross/2][j]=Unit_choose[cro[i]][j];

}

}

}

for(i=0;i

// cout<

if(temp[i]==0){

for(j=0;j

Unit[num_cross][j]=Unit_choose[i][j];

}

num_cross++;

}

}

}

void hwj_aberrance(int num,float aberrance){//变异后的得到的种群int num_aberrance=NUMBER*aberrance;//变异的个体数

int k;//变异点

int abe[NUMBER];//变异的个体编号

int temp[NUMBER];//是否变异数组一览

int i,j,p;

for(i=0;i

abe[i]=-1;

temp[i]=0;

遗传算法用于函数优化

遗传算法用于函数优化求解 一、实验目的 本实验要求在掌握遗传算法的基本思想、原理和算法流程的基础上,能够针对指定的单变量优化目标函数,设计相应的遗传算法优化程序,并求得全局最优解。 二、实验要求 针对目标函数 2 1(1),[0,2]y x x =--∈,设计利用遗传算法进行优化求解的程序,绘制迭代过程中最优解的变化情况,并分别改变算法中的编码位数、种群规模、交叉和变异概率,分析这些变量对算法精度及收敛性的影响。 三、实验步骤 1、初始化种群,确定种群规模M=20,编码位数n=5 和编码机制(二进制编码); 初始化种群:E = round(rand(M,n)); 每个编码对应的二进制数值: (1) 2i i i y y -=?∑ i y 为第i 位二进制代码; 二进制数y 转换为十进制数x : max min min *21n x x x y x -= +-; 2、根据给定的目标函数,计算各个种群的适应度值; 3、采用轮盘选择法对种群进行选择复制; 4、设定交叉概率为0.9,进行遗传操作(交叉); 5、设定变异概率0.05,进行遗传操作(变异); 6、产生下一代种群,与终止条件比较,不满足返回到步骤2直到满足条件退出。 算法的流程如图7.1所示。

N Y 结束 输出结果 迭代次数达上限? 开始 初始化种群(编码) 计算适应度函数 交叉、变异 选择、复制 达到系统指标? 图7.1 算法流程图 四、实验结果及分析 我们采用遗传算法来寻求目标函数的最大值。初始化样本个数为20个,编码位数为5位,采用二进制编码,交叉概率为0.9,变异概率为0.05,最大迭代次数为1000次,初始样本随机选择,当父代与子代间适应度变化小于0.001时,达到系统指标。MATLAB 模拟运行输出迭代种群的平均适应度变化、种群的最优解与最差解,绘出图像(见图1),计算运行时间的平均值(见表1),由表可知,平均运行时间约为0.65秒左右,速度较快。由图可知,前期平均适应度是不断上升的,到达一定程度后即平均适应度在0.9以上后,就基本处于波动平衡状态。

函数极值的几种求法

函数极值的几种求法 ──针对高中生所学知识 摘要:函数是数学教学中一个重要的组成部分,从小学六年级的一元一次方程继而延伸到初中的一次函数,二次函数的初步介绍,再到高中的函数的单调性、周期性、最值、极值,以及指数函数、对数函数、三角函数的学习,这些足以说明函数在数学教学中的地位。极值作为函数的一个重要性质,无论是在历年高考试题中,还是在实际生活运用中都占有不可或缺的地位。本文主要阐述了初高中常见的几种函数,通过函数极值的相关理论给出每种函数极值的求解方法。 关键词:函数;单调性;导数;图像;极值 Abstract: Function is an important part of mathematics teaching. First the learning of linear equation in six grade, secondly the preliminary introduction of linear functions and quadratic functions in junior high school, then the monotonicity, the periodicity, the most value and the extreme value of function, finally the learning of the logarithmic function, exponential function and trigonometric function in high school. These are enough to show the important statue of the function in mathematics teaching. As an important properties of function, extreme value has an indispensable status whether in the calendar year test, or in daily life. This article will mainly expound the methods of solving the extreme value of sever functions in middle school. Key words: function; monotonicity; derivative; image; extreme value “函数”一词最先是由德国的数学家莱布尼茨在17世纪采用的,当时莱布尼茨用“函数”这一词来表示变量x的幂,也就是x的平方x的立方。之后莱布尼茨又将“函数”这一词用来表示曲线上的横坐标、纵坐标、切线的长度、垂线的长度等与曲线上的点有关的变量[]1。就这样“函数”这词逐渐盛行。在中国,清代著名数学家、天文学家、翻译家和教育家,近代科学的先驱者善兰给出的定义是:

遗传算法的c语言程序

一需求分析 1.本程序演示的是用简单遗传算法随机一个种群,然后根据所给的交叉率,变异率,世代数计算最大适应度所在的代数 2.演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的命令;相应的输入数据和运算结果显示在其后。3.测试数据 输入初始变量后用y=100*(x1*x1-x2)*(x1*x2-x2)+(1-x1)*(1-x1)其中-2.048<=x1,x2<=2.048作适应度函数求最大适应度即为函数的最大值 二概要设计 1.程序流程图 2.类型定义 int popsize; //种群大小 int maxgeneration; //最大世代数 double pc; //交叉率 double pm; //变异率 struct individual

{ char chrom[chromlength+1]; double value; double fitness; //适应度 }; int generation; //世代数 int best_index; int worst_index; struct individual bestindividual; //最佳个体 struct individual worstindividual; //最差个体 struct individual currentbest; struct individual population[POPSIZE]; 3.函数声明 void generateinitialpopulation(); void generatenextpopulation(); void evaluatepopulation(); long decodechromosome(char *,int,int); void calculateobjectvalue(); void calculatefitnessvalue(); void findbestandworstindividual(); void performevolution(); void selectoperator(); void crossoveroperator(); void mutationoperator(); void input(); void outputtextreport(); 4.程序的各函数的简单算法说明如下: (1).void generateinitialpopulation ()和void input ()初始化种群和遗传算法参数。 input() 函数输入种群大小,染色体长度,最大世代数,交叉率,变异率等参数。 (2)void calculateobjectvalue();计算适应度函数值。 根据给定的变量用适应度函数计算然后返回适度值。 (3)选择函数selectoperator() 在函数selectoperator()中首先用rand ()函数产生0~1间的选择算子,当适度累计值不为零时,比较各个体所占总的适应度百分比的累计和与选择算子,直到达到选择算子的值那个个体就被选出,即适应度为fi的个体以fi/∑fk的概率继续存在; 显然,个体适应度愈高,被选中的概率愈大。但是,适应度小的个体也有可能被选中,以便增加下一代群体的多样性。 (4)染色体交叉函数crossoveroperator() 这是遗传算法中的最重要的函数之一,它是对个体两个变量所合成的染色体进行交叉,而不是变量染色体的交叉,这要搞清楚。首先用rand ()函数产生随机概率,若小于交叉概率,则进行染色体交叉,同时交叉次数加1。这时又要用rand()函数随机产生一位交叉位,把染色

遗传算法求解实例

yj1.m :简单一元函数优化实例,利用遗传算法计算下面函数的最大值 0.2)*10sin()(+=x x x f π,∈x [-1, 2] 选择二进制编码,种群中个体数目为40,每个种群的长度为20,使用代沟为0.9, 最大遗传代数为25 译码矩阵结构:?????????? ??????? ???? ?=ubin lbin scale code ub lb len FieldD 译码矩阵说明: len – 包含在Chrom 中的每个子串的长度,注意sum(len)=length(Chrom); lb 、ub – 行向量,分别指明每个变量使用的上界和下界; code – 二进制行向量,指明子串是怎样编码的,code(i)=1为标准二进制编码, code(i)=0则为格雷编码; scale – 二进制行向量,指明每个子串是否使用对数或算术刻度,scale(i)=0为算术 刻度,scale(i)=1则为对数刻度; lbin 、ubin – 二进制行向量,指明表示范围中是否包含每个边界,选择lbin=0或 ubin=0,表示从范围中去掉边界;lbin=1或ubin=1则表示范围中包含边界; 注:增加第22行:variable=bs2rv(Chrom, FieldD);否则提示第26行plot(variable(I), Y, 'bo'); 中variable(I)越界 yj2.m :目标函数是De Jong 函数,是一个连续、凸起的单峰函数,它的M 文件objfun1包含在GA 工具箱软件中,De Jong 函数的表达式为: ∑ == n i i x x f 1 2 )(, 512512≤≤-i x 这里n 是定义问题维数的一个值,本例中选取n=20,求解 )(min x f ,程序主要变量: NIND (个体的数量):=40; MAXGEN (最大遗传代数):=500; NV AR (变量维数):=20; PRECI (每个变量使用多少位来表示):=20; GGAP (代沟):=0.9 注:函数objfun1.m 中switch 改为switch1,否则提示出错,因为switch 为matlab 保留字,下同! yj3.m :多元多峰函数的优化实例,Shubert 函数表达式如下,求)(min x f 【shubert.m 】

4遗传算法与函数优化

第四章遗传算法与函数优化 4.1 研究函数优化的必要性: 首先,对很多实际问题进行数学建模后,可将其抽象为一个数值函数的优化问题。由于问题种类的繁多,影响因素的复杂,这些数学函数会呈现出不同的数学特征。除了在函数是连续、可求导、低阶的简单情况下可解析地求出其最优解外,大部分情况下需要通过数值计算的方法来进行近似优化计算。 其次,如何评价一个遗传算法的性能优劣程度一直是一个比较难的问题。这主要是因为现实问题种类繁多,影响因素复杂,若对各种情况都加以考虑进行试算,其计算工作量势必太大。由于纯数值函数优化问题不包含有某一具体应用领域中的专门知识,它们便于不同应用领域中的研究人员能够进行相互理解和相互交流,并且能够较好地反映算法本身所具有的本质特征和实际应用能力。所以人们专门设计了一些具有复杂数学特征的纯数学函数,通过遗传算法对这些函数的优化计算情况来测试各种遗传算法的性能。 4.2 评价遗传算法性能的常用测试函数 在设计用于评价遗传算法性能的测试函数时,必须考虑实际应用问题的数学模型中所可能呈现出的各种数学特性,以及可能遇到的各种情况和影响因素。这里所说的数学特性主要包括: ●连续函数或离散函数; ●凹函数或凸函数; ●二次函数或非二次函数; ●低维函数或高维函数; ●确定性函数或随机性函数; ●单峰值函数或多峰值函数,等等。 下面是一些在评价遗传算法性能时经常用到的测试函数: (1)De Jong函数F1: 这是一个简单的平方和函数,只有一个极小点f1(0, 0, 0)=0。

(2)De Jong 函数F2: 这是一个二维函数,它具有一个全局极小点f 2(1,1) = 0。该函数虽然是单峰值的函数,但它却是病态的,难以进行全局极小化。 (3)De Jong 函数F3: 这是一个不连续函数,对于]0.5,12.5[--∈i x 区域内的每一个点,它都取全局极小值 30),,,,(543213-=x x x x x f 。

基本遗传算法的C源程序。doc【精品毕业设计】(完整版)

/********************************************************** ********/ /* 基于基本遗传算法的函数最优化SGA.C */ /* A Function Optimizer using Simple Genetic Algorithm */ /* developed from the Pascal SGA code presented by David E.Goldberg */ //********************************************************** ********/ #include #include #include #include "graph.c" /* 全局变量*/ struct individual /* 个体*/ { unsigned *chrom; /* 染色体*/ double fitness; /* 个体适应度*/ double varible; /* 个体对应的变量值*/ int xsite; /* 交叉位置*/ int parent[2]; /* 父个体*/ int *utility; /* 特定数据指针变量*/ };

struct bestever /* 最佳个体*/ { unsigned *chrom; /* 最佳个体染色体*/ double fitness; /* 最佳个体适应度*/ double varible; /* 最佳个体对应的变量值*/ int generation; /* 最佳个体生成代*/ }; struct individual *oldpop; /* 当前代种群*/ struct individual *newpop; /* 新一代种群*/ struct bestever bestfit; /* 最佳个体*/ double sumfitness; /* 种群中个体适应度累计*/ double max; /* 种群中个体最大适应度*/ double avg; /* 种群中个体平均适应度*/ double min; /* 种群中个体最小适应度*/ float pcross; /* 交叉概率*/ float pmutation; /* 变异概率*/ int popsize; /* 种群大小*/ int lchrom; /* 染色体长度*/ int chromsize; /* 存储一染色体所需字节数*/ int gen; /* 当前世代数*/ int maxgen; /* 最大世代数*/ int run; /* 当前运行次数*/

遗 传 算 法 详 解 ( 含 M A T L A B 代 码 )

GATBX遗传算法工具箱函数及实例讲解 基本原理: 遗传算法是一种典型的启发式算法,属于非数值算法范畴。它是模拟达尔文的自然选择学说和自然界的生物进化过程的一种计算模型。它是采用简单的编码技术来表示各种复杂的结构,并通过对一组编码表示进行简单的遗传操作和优胜劣汰的自然选择来指导学习和确定搜索的方向。遗传算法的操作对象是一群二进制串(称为染色体、个体),即种群,每一个染色体都对应问题的一个解。从初始种群出发,采用基于适应度函数的选择策略在当前种群中选择个体,使用杂交和变异来产生下一代种群。如此模仿生命的进化进行不断演化,直到满足期望的终止条件。 运算流程: Step 1:对遗传算法的运行参数进行赋值。参数包括种群规模、变量个数、交叉概率、变异概 率以及遗传运算的终止进化代数。 Step 2:建立区域描述器。根据轨道交通与常规公交运营协调模型的求解变量的约束条件,设置变量的取值范围。 Step 3:在Step 2的变量取值范围内,随机产生初始群体,代入适应度函数计算其适应度值。 Step 4:执行比例选择算子进行选择操作。 Step 5:按交叉概率对交叉算子执行交叉操作。

Step 6:按变异概率执行离散变异操作。 Step 7:计算Step 6得到局部最优解中每个个体的适应值,并执行最优个体保存策略。 Step 8:判断是否满足遗传运算的终止进化代数,不满足则返回Step 4,满足则输出运算结果。 运用遗传算法工具箱: 运用基于Matlab的遗传算法工具箱非常方便,遗传算法工具箱里包括了我们需要的各种函数库。目前,基于Matlab的遗传算法工具箱也很多,比较流行的有英国设菲尔德大学开发的遗传算法工具箱GATBX、GAOT以及Math Works公司推出的GADS。实际上,GADS就是大家所看到的Matlab中自带的工具箱。我在网上看到有问为什么遗传算法函数不能调用的问题,其实,主要就是因为用的工具箱不同。因为,有些人用的是GATBX带有的函数,但MATLAB自带的遗传算法工具箱是GADS,GADS当然没有GATBX里的函数,因此运行程序时会报错,当你用MATLAB来编写遗传算法代码时,要根据你所安装的工具箱来编写代码。 以GATBX为例,运用GATBX时,要将GATBX解压到Matlab下的toolbox文件夹里,同时,set path将GATBX文件夹加入到路径当中。 这块内容主要包括两方面工作:1、将模型用程序写出来(.M文件),即目标函数,若目标函数非负,即可直接将目标函数作为适应度函数。2、设置遗传算法的运行参数。包括:种群规模、变量个数、区域描述器、交叉概率、变异概率以及遗传运算的终止进化代数等等。

多元函数的极值及其-求法

第十一讲 二元函数的极值 要求:理解多元函数极值的概念,会用充分条件判定二元函数的极值,会用拉格朗日乘数法求条件极值。 问题提出:在实际问题中,往往会遇到多元函数的最大值,最小值问题,与一元函数相 类似,多元函数的最大值,最小值与极大值,极小值有密切的关系,因此以二元函数为例,来讨论多元函数的极值问题. 一.二元函数的极值 定义 设函数),(y x f z =在点),(00y x 的某个邻域内有定义,对于该邻域内的所有 ),(),(00y x y x ≠,如果总有),(),(00y x f y x f <,则称函数),(y x f z =在点),(00y x 处有极大值;如果总有),(),(00y x f y x f >,则称函数),(y x f z =在点),(00y x 有极小值. 函数的极大值,极小值统称为极值,使函数取得极值的点称为极值点. 例1.函数xy z =在点)0,0(处不取得极值,因为在点)0,0(处的函数值为零,而在点 )0,0(的任一邻域内总有使函数值为正的点,也有使函数值为负的点. 例2.函数2 243y x z +=在点)0,0(处有极小值. 因为对任何),(y x 有0)0,0(),(=>f y x f . 从几何上看,点)0,0,0(是开口朝上的椭圆抛物面2243y x z +=的顶点,曲面在点)0,0,0(处有切平面0=z ,从而得到函数取得极值的必要条件. 定理1(必要条件) 设函数),(y x f z =在点),(00y x 具有偏导数,且在点),(00y x 处有极值,则它在该点的 偏导数必然为零,即0),(00=y x f x ,0),(00=y x f y . 几何解释 若函数),(y x f z =在点),(00y x 取得极值0z ,那么函数所表示的曲面在点) ,,(000z y x 处的切平面方程为 ))(,())(,(0000000y y y x f x x y x f z z y x -+-=- 是平行于xoy 坐标面的平面0z z =. 类似地有三元及三元以上函数的极值概念,对三元函数也有取得极值的必要条件为 0),,(000=z y x f x ,0),,(000=z y x f y ,0),,(000=z y x f z

遗传算法求复杂函数极值问题【精品毕业设计】(完整版)

遗传算法求复杂函数极值问题 中文摘要: 本文首先介绍遗传算法的历史背景,基本思想,对遗传算法的常见的编码解码方法进行了深入的阐述,并对算子选择方法进行深入分析和对比,在此基础上把遗传算法应用于求解复杂函数的极值计算。最后在MATLAB语言环境下编写程序,对求解函数的最大值进行了仿真,并对调试的结果进行了分析,得出了部分结论。 关键词:遗传算法最优解算子选择复杂函数 作者:xx xx 指导老师:xxxx xx

Using Genetic Algorithm to Solve Extreme Problem of Complex Function Abstract Firstly,the historical background and basic idea of genetic algorithm are introduced in this paper. The common coding and decoding method of genetic algorithm are discussed too. Secondly, the selection method of genetic operator is analyzed and compared deeply, based on which genetic algorithm is used to solve extreme problem of complex function. Finally, with MA TLAB software, the program is compiled and the maximum is sought out. At the end of the paper, the debugging result is analyzed and the conclusion is given. Keywords: Genetic Algorithm Optimal Solution Operator Selection Complex Function Written by : xx xx Supervised by: xxxx xx

一个简单实用的遗传算法c程序完整版

一个简单实用的遗传算 法c程序 HEN system office room 【HEN16H-HENS2AHENS8Q8-HENH1688】

一个简单实用的遗传算法c程序(转载) 2009-07-28 23:09:03 阅读418 评论0 字号:大中小 这是一个非常简单的遗传算法源代码,是由Denis Cormier (North Carolina State University)开发的,Sita (University of North Carolina at Charlotte)修正。代码保证尽可能少,实际上也不必查错。对一特定的应用修正此代码,用户只需改变常数的定义并且定义“评价函数”即可。注意代码的设计是求最大值,其中的目标函数只能取正值;且函数值和个体的适应值之间没有区别。该系统使用比率选择、精华模型、单点杂交和均匀变异。如果用Gaussian变异替换均匀变异,可能得到更好的效果。代码没有任何图形,甚至也没有屏幕输出,主要是保证在平台之间的高可移植性。读者可以从,目录 coe/evol中的文件中获得。要求输入的文件应该命名为‘’;系统产生的输出文件为‘’。输入的文件由几行组成:数目对应于变量数。且每一行提供次序——对应于变量的上下界。如第一行为第一个变量提供上下界,第二行为第二个变量提供上下界,等等。 /**************************************************************************/ /* This is a simple genetic algorithm implementation where the */ /* evaluation function takes positive values only and the */ /* fitness of an individual is the same as the value of the */ /* objective function */ /**************************************************************************/ #include <> #include <> #include <> /* Change any of these parameters to match your needs */ #define POPSIZE 50 /* population size */

函数的极值及其求法1

三、导数的应用 函数的极值及其求法 在学习函数的极值之前,我们先来看一例子:设有函数,容易知道点x=1及x=2是此函数单调区间的分界点,又可知在点x=1左侧附近,函数值是单调增加的,在点x=1右侧附近,函数值是单调减小的.因此存在着点x=1的一个邻域,对于这个邻域内,任何点x(x=1除外),<均成立,点x=2也有类似的情况(在此不多说),为什么这些点有这些性质呢? 事实上,这就是我们将要学习的内容——函数的极值, 函数极值的定义设函数在区间(a,b)内有定义,x 0是(a,b)内一点. 若存在着x 0点的一个邻域,对于这个邻域内任何点x(x 0点除外),<均成立,则说是函数的一个极大值; 若存在着x 0点的一个邻域,对于这个邻域内任何点x(x 0点除外),>均成立,则说是函数的一个极小值.函数的极大值与极小值统称为函数的极值,使函数取得极值的点称为极值点。 我们知道了函数极值的定义了,怎样求函数的极值呢? 学习这个问题之前,我们再来学习一个概念——驻点凡是使的x 点,称为函数的驻点。 判断极值点存在的方法有两种:如下 方法一:设函数在x 0点的邻域可导,且. 情况一:若当x 取x 0左侧邻近值时, >0,当x 取x 0右侧邻近值时,<0,则函数在x 0点取极大值。 情况一:若当x 取x 0左侧邻近值时, <0,当x 取x 0右侧邻近值时,>0,则函数在x 0点取极小值。 注:此判定方法也适用于导数在x 0点不存在的情况。 用方法一求极值的一般步骤是:

a):求; b):求的全部的解——驻点; c):判断在驻点两侧的变化规律,即可判断出函数的极值。例题:求极值点 解答:先求导数 再求出驻点:当时,x=-2、1、-4/5 判定函数的极值,如下图所示

遗传算法程序示例

遗传算法程序示例 %% I. 清空环境变量 %optimtool solver 中选择GA %添加gaot工具箱 clear all clc %% II. 绘制函数曲线 x = 0:0.01:9; y = x + 10*sin(5*x)+7*cos(4*x); figure plot(x, y) xlabel('自变量') ylabel('因变量') title('y = x + 10*sin(5*x) + 7*cos(4*x)') grid %% III. 初始化种群 initPop = initializega(50,[0 9],'fitness'); %种群大小;变量变化范围;适应度函数的名称 %看一下initpop 第二列代表适应度函数值 %% IV. 遗传算法优化 [x endPop bpop trace] = ga([0 9],'fitness',[],initPop,[1e-6 1 1],'maxGenTerm',25,... 'normGeomSelect',0.08,'arithXover',2,'nonUnifMutation',[2 25 3]); %变量范围上下界;适应度函数;适应度函数的参数;初始种群;精度和显示方式;终止函数的名称; %终止函数的参数;选择函数的名称;选择函数的参数;交叉函数的名称;交叉函数的参数;变异函数的 %名称;变异函数的参数 % X 最优个体endpop 优化终止的最优种群bpop 最优种群的进化轨迹trace 进化迭代过程中 %最优的适应度函数值和适应度函数值矩阵 %% V. 输出最优解并绘制最优点 x hold on plot (endPop(:,1),endPop(:,2),'ro')

(实例)matlab遗传算法工具箱函数及实例讲解

matlab遗传算法工具箱函数及实例讲解 核心函数: (1)function [pop]=initializega(num,bounds,eevalFN,eevalOps,options)--初始种群的生成函数 【输出参数】 pop--生成的初始种群 【输入参数】 num--种群中的个体数目 bounds--代表变量的上下界的矩阵 eevalFN--适应度函数 eevalOps--传递给适应度函数的参数 options--选择编码形式(浮点编码或是二进制编码)[precision F_or_B], 如 precision--变量进行二进制编码时指定的精度 F_or_B--为1时选择浮点编码,否则为二进制编码,由precision指定精度) (2)function [x,endPop,bPop,traceInfo] = ga(bounds,evalFN,evalOps,startPop,opts,... termFN,termOps,selectFN,selectOps,xOverFNs,xOverO ps,mutFNs,mutOps)--遗传算法函数 【输出参数】 x--求得的最优解 endPop--最终得到的种群 bPop--最优种群的一个搜索轨迹 【输入参数】 bounds--代表变量上下界的矩阵 evalFN--适应度函数 evalOps--传递给适应度函数的参数 startPop-初始种群 opts[epsilon prob_ops display]--opts(1:2)等同于initializega 的options参数,第三个参数控制是否输出,一般为0。如[1e-6 1 0] termFN--终止函数的名称,如['maxGenTerm'] termOps--传递个终止函数的参数,如[100] selectFN--选择函数的名称,如['normGeomSelect'] selectOps--传递个选择函数的参数,如[0.08] xOverFNs--交叉函数名称表,以空格分开,如['arithXover heuristicXover simpleXover'] xOverOps--传递给交叉函数的参数表,如[2 0;2 3;2 0] mutFNs--变异函数表,如['boundaryMutation multiNonUnifMutation nonUnifMutation unifMutation'] mutOps--传递给交叉函数的参数表,如[4 0 0;6 100 3;4 100 3;4 0 0]

遗传算法求解函数极值C语言代码

#include "stdio.h" #include "stdlib.h" #include "conio.h" #include "math.h" #include "time.h" #define num_C 12 //个体的个数,前6位表示x1,后6位表示x2 #define N 100 //群体规模为100 #define pc 0.9 //交叉概率为0.9 #define pm 0.1 //变异概率为10% #define ps 0.6 //进行选择时保留的比例 #define genmax 2000 //最大代数200 int RandomInteger(int low,int high); void Initial_gen(struct unit group[N]); void Sort(struct unit group[N]); void Copy_unit(struct unit *p1,struct unit *p2); void Cross(struct unit *p3,struct unit *p4); void Varation(struct unit group[N],int i); void Evolution(struct unit group[N]); float Calculate_cost(struct unit *p); void Print_optimum(struct unit group[N],int k); /* 定义个体信息*/ typedef struct unit { int path[num_C]; //每个个体的信息 double cost; //个体代价值 }; struct unit group[N]; //种群变量group int num_gen=0; //记录当前达到第几代 int main() { int i,j; srand((int)time(NULL)); //初始化随机数发生器 Initial_gen(group); //初始化种群 Evolution(group); //进化:选择、交叉、变异 getch(); return 0; } /* 初始化种群*/ void Initial_gen(struct unit group[N]) { int i,j; struct unit *p; for(i=0;i<=N-1;i++) //初始化种群里的100个个体 {

第五章-遗传算法工具箱函数

第五章遗传算法工具箱函数 本章介绍英国设菲尔德大学开发的遗传算法工具箱函数。 由于MATLAB高级语言的通用性,对问题用M文件编码,与此配对的是MA TLAB先进的数据分析、可视化工具、特殊目的的应用领域工具箱和展现给使用者具有研究遗传算法可能性的一致环境。MATLAB遗传算法工具箱为遗传算法从业者和第一次实验遗传算法的人提供了广泛多样的有用函数。 遗传算法工具箱使用MA TLAB矩阵函数为实现广泛领域的遗传算法建立一套通用工具,这个遗传算法工具是用M文件写成的,是命令行形式的函数,能完成遗传算法大部分重要功能的程序的集合。用户可通过这些命令行函数,根据实际分析的需要,编写出功能强大的MATLAB程序。 5.1 工具箱结构 本节给出GA工具箱的主要程序。表5.1为遗传算法工具箱中的各种函数分类表。 表5.1 遗传算法工具箱中函数分类表

5.1.1 种群表示和初始化 种群表示和初始化函数有:crtbase,crtbp,crtrp。 GA工具箱支持二进制、整数和浮点数的基因表示。二进制和整数种群可以使用工具箱中的crtbp建立二进制种群。crtbase是附加的功能,它提供向量描述整数表示。种群的实值可用crtrp进行初始化。在二进制代码和实值之间的变换可使用函数bs2rv,它支持格雷码和对数编码。 5.1.2 适应度计算 适应度函数有:ranking,scaling。 适应度函数用于转换目标函数值,给每一个个体一个非负的价值数。这个工具箱支持Goldberg的偏移法(offsetting)和比率法以及贝克的线性评估算法。另外,ranking函数支持非线性评估。 5.1.3 选择函数 选择函数有:reins,rws,select,sus。 这些函数根据个体的适应度大小在已知种群中选择一定数量的个体,对它的索引返回一个列向量。现在最合适的是轮盘赌选择(即rws函数)和随机遍历抽样(即sus函数)。高级入口函数select为选择程序,特别为多种群的使用提供了一个方便的接口界面。在这种情况下,代沟是必须的,这就是整个种群在每一代中没有被完全复制,reins能使用均匀的随机数或基于适应度的重新插入。 5.1.4 交叉算子 交叉算子函数有:recdis,recint,reclin,recmut,recombin,xovdp,xovdprs,xovmp,xovsh,xovshrs,xovsp,xovsprs。 交叉是通过给定的概率重组一对个体产生后代。单点交叉、两点交叉和洗牌交叉是由xovsp、xovdp、xovsh函数分别完成的。缩小代理交叉函数分别是:xovdprs、xovshrs和xovsprs。通用的多点交叉函数是xovmp,它提供均匀交换的支持。为支持染色体实值表示,离散的、中间的和线性重组分别由函数recdis、recint、reclin完成。函数recmut提供具有突变特征的线性重组。函数recombin是一高级入口函数,对所有交叉操作提供多子群支持入口。 5.1.5 变异算子 变异算子函数有:mut,mutate,mutbga。

遗传算法C语言源代码(一元函数和二元函数)

C语言遗传算法代码 以下为遗传算法的源代码,计算一元代函数的代码和二元函数的代码以+++++++++++++++++++++++++++++++++++++为分割线分割开来,请自行选择适合的代码,使用时请略看完代码的注释,在需要更改的地方更改为自己需要的代码。 +++++++++++++++++++++++++++++++一元函数代码++++++++++++++++++++++++++++ #include #include #include #include #define POPSIZE 1000 #define maximization 1 #define minimization 2 #define cmax 100 #define cmin 0 #define length1 20 #define chromlength length1 //染色体长度 //注意,你是求最大值还是求最小值 int functionmode=minimization; //变量的上下限的修改开始 float min_x1=-2;//变量的下界 float max_x1=-1;//变量的上界 //变量的上下限的修改结束 int popsize; //种群大小 int maxgeneration; //最大世代数 double pc; //交叉率 double pm; //变异率 struct individual { char chrom[chromlength+1]; double value; double fitness; //适应度 }; int generation; //世代数 int best_index; int worst_index;

一个简单实用的遗传算法c程序

一个简单实用的遗传算法c程序(转载) c++ 2009-07-28 23:09:03 阅读418 评论0 字号:大中小 这是一个非常简单的遗传算法源代码,是由Denis Cormier (North Carolina State University)开发的,Sita S.Raghavan (University of North Carolina at Charlotte)修正。代码保证尽可能少,实际上也不必查错。对一特定的应用修正此代码,用户只需改变常数的定义并且定义“评价函数”即可。注意代码的设计是求最大值,其中的目标函数只能取正值;且函数值和个体的适应值之间没有区别。该系统使用比率选择、精华模型、单点杂交和均匀变异。如果用Gaussian变异替换均匀变异,可能得到更好的效果。代码没有任何图形,甚至也没有屏幕输出,主要是保证在平台之间的高可移植性。读者可以从https://www.360docs.net/doc/1310500531.html,,目录coe/evol 中的文件prog.c中获得。要求输入的文件应该命名为…gadata.txt?;系统产生的输出文件为…galog.txt?。输入的文件由几行组成:数目对应于变量数。且每一行提供次序——对应于变量的上下界。如第一行为第一个变量提供上下界,第二行为第二个变量提供上下界,等等。 /**************************************************************************/ /* This is a simple genetic algorithm implementation where the */ /* evaluation function takes positive values only and the */ /* fitness of an individual is the same as the value of the */ /* objective function */ /**************************************************************************/ #include #include #include /* Change any of these parameters to match your needs */

三个遗传算法matlab程序实例

遗传算法程序(一): 说明: fga.m 为遗传算法的主程序; 采用二进制Gray编码,采用基于轮盘赌法的非线性排名选择, 均匀交叉,变异操作,而且还引入了倒位操作! function [BestPop,Trace]=fga(FUN,LB,UB,eranum,popsize,pCross,pMutation,pInversion,options) % [BestPop,Trace]=fmaxga(FUN,LB,UB,eranum,popsize,pcross,pmutation) % Finds a maximum of a function of several variables. % fmaxga solves problems of the form: % max F(X) subject to: LB <= X <= UB % BestPop - 最优的群体即为最优的染色体群 % Trace - 最佳染色体所对应的目标函数值 % FUN - 目标函数 % LB - 自变量下限 % UB - 自变量上限 % eranum - 种群的代数,取100--1000(默认200) % popsize - 每一代种群的规模;此可取50--200(默认100) % pcross - 交叉概率,一般取0.5--0.85之间较好(默认0.8) % pmutation - 初始变异概率,一般取0.05-0.2之间较好(默认0.1) % pInversion - 倒位概率,一般取0.05-0.3之间较好(默认0.2) % options - 1*2矩阵,options(1)=0二进制编码(默认0),option(1)~=0十进制编 %码,option(2)设定求解精度(默认1e-4) % % ------------------------------------------------------------------------ T1=clock; if nargin<3, error('FMAXGA requires at least three input arguments'); end if nargin==3, eranum=200;popsize=100;pCross=0.8;pMutation=0.1;pInversion=0.15;options=[0 1e-4];end if nargin==4, popsize=100;pCross=0.8;pMutation=0.1;pInversion=0.15;options=[0 1e-4];end if nargin==5, pCross=0.8;pMutation=0.1;pInversion=0.15;options=[0 1e-4];end if nargin==6, pMutation=0.1;pInversion=0.15;options=[0 1e-4];end if nargin==7, pInversion=0.15;options=[0 1e-4];end if find((LB-UB)>0) error('数据输入错误,请重新输入(LB

相关文档
最新文档