自适应遗传算法代码

自适应遗传算法代码
自适应遗传算法代码

/**********************************************************************/

/* 基于基本遗传算法的自适应遗传优化算法函数最优化SGA_AUTO.C */

/* A Function Optimizer using Simple Genetic Algorithm */

/* developed from the Pascal SGA code presented by David E.Goldberg */

/* 华南理工大学电子与信息学院苏勇2004年4月*/

/**********************************************************************/

#include

#include

/* 全局变量*/

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; /* 当前运行次数*/

int maxruns; /* 总运行次数*/

int printstrings; /* 输出染色体编码的判断,0 -- 不输出, 1 -- 输出*/

int nmutation; /* 当前代变异发生次数*/

int ncross; /* 当前代交叉发生次数*/ float pc1;

float pc2;

float pm1;

float pm2;

int temp_mate1;

int temp_mate2;

/* 随机数发生器使用的静态变量*/

static double oldrand[55];

static int jrand;

static double rndx2;

static int rndcalcflag;

/* 输出文件指针*/

FILE *outfp ;

/* 函数定义*/

void advance_random();

int flip(float);rnd(int, int);

void randomize();

double randomnormaldeviate();

float randomperc(),rndreal(float,float);

void warmup_random(float);

void initialize(),initdata(),initpop();

void initreport(),generation(),initmalloc();

void freeall(),nomemory(char *),report();

void writepop(),writechrom(unsigned *);

void preselect();

void statistics(struct individual *);

void title(),repchar (FILE *,char *,int);

void skip(FILE *,int);

int select();

void objfunc(struct individual *);

int crossover (unsigned *, unsigned *, unsigned *, unsigned *);

void mutation(unsigned *);

void initialize() /* 遗传算法初始化*/

{

/* 键盘输入遗传算法参数*/

initdata();

/* 确定染色体的字节长度*/

chromsize = (lchrom/(8*sizeof(unsigned)));

if(lchrom%(8*sizeof(unsigned))) chromsize++;

/*分配给全局数据结构空间*/

initmalloc();

/* 初始化随机数发生器*/

randomize();

/* 初始化全局计数变量和一些数值*/

nmutation = 0;

ncross = 0;

bestfit.fitness = 0.0;

bestfit.generation = 0;

/* 初始化种群,并统计计算结果*/

initpop();

statistics(oldpop);

initreport();

}

void initdata() /* 遗传算法参数输入*/

{

char answer[2];

popsize=30;

if((popsize%2) != 0)

{

fprintf(outfp, "种群大小已设置为偶数\n");

popsize++;

};

lchrom=22;

printstrings=1;

maxgen=150;

pcross=0.8;

pc1=0.8;

pc2=0.6;

pmutation=0.05;

pm1=0.05;

pm2=0.005;

}

void initpop() /* 随机初始化种群*/

{

int j, j1, k, stop;

unsigned mask = 1;

for(j = 0; j < popsize; j++)

{

for(k = 0; k < chromsize; k++)

{

oldpop[j].chrom[k] = 0;

if(k == (chromsize-1))

stop = lchrom - (k*(8*sizeof(unsigned)));

else

stop =8*sizeof(unsigned);

for(j1 = 1; j1 <= stop; j1++)

{

oldpop[j].chrom[k] = oldpop[j].chrom[k]<<1;

if(flip(0.5))

oldpop[j].chrom[k] = oldpop[j].chrom[k]|mask;

}

}

oldpop[j].parent[0] = 0; /* 初始父个体信息*/

oldpop[j].parent[1] = 0;

oldpop[j].xsite = 0;

objfunc(&(oldpop[j])); /* 计算初始适应度*/ }

}

void initreport() /* 初始参数输出*/

{

void skip();

skip(outfp,1);

fprintf(outfp,"基本遗传算法参数\n");

fprintf(outfp," -------------------------------------------------\n");

fprintf(outfp,"种群大小(popsize) = %d\n",popsize);

fprintf(outfp,"染色体长度(lchrom) = %d\n",lchrom);

fprintf(outfp,"最大进化代数(maxgen) = %d\n",maxgen);

fprintf(outfp,"交叉概率(pcross) = %f\n",pcross);

fprintf(outfp,"变异概率(pmutation) = %f\n",pmutation);

fprintf(outfp," -------------------------------------------------\n");

skip(outfp,1);

fflush(outfp);

}

void generation()

{

int mate1, mate2, jcross, j = 0;

/* 每代运算前进行预选*/

preselect();

/* 选择, 交叉, 变异*/

do

{

/* 挑选交叉配对*/

mate1 = select();

temp_mate1 = mate1;

mate2 = select();

temp_mate2 = mate2;

/* 交叉和变异*/

jcross = crossover(oldpop[mate1].chrom, oldpop[mate2].chrom, newpop[j].chrom, newpop[j+1].chrom);

/* 自适应变异概率*/

if(gen!=0)

{

if(newpop[j].fitness>=avg)

pmutation = pm1-(pm1-pm2)*(max-newpop[j].fitness)/(max-avg);

else

pmutation = pm1;

}

mutation(newpop[j].chrom);

if(gen!=0)

{

if(newpop[j+1].fitness>=avg)

pmutation = pm1-(pm1-pm2)*(max-newpop[j+1].fitness)/(max-avg);

else

pmutation = pm1;

}

mutation(newpop[j+1].chrom);

/* 解码, 计算适应度*/

objfunc(&(newpop[j]));

/*记录亲子关系和交叉位置*/

newpop[j].parent[0] = mate1+1;

newpop[j].xsite = jcross;

newpop[j].parent[1] = mate2+1;

objfunc(&(newpop[j+1]));

newpop[j+1].parent[0] = mate1+1;

newpop[j+1].xsite = jcross;

newpop[j+1].parent[1] = mate2+1;

j = j + 2;

}

while(j < (popsize-1));

}

void initmalloc() /*为全局数据变量分配空间*/

{

unsigned nbytes;

char *malloc();

int j;

/* 分配给当前代和新一代种群内存空间*/

nbytes = popsize*sizeof(struct individual);

if((oldpop = (struct individual *) malloc(nbytes)) == NULL)

nomemory("oldpop");

if((newpop = (struct individual *) malloc(nbytes)) == NULL)

nomemory("newpop");

/* 分配给染色体内存空间*/

nbytes = chromsize*sizeof(unsigned);

for(j = 0; j < popsize; j++)

{

if((oldpop[j].chrom = (unsigned *) malloc(nbytes)) == NULL) nomemory("oldpop chromosomes");

if((newpop[j].chrom = (unsigned *) malloc(nbytes)) == NULL) nomemory("newpop chromosomes");

}

if((bestfit.chrom = (unsigned *) malloc(nbytes)) == NULL)

nomemory("bestfit chromosome");

}

void freeall() /* 释放内存空间*/

