当前位置:文档之家› 遗传算法并行源程序

遗传算法并行源程序

遗传算法并行源程序
遗传算法并行源程序

//THBGFSHFGBCVXNCH

#define WIN32_LEAN_AND_MEAN // 从Windows 头中排除极少使用的资料

#include

#include

#include

#include

#include

#include

#include

#include

#pragma comment(lib,"Wininet.lib")

#pragma comment(lib,"mpi.lib")

#pragma comment(lib,"cxx.lib")

#define POPSIZE 6 /* 群体大小,其实就是基因总数*/

#define MAXGENS 10 /* 进化代数*/

#define NVARS 3 /* 问题变量数,即基因的长度*/

#define PXOVER 0.8 /* 交叉概率*/

#define PMUTATION 0.15 /* 变异概率*/

#define TRUE 1

#define FALSE 0

int generation; /* 记录当前已经进化的代数*/

int cur_best; /* 最优个体*/

FILE *galog; /* 日志文件*/

struct genotype /* 基因类型*/

{

double gene[NV ARS]; /* 染色体字符串*/

double upper[NV ARS]; /* 每个基于的上界*/

double lower[NV ARS]; /* 每个基因的下界*/

double fitness; /* 个体适应度*/

double rfitness; /* 相对适应度*/

double cfitness; /* 累积适应度*/

};

struct genotype population[POPSIZE+1]; /* 种群*/

struct genotype newpopulation[POPSIZE+1]; /* 新种群*/

void initialize(void); /* 种群初始化函数*/ double randval(double, double); /* 随机函数*/

void keep_the_best(void); /*寻找最优个体*/

void elitist(void); /* 保持最优*/ void select(void); /* 选择算子*/

void crossover(void); /* 交叉算子*/

void Xover(int,int); /* 交叉操作*/

void swap(double *, double *); /* 交换*/

void evaluate(void); /* 个体适应度评价*/ void worker(genotype *,int ) /* 从处理器操作,突变和适应度评价*/ void report(void); /* 记录*/

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

初始化基因值,适应值。从gadata.txt中读入每

个变量的上下限,然后随机产生。

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

void initialize(void)

{

FILE *infile;

int i, j;

double lbound, ubound;

if ((infile = fopen("gadata.txt","r"))==NULL)

{

fprintf(galog,"\nCannot open input file!\n");

exit(1);

}

for (i = 0; i < NV ARS; i++)//nvars==3,问题变量数

{

fscanf(infile, "%lf",&lbound);

fscanf(infile, "%lf",&ubound);

for (j = 0; j < POPSIZE; j++)//50

{

population[j].fitness = 0;

population[j].rfitness = 0;

population[j].cfitness = 0;

population[j].lower[i] = lbound;

population[j].upper[i]= ubound;

population[j].gene[i] = randval(population[j].lower[i],

population[j].upper[i]);

}

}

fclose(infile);

}

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

/* 在上下界间产生一个数*/

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

double randval(double low, double high)

{

double val;

val = ((double)(rand()%1000)/1000.0)*(high - low) + low;

return(val);

}

/***************************************************************/ /* Keep_the_best function: 保持对最优个体的追踪*/

/***************************************************************/ void keep_the_best()//将最优的值放在最后一个空位上

{

int mem;

int i;

cur_best = 0; /* 最优个体索引*/

for (mem = 0; mem < POPSIZE; mem++)

{

if (population[mem].fitness > population[POPSIZE].fitness)

{

cur_best = mem;

population[POPSIZE].fitness = population[mem].fitness;

}

}

/* once the best member in the population is found, copy the genes */

for (i = 0; i < NV ARS; i++)

population[POPSIZE].gene[i] = population[cur_best].gene[i];

}

/****************************************************************/ /* Elitist function: 如果这一代的最好值比上一代的*/

/* 差,那么用上一代的最好值替代本代的最差值*/

/****************************************************************/ void elitist()

{

int i;

double best, worst; /* best and worst fitness values */

int best_mem, worst_mem; /* indexes of the best and worst member */

best = population[0].fitness;

worst = population[0].fitness;

for (i = 0; i < POPSIZE - 1; ++i)//找出最好和最坏的适应度

{

if(population[i].fitness > population[i+1].fitness)

{

if (population[i].fitness >= best)

{

best = population[i].fitness;

best_mem = i;

}

if (population[i+1].fitness <= worst)

{

worst = population[i+1].fitness;

worst_mem = i + 1;

}

}

else

{

if (population[i].fitness <= worst)

{

worst = population[i].fitness;

worst_mem = i;

}

if (population[i+1].fitness >= best)

{

best = population[i+1].fitness;

best_mem = i + 1;

}

}

}

/* 如果新一代种群中的最优个体比前一代的最优个体好,*/

/* best取此值,反之用上一代最优个体取代当前代的最差个体。*/

if (best >= population[POPSIZE].fitness)

{

for (i = 0; i < NV ARS; i++)

population[POPSIZE].gene[i] = population[best_mem].gene[i];

population[POPSIZE].fitness = population[best_mem].fitness;

}

else

{

for (i = 0; i < NV ARS; i++)

population[worst_mem].gene[i] = population[POPSIZE].gene[i];

population[worst_mem].fitness = population[POPSIZE].fitness;

}

}

/*************************************************************************/ /* Selection function: 适者生存通过适应度大小筛选,适*/

/* 应度越大,出现的次数越多(会有重复)*/

/*************************************************************************/ void select(void)//

{

int mem, i, j, k=0;

double sum = 0;

double p;

/* 计算适应度总和*/

for (mem = 0; mem < POPSIZE; mem++)

sum += population[mem].fitness;

}

/* 计算相对适应度,有点像概率密度*/

for (mem = 0; mem < POPSIZE; mem++)

{

population[mem].rfitness = population[mem].fitness/sum;

}