{

int i;

for(i = 0; i < popsize; i++)

{

free(oldpop[i].chrom);

free(newpop[i].chrom);

}

free(oldpop);

free(newpop);

free(bestfit.chrom);

}

void nomemory(string) /* 内存不足,退出*/

char *string;

{

fprintf(outfp,"malloc: out of memory making %s!!\n",string);

exit(-1);

}

void report() /* 输出种群统计结果*/

{

void repchar(), skip();

void writepop(), writestats();

repchar(outfp,"-",80);

skip(outfp,1);

if(printstrings == 1)

{

repchar(outfp," ",((80-17)/2));

fprintf(outfp,"模拟计算统计报告\n");

fprintf(outfp, "世代数%3d", gen);

repchar(outfp," ",(80-28));

fprintf(outfp, "世代数%3d\n", (gen+1));

fprintf(outfp,"个体染色体编码");

repchar(outfp," ",lchrom-5);

fprintf(outfp,"适应度父个体交叉位置");

fprintf(outfp,"染色体编码");

repchar(outfp," ",lchrom-5);

fprintf(outfp,"适应度\n");

repchar(outfp,"-",80);

skip(outfp,1);

writepop(outfp);

repchar(outfp,"-",80);

skip(outfp,1);

}

fprintf(outfp,"第%d 代统计: \n",gen);

fprintf(outfp,"总交叉操作次数= %d, 总变异操作数= %d\n",ncross,nmutation);

fprintf(outfp,"最小适应度:%f 最大适应度:%f 平均适应度%f\n", min,max,avg);

fprintf(outfp,"迄今发现最佳个体=> 所在代数:%d ", bestfit.generation);

fprintf(outfp,"适应度:%f 染色体:", bestfit.fitness);

writechrom((&bestfit)->chrom);

fprintf(outfp,"对应的变量值: %f", bestfit.varible);

skip(outfp,1);

repchar(outfp,"-",80);

skip(outfp,1);

}

void writepop()

{

struct individual *pind;

int j;

for(j=0; j

{

fprintf(outfp,"%3d) ",j+1);

/* 当前代个体*/

pind = &(oldpop[j]);

writechrom(pind->chrom);

fprintf(outfp,"%8f | ", pind->fitness);

/* 新一代个体*/

pind = &(newpop[j]);

fprintf(outfp,"(%2d,%2d) %2d ",

pind->parent[0], pind->parent[1], pind->xsite);

writechrom(pind->chrom);

fprintf(outfp,"%8f\n", pind->fitness);

}

}

void writechrom(chrom) /* 输出染色体编码*/ unsigned *chrom;

{

int j, k, stop;

unsigned mask = 1, tmp;

for(k = 0; k < chromsize; k++)

{

tmp = chrom[k];

if(k == (chromsize-1))

stop = lchrom - (k*(8*sizeof(unsigned)));

else

stop =8*sizeof(unsigned);

for(j = 0; j < stop; j++)

{

if(tmp&mask)

fprintf(outfp,"1");

else

fprintf(outfp,"0");

tmp = tmp>>1;

}

}

}

void preselect()

{

int j;

sumfitness = 0;

for(j = 0; j < popsize; j++) sumfitness += oldpop[j].fitness; }

int select() /* 轮盘赌选择*/

{

extern float randomperc();

float sum, pick;

int i;

pick = randomperc();

sum = 0;

if(sumfitness != 0)

{

for(i = 0; (sum < pick) && (i < popsize); i++)

sum += oldpop[i].fitness/sumfitness;

}

else

i = rnd(1,popsize);

return(i-1);

}

void statistics(pop) /* 计算种群统计数据*/

struct individual *pop;

{

int i, j;

sumfitness = 0.0;

min = pop[0].fitness;

max = pop[0].fitness;

/* 计算最大、最小和累计适应度*/

for(j = 0; j < popsize; j++)

{

sumfitness = sumfitness + pop[j].fitness;

if(pop[j].fitness > max) max = pop[j].fitness;

if(pop[j].fitness < min) min = pop[j].fitness;

/* new global best-fit individual */

if(pop[j].fitness > bestfit.fitness)

{

for(i = 0; i < chromsize; i++)

bestfit.chrom[i] = pop[j].chrom[i];

bestfit.fitness = pop[j].fitness;

bestfit.varible = pop[j].varible;

bestfit.generation = gen;

}

}

/* 计算平均适应度*/

avg = sumfitness/popsize;

}

void title()

{

printf("SGA Optimizer Jean.Timex\n");

}

void repchar (outfp,ch,repcount)

FILE *outfp;

char *ch;

int repcount;

{

int j;

for (j = 1; j <= repcount; j++) fprintf(outfp,"%s", ch);

}

void skip(outfp,skipcount)

FILE *outfp;

int skipcount;

{

int j;

for (j = 1; j <= skipcount; j++) fprintf(outfp,"\n");

}

void objfunc(critter) /* 计算适应度函数值*/

struct individual *critter;

{

unsigned mask=1;

unsigned bitpos;

unsigned tp;

double pow(), bitpow ;

int j, k, stop;

critter->varible = 0.0;

for(k = 0; k < chromsize; k++)

{

if(k == (chromsize-1))

stop = lchrom-(k*(8*sizeof(unsigned)));

else

stop =8*sizeof(unsigned);

tp = critter->chrom[k];

for(j = 0; j < stop; j++)

{

bitpos = j + (8*sizeof(unsigned))*k;

if((tp&mask) == 1)

{

bitpow = pow(2.0,(double) bitpos);

critter->varible = critter->varible + bitpow;

}

tp = tp>>1;

}

}

critter->varible =-1+critter->varible*3/(pow(2.0,(double)lchrom)-1);

critter->fitness =critter->varible*sin(critter->varible*10*atan(1)*4)+2.0;

}

void mutation(unsigned *child) /*变异操作*/

{

int j, k, stop;

unsigned mask, temp = 1;

for(k = 0; k < chromsize; k++)

{

mask = 0;

if(k == (chromsize-1))

stop = lchrom - (k*(8*sizeof(unsigned)));

else

stop = 8*sizeof(unsigned);

for(j = 0; j < stop; j++)

{

if(flip(pmutation))

{

mask = mask|(temp<

nmutation++;

}

}

child[k] = child[k]^mask;

}

}

int crossover (unsigned *parent1, unsigned *parent2, unsigned *child1, unsigned *child2) /* 由两个父个体交叉产生两个子个体*/

{

int j, jcross, k;

unsigned mask, temp;

/*//////////////////////自适应交叉概率*/

double fp_fitness = 0;

if(gen!=0)

{

if(oldpop[temp_mate1].fitness>=oldpop[temp_mate2].fitness)

fp_fitness = oldpop[temp_mate1].fitness;

else

fp_fitness = oldpop[temp_mate2].fitness;

if(fp_fitness>=avg)

pcross = pc1-(pc1-pc2)*(fp_fitness-avg)/(max-avg);

else

pcross = pc2;

}

/*///////////////////////////////////*/

if(flip(pcross))

{

jcross = rnd(1 ,(lchrom - 1));/* Cross between 1 and l-1 */

ncross++;

for(k = 1; k <= chromsize; k++)

{

if(jcross >= (k*(8*sizeof(unsigned))))

{

child1[k-1] = parent1[k-1];

child2[k-1] = parent2[k-1];

}

else if((jcross < (k*(8*sizeof(unsigned)))) && (jcross > ((k-1)*(8*sizeof(unsigned)))))

{

mask = 1;

for(j = 1; j <= (jcross-1-((k-1)*(8*sizeof(unsigned)))); j++)

{

temp = 1;

mask = mask<<1;

mask = mask|temp;

}

child1[k-1] = (parent1[k-1]&mask)|(parent2[k-1]&(~mask));

child2[k-1] = (parent1[k-1]&(~mask))|(parent2[k-1]&mask);

}

else

{

child1[k-1] = parent2[k-1];

child2[k-1] = parent1[k-1];

}

}

}

else

{

for(k = 0; k < chromsize; k++)

{

child1[k] = parent1[k];

child2[k] = parent2[k];

}

jcross = 0;

}

return(jcross);

}

void advance_random() /* 产生55个随机数*/

{

int j1;

double new_random;

for(j1 = 0; j1 < 24; j1++)

{

new_random = oldrand[j1] - oldrand[j1+31];

if(new_random < 0.0) new_random = new_random + 1.0;

oldrand[j1] = new_random;

}

for(j1 = 24; j1 < 55; j1++)

{

new_random = oldrand [j1] - oldrand [j1-24];

if(new_random < 0.0) new_random = new_random + 1.0;

oldrand[j1] = new_random;

}

}

int flip(float prob) /* 以一定概率产生0或1 */

{

float randomperc();

if(randomperc() <= prob)

return(1);

else

return(0);

}

void randomize() /* 设定随机数种子并初始化随机数发生器*/ {

float randomseed;

int j1;

for(j1=0; j1<=54; j1++)

oldrand[j1] = 0.0;

jrand=0;

randomseed=0.5;

warmup_random(randomseed);

}

double randomnormaldeviate() /* 产生随机标准差*/

{

double sqrt(), log(), sin(), cos();

float randomperc();

double t, rndx1;

if(rndcalcflag)

{ rndx1 = sqrt(- 2.0*log((double) randomperc()));

t = 6.2831853072 * (double) randomperc();

rndx2 = rndx1 * sin(t);

rndcalcflag = 0;

return(rndx1 * cos(t));

}

else

{

rndcalcflag = 1;

return(rndx2);

}

}

float randomperc() /*与库函数random()作用相同, 产生[0,1]之间一个随机数*/ {

jrand++;

if(jrand >= 55)

{

jrand = 1;

advance_random();

}

return((float) oldrand[jrand]);

}

int rnd(low, high) /*在整数low和high之间产生一个随机整数*/

int low,high;

{

int i;

float randomperc();

if(low >= high)

i = low;

else

{

i = (randomperc() * (high - low + 1)) + low;

if(i > high) i = high;

}

return(i);

}

void warmup_random(float random_seed) /* 初始化随机数发生器*/

{

int j1, ii;

double new_random, prev_random;

oldrand[54] = random_seed;

new_random = 0.000000001;

prev_random = random_seed;

for(j1 = 1 ; j1 <= 54; j1++)

{

ii = (21*j1)%54;

oldrand[ii] = new_random;

new_random = prev_random-new_random;

if(new_random<0.0) new_random = new_random + 1.0;

prev_random = oldrand[ii];

}

advance_random();

advance_random();

advance_random();

jrand = 0;

}

main(argc,argv) /* 主程序*/

int argc;

char *argv[];

{

struct individual *temp;

FILE *fopen();

void title();

char *malloc();

//if()

argv[1]="output.txt";

if((outfp = fopen(argv[1],"w")) == NULL)

{

fprintf(stderr,"Cannot open output file %s\n",argv[1]);

exit(-1);

}

title();

maxruns=10;

for(run=1; run<=maxruns; run++)

{

initialize();

for(gen=0; gen

{

fprintf(outfp,"\n第%d / %d 次运行: 当前代为%d, 共%d 代\n", run,maxruns,gen,maxgen);

/* 产生新一代*/

generation();

/* 计算新一代种群的适应度统计数据*/

statistics(newpop);

/* 输出新一代统计数据*/

report();

temp = oldpop;

oldpop = newpop;

newpop = temp;

}

freeall();

}

}

/************************************************************* **** 本程序是实现了模拟退火算法****** **** 利用模拟退火算法,求出某函数的最小小值****** **** 编写者: 张庆贤******

***************************************************************/ #include "iostream.h"

#include "stdlib.h"

#include "stdio.h"

#include "math.h"

/********************************

定义常量

********************************/

#define MAX_TP 20000000 //最高温度

#define MIN_TP 1 //控制的最低温度

#define LENGTH 0.01 //步长,各个函数不一样,

#define BK 0.1 //B常数

#define AF 0.95 //温度变化速率

#define debuge 1 //调试信息的控制

/***********************************

目标函数

************************************/

double fun(double x)

{

int a,b,c;

a=-4;

b=-8;

c=-12;

return (a*x*x+b*x+c);

}

/*********************************************** 模拟退火算法

************************************************/ double sa()

{

double old_x,new_x;//变量

double tempt=MAX_TP;

double old_eg,new_eg;//能量函数

double dx; //符号

//随机的产生一个初试值

old_x=(double)(rand()%2);

old_eg=fun(old_x);

/*************************

逐渐降温的过程

**************************/

while(tempt>MIN_TP)

{

dx=(double)(rand()%3);

if(dx>1.5)

dx=1;

else

dx=-1;

//length=(float(rand()%30))/60;

//做调试的时候用的输出

//cout<<"length="<

//***************************

new_x=(double)(old_x+dx*LENGTH);

new_eg=fun(new_x);

if((old_eg-new_eg)<0)

{

old_x=new_x;

old_eg=new_eg;

}

else

{

double rd=(double)(rand()%100);

double p;

/**************************************

在本程序中有加0.8有一定的理论依据

**************************************/

rd=rd/100+0.8;

p=exp(-(old_eg-new_eg)/(BK*tempt));

//**************************************

#if debuge

cout<<" rd="<

cout<<"min x="<

}

自适应遗传算法讲解学习

自适应遗传算法

自适应遗传算法 一.主要流程: 1. 参数的初始化。设定遗传种群规模N ,阵元数M ,信源数P 等。 2. 编码。采用十进制编码方法。 3. 初始种群的产生。随机数生成。 4. 适应度函数的评价。选取 ()() R P ΘA )tr f = (1) 其中, H 1H )(A A A A P A -= (2) P A 是A 的投影矩阵,A 是阵列流型。 ∑==L i L 1 H 1XX R ) (3) R )是数据协方差矩阵的最大似然估计。 5. 选择。比例选择方法与精英选择方法结合使用,在当代种群中选择优良个体遗传到下一代。既保证了种群的多样性,也使最优个体得以保留。 1)比例选择方法(赌轮盘法):每个个体被选中的概率与它的适应度函数值大小成正比,即适应度函数越高的个体被选中的概率也就越高。 2)精英选择方法:让种群中适应度函数值最高的个体不进行配对交叉,直接复制到下一代中。但是容易陷入局部最优解,全局搜索能力差。 6. 交叉。按照概率P c 对种群中个体两两配对,进行交叉操作。本文中选取算数交叉的方式。 算数交叉:是由两个个体的线性组合来产生新的个体,假设第t 代的两个个体为A (t)、B (t),则算数交叉后产生的新个体是