/* 计算累计适应度,有点像分布函数*/

population[0].cfitness = population[0].rfitness;

for (mem = 1; mem < POPSIZE; mem++)

{

population[mem].cfitness = population[mem-1].cfitness +

population[mem].rfitness;

}

/* 使用累计适应度确定幸存者,落在哪个概率区域就选择相应的概率区域上的染色体*/ for (i = 0; i < POPSIZE; i++)

{

p = rand()%1000/1000.0;

if (p < population[0].cfitness)

newpopulation[i] = population[0];//选择

else

{

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

if (p >= population[j].cfitness &&

p

newpopulation[i] = population[j+1];//选择

}

}

/* 确定全部的幸存者后,拷贝回population完成选择*/

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

population[i] = newpopulation[i];

}

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

/* Crossover selection: 单随机点交叉,前后两个*/

/* 个体交叉,得到两个新的个体,原来的个体消失*/

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

void crossover(void)

{

int i=0, mem, one;

int first = 0; /* count of the number of members chosen */

double x;

for (mem = 0; mem < POPSIZE; ++mem)

x = rand()%1000/1000.0;

if (x < PXOVER) //按交叉概率进行交叉

{

++first;

if (first % 2 == 0)

Xover(one, mem); //相邻的两个交叉

else

one = mem;

}

}

}

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

/* Crossover: 交叉操作*/

/**************************************************************/ void Xover(int one, int two)

{

int i;

int point; /* crossover point */

/* select crossover point */

if(NV ARS > 1) //等于1时就没有交叉的必要{

if(NV ARS == 2)

point = 1;

else

point = (rand() % (NV ARS - 1)) + 1;

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

swap(&population[one].gene[i], &population[two].gene[i]);

}

}

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

/* Swap: 互换*/ /*************************************************************/

void swap(double *x, double *y)