()()()()t t t A B A αα-+=+11 (4) ()()()()t t t B A B αα-+=+11 (5) 其中,α选取(0,1)之间的随机数。 交叉概率:使交叉概率随着遗传代数的增长,逐渐减小,目的是进化前期注重交叉运算,全局搜索能力强。 2.02cos *4.0+?? ? ??*=πK T P c (6) 其中,T 是进化代数,K 是总进化次数。 7. 变异。按照概率P m 对种群个体进行变异。本文中选取均匀变异的方式。 均匀变异:如某基因座上的基因值为X k ,其取值范围为[Umin,Umax],对其进行变异后的值为 )U -r(U +U =X min max min k (7) 其中,r 选取[0,1]之间的随机数。 变异概率:使变异概率随着遗传代数的增长,逐渐增加,目的是进化后期注重变异运算,局部搜索能力强。 005.02sin *045.0+?? ? ??*=πK T P m (8) 其中,T 是进化代数,K 是总进化次数。 8. 终止条件判断。若已达到设定的最大遗传代数,则迭代终止,输出最优解;若不满足终止条件,则返回第4步,进行迭代寻优过程。

基于遗传算法的OFDM自适应资源分配算法MATLAB源码

基于遗传算法的OFDM自适应资源分配算法MATLAB源码 OFDM自适应资源分配问题(载波、功率等),是一个既含有离散决策变量,又含有连续决策变量的非线性优化模型,且含有较为复杂的非线性约束,因此适合采用智能优化算法进行求解。 function [BESTX1,BESTX2,BESTY,ALLX1,ALLX2,ALL Y]=GA2(K,N,Pm,H,BBB,P,N0) %% 本源码实现遗传算法,用于RA准则下的多用户OFDM自适应资源分配 %% 输入参数列表 % K 迭代次数 % N 种群规模,要求是偶数 % Pm 变异概率 % H 信道增益矩阵,K*N的矩阵,表示用户k在子信道n上的信道增益,无单位,取值范围0~1 % BBB 总带宽(Hz) % P 总功率(W) % N0 加性高斯白噪声功率谱密度(W/Hz) %% 输出参数列表 % BESTX1 K×1细胞结构,每一个元素是M×1向量,记录每一代的最优个体的第一分量 % BESTX2 K×1细胞结构,每一个元素是M×1向量,记录每一代的最优个体的第二分量 % BESTY K×1矩阵,记录每一代的最优个体的评价函数值 % ALLX1 K×1细胞结构,每一个元素是M×N矩阵,记录全部个体的第一分量 % ALLX2 K×1细胞结构,每一个元素是M×N矩阵,记录全部个体的第二分量 % ALL Y K×N矩阵,记录全部个体的评价函数值 %% 第一步 [KK,NN]=size(H); M=NN;%决策变量个数,子载波个数 farm1=zeros(M,N);%每一列是一个样本 for i=1:N farm1(:,i)=unidrnd(KK,M,1); end farm2=zeros(M,N);%每一列是一个样本 for i=1:N farm2(:,i)=RandSeq(M); end %输出变量初始化 ALLX1=cell(K,1); ALLX2=cell(K,1); ALL Y=zeros(K,N); BESTX1=cell(K,1);

自适应Simpson积分算法MATLAB及C实现代码.docx

自适应Simpson积分算法(MATLAB及C++实现代码) (计算数学课用) 在CSDN论坛中找到了却要金币,无奈之下自己写了一份。 对于类似问题,改一下积分函数和区间即可。 针对问题:数学上已经证明了 ∫ 4 1+x2 dx=π 1 成立,所以可以通过数值积分来求π的近似值。 试利用自适应Simpson算法计算积分近似值。 C++版:(直接复制粘贴在VC++6.0即可运行) /*用自适应Simpson积分方法计算积分值*/ #include #include int n=0; //设置全局变量n,用来记录最高迭代次数,避免递归一直进行下去。double pi=3.141592653589793238462643 ; //设置近似精确值,用以比较 double e1=0.00001 ; //设置误差容限为10^-5 double f(double); //要积分的函数 double Simpson (double,double,double,double); // 迭代函数 using namespace std; //主函数 int main() { double a=0,b=1,t,h,S;//积分区间 h=(b-a)/2; S=h/3*(f(a)+f(b)+4*f((a+b)/2)); //第一次Simpson公式积分值 t=Simpson(a,b,e1,S); cout<<"积分值为:"<

matlab自适应遗传算法

function [xv,fv]=AdapGA(fitness,a,b,NP,NG,Pc1,Pc2,Pm1,Pm2,eps) %×?êêó|ò?′???·¨ L = ceil(log2((b-a)/eps+1)); x = zeros(NP,L); for i=1:NP x(i,:) = Initial(L); fx(i) = fitness(Dec(a,b,x(i,:),L)); end for k=1:NG sumfx = sum(fx); Px = fx/sumfx; PPx = 0; PPx(1) = Px(1); for i=2:NP PPx(i) = PPx(i-1) + Px(i); end for i=1:NP sita = rand(); for n=1:NP if sita <= PPx(n) SelFather = n; break; end

end Selmother = round(rand()*(NP-1))+1; posCut = round(rand()*(L-2)) + 1; favg = sumfx/NP; fmax = max(fx); Fitness_f = fx(SelFather); Fitness_m = fx(Selmother); Fm = max(Fitness_f,Fitness_m); if Fm>=favg Pc = Pc1*(fmax - Fm)/(fmax - favg); else Pc = Pc2; end r1 = rand(); if r1<=Pc nx(i,1:posCut) = x(SelFather,1:posCut); nx(i,(posCut+1):L) = x(Selmother,(posCut+1):L); fmu = fitness(Dec(a,b,nx(i,:),L)); if fmu>=favg Pm = Pm1*(fmax - fmu)/(fmax - favg); else Pm = Pm2;

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

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,xOverOps,mutFNs ,mutOps)--遗传算法函数?【输出参数】? x--求得的最优解? endPop--最终得到的种群?

bPop--最优种群的一个搜索轨迹?【输入参数】? bounds--代表变量上下界的矩阵? evalFN--适应度函数? evalOps--传递给适应度函数的参数? startPop-初始种群? opts[epsilon prob_ops display]--opts(1:2)等同于initializega 的options参数,第三个参数控制是否输出,一般为0。如[1e-6 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]?注意】matlab工具箱函数必须放在工作目录下?【问题】求f(x)=x+10*sin(5x)+7*cos(4x)的最大值,其中0=x=9?【分析】选择二进制编码,种群中的个体数目为10,二进制编码长度为20,交叉概率为0.95,变异概率为0.08?【程序清单】?

自适应小生境遗传算法的性能分析

自适应小生境遗传算法的性能分析1 李明林 (福州大学机械工程及自动化学院 福建福州 350002) E-mail:lml_006@https://www.360docs.net/doc/c57395625.html, 摘 要:本文提出一种改进的维持物种多样性的小生境实现技术——自适应小生境遗传算法。该算法以Mahfoud提出的确定性排挤策略为基础,采用数值编码,并结合算术交叉、非均匀变异和高斯变异、自适应变异概率。经过实验分析,验证了该算法能有效地、自适应地形成小生境进化环境,并具备相当的收敛速度和相当的求解精度。 关键词:小生境,自适应,遗传算法,多态优化,排挤 1 引言 作为一种模拟生物在自然环境中遗传和进化过程的自适应全局优化搜索算法,遗传算法以其明显优于传统优化算法的鲁棒性、自适应性、全局优化性和隐含并行性广泛地用于求解各种工程优化问题。近年来,人们特别关注发展用于多目标优化、多峰值函数优化与组合优化问题的小生境遗传算法[1]。 观察各种小生境的实现方法,可看出其共同点都是为了有效地维持群体的多样性。而其差别可归纳为两种基本类型:一种是将连续的、无限的搜索空间划分为离散的、有限的小生境区域;另一种则是对种群的适应度作适当的修整以抑制超级个体的复制概率来维持进化过程中的群体多样性。前一种类型以De Jong 提出的基于排挤机制(Crowding)的小生境实现方法为代表(1975),后一种类型以Goldberg等提出的基于共享机制(Sharing)的小生境技术为代表(1987)。在此基础上,各种各样的小生境技术不断出现。我们项目的研究主要是对一些有代表性的技术进行性能分析,为小生境遗传算法的实际工程应用提供有用的设计依据。 本文首先在深入理解Mahfoud提出的基于确定性排挤机制(Deterministic Crowding)的小生境思想的基础上,以实验的手段论证其思想的有效性和正确性。在实验过程中,不断修改程序的各个组成部分,并用于函数优化测试。最后发现一种程序组合具有较明显的特点。它可维持种群的多样性,而且可自适应形成大小、形状各异的小生境。因此将它称为自适应小生境遗传算法(简称SNGA)。 本文首先介绍确定性排挤机制的基本思想和算法结构,结合文献[2]的遗传算子编写了SNGA类库函数。其次结合三种较为典型的数值优化测试函数,对SNGA进行实验分析。最后对SNGA进行总结讨论。 2 确定性排挤机制和SNGA 1970年,Cavicchio提出了基于预选择机制(Preselection)的小生境技术,其基本思想是父代个体经过遗传操作后生成子代个体,父子个体相互竞争,适应度高的进入下一代群体中。DeJong于1975年一般化了Cavicchio的预选择机,在其博士论文提出了基于排挤机制(Crowding)的小生境技术。即:在父代群体中选取部分个体作为小生境主体,在新生子代群体中与小生境主体相似的个体不得进入下一代群体。他们声称这两种方法都可在群体中形成小生境的进化环境,并维持了群体的多样性。 1本课题得到福建省教育厅(JB04025)项目资助。

多方式进化遗传算法Matlab源代码

多方式进化遗传算法Matlab源代码 对于单种群进化,多方式进化是提高全局搜索能力和收敛速度的一种有效策略 该程序采用: 编码:二进制编码、实数编码(默认) 选择:非线性排名选择(主要表现在前期),锦标赛选择(主要表现在后期,含精英保留),由于单纯的转轮盘选择存在诸多弊端,这里没有采用 交叉:二进制编码采用多点交叉和均匀交叉,并逐步增大均匀交叉概率 实数编码采用离散交叉(前期)、算术交叉(中期)、AEA重组(后期) 变异:二进制编码采用随机变异 实数编码采用两种自适应变异和两种随机变异,且尽量采用前者 到位:适当的到位可以提高种群的多样性 function [X,MaxFval,BestPop,Trace]=fga(FUN,bounds,MaxEranum,PopSize,options,pCross,pMutation,pInversion) % [X,MaxFval,BestPop,Trace]=fga(FUN,bounds,MaxEranum,PopSize,options,pCross,pMutation,pInversion) % Finds a maximum of a function of several variables. % fga solves problem s of the form: % max F(X) subject to: LB <= X <= UB % BestPop - 最优的群体即为最优的染色体群 % Trace - 每代最佳个体所对应的目标函数值 % FUN - 目标函数 % LB - 自变量下限 % UB - 自变量上限 % eranum - 种群的代数,取50--500(默认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<2, error('FMAXGA requires at least three input arguments'); end if nargin==2, MaxEranum=100;PopSize=100;options=[1 1e-4];pCross=0.85;pMutation=0.1;pInversion=0.25;end if nargin==3, PopSize=100;options=[1 1e-4];pCross=0.85;pMutation=0.1;pInversion=0.25;end if nargin==4, options=[1 1e-4];pCross=0.85;pMutation=0.1;pInversion=0.25;end if nargin==5, pCross=0.85;pMutation=0.1;pInversion=0.25;end if nargin==6, pMutation=0.1;pInversion=0.25;end if nargin==7, pInversion=0.25;end if (options(1)==0|options(1)==1)&find((bounds(:,1)-bounds(:,2))>0) error('数据输入错误,请重新输入:'); end %s=sprintf('程序运行需要约%.4f 秒钟时间,请稍等......',(eranum*popsize/1000)); %disp(s); % 定义全局变量 global m n NewPop children1 children2 VarNum % 初始化种群和变量

遗传算法总结【精品毕业设计】(完整版)

遗传算法总结 遗传算法是借鉴生物的自然选择和遗传进化机制而开发出的一种全局自适应概率搜索算法。 一、遗传算法流程图 算法开始 原问题参数集 染色体编码,产生初始种群 计算种群中个体的适应值 终止条件判断 N 选择 交叉 Y 变异 新种群 输出结果 算法结束 图1 遗传算法流程图 二、遗传算法的原理和方法 1)染色体编码 把一个问题的可行解从其解空间转换到遗传算法所能处理的搜索空间的转换方法就称为编码。