{

double temp;

temp = *x;

*x = *y;

*y = temp;

void evaluate(void) /*个体适应度评价函数*/

{

int mem;

int i;

double x[NV ARS+1];

for (mem = 0; mem < POPSIZE; mem++)

{

for (i = 0; i < NV ARS; i++)

x[i+1] = population[mem].gene[i];

population[mem].fitness = x[1]*x[1] + x[2]*x[2] + x[3]*x[3];//计算得到适应度

}

}

void report(void)

{

double best_val; /* 种群中最高适应度值*/

double avg; /* 平均适应度值*/

double stddev; /* 标准方差*/

double sum_square; /* 平方的总数*/

double square_sum; /* 总数的平方*/

double sum; /* 适应度值总和*/

sum = 0.0;

sum_square = 0.0;

for (int i = 0; i < POPSIZE; i++)

{

sum += population[i].fitness;

sum_square += population[i].fitness * population[i].fitness;

}

avg = sum/(double)POPSIZE;

square_sum = avg * avg * POPSIZE;

stddev = sqrt((sum_square - square_sum)/(POPSIZE - 1));

best_val = population[POPSIZE].fitness;

fprintf(galog, "%5d \t\t %6.3f \t %6.3f \t %6.3f\n", generation, best_val, avg, stddev);

printf("%5d \t\t %6.3f \t %6.3f \t %6.3f\n", generation, best_val, avg, stddev);

}

void worker(genotype * subpopulation,int mysize) /*突变和适应度评价操作*/ {

double lbound, hbound;

double x;

for (int i = 0; i < mysize; i++)

{

for (int j = 0; j < NV ARS; j++)

{

x = rand()%1000/1000.0;

if (x < PMUTA TION)

{

lbound = subpopulation->lower[j];

hbound = subpopulation->upper[j];

subpopulation[i].gene[j] = randval(lbound, hbound);

}

}

}//end 变异

//适应度评价

int mem;

double xchorm[NV ARS+1];

for (mem = 0; mem < mysize; mem++)

{

for (int i = 0; i < NV ARS; i++)

xchorm[i+1] = subpopulation[mem].gene[i];

subpopulation[mem].fitness = (xchorm[1]*xchorm[1]) + (xchorm[1]*xchorm[2]) + xchorm[3]*xchorm[3];//计算得到适应度F1

}//end适应度评价

}

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

/*主函数*/

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

void main(int argc,char *argv[])

{

int myid,numprocs,mysize;

int i,j;

double starttime,endtime;

MPI_Status status;

MPI_Request request;

MPI_Init(&argc,&argv);

MPI_Comm_rank(MPI_COMM_WORLD,&myid);

MPI_Comm_size(MPI_COMM_WORLD,&numprocs);

if (numprocs>1)

mysize = POPSIZE/(numprocs-1);//每个从处理器上应该分配的个体数

else if (numprocs==1) mysize= POPSIZE;

genotype * subpopulation = (genotype*)malloc(mysize*sizeof(genotype));

if (!subpopulation)

{

printf("不能获得%d 个大小的空间\n",mysize);

MPI_Abort(MPI_COMM_WORLD,1);

}

//自定义数据类型

MPI_Datatype mystruct;

int blocklens[6];

MPI_Aint indices[6];

MPI_Datatype old_types[6];

//各块中数据个数

blocklens[0] = NV ARS;

blocklens[1] = NV ARS;

blocklens[2] = NV ARS;

blocklens[3] = 1;

blocklens[4] = 1;

blocklens[5] = 1;

//数据类型

for (i =0;i<6;i++) old_types[i]=MPI_DOUBLE;

//求地址和相对偏移

MPI_Address(&population->gene,&indices[0]);

MPI_Address(&population->upper,&indices[1]);

MPI_Address(&population->lower,&indices[2]);

MPI_Address(&population->fitness,&indices[3]);

MPI_Address(&population->rfitness,&indices[4]);

MPI_Address(&population->cfitness,&indices[5]);

indices[5]=indices[5]-indices[0];

indices[4]=indices[4]-indices[0];

indices[3]=indices[3]-indices[0];

indices[2]=indices[2]-indices[0];

indices[1]=indices[1]-indices[0];

indices[0]=0;

MPI_Type_struct(6,blocklens,indices,old_types,&mystruct);//生成新的mpi数据类型MPI_Type_commit(&mystruct);

//输出表头,初始化,初步测评,初步寻优

if(myid == 0)

{

starttime=MPI_Wtime();

if ((galog = fopen("galog.txt","w"))==NULL)

exit(1);

fprintf(galog, "generation \t best \t \t average \t standard\n");

fprintf(galog, "number \t value\t \t fitness \t deviation\n");

generation = 0;

initialize();//编码

evaluate();//适应度评价函数

keep_the_best();//寻找到最优的染色体,并将之放置在群体的最后一个空位上}

//开始进化

while(generation

{

generation++;

if (myid==0)//master

{

select(); //选择适应度高的个体

crossover(); //交叉,交叉率为80%

//分配数据,处理后回收数据

for (i=1;i<= numprocs -1;i++) //发送

{

for(j=0;j

subpopulation[j] = population[mysize*(i-1)+j]; /*

for(j=0;j

printf("\n

发%f %f %f %f",subpopulation[j].fitness,subpopulation[j].gene[0],subpopulation[j].gene[1],subpo pulation[j].gene[2]);*/

MPI_Ssend(subpopulation,mysize,mystruct,i,1,MPI_COMM_WORLD);//分配

}

for (i=1;i<= numprocs -1;i++) //接收

{

MPI_Recv(subpopulation,mysize,mystruct,i,2,MPI_COMM_WORLD,&status);//回收

for(j=0;j

population[mysize*(i-1)+j] = subpopulation[j];

}

report(); //输出和写下每一代中最优秀的个体的适应度值,平均适应度值以及方差等elitist(); //如果这一代的最好值比上一代的差,那么用上一代的最好值替代本代的最差值

}//end master

else{//workers

MPI_Recv(subpopulation,mysize,mystruct,0,1,MPI_COMM_WORLD,&status);

worker(subpopulation,mysize); //mutate and value

MPI_Ssend(subpopulation,mysize,mystruct,0,2,MPI_COMM_WORLD);/*

for(j=0;j

printf("\n

收%f %f %f %f",subpopulation[j].fitness,subpopulation[j].gene[0],subpopulation[j].gene[1],subpo pulation[j].gene[2]);*/

}

MPI_Barrier(MPI_COMM_WORLD);

}

if (myid==0)

{

fprintf(galog,"Simulation completed\n");

fprintf(galog,"Best member:\n");

for (i = 0; i < NV ARS; i++)

fprintf (galog," var(%d) = %3.3f\n",i,population[POPSIZE].gene[i]);

fprintf(galog,"Best fitness = %3.3f",population[POPSIZE].fitness); printf("\nSuccess\n");

endtime=MPI_Wtime();

printf("mpi的时间:%f 秒",endtime-starttime);

fprintf(galog,"mpi的时间:%f 秒",endtime-starttime);

fclose(galog);

}

MPI_Type_free(&mystruct);

MPI_Finalize();

}

这里附上gadata.txt的内容:

-5.12 5.12 -5.12 5.12 -5.12 5.12

注:上面的值是基因值的上下限。

遗传算法的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()函数随机产生一位交叉位,把染色

遗传算法并行化的研究.doc

遗传算法并行化的研究 学号:SC02011036 姓名:黄鑫 摘要 本文是针对遗传算法并行化进行了研究,首先简要给出了基本遗传算法的形式化描述,然后做了并行性的分析,详细介绍了遗传算法的结构化并行模型:步进模型,岛屿模型,邻接模型,最后指出了进一步要研究的课题。 关键词:遗传算法,并行计算,结构化GA 1引言 遗传算法(GA)是根据达尔文进化论“优胜劣汰,适者生存”的一种启发式搜索算法。采用选择,交叉,变异等基本变化算子在解空间同时进行多点搜索,本身固有并行性。随着大规模并行机的迅速发展,将并行机的高速性与遗传算法并行性结合起来,从而促进遗传算法的发展。然而,仅仅将基本遗传算法硬件并行化伴随着大量通讯开销等问题,从而必须对标准GA的进行改进,使得并行遗传算法不单单是遗传算法硬件并行实现,更重要的是结构化的遗传算法。本文首先给出了GA形式化描述,对基本GA的可并行性做出分析,然后给出了并行GA的模型,最后指出了并行遗传算法还需要解决的问题。 2 基本遗传算法 在这里我们不对遗传算法做过多的介绍,只是给出基本遗传算法的形式化描述:begin (1)initialization (1.1)产生一个初始群体 (1.2)评估第一代整个群体的适应度值 (2)while running do (2.1)选择父代 (2.2)交叉操作 (2.3)子代变异 (2.4)评估子代的适应度 (2.5)子代取代父代,形成新的一带个体 endwhile end 3 遗传算法的并行性分析 从第一节对遗传算法的描述,我们可以看出基本遗传算法模型是一个反复迭代的进化计算过程,通过对一组表示候选解的个体进行评价、选择、交叉、变异等操作,来产生新一代的个体(候选解),这个迭代过程直到满足某种结束条件为止。对应于基本遗传算法的运行过程,为实现其并行化要求,可以从下面四种并行性方面着手对其进行改进和发展。 并行性Ⅰ:个体适应度评价的并行性。 个体适应度的评价在遗传算法中占用的运行时间比较大。通过对适应度并行计算方法的研究,可提高个体适应度评价的计算效率。 并行性Ⅱ:整个群体各个个体适应度评价的并行性。

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

硕士生考查课程考试试卷 考试科目: 考生姓名:考生学号: 学院:专业: 考生成绩: 任课老师(签名) 考试日期:年月日午时至时

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

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

遗传算法与优化问题

实验十遗传算法与优化问题 一、问题背景与实验目的 遗传算法(Genetic Algorithm —GA),就是模拟达尔文的遗传选择与自然淘汰的生物进化过程的计算模型,它就是由美国Michigan大学的J、Holla nd教授于1975 年首先提出的?遗传算法作为一种新的全局优化搜索算法,以其简单通用、鲁棒性强、适于并行处理及应用范围广等显著特点,奠定了它作为21世纪关键智能计算之一的地位. 本实验将首先介绍一下遗传算法的基本理论,然后用其解决几个简单的函数最值问题,使读者能够学会利用遗传算法进行初步的优化计算? 1. 遗传算法的基本原理 遗传算法的基本思想正就是基于模仿生物界遗传学的遗传过程?它把问题的参数用基因代表,把问题的解用染色体代表(在计算机里用二进制码表示),从而得到一个由具有不同染色体的个体组成的群体?这个群体在问题特定的环境里生存 竞争,适者有最好的机会生存与产生后代?后代随机化地继承了父代的最好特征,并也在生存环境的控制支配下继续这一过程.群体的染色体都将逐渐适应环境,不断进化,最后收敛到一族最适应环境的类似个体,即得到问题最优的解?值得注意的一点就是,现在的遗传算法就是受生物进化论学说的启发提出的,这种学说对我们用计算机解决复杂问题很有用,而它本身就是否完全正确并不重要(目前生物界对此学说尚有争议). (1)遗传算法中的生物遗传学概念 由于遗传算法就是由进化论与遗传学机理而产生的直接搜索优化方法;故而 在这个算法中要用到各种进化与遗传学的概念? 首先给出遗传学概念、遗传算法概念与相应的数学概念三者之间的对应关系这些概念

(2)遗传算法的步骤 遗传算法计算优化的操作过程就如同生物学上生物遗传进化的过程,主要有三个基本操作(或称为算子):选择(Selection)、交叉(Crossover)、变异(Mutation). 遗传算法基本步骤主要就是:先把问题的解表示成“染色体”,在算法中也就就是以二进制编码的串,在执行遗传算法之前,给出一群“染色体”,也就就是假设的可行解.然后,把这些假设的可行解置于问题的“环境”中,并按适者生存的原则从中选 择出较适应环境的“染色体”进行复制 ,再通过交叉、变异过程产生更适 应环境的新一代“染色体”群.经过这样的一代一代地进化,最后就会收敛到最适应环境的一个“染色体”上,它就就是问题的最优解. 下面给出遗传算法的具体步骤,流程图参见图1: 第一步:选择编码策略,把参数集合(可行解集合)转换染色体结构空间; 第二步:定义适应函数,便于计算适应值; 第三步:确定遗传策略,包括选择群体大小,选择、交叉、变异方法以及确定交叉概率、变异概率等遗传参数; 第四步:随机产生初始化群体; 第五步:计算群体中的个体或染色体解码后的适应值; 第六步:按照遗传策略,运用选择、交叉与变异算子作用于群体,形成下一代群体; 第七步:判断群体性能就是否满足某一指标、或者就是否已完成预定的迭代次数,不满足则返回第五步、或者修改遗传策略再返回第六步. 图1 一个遗传算法的具体步骤

基于遗传算法的matlab源代码

function youhuafun D=code; N=50;%Tunable maxgen=50;%Tunable crossrate=0.5;%Tunable muterate=0.08;%Tunable generation=1; num=length(D); fatherrand=randint(num,N,3); score=zeros(maxgen,N); while generation<=maxgen ind=randperm(N-2)+2;%随机配对交叉 A=fatherrand(:,ind(1:(N-2)/2)); B=fatherrand(:,ind((N-2)/2+1:end)); %多点交叉 rnd=rand(num,(N-2)/2); ind=rnd tmp=A(ind); A(ind)=B(ind); B(ind)=tmp; %%两点交叉 %for kk=1:(N-2)/2 %rndtmp=randint(1,1,num)+1; %tmp=A(1:rndtmp,kk); %A(1:rndtmp,kk)=B(1:rndtmp,kk); %B(1:rndtmp,kk)=tmp; %end fatherrand=[fatherrand(:,1:2),A,B]; %变异 rnd=rand(num,N); ind=rnd[m,n]=size(ind); tmp=randint(m,n,2)+1; tmp(:,1:2)=0; fatherrand=tmp+fatherrand; fatherrand=mod(fatherrand,3); %fatherrand(ind)=tmp; %评价、选择 scoreN=scorefun(fatherrand,D);%求得N个个体的评价函数 score(generation,:)=scoreN; [scoreSort,scoreind]=sort(scoreN); sumscore=cumsum(scoreSort); sumscore=sumscore./sumscore(end); childind(1:2)=scoreind(end-1:end); for k=3:N tmprnd=rand; tmpind=tmprnd difind=[0,diff(t mpind)]; if~any(difind) difind(1)=1; end childind(k)=scoreind(logical(difind)); end fatherrand=fatherrand(:,childind); generation=generation+1; end %score maxV=max(score,[],2); minV=11*300-maxV; plot(minV,'*');title('各代的目标函数值'); F4=D(:,4); FF4=F4-fatherrand(:,1); FF4=max(FF4,1); D(:,5)=FF4; save DData D function D=code load youhua.mat %properties F2and F3 F1=A(:,1); F2=A(:,2); F3=A(:,3); if(max(F2)>1450)||(min(F2)<=900) error('DATA property F2exceed it''s range (900,1450]') end %get group property F1of data,according to F2value F4=zeros(size(F1)); for ite=11:-1:1 index=find(F2<=900+ite*50); F4(index)=ite; end D=[F1,F2,F3,F4]; function ScoreN=scorefun(fatherrand,D) F3=D(:,3); F4=D(:,4); N=size(fatherrand,2); FF4=F4*ones(1,N); FF4rnd=FF4-fatherrand; FF4rnd=max(FF4rnd,1); ScoreN=ones(1,N)*300*11; %这里有待优化

一个简单实用的遗传算法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期作者简介:李红梅(1978-),女,湖南湘潭人,硕士,广东白云学院讲师,研究方向为演化计算。 1遗传算法的发展史 遗传算法(Genetic Algorithms )研究的历史比较短,20世纪 60年代末期到70年代初期,主要由美国家Michigan 大学的John Holland 与其同事、学生们研究形成了一个较完整的理论 和方法,遗传算法作为具有系统优化、适应和学习的高性能计算和建模方法的研究渐趋成熟。我国对于GA 的研究起步较晚,不过从20世纪90年代以来一直处于不断上升中。 2遗传算法的基本思想 遗传算法是从代表问题可能潜在解集的一个种群(popu- lation )开始的,而一个种群则由经过基因(gene )编码(coding ) 的一定数目的个体(individual )组成。每个个体实际上是染色体(chromosome )带有特征的实体。染色体作为遗传物质的主要载体,即多个基因的集合,其内部表现是某种基因组合,它决定了个体的形状的外部表现。初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代(generation )演化产生出越来越好的近似解。在每一代中,根据问题域中个体的适应度(fitness )、大小挑选(selection )个体,借助于自然遗传学的遗传算子(genetic operators )进行组合交叉(crossover )和变异(mutation ),产生出代 表新的解集的种群。这个过程将导致后生代种群比前代更加适应环境,末代种群中的最优个体经过解码(decoding ),可以作为问题近似最优解。 3遗传算法的一般流程 (1)随机产生一定数目的初始种群,每个个体表示为染色 体的基因编码; (2)计算每个个体的适应度,并判断是否符合优化准则。若符合,输出最佳个体及其代表的最优解并结束计算,否则转向第3步; (3)依据适应度选择再生个体,适应度高的个体被选中的概率高,适应度低的个体可能被淘汰; (4)执行交叉和变异操作,生成新的个体;(5)得到新一代的种群,返回到第2步。 4遗传算法的特点 传统的优化方法主要有三种:枚举法、启发式算法和搜索 算法: (1)枚举法 可行解集合内的所有可行解,以求出精确最 优解。对于连续函数,该方法要求先对其进行离散化处理,这样就可能因离散处理而永远达不到最优解。此外,当枚举空间比较大时,该方法的求解效率比较低,有时甚至在目前先进计算机工具上无法求解。 (2)启发式算法 寻求一种能产生可行解的启发式规则, 以找到一个最优解或近似最优解。该方法的求解效率比较高,但对每一个需求解的问题必须找出其特有的启发式规则。这个启发式规则一般无通用性,不适合于其它问题。 (3)搜索算法 寻求一种搜索算法,该算法在可行解集合 的一个子集内进行搜索操作,以找到问题的最优解或者近似最优解。该方法虽然保证不了一定能够得到问题的最优解,但若适当地利用一些启发知识,就可在近似解的质量和效率上达到一种较好的平衡。 遗传算法不同于传统的搜索和优化方法。主要区别在于: ①遗传算法直接处理问题参数的适当编码而不是处理参数集 本身。②遗传算法按并行方式搜索一个种群数目的点,而不是 遗传算法概述 李红梅 (广东白云学院计算机系,广东广州510450) 摘要:遗传算法是一种全局优化的随机搜索算法。它是解决复杂优化问题的有力工具。在工程设计、演化硬件电路 设计以及人工智能等方面应用前景广阔。系统地介绍了遗传算法的发展史、基本思想、特点、主要应用领域等相关方 面。 关键词:遗传算法;搜索;进化;最优解;种群中图分类号:TP312 文献标识码:A 文章编号:1672-7800(2009)01-0067-02 第8卷第1期2009年1月 Vol.8No.1Jan.2009 软件导刊 Software Guide

并行遗传算法

并行遗传算法及其应用 1、遗传算法(GA)概述 GA是一类基于自然选择和遗传学原理的有效搜索方法,它从一个种群开始,利用选择、交叉、变异等遗传算子对种群进行不断进化,最后得到全局最优解。生物遗传物质的主要载体是染色体,在GA中同样将问题的求解表示成“染色体Chromosome”,通常是二进制字符串表示,其本身不一定是解。首先,随机产生一定数据的初始染色体,这些随机产生的染色体组成一个种群(Population),种群中染色体的数目称为种群的大小或者种群规模。第二:用适值度函数来评价每一个染色体的优劣,即染色体对环境的适应程度,用来作为以后遗传操作的依据。第三:进行选择(Selection),选择过程的目的是为了从当前种群中选出优良的染色体,通过选择过程,产生一个新的种群。第四:对这个新的种群进行交叉操作,变异操作。交叉、变异操作的目的是挖掘种群中个体的多样性,避免有可能陷入局部解。经过上述运算产生的染色体称为后代。最后,对新的种群(即后代)重复进行选择、交叉和变异操作,经过给定次数的迭代处理以后,把最好的染色体作为优化问题的最优解。 GA通常包含5个基本要素:1、参数编码:GA是采用问题参数的编码集进行工作的,而不是采用问题参数本身,通常选择二进制编码。2、初始种群设定:GA随机产生一个由N个染色体组成的初始种群(Population),也可根据一定的限制条件来产生。种群规模是指种群中所含染色体的数目。3、适值度函数的设定:适值度函数是用来区分种群中个体好坏的标准,是进行选择的唯一依据。目前主要通过目标函数映射成适值度函数。4、遗传操作设计:遗传算子是模拟生物基因遗传的操作,遗传操作的任务是对种群的个体按照它们对环境的适应的程度施加一定的算子,从而实现优胜劣汰的进化过程。遗传基本算子包括:选择算子,交叉算子,变异算子和其他高级遗传算子。5、控制参数设定:在GA的应用中,要首先给定一组控制参数:种群规模,杂交率,变异率,进化代数等。 GA的优点是擅长全局搜索,一般来说,对于中小规模的应用问题,能够在许可的范围内获得满意解,对于大规模或超大规模的多变量求解任务则性能较差。另外,GA本身不要求对优化问题的性质做一些深入的数学分析,从而对那些不

遗传算法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;

遗传算法的并行实现

遗 传 算 法 (基于遗传算法求函数最大值) 指导老师:刘建丽 学号:S201007156 姓名:杨平 班级:研10级1班

遗传算法 一、 遗传算法的基本描述 遗传算法(Genetic Algorithm ,GA )是通过模拟自然界生物进化过程来求解优化问题的一类自组织、自适应的人工智能技术。它主要基于达尔文的自然进化论和孟德尔的遗传变异理论。多数遗传算法的应用是处理一个由许多个体组成的群体,其中每个个体表示问题的一个潜在解。对个体存在一个评估函数来评判其对环境的适应度。为反映适者生存的思想,算法中设计一个选择机制,使得:适应度好的个体有更多的机会生存。在种群的进化过程中,主要存在两种类型的遗传算子:杂交和变异。这些算子作用于个体对应的染色体,产生新的染色体,从而构成下一代种群中的个体。该过程不断进行,直到找到满足精度要求的解,或者达到设定的进化代数。显然,这样的思想适合于现实世界中的一大类问题,因而具有广泛的应用价值。遗传算法的每一次进化过程中的,各个体之间的操作大多可以并列进行,因此,一个非常自然的想法就是将遗传算法并行化,以提高计算速度。本报告中试图得到一个并行遗传算法的框架,并考察并行化之后的一些特性。为简单起见(本来应该考虑更复杂的问题,如TSP 。因时间有些紧张,做如TSP 等复杂问题怕时间不够,做不出来,请老师原谅),考虑的具有问题是:对给定的正整数n 、n 元函数f ,以及定义域D ,求函数f 在D 内的最大值。 二、 串行遗传算法 1. 染色体与适应度函数 对函数优化问题,一个潜在的解就是定义域D 中的一个点011(,,...,)n x x x -,因此,我们只需用一个长度为n 的实数数组来表示一个个体的染色体。由于问题中要求求函数f 的最大值,我们可以以个体所代表点011(,,...,)n x x x -在f 函数下的值来判断该个体的好坏。因此,我们直接用函数f 作为个体的适应度函数。 2. 选择机制 选择是遗传算法中最主要的机制,也是影响遗传算法性能最主要的因素。若选择过程中适应度好的个体生存的概率过大,会造成几个较好的可行解迅速占据种群,从而收敛于局部最优解;反之,若适应度对生存概率的影响过小,则会使算法呈现出纯粹的随机徘徊行为,算法无法收敛。下面我们介绍在实验中所使用的选择机制。

遗传算法的C语言程序案例

遗传算法的C语言程序案例 一、说明 1.本程序演示的是用简单遗传算法随机一个种群,然后根据所给的交叉率,变异率,世代数计算最大适应度所在的代数 2.演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的命令;相应的输入数据和运算结果显示在其后。3.举个例子,输入初始变量后,用y= (x1*x1)+(x2*x2),其中-2.048<=x1,x2<=2.048作适应度函数求最大适应度即为函数的最大值 4.程序流程图

5.类型定义 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(); 6.程序的各函数的简单算法说明如下: (1).void generateinitialpopulation ()和void input ()初始化种群和遗传算法参数。 input() 函数输入种群大小,染色体长度,最大世代数,交叉率,变异率等参数。 (2)void calculateobjectvalue();计算适应度函数值。 根据给定的变量用适应度函数计算然后返回适度值。 (3)选择函数selectoperator() 在函数selectoperator()中首先用rand ()函数产生0~1间的选择算子,当适度累计值不为零时,比较各个体所占总的适应度百分比的累计和与选择算子,直到达到选择算子的值那个个

MapReduce求解物流配送单源最短路径研究

MapReduce求解物流配送单源最短路径研究 摘要: 针对物流配送路线优化,提出了将配送路线问题分解成若干可并行操作的子问题的云计算模式。详细论述了基于标色法的MapReduce广度优先算法并行化模型、节点数据结构、算法流程和伪代码程序,并通过将该算法应用于快递公司的实际配送,验证了该算法的可行性。关键词: 物流配送; MapReduce;并行计算;最短路径 随着电子商务的普及,人们网上购物的习惯逐渐形成。截止2012年11月30日,阿里巴巴集团旗下淘宝和天猫2012年总交易额已经突破一万亿。综合淘宝和天猫的交易数据来看,以快递员为主体的中国物流配送业对电子商务发展的促进起到了巨大作用。同时传统邮政担负的包裹配送业务比重也逐渐地倾斜于第三方物流配送公司。目前我国物流配送运输成本占整个物流成本的35%~50%左右[1]。由于网购物品用户分布在城市的不同地方,为了控制配送运输成本,改善配送秩序,需要优化配送路线。优化配送路线的求解有串行算法和并行算法。串行算法主要表现在基于算法本身以及其优化组合的方法,例如CLARK G和WRIGHT J的节约算法、GILLETT B E和MILLER L R的扫描算法、Christofides等人的k度中心树和相关算法、Gendrean的禁忌搜索方法、LAWRENCE J 的遗传算法、Dijkstra算法、Nordbeck提出的椭圆限制搜索区域改进算法[2]。随着计算数据的海量化以及摩尔定律的失效(晶体管电路已经接近了其物理改进的极限),串行算法本身的改进和组合已不能适应需求。计算机科学领域出现了另一类并行最短路径分析算法设计,目前关于并行最短路径分析算法设计有基于MPI的主从Dijkstra并行算法[3]、MPI+open-MP混合算法[4]、社区分析的最短路径LC-2q并行算法[5]等。本文针对物流及时配送和成本控制需求,提出基于标色法的MapReduce广度优先算法并行化模型,并应用于配送线路优化问题。由于MapReduce本身封装了数据分割、负载均衡、容错处理等细节,用户只需要将实际应用问题分解成若干可并行操作的子问题,有效降低了求解难度,为解决物流配送运输路径优化问题提供了技术支持。1 MapReduce算法描述信息技术和网络技术的发展为云计算的产生提供了条件。MapReduce并行编程模型是云计算的核心技术之一。MapReduce是Google 实验室提出的一个分布式并行编程模型或框架, 主要用来处理和产生海量数据的并行编程模式,2004 年DEAN J和GHEMAWAT S第一次发表了这一新型分布式并行编程模型[6]。用户不必关注MapReduce 如何进行数据分割、负载均衡、容错处理等细节,只需要将实际应用问题分解成若干可并行操作的子问题,这种分解思路遵守主从架构模型。Mapreduce框架的主要程序分为Master、Map和Reduce。在Hadoop 中,MapReduce由一个主节点(Jobtracker,属于Master)和从节点(Tasktracker,属于Map和Reduce)组成[7]。1.1 基于标色法的MapReduce广度优先算法模型给定一个带权有向图,用G=(N,E,W)模型来表示,其中N={ni∣i=1,2,...,m}为完全图的点的集合;E={e(ni,nj)∣i≠j, ni,nj∈N}为弧段集;W={w(ni,nj)∣i≠j,ni,nj∈N}为权值集。一般向图的权值表示节点与节点之间的几何长度,记为w(ni,nj)=dij,dij表示节点ni到节点nj的距离。最短路径计算就是计算从起始点ni到终止点nj的最短几何长度之和为最小。在有向图起始点和终止点的最短路径计算中,MapReduce采用的是广度优先算法。MapReduce计算最短路径用邻接表来表示图,在邻接表中每一行数据构成Map和Reduce的一个数据内容。Map和Reduce的(key,value)中key为N,value值为与这个节点邻接的所有节点的 AdjacentList。在用标色法求解最短路径时,AdjacentList节点的信息包括源点到顶点的距离distance(除到本身的距离为0外,其余初始值皆为无穷大);节点的颜色color(其值可分别取0、1、2,0表示未处理的顶点,1表示等待处理的顶点,2表示已处理的顶点,源点的初始值为1,其余顶点皆为0);被访问顶点和边的权值记为N和W。顶点的数据结构如表1所示。

遗传算法典范MATLAB代码

遗传算法经典学习Matlab代码 遗传算法实例: 也是自己找来的,原代码有少许错误,本人都已更正了,调试运行都通过了的。对于初学者,尤其是还没有编程经验的非常有用的一个文件 遗传算法实例 % 下面举例说明遗传算法 % % 求下列函数的最大值 % % f(x)=10*sin(5x)+7*cos(4x) x∈[0,10] % % 将 x 的值用一个10位的二值形式表示为二值问题,一个10位的二值数提供的分辨率是每为 (10-0)/(2^10-1)≈0.01 。 % % 将变量域 [0,10] 离散化为二值域 [0,1023], x=0+10*b/1023, 其 中 b 是 [0,1023] 中的一个二值数。 % % %

%--------------------------------------------------------------------------------------------------------------% %--------------------------------------------------------------------------------------------------------------% % 编程 %----------------------------------------------- % 2.1初始化(编码) % initpop.m函数的功能是实现群体的初始化,popsize表示群体的大小,chromlength表示染色体的长度(二值数的长度), % 长度大小取决于变量的二进制编码的长度(在本例中取10位)。 %遗传算法子程序 %Name: initpop.m %初始化 function pop=initpop(popsize,chromlength) pop=round(rand(popsize,chromlength)); % rand随机产生每个单元 为 {0,1} 行数为popsize,列数为chromlength的矩阵,

遗传算法的应用研究_赵夫群

2016年第17期 科技创新科技创新与应用 遗传算法的应用研究 赵夫群 (咸阳师范学院,陕西咸阳712000) 1概述 遗传算法(Genetic Algorithms,GA)一词源于人们对自然进化系统所进行的计算机仿生模拟研究,是以达尔文的“进化论”和孟德尔的“遗传学原理”为基础的,是最早开发出来的模拟遗传系统的算法模型。遗传算法最早是由Fraser提出来的,后来Holland对其进行了推广,故认为遗传算法的奠基人是Holland。 随着遗传算法的不断完善和成熟,其应用范围也在不断扩大,应用领域非常广泛,主要包括工业控制、网络通讯、故障诊断、路径规划、最优控制等。近几年,出现了很多改进的遗传算法,改进方法主要包括:应用不同的交叉和变异算子;引入特殊算子;改进选择和复制方法等。但是,万变不离其宗,都是基于自然界生物进化,提出的这些改进方法。 2遗传算法的原理 遗传算法是从某一个初始种群开始,首先计算个体的适应度,然后通过选择、交叉、变异等基本操作,产生新一代的种群,重复这个过程,直到得到满足条件的种群或达到迭代次数后终止。通过这个过程,后代种群会更加适应环境,而末代种群中的最优个体,在经过解码之后,就可以作为问题的近似最优解了。 2.1遗传算法的四个组成部分 遗传算法主要由四个部分组成[1]:参数编码和初始群体、适应度函数、遗传操作和控制参数。编码方法中,最常用的是二进制编码,该方法操作简单、便于用模式定理分析。适应度函数是由目标函数变换而成的,主要用于评价个体适应环境的能力,是选择操作的依据。遗传操作主要包括了选择、交叉、变异等三种基本操作。控制参数主要有:串长Z,群体大小size,交叉概率Pc,变异概率Pm等。目前对遗传算法的研究主要集中在参数的调整中,很多文献建议的参数取值范围一般是:size取20~200之间,Pc取0.5~1.0之间,Pm取0~0.05之间。 2.2遗传算法的基本操作步骤 遗传算法的基本操作步骤为: (1)首先,对种群进行初始化;(2)对种群里的每个个体计算其适应度值;(3)根据(2)计算的适应度,按照规则,选择进入下一代的个体;(4)根据交叉概率Pc,进行交叉操作;(5)以Pm为概率,进行变异操作;(6)判断是否满足停止条件,若没有,则转第(2)步,否则进入(7);(7)得到适应度值最优的染色体,并将其作为问题的满意解或最优解输出。 3遗传算法的应用 遗传算法的应用领域非常广泛,下面主要就遗传算法在优化问题、生产调度、自动控制、机器学习、图像处理、人工生命和数据挖掘等方面的应用进行介绍。 3.1优化问题 优化问题包括函数优化和组合优化两种。很多情况下,组合优化的搜索空间受问题规模的制约,因此很难寻找满意解。但是,遗传算法对于组合优化中的NP完全问题非常有效。朱莹等[2]提出了一种结合启发式算法和遗传算法的混合遗传算法来解决杂货船装载的优化问题中。潘欣等[3]在化工多目标优化问题中应用了并行遗传算法,实验结果表明该方法效果良好。王大东等[4]将遗传算法应用到了清运车辆路径的优化问题求解中,而且仿真结果表明算法可行有效。 3.2生产调度 在复杂生产调度方面,遗传算法也发挥了很大的作用。韦勇福等[5]将遗传算法应用到了车间生产调度系统的开发中,并建立了最小化完工时间目标模型,成功开发了车间生产调度系统模块,并用实例和仿真验证了该方法的可行性。张美凤等[6]将遗传算法和模拟退火算法相结合,提出了解决车间调度问题的混合遗传算法,并给出了一种编码方法以及建立了相应的解码规则。 3.3自动控制 在自动控制领域中,遗传算法主要用于求解的大多也是与优化相关的问题。其应用主要分为为两类,即离线设计分析和在线自适应调节。GA可为传统的综合设计方法提供优化参数。 3.4机器学习 目前,遗传算法已经在机器学习领域得到了较为广泛的应用。邢晓敏等[7]提出了将遗传算子与Michigan方法和基于Pitt法的两个机器学习方法相结合的机器学习方法。蒋培等[8]提出了一种基于共同进化遗传算法的机器学习方法,该方法克服了学习系统过分依赖于问题的背景知识的缺陷,使得学习者逐步探索新的知识。 3.5图像处理 图像处理是一个重要的研究领域。在图像处理过程中产生的误差会影响图像的效果,因此我们要尽可能地减小误差。目前,遗传算法已经在图像增强、图像恢复、图像重建、图像分形压缩、图像分割、图像匹配等方面应用广泛,详见参考文献[9]。 4结束语 遗传算法作为一种模拟自然演化的学习过程,原理简单,应用广泛,已经在许多领域解决了很多问题。但是,它在数学基础方面相对不够完善,还有待进一步研究和探讨。目前,针对遗传算法的众多缺点,也相继出现了许多改进的算法,并取得了一定的成果。可以预期,未来伴随着生物技术和计算机技术的进一步发展,遗传算法会在操作技术等方面更加有效,其发展前景一片光明。 参考文献 [1]周明,孙树栋.遗传算法原理及应用[M].国防工业出版社,1999,6. [2]朱莹,向先波,杨运桃.基于混合遗传算法的杂货船装载优化问题[J].中国船舰研究,2015:10(6):126-132. [3]潘欣,等.种群分布式并行遗传算法解化工多目标优化问题[J].化工进展,2015:34(5):1236-1240. [4]王大东,刘竞遥,王洪军.遗传算法求解清运车辆路径优化问题[J].吉林师范大学学报(自然科学版),2015(3):132-134. [5]韦勇福,曾盛绰.基于遗传算法的车间生产调度系统研究[J].装备制造技术,2014(11):205-207. [6]黄巍,张美凤.基于混合遗传算法的车间生产调度问题研究[J].计算机仿真,2009,26(10):307-310. [7]邢晓敏.基于遗传算法的机器学习方法赋值理论研究[J].软件导刊[J].2009,8(11):80-81. [8]蒋培.基于共同进化遗传算法的机器学习[J].湖南师范大学自然科学学报,2004,27(3):33-38. [9]田莹,苑玮琦.遗传算法在图像处理中的应用[J].中国图象图形学报,2007,12(3):389-396. [10]周剑利,马壮,陈贵清.基于遗传算法的人工生命演示系统的研究与实现[J].制造业自动化,2009,31(9):38-40. [11]刘晓莉,戎海武.基于遗传算法与神经网络混合算法的数据挖掘技术综述[J].软件导刊,2013,12(12):129-130. 作者简介:赵夫群(1982,8-),女,汉族,籍贯:山东临沂,咸阳师范学院讲师,西北大学在读博士,工作单位:咸阳师范学院教育科学学院,研究方向:三维模型安全技术。 摘要:遗传算法是一种非常重要的搜索算法,特别是在解决优化问题上,效果非常好。文章首先介绍了遗传算法的四个组成部分,以及算法的基本操作步骤,接着探讨了遗传算法的几个主要应用领域,包括优化、生产调度、机器学习、图像处理、人工生命和数据挖掘等。目前遗传算法以及在很多方面的应用中取得了较大的成功,但是它在数学基础方面相对还不够完善,因而需要进一步研究和完善。 关键词:遗传算法;优化问题;数据挖掘 67 --

相关主题
文本预览
相关文档 最新文档