De Jong 曾提出了两条操作性较强的实用编码原则:编码原则一:应使用能易于产生与所求问题相关的且具有低阶、短定义长度模式的编码方案;编码原则二:应使用能使问题得到自然表示或描述的具有最小编码字符集的编码方案。 编码方法主要有以下几种:二进制编码方法、格雷码编码方法、浮点数编码方法、符号编码方法、参数级联编码方法、多参数交叉编码方法。 2) 适应值计算 由解空间中某一点的目标函数值()f x 到搜索空间中对应个体的适应度函数值 (())Fit f x 的转换方法基本上有一下三种: a . 直接以待解的目标函数值()f x 转化为适应度函数值(())Fit f x ,令 () (())=() f x Fit f x f x ?? -?目标函数为最大化函数 目标函数为最小化函数 b . 对于最小值的问题,做下列转化max max () () (())0 C f x f x C Fit f x -

自适应遗传算法

自适应遗传算法 一.主要流程: 1. 参数的初始化。设定遗传种群规模N ,阵元数M ,信源数P 等。 2. 编码。采用十进制编码方法。 3. 初始种群的产生。随机数生成。 4. 适应度函数的评价。选取 ()() R P ΘA tr f = (1) 其中, H 1H )(A A A A P A -= (2) P A 是A 的投影矩阵,A 是阵列流型。 ∑==L i L 1 H 1XX R (3) R 是数据协方差矩阵的最大似然估计。 5. 选择。比例选择方法与精英选择方法结合使用,在当代种群中选择优良个体遗传到下一代。既保证了种群的多样性,也使最优个体得以保留。 1)比例选择方法(赌轮盘法):每个个体被选中的概率与它的适应度函数值大小成正比,即适应度函数越高的个体被选中的概率也就越高。 2)精英选择方法:让种群中适应度函数值最高的个体不进行配对交叉,直接复制到下一代中。但是容易陷入局部最优解,全局搜索能力差。 6. 交叉。按照概率P c 对种群中个体两两配对,进行交叉操作。本文中选取算数交叉的方式。 算数交叉:是由两个个体的线性组合来产生新的个体,假设第t 代的两个个体为A (t)、B (t),则算数交叉后产生的新个体是 ()()()()t t t A B A αα-+=+11 (4) ()()()()t t t B A B αα-+=+11 (5) 其中,α选取(0,1)之间的随机数。 交叉概率:使交叉概率随着遗传代数的增长,逐渐减小,目的是进化前期注重交叉运算,全局搜索能力强。 2.02cos *4.0+?? ? ??*=πK T P c (6) 其中,T 是进化代数,K 是总进化次数。 7. 变异。按照概率P m 对种群个体进行变异。本文中选取均匀变异的方式。 均匀变异:如某基因座上的基因值为X k ,其取值范围为[Umin,Umax],对其进行变异后的值为 )U -r(U +U =X min max min k (7)

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

遗传算法入门(上)代码中的进化学说与遗传学说 写在之前 算法所属领域 遗传算法的思想解析 为什么要用遗传算法? 科研现状 应用现状 遗传算法入门系列文章: (中篇)遗传算法入门(中)实例,求解一元函数最值(MATLAB版)(下篇)遗传算法入门(下)实例,求解TSP问题(C++版) 写在之前 说明:本想着用大量篇幅写一篇“关于遗传算法的基本原理”作为本系列入门的第一篇,但是在找寻资料的过程中,看到网络上有大量的关于遗传算法的介绍,觉得写的都挺好,所以本文我就简单写点自己的理解。 推荐几篇关于遗传算法的介绍性文章: 遗传算法详解(GA)(个人觉得很形象,很适合初学者) 算法所属领域 ? 相信每个人学习一门知识之前,都会想知道这门知识属于哪一门学科范畴,属于哪一类技术领域? ? 首先对于这种问题,GA是没有绝对的归属的。算法的定义是解决问题的一种思想和指导理论。而遗传算法也是解决某一问题的一种思想,用

某一编程语言实现这种思想的程序具有很多特点,其中一个便是智能性和进化性,即,不需要大量的人为干涉,程序本身能够根据一定的条件自我筛选,最终得出令人满意的结果。所以按照这种特性,把它列为人工智能领域下的学习门类毫无疑问是可以的。遗传算法的思想是借鉴了达尔文的进化学说和孟德尔的遗传学说,把遗传算法说成是一门十足的仿生学一点都不过分。然而从应用的角度出发,遗传算法是求最优解问题的好方法,如信号处理中的优化、数学求解问题、工业控制参数最优解、神经网络中的激活函数、图像处理等等,所以把遗传算法说成优化范畴貌似也说的过去。为了方便理解,我们可以暂时将其定位为人工智能–智能优化,这也是很多书中描述遗传算法的惯用词汇。 遗传算法的思想解析 遗传算法(gentic algorithms简称GA)是模拟生物遗传和进化的全局优化搜索算法 ? 我们知道,在人类的演化中,达尔文的进化学说与孟德尔的遗传学说起着至关重要的理论指导。每个人作为一个个体组成一个人类种群,正是经历着物竞天择,才会让整个群体慢慢变的更好,即更加适应周围的环境。而每一代正是靠着基因交叉与变异才能繁衍出更加适应大自然规律的下一代个体。总之,在漫长的迭代进化中,一个不适应环境的群体,在物竞天择和交叉变异中慢慢变的适应了环境。 ? GA的思想完全模拟了生物的进化和遗传方式。我们在求解一个问题的最优解时,先人为的产生很多任意的解,组成一个解集(一个解是一个个体,一个解集是一个种群),这些解有好有坏。我们的最终目的是让这

变异概率自适应调整的遗传算法GA程序

变异概率自适应调整的遗传算法算例 一:优化函数:()()*sin 10*2,[1,2] f x x x x =+∈-+ A.变异概率自适应调整公式: B.遗传算法参数 (1)种群规模设为80,遗传算子分别为轮盘法选择,多点点交叉和多点自适应变异; (2)交叉概率0.7,变异概率0.01; (3)最大进化代数为100代,保优操作。 C.程序框图 图 1 程序流程框图 ()()12max 1max 1 ,,m m m avg avg m m avg P P f f P f f f f P P f f --?-≥?-=??

二:程序及运行结果 (1)%变异概率自适应调整的GA程序 %优化函数为f=x*sin(10*x)+2,其中,-1=

人工智能之遗传算法论文含源代码

30维线性方程求解 摘要:非线性方程组的求解是数值计算领域中最困难的问题,大多数的数值求解算法例如牛顿法的收敛性和性能特征在很大程度上依赖于初始点。但是对于很多高维的非线性方程组,选择好的初始点是一件非常困难的事情。本文采用了遗传算法的思想,提出了一种用于求解非线性方程组的混合遗传算法。该混合算法充分发挥了遗传算法的群体搜索和全局收敛性。选择了几个典型非线性方程组,考察它们的最适宜解。 关键词:非线性方程组;混合遗传算法;优化 1. 引言遗传算法是一种通用搜索算法,它基于自然选择机制和自然遗传规律来模拟自然界的进化过程,从而演化出解决问题的最优方法。它将适者生存、结构化但同时又是 随机的信息交换以及算法设计人的创造才能结合起来,形成一种独特的搜索算法,把一些解决方案用一定的方式来表示,放在一起成为群体。每一个方案的优劣程度即为适应性,根据自然界进化“优胜劣汰”的原则,逐步产生它们的后代,使后代具有更强的适应性,这样不断演化下去,就能得到更优解决方案。 随着现代自然科学和技术的发展,以及新学科、新领域的出现,非线性科学在工农业、经济政治、科学研究方面逐渐占有极其重要的位置。在理论研究和应用实践中,几乎绝大多数的问题都最终能化为方程或方程组,或者说,都离不开方程和方程组的求解。因此,在非线性问题中尤以非线性方程和非线性方程组的求解最为基本和重要。传统的解决方法,如简单迭代法、牛顿法、割线法、延拓法、搜索法、梯度法、共轭方向法、变尺度法,无论从算法的选择还是算法本身的构造都与所要解决的问题的特性有很大的关系。很多情况下,算法中算子的构造及其有效性成为我们解决问题的巨大障碍。而遗传算法无需过多地考虑问题的具体形式,因为它是一种灵活的自适应算法,尤其在一些非线性方程组没有精确解的时候,遗传算法显得更为有效。而且,遗传算法是一种高度并行的算法,且算法结构简单,非常便于在计算机上实现。本文所研究的正是将遗传算法应用于求解非线性方程组的问题。 2. 遗传算法解非线性方程组为了直观地观察用遗传算法求解非线性方程组的效果,我们这里用代数非线性方程组作为求解的对象问题描述:非线性方程组指的是有n 个变量(为了简化讨论,这里只讨论实变量方程组)的方程组 中含有非线性方程。其求解是指在其定义域内找出一组数能满足方程组中的每 个方程。这里,我们将方程组转化为一个函数则求解方程组就转化为求一组值使得成立。即求使函数取得最小值0 的一组数,于是方程组求解问题就转变为函数优化问题 3. 遗传算子 遗传算子设计包括交叉算子、变异算子和选择算子的设计。

遗传算法案例分析及源代码

一.问题描述: 在某一区域内有n 个客户,拟建一个物流中心,已知客户j 地址坐标为),(i i y x 。确定物流中心的地址坐标),(y x ,使得该物流中心到几个客户之间的距离最短。 假设:简单的用两点之间的距离代替运输距离。 目标函数: 22)()(min i i y Y x X z -+-= 约束条件: } 8,7,6,5,4,3,2,1,0{}8,7,6,5,4,3,2,1,0{X ∈∈Y 假设某一区域内有 5 个客户,其位置坐标如下表所示, 客户坐标及相关需求量 客户 X (km) Y(km) 1 1 5 2 2 8 3 5 1 4 7 6 5 8 3 (1)变量: C :是一个1*6数组,每个数组里面是一个6位二进制数,它是遗传算法中的染色体。 new_c:每一轮的新变量c 。 first_c:初始群体矩阵。 sur_value :个体适应值的概率值,为0-1之间的数,所有概率值和为1。 survived :经过选择运算后产生的个体基因型组合。 intersect_c :经过交叉运算后产生的个体基因型组合。 mutation_c :经过变异运算后产生的个体基因型组合。 f :最后计算得到的最大值 (2)程序里面的方程 function out = value_function( ci ):价值函数(自适应度函数)。 function [ sur_value ] = calc_value( c ):计算群体中每一个个体的适应度的值 function survived = surviver( sur_value ):利用概率选择函数 function [ intersect_c ] = intersect( new_c ):交叉运算 function [ mutation_c ,mutation_value] = mutation( intersect_c ):变异运算 (1)遗传算法主程序 %遗传算法的主程序

基于遗传算法PID控制寻优实现(有代码超详细)

基于遗传优化算法对离散PID控制器参数的优化设计摘要 PID控制作为一种经典的控制方法,从诞生至今,历经数十年的发展和完善,因其优越的控制性能业已成为过程控制领域最为广泛的控制方法;PID控制器具有结构简单、适应性强、不依赖于被控对象的精确模型、鲁棒性较强等优点,其控制性能直接关系到生产过程的平稳高效运行,因此对PID控制器设计和参数整定问题的研究不但具有理论价值更具有很大的实践意义,遗传算法是一种借鉴生物界自然选择和自然遗传学机理上的迭代自适应概率性搜索算法。本论文主要应用遗传算法对PID调节器参数进行优化。 关键词:遗传优化算法PID控制器参数优化 1.前言 PID调节器是最早发展起来的控制策略之一,因为它所涉及的设计算法和控制结构都是简单的,并且十分适用于工程应用背景,此外PID控制方案并不要求精确的受控对象的数学模型,且采用PID控制的控制效果一般是比较令人满意的,所以在工业实际应用中,PID调节器是应用最为广泛的一种控制策略,也是历史最久、生命力最强的基本控制方式。调查结果表明: 在当今使用的控制方式中,PID型占84. 5% ,优化PID型占68%,现代控制型占有15%,手动控制型66%,人工智能(AI)型占0.6% 。如果把PID型和优化PID型二者加起来,则占90% 以上,这说明PID控制方式占绝大多数,如果把手动控制型再与上述两种加在一起,则占97.5% ,这说明古典控制占绝大多数。就连科学技术高度发达的日本,PID控制的使用率也高达84.5%。这是由于理论分析及实际运行经验已经证明了PID调节器对于相当多的工业过程能够起到较为满足的控制效果。它结构简单、适用面广、鲁棒性强、参数易于调整、在实际中容易被理解和实现、在长期应用中己积累了丰富的经验。特别在工业过程中,由于控制对象的精确数学模型难以建立,系统的参数又经常发生变化,运用现代控制理论分析综合要耗费很大的代价进行模型辨识,但往往不能达到预期的效果,所以不论常规调节仪表还是数

MATLAB课程遗传算法实验报告及源代码

硕士生考查课程考试试卷 考试科目:MATLAB教程 考生姓名:张宜龙考生学号:2130120033 学院:管理学院专业:管理科学与工程考生成绩: 任课老师(签名) 考试日期:年月日午时至时

《MATLAB 教程》试题: A 、利用MATLA B 设计遗传算法程序,寻找下图11个端点的最短路径,其中没有连接的端点表示没有路径。要求设计遗传算法对该问题求解。 a e h k B 、设计遗传算法求解f (x)极小值,具体表达式如下: 3 21231(,,)5.12 5.12,1,2,3 i i i f x x x x x i =?=???-≤≤=? ∑ 要求必须使用m 函数方式设计程序。 C 、利用MATLAB 编程实现:三名商人各带一个随从乘船渡河,一只小船只能容纳二人,由他们自己划行,随从们密约,在河的任一岸,一旦随从的人数比商人多,就杀人越货,但是如何乘船渡河的大权掌握在商人手中,商人们怎样才能安全渡河? D 、结合自己的研究方向选择合适的问题,利用MATLAB 进行实验。 以上四题任选一题进行实验,并写出实验报告。

选择题目: B 、设计遗传算法求解f (x)极小值,具体表达式如下: 3 21231(,,)5.12 5.12,1,2,3 i i i f x x x x x i =?=???-≤≤=? ∑ 要求必须使用m 函数方式设计程序。 一、问题分析(10分) 这是一个简单的三元函数求最小值的函数优化问题,可以利用遗传算法来指导性搜索最小值。实验要求必须以matlab 为工具,利用遗传算法对问题进行求解。 在本实验中,要求我们用M 函数自行设计遗传算法,通过遗传算法基本原理,选择、交叉、变异等操作进行指导性邻域搜索,得到最优解。 二、实验原理与数学模型(20分) (1)试验原理: 用遗传算法求解函数优化问题,遗传算法是模拟生物在自然环境下的遗传和进化过程而形成的一种自适应全局优化概率搜索方法。其采纳了自然进化模型,从代表问题可能潜在解集的一个种群开始,种群由经过基因编码的一定数目的个体组成。每个个体实际上是染色体带有特征的实体;初始种群产生后,按照适者生存和优胜劣汰的原理,逐代演化产生出越来越好的解:在每一代,概据问题域中个体的适应度大小挑选个体;并借助遗传算子进行组合交叉和主客观变异,产生出代表新的解集的种群。这一过程循环执行,直到满足优化准则为止。最后,末代个体经解码,生成近似最优解。基于种群进化机制的遗传算法如同自然界进化一样,后生代种群比前生代更加适应于环境,通过逐代进化,逼近最优解。 遗传算法是一种现代智能算法,实际上它的功能十分强大,能够用于求解一些难以用常规数学手段进行求解的问题,尤其适用于求解多目标、多约束,且目标函数形式非常复杂的优化问题。但是遗传算法也有一些缺点,最为关键的一点,即没有任何理论能够证明遗传算法一定能够找到最优解,算法主要是根据概率论的思想来寻找最优解。因此,遗传算法所得到的解只是一个近似解,而不一定是最优解。 (2)数学模型 对于求解该问题遗传算法的构造过程: (1)确定决策变量和约束条件;

遗传算法案例及源代码

计算智能作业三:遗传算法计算问题 1.问题描述: 求下述二元函数的最大值: 22 2121),(max x x x x f += S.t. }7,6,5,4,3,2,1{1∈x }7,6,5,4,3,2,1{2∈x 2.程序结构: (1)变量: C :是一个1*6数组,每个数组里面是一个6位二进制数,它是遗传算法中的染色体。 new_c:每一轮的新变量c 。 first_c:初始群体矩阵。 sur_value :个体适应值的概率值,为0-1之间的数,所有概率值和为1。 survived :经过选择运算后产生的个体基因型组合。 intersect_c :经过交叉运算后产生的个体基因型组合。 mutation_c :经过变异运算后产生的个体基因型组合。 f :最后计算得到的最大值 (2)程序里面的方程 function out = value_function( ci ):价值函数(自适应度函数),即2 22121),(x x x x f +=。 function [ sur_value ] = calc_value( c ):计算群体中每一个个体的适应度的值 function survived = surviver( sur_value ):利用概率选择函数 function [ intersect_c ] = intersect( new_c ):交叉运算 function [ mutation_c ,mutation_value] = mutation( intersect_c ):变异运算 3.源程序 (1)遗传算法的主程序 主程序包括初始群体产生,最终结果展示,即各函数之间的调用关系。 个体编码 遗传算法的运算对象是表示个体的符号串,所以必须把变量 x1, x2 编码为无符号二进制整数。这个二进制整数位个体的基因型。 因为x1, x2 为 0 ~ 7之间的整数,所以分别用3位无符号二进制整数来表示,将它们连接在一起所组成的6位无符号二进制数就形成了个体的基因型,表示一个可行解。 如一下表格表示基因型和表现型之间的对应关系: 个体 基因型 表现型 1 111001 (7,1) 2 100111 (4,7) 3 011011 (3,3) 4 101110 (5,6)

遗传算法Matlab源代码

function [X,MaxFval,BestPop,Trace]=fga(FUN,bounds,MaxEranum,PopSize,options,pCross,pMutation,pInversion) % [X,MaxFval,BestPop,Trace]=fga(FUN,bounds,MaxEranum,PopSize,options,pCross,pMutation,pInversion) % Finds a maximum of a function of several variables. % fga solves problems of the form: % max F(X) subject to: LB <= X <= UB (LB=bounds(:,1),UB=bounds(:,2)) % X - 最优个体对应自变量值 % MaxFval - 最优个体对应函数值 % BestPop - 最优的群体即为最优的染色体群 % Trace - 每代最佳个体所对应的目标函数值 % FUN - 目标函数 % bounds - 自变量范围 % MaxEranum - 种群的代数,取50--500(默认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<2, error('FMAXGA requires at least three input arguments'); end if nargin==2, MaxEranum=150;PopSize=100;options=[1 1e-4];pCross=0.85;pMutation=0.1;pInversion=0.25;end if nargin==3, PopSize=100;options=[1 1e-4];pCross=0.85;pMutation=0.1;pInversion=0.25;end if nargin==4, options=[1 1e-4];pCross=0.85;pMutation=0.1;pInversion=0.25;end if nargin==5, pCross=0.85;pMutation=0.1;pInversion=0.25;end if nargin==6, pMutation=0.1;pInversion=0.25;end if nargin==7, pInversion=0.25;end if (options(1)==0|options(1)==1)&find((bounds(:,1)-bounds(:,2))>0) error('数据输入错误,请重新输入:'); end % 定义全局变量 global m n NewPop children1 children2 VarNum % 初始化种群和变量 precision = options(2); bits = ceil(log2((bounds(:,2)-bounds(:,1))' ./ precision));%由设定精度划分区间 VarNum = size(bounds,1); [Pop] = InitPop(PopSize,bounds,bits,options);%初始化种群 [m,n] = size(Pop); fit = zeros(1,m); NewPop = zeros(m,n); children1 = zeros(1,n); children2 = zeros(1,n); pm0 = pMutation; BestPop = zeros(MaxEranum,n);%分配初始解空间BestPop,Trace Trace = zeros(1,MaxEranum);

相关文档
最新文档