遗传算法求解y=x2 - 副本

遗传算法求解y=x2 - 副本
遗传算法求解y=x2 - 副本

初始遗传算法及一个简单的例子

遗传算法(Genetic Algorithms, GA)是一类借鉴生物界自然选择和自然遗传机制的随机化搜索算法。它模拟自然选择和自然遗传过程中发生的繁殖、交叉和基因突变现象,在每次迭代中都保留一组候选解,并按某种指标从解群中选取较优的个体,利用遗传算子(选择、交叉和变异)对这些个体进行组合,产生新一代的候选解群,重复此过程,直到满足某种收敛指标为止。

下面我以一个实例来详细表述遗传算法的过程

例:求下述二元函数的最大值:

2

=]

y x

x∈

,0[

31

1、编码:

用遗传算法求解问题时,不是对所求解问题的实际决策变量直接进行操作,而是对表示可行解的个体编码的操作,不断搜索出适应度较高的个体,并在群体中增加其数量,最终寻找到问题的最优解或近似最优解。因此,必须建立问题的可行解的实际表示和遗传算法的染色体位串结构之间的联系。在遗传算法中,把一个问题的可行解从其解空间转换到遗传算法所能处理的搜索空间的转换方法称之为编码。反之,个体从搜索空间的基因型变换到解空间的表现型的方法称之为解码方法。

编码是应用遗传算法是需要解决的首要问题,也是一个关键步骤。迄今为止人们已经设计出了许多种不同的编码方法。基本遗传算法使用的是二进制符号0和1所组成的二进制符号集{0,1},也就是说,把问题空间的参数表示为基于字符集{0,1}构成的染色体位串。每个个体的染色体中所包含的数字的个数L 称为染色体的长度或称为符号串的长度。一般染色体的长度L为一固定的数,如本例的编码为

s1 = 1 0 0 1 0 (17)

s2 = 1 1 1 1 0 (30)

s3 = 1 0 1 0 1 (21)

s4 = 0 0 1 0 0 (4)

表示四个个体,该个体的染色体长度L=5。

2、个体适应度函数

在遗传算法中,根据个体适应度的大小来确定该个体在选择操作中被选定的概率。个体的适应度越大,该个体被遗传到下一代的概率也越大;反之,个体的适应度越小,该个体被遗传到下一代的概率也越小。基本遗传算法使用比例选择操作方法来确定群体中各个个体是否有可能遗传到下一代群体中。为了正确计算不同情况下各个个体的选择概率,要求所有个体的适应度必须为正数或为零,不能是负数。这样,根据不同种类的问题,必须预先确定好由目标函数值到个体适应度之间的转换规则,特别是要预先确定好目标函数值为负数时的处理方法。

如所求解的问题为:)(max f 直接设定个体的适应度函数值就等于相应的目标函数值,即2)(f x x =. 3、遗传算子 (1)比例选择:选择或称复制,建立在对个体适应度进行评价的基础之上。其作用是从当前群体中选择出一些比较优良的个体,并将其复制到下一代群体中。基本遗传算法采用比例选择的方法,所谓比例选择,是指个体在选择操作中被选中的概率与该个体的适应度大小成正比。本例选择概率的计算公式为:

∑==n j j s f s f 1

i i )

()

(p

其中f 为适度函数;)(i s f 为个体i s 的适应值,显然,适应值最高的个体被随机选定的概率就越大,被选择的次数就越多,从而被繁殖的次数也就越多。 (2)单点交叉。单点交叉又称简单交叉,是遗传算法所使用的交叉操作方法。

选择一个交叉点,子代在交叉点前面的基因从一个父代基因那里得到,后面的部分从另外一个父代基因那里得到。

如:

交叉前: 100|10

101|01

交叉后: 100|01

101|10

(3)基本位变异。基本位变异石最简单和最基本的变异操作,也是基本遗传算法中所使用的变异操作方法。对于基本遗传算法中用二进制编码符号串所表示的个体,对需要进行变异操作的某一基因,若原有基因值为0,则变异操作将该基因值变为1;反之,若原有基因值为1,则变异操作将其变为0.

基本位变异算子是指对个体编码串随机指定的某一位或某几位基因作变异运算。对于基本遗传算法中用二进制编码符号串所表示的个体,若需要进行变异操作的某一基因座上的原有基因值为0,则变异操作将其变为1;反之,若原有基因值为1,则变异操作将其变为0。

如:

变异前:

1001|0

变异后:

1001|1

(4)基本遗传算法的运行参数

本例中指定四个基本参数

种群大小:popsize

最大世代数 maxgeneration

交叉率pc

变异率pm

至于遗传算法的终止条件,还可以利用某种判定准则,当判定出群体已经进化成熟且不再有进化趋势时就可终止算法的运行过程。如连续几代个体平均适应度的差异小于某一个极小的值;或者群体中所有个体适应度的方差小于某一个极小的值。这4个参数对遗传算法的搜索结果及搜索效率都有一定的影响,目前尚无合理选择它们的理论根据在遗传算法的实际应用中,往往需要经过多次的试算后才能确定出这些参数合理的取值范围或取值大小

4、遗传算法的应用步骤如下:

遗传算法提供了一种求解复杂系统优化问题的通用框架,它不依赖于问题的领域和种类。对一个需要进行优化计算的实际应用问题,一般可按下述步骤来构造求解该问题的遗传算法。

第一步:建立优化模型,即确定出目标函数、决策变量及各种约束条件以及数学描述形式或量化方法。

第二步:确定表示可行解的染色体编码方法,也即确定出个体的基因型x及遗传算法的搜索空间。

第三步:确定解码方法,即确定出个体基因型x到个体表现型x的对应关系或转换方法。

第四步:确定个体适应度的量化评价方法,即确定出由目标函数值)

(f x到个体适应度)x(

F的转换规则。

第五步:设计遗传操作方法,即确定出选择运算、交叉运算、变异运算等具体操作方法。

第六步:确定遗传算法的有关运行参数,即确定出遗传算法的种群大小(popsize)、最大世代数 (maxgeneration)、交叉率(pc)、变异率(pm)等参数。

由上述构造步骤可以看出,可行解的编码方法、遗传操作的设计是构造遗传算法时需要考虑的两个主要问题,也是设计遗传算法时的两个关键步骤。对不同的优化问题需要使用不同的编码方法和不同的遗传操作,它们与所求解的具体问题密切相关,因而对所求解问题的理解程度是遗传算法应用成功与否的关键。

本例c语言代码

////////////////////////////////////

//遗传算法解决 y=x2问题

//编译环境 vc++6.0

//声明:部分代码来自网

#include

#include

#include

#include

#define POPSIZE 500 //种群大小

#define chromlength 5 //染色体长

int popsize ; //种群大小

int maxgeneration; //最大世代数

double pc = 0.0; //交叉率

double pm = 0.0; //变异率

struct individual //定义染色体个体结构体

{

int chrom[chromlength]; //定义染色体二进制表达形式,edit by ppme 将char 转为 int

double value; //染色体的值

double fitness; //染色体的适应值

};

int generation; //当前执行的世代数

int best_index; //最好的染色体索引序号

int worst_index; //最差的染色体索引序号

struct individual bestindividual; //最佳染色体个体

struct individual worstindividual; //最差染色体个体

struct individual currentbest; //当前最好的染色体个体 currentbest struct individual population[POPSIZE];//种群数组

//函数声明

void generateinitialpopulation(); //ok-初始化当代种群

void generatenextpopulation(); //产生下一代种群

void evaluatepopulation(); //评价种群

void calculateobjectfitness(); //计算种群适应度

double decodechromosome(int,int); //染色体解码

void findbestandworstindividual(); //寻找最好的和最坏的染色体个体

void performevolution(); //进行演变进化

void selectoperator(); //选择操作

void crossoveroperator(); //交换操作

void mutationoperator(); //变异操作

void input(); //输入接口

void outputtextreport(); //输出文字报告

void main() //主函数

{

int i;

srand((unsigned)time(NULL)); //强制类型转化,以当前时间戳定义随机数种子

printf("本程序为求函数y=x*x的最大值\n");

generation=0; //初始化generation当前执行的代

input(); //初始化种群大小、交叉率、变异率

/*edit by ppme*/

//调试用。。。。。显示input()结果

printf("种群规模(popsize): %d;\n最大世代数(maxgeneration) %d;\n交叉率(pc) %f;变异率(pm) %f\n\n",popsize,maxgeneration,pc,pm);

/*edit by ppme*/

generateinitialpopulation(); //产生初始化种群

evaluatepopulation(); //评价当前种群,(A.计算种群/个体的适应度;B.找出最好和最差的个体)

while(generation

{

generation++;

generatenextpopulation(); //生成子代种群(A.选择; B.交叉; C.变异)

evaluatepopulation(); //评价新生子代种群

performevolution(); //进行子代进化

outputtextreport(); //输入当代最终种群

}

printf("\n");

printf(" 统计结果: ");

printf("\n");

printf("最大函数值等于:%f\n",currentbest.fitness);

printf("其染色体编码为:");

//计算currentbest的value

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

printf(" %d",currentbest.chrom[i]);

printf("\n");

}

void generateinitialpopulation( ) //种群初始化

{

int i,j;

srand((unsigned)time(NULL)); //强制类型转化,以当前时间戳定义随机数种子

for (i=0;i

{

for(j=0;j

{

population[i].chrom[j]=(rand()%10<5)?0:1; //rand()%10随机产生0-9的整数

//,小于5标注0,否则标注1

}

}

//调试显示初始化结果

printf("显示初始化结果:\n");

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

{

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

{

printf(" %d",population[i].chrom[j]);

}

printf("\n");

}

}

void generatenextpopulation() //生成下一代

{

selectoperator();

crossoveroperator();

mutationoperator();

}

void evaluatepopulation() //评价种群???

{

calculateobjectfitness(); //计算种群?个体的适应度

findbestandworstindividual(); //赵到最好和最差的染色体个体

}

void calculateobjectfitness() //计算染色体个体适应值和适应度

{

int i;

int j;

printf("calculateobjectfitness is executing!\n");

for(i=0;i

{

double temp;

temp=decodechromosome(i,chromlength); //计算个体适应值

population[i].value=(double)temp;

population[i].fitness=population[i].value*population[i].value;

}

//调试用

printf("显示当前种群结果:\n");

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

{

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

{

printf(" %d",population[i].chrom[j]);

}

printf(" %lf",population[i].value);

printf(" %lf",population[i].fitness);

printf("\n");

}

}

double decodechromosome(int pop_index , int length) //给染色体解码{

int i;

double decimal=0;

for( i = length; i >= 0 ; i-- )

decimal += population[pop_index].chrom[i]*pow(2,i); //遍历染色体二进制编码,

return (decimal); //并计算出其10进制的value值

}

void findbestandworstindividual( ) //求最佳个体和最差个体

{

int i;

double sum=0.0;

bestindividual=population[0];

worstindividual=population[0];

for (i=1;i

{

if (population[i].fitness>bestindividual.fitness) //依次比较,找出最佳个体

{

bestindividual=population[i];

best_index=i;

}

else if (population[i].fitness

{

worstindividual=population[i];

worst_index=i;

}

sum+=population[i].fitness; //sum 存放种群总体适应值}//for

if (generation==0)

{

currentbest=bestindividual; //第一代最好的暂时存放在currentbest

}

else

{

if(bestindividual.fitness>=currentbest.fitness)//第n代最好的,通过比较大于以往最好个体的话,

{ //暂时存放在currentbest

currentbest=bestindividual;

}

}

}

void performevolution() //演示评价结果

{

if (bestindividual.fitness>currentbest.fitness)

{

currentbest=population[best_index];

}

else

{

population[worst_index]=currentbest;

}

}

void selectoperator() //比例选择算法

{

int i,index;

double p,sum=0.0; //p存放随机概率,sum存放个体适应率和累计适应率double cfitness[POPSIZE]; //当代种群染色体个体的适应率

struct individual newpopulation[POPSIZE]; //新种群

srand((unsigned) time(NULL)); //种下随机种子

for(i=0;i

{

sum+=population[i].fitness; //sum存放种群适应值总和}

for(i=0;i

cfitness[i]=population[i].fitness/sum; // cfitness[] = fitness/sum得到个体适应率

}

for(i=1;i

cfitness[i]=cfitness[i-1]+cfitness[i]; //cfitness[]= cfitness[i-1]+cfitness[i]得到种群

} //累计适应率

for (i=0;i

{

p=rand()%1000/1000.0; //得到千分位小数

index=0;

while (p>cfitness[index])

{

index++;

}

newpopulation[i]=population[index]; //选出的个体组成新的一代,暂时存放于newpopulation[]中

}

for(i=0;i

population[i]=newpopulation[i]; //全局变量populaiton存放新的种群(有重复的值)

}

}

void crossoveroperator() //交叉算法

{

int i,j;

int index[POPSIZE];

int point,temp;

double p;

srand((unsigned) time(NULL)); //种下随机种子

for (i=0;i

index[i]=i;

}

for (i=0;i

temp=index[i];

index[i]=index[point+i];

index[point+i]=temp;

}

for (i=0;i

p=rand()%1000/1000.0;

if (p

point=rand()%(chromlength-1)+1;

for (j=point; j

temp=population[index[i]].chrom[j];

population[index[i]].chrom[j]=population[index[i+1]].chrom[j];

population[index[i+1]].chrom[j]=temp;

}

}

}

}

void mutationoperator() //变异操作

{

int i,j;

double p;

srand((unsigned) time(NULL)); //种下随机种子

for (i=0;i

for(j=0;j

p=rand()%1000/1000.0;

if (p

population[i].chrom[j]=(population[i].chrom[j]==0)?1:0;

}

}

}

}

void input() //数据输入

{

printf("初始化全局变量:\n");

printf("种群大小(4-500偶数):");

scanf("%d", &popsize); //输入种群大小,必须为偶数

if((popsize%2) != 0)

{

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

popsize++;

};

printf("最大世代数(10-300):"); //输入最大世代数

scanf("%d", &maxgeneration);

printf("交叉率(0.2-1.0):"); //输入交叉率

scanf("%lf", &pc);

printf("变异率(0.00):"); //输入变异率

scanf("%lf", &pm);

}

void outputtextreport()//数据输出

{

int i;

double sum;

double average;

sum=0.0;

for(i=0;i

{

sum+=population[i].value;

}

average=sum/popsize;

printf("当前世代=%d\n当前世代染色体平均值=%f\n当前世代染色体最高值=%f\n",generation,average,population[best_index].value);

}

运行结果:

/*

本程序为求函数y=x*x的最大值

初始化全局变量:

种群大小(4-500偶数):4

最大世代数(10-300):5

交叉率(0.2-1.0):0.9

变异率(0.00):0.01

种群规模(popsize): 4;

最大世代数(maxgeneration) 5;

交叉率(pc) 0.900000;变异率(pm) 0.010000

显示初始化结果:

0 1 0 0 1

1 1 1 1 1

0 0 0 1 0

0 1 1 1 1

calculateobjectfitness is executing!

显示当前种群结果:

0 1 0 0 1 18.000000 324.000000

1 1 1 1 1 31.000000 961.000000

0 0 0 1 0 8.000000 64.000000

0 1 1 1 1 30.000000 900.000000 calculateobjectfitness is executing!

显示当前种群结果:

1 1 1 1 1 31.000000 961.000000

0 1 0 0 1 18.000000 324.000000

0 1 0 0 1 18.000000 324.000000

1 1 1 1 1 31.000000 961.000000

当前世代=1

当前世代染色体平均值=27.750000

当前世代染色体最高值=31.000000 calculateobjectfitness is executing!

显示当前种群结果:

1 1 1 1 1 31.000000 961.000000

1 1 1 1 1 31.000000 961.000000

1 1 1 1 1 31.000000 961.000000

1 1 1 1 1 31.000000 961.000000

当前世代=2

当前世代染色体平均值=31.000000

当前世代染色体最高值=31.000000 calculateobjectfitness is executing!

显示当前种群结果:

1 1 1 1 1 31.000000 961.000000

1 1 1 1 1 31.000000 961.000000

1 1 1 1 1 31.000000 961.000000

1 1 1 1 1 31.000000 961.000000

当前世代=3

当前世代染色体平均值=31.000000

当前世代染色体最高值=31.000000 calculateobjectfitness is executing! 显示当前种群结果:

1 1 1 1 1 31.000000 961.000000

1 1 1 1 1 31.000000 961.000000

1 1 1 1 1 31.000000 961.000000

1 1 1 1 1 31.000000 961.000000

当前世代=4

当前世代染色体平均值=31.000000

当前世代染色体最高值=31.000000 calculateobjectfitness is executing! 显示当前种群结果:

1 1 1 1 1 31.000000 961.000000

1 1 1 1 1 31.000000 961.000000

1 1 1 1 1 31.000000 961.000000

1 1 1 1 1 31.000000 961.000000

当前世代=5

当前世代染色体平均值=31.000000

当前世代染色体最高值=31.000000

统计结果:

最大函数值等于:961.000000

其染色体编码为: 1 1 1 1 1

Press any key to continue

*/

实验六:遗传算法求解TSP问题实验分析

实验六:遗传算法求解TSP问题实验 一、实验目的 熟悉和掌握遗传算法的原理、流程和编码策略,并利用遗传求解函数优化问题,理解求解TSP问题的流程并测试主要参数对结果的影响。用遗传算法对TSP问题进行了求解,熟悉遗传算法地算法流程,证明遗传算法在求解TSP问题时具有可行性。 二、实验内容 参考实验系统给出的遗传算法核心代码,用遗传算法求解TSP的优化问题,分析遗传算法求解不同规模TSP问题的算法性能。 对于同一个TSP问题,分析种群规模、交叉概率和变异概率对算法结果的影响。 增加1种变异策略和1种个体选择概率分配策略,比较求解同一TSP问题时不同变异策略及不同个体选择分配策略对算法结果的影响。 1. 最短路径问题 所谓旅行商问题(Travelling Salesman Problem , TSP),即最短路径问题,就是在给定的起始点S到终止点T的通路集合中,寻求距离最小的通路,这样的通路成为S点到T点的最短路径。 在寻找最短路径问题上,有时不仅要知道两个指定顶点间的最短路径,还需要知道某个顶点到其他任意顶点间的最短路径。遗传算法方法的本质是处理复杂问题的一种鲁棒性强的启发性随机搜索算法,用

遗传算法解决这类问题,没有太多的约束条件和有关解的限制,因而可以很快地求出任意两点间的最短路径以及一批次短路径。 假设平面上有n个点代表n个城市的位置, 寻找一条最短的闭合路径, 使得可以遍历每一个城市恰好一次。这就是旅行商问题。旅行商的路线可以看作是对n个城市所设计的一个环形, 或者是对一列n个城市的排列。由于对n个城市所有可能的遍历数目可达(n- 1)!个, 因此解决这个问题需要0(n!)的计算时间。假设每个城市和其他任一城市之间都以欧氏距离直接相连。也就是说, 城市间距可以满足三角不等式, 也就意味着任何两座城市之间的直接距离都小于两城市之间的间接距离。 2. 遗传算法 遗传算法是由美国J.Holland教授于1975年在他的专著《自然界和人工系统的适应性》中首先提出的,它是一类借鉴生物界自然选择和自然遗传机制的随机化搜索算法。通过模拟自然选择和自然遗传过程中发生的繁殖、交叉和基因突变现象,在每次迭代中都保留一组候选解,并按某种指标从解群中选取较优的个体,利用遗传算子(选择、交叉和变异)对这些个体进行组合,产生新一代的候选解群,重复此过程,直到满足某种收敛指标为止。遗传算法在本质上是一种不依赖具体问题的直接搜索方法,是一种求解问题的高效并行全局搜索方法。其假设常描述为二进制位串,位串的含义依赖于具体应用。搜索合适的假设从若干初始假设的群体集合开始。当前种群成员通过模仿生物进化的方式来产生下一代群体,如随机变异和交叉。每一步,根据给定的适应度评估当前群体的假设,而后使用概率方法选出适应度最高的假设作为产生下一代的种子。

遗传算法求解实例

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 】

基于遗传算法的一种新的约束处理方法

基于遗传算法的一种新的约束处理方法 苏勇彦1,王攀1,范衠2 (1武汉理工大学 自动化学院, 湖北 武汉 430070) (2丹麦理工大学 机械系 哥本哈根) 摘 要:本文针对目前的约束处理方法中存在的问题,提出一种新的约束处理方法。该方法通过可行解和不可行解混合交叉的方法对问题的解空间进行搜索,对可行种群和不可行种群分别进行选择操作。避免了惩罚策略中选取惩罚因子的困难,使得约束处理问题简单化。实例测试结果表明,该约束处理方法的有效性。 关键词:遗传算法、约束处理、可行解、不可行解、两种群混合交叉 1引言 科学研究和工程应用中许多问题都可以转化为求解一个带约束条件的函数优化问题[1]。遗传算法(Genetic Algorithm )与许多基于梯度的算法比较,具有不需要目标函数和约束条件可微,且能收敛到全局最优解的优点 [2],因此,它成为一种约束优化问题求解的有力工具。目前,基于GA 的约束处理方法有拒绝策略,修复策略,改进遗传算子策略以及惩罚函数策略等。但是这些方法都存在一些问题[3]:修复策略对问题本身的依赖性,对于每个问题必须设计专门的修复程序。改进遗传算子策略则需要设计针对问题的表达方式以及专门的遗传算子来维持解的可行性。惩罚策略解的质量严重依赖于惩罚因子的选取,当惩罚因子不适当时,算法可能收敛于不可行解。 本文针对目前的约束处理方法中存在的问题,提出一种新的约束处理方法。该方法通过可行解和不可行解混合交叉的方法对问题的解空间进行搜索,对可行种群和不可行种群分别进行选择操作。避免了惩罚策略中选取惩罚因子的困难,使得约束处理问题简单化。实例测试结果表明,该约束处理方法的有效性。 2约束处理方法描述 2.1单目标有约束优化问题一般形式 )(max x f ..t s ;0)(≤x g i 1,,2,1m i L L =;0)(=x h i )(,,1211m m m m i +=+=L X x ∈ 这里都是定义在m m m m h h h g g g f ,,,;,,;2121111L L ++n E 上的实值函数。X 是n E 上的 子集,x 是维实向量,其分量为。上述问题要求在变量满足约 束的同时极大化函数。函数通常为目标函数。约束n n x x x ,,,21L n x x x ,,,21L f f ;0)(≤x g i 称为不等式约束;约束称为等式约束。集合;0)(=x h i X 通常为变量的上下界限定的区域。向量且满足所有约束,则称之为问题的可行解。所有可行解构成可行域。否则,为问题的不可行解,所有不可行解构成不可行域。问题的目标是找到一个可行解X x ∈x 使得)()(x f x f ≤对于所有可行解x 成立。那么,x 为最优解[4]。 2.2算法描述 目前,最常采用的约束处理方法为惩罚函数法。但优化搜索的效率对惩罚因子的选择有

用遗传算法解决0-1背包问题概述

实现遗传算法的0-1背包问题 求解及其改进 姓名: 学号: 班级: 提交日期:2012年6月27日

实现遗传算法的0-1背包问题求解 摘要:研究了遗传算法解决0-1背包问题中的几个问题: 1)对于过程中不满足重量限制条件的个体的处理,通过代换上代最优解保持种群的进化性 2)对于交换率和变异率的理解和处理方法,采用逐个体和逐位判断的处理方法 3)对于早熟性问题,引入相似度衡量值并通过重新生成个体替换最差个体方式保持种群多样性。4)一种最优解只向更好进化方法的尝试。 通过实际计算比较表明,本文改进遗传算法在背包问题求解中具有很好的收敛性、稳定性和计算效率。通过实例计算,表明本文改进遗传算法优于简单遗传算法和普通改进的遗传算法。 关键词:遗传算法;背包问题;优化 1.基本实现原理: 一、问题描述 0-1背包问题属于组合优化问题的一个例子,求解0-1背包问题的过程可以被视作在很多可行解当中求解一个最优解。01背包问题的一般描述如下: 给定n个物品和一个背包,物品i的重量为Wi,其价值为Vi,背包的容量为C。选择合适的物品装入背包,使得背包中装入的物品的总价值最大。注意的一点是,背包内的物品的重量之和不能大于背包的容量C。在选择装入背包的物品时,对每种物品i只有两种选择:装入背包或者不装入背包,即只能将物品i装入背包一次。称此类问题为0/1背包问题。 其数学模型为: 0-1背包问题传统的解决方法有动态规划法、分支界限法、回溯法等等。传统的方法不能有效地解决0-1背包问题。遗传算法(Genetic Algorithms)则是一种适合于在大量的可行解中搜索最优(或次优)解的有效算法。 二、遗传算法特点介绍: 遗传算法(Genetic Algorithm, GA)是1962年Holland教授首次提出了GA算法的思想是近年来随着信息数据量激增,发展起来的一种崭新的全局优化算法,它借用了生物遗传学的观点,通过自然选择、遗传、变异等作用机制,实现各个个体的适应性的提高。 基本遗传算法求解步骤: Step 1 参数设置:在论域空间U上定义一个适应度函数f(x),给定种群规模N,交叉率P c 和变异率P m,代数T; Step 2 初始种群:随机产生U中的N个染色体s1, s2, …, s N,组成初始种群S={s1, s2, …, s N},置代数计数器t=1; Step 3计算适应度:S中每个染色体的适应度f() ; Step 4 判断:若终止条件满足,则取S中适应度最大的染色体作为所求结果,算法结束。Step 5 选择-复制:按选择概率P(x i)所决定的选中机会,每次从S中随机选定1个染色体并将其复制,共做N次,然后将复制所得的N个染色体组成群体S1; Step 6 交叉:按交叉率P c所决定的参加交叉的染色体数c,从S1中随机确定c个染色体,配对进行交叉操作,并用产生的新染色体代替原染色体,得群体S2; Step 7 变异:按变异率P m所决定的变异次数m,从S2中随机确定m个染色体,分别进行变异操作,并用产生的新染色体代替原染色体,得群体S3; Step 8 更新:将群体S3作为新一代种群,即用S3代替S,t=t+1,转步3;

使用遗传算法求解函数最大值

使用遗传算法求解函数最大值 题目 使用遗传算法求解函数 在及y的最大值。 解答 算法 使用遗传算法进行求解,篇末所附源代码中带有算法的详细注释。算法中涉及不同的参数,参数的取值需要根据实际情况进行设定,下面运行时将给出不同参数的结果对比。 定义整体算法的结束条件为,当种群进化次数达到maxGeneration时停止,此时种群中的最优解即作为算法的最终输出。 设种群规模为N,首先是随机产生N个个体,实验中定义了类型Chromosome表示一个个体,并且在默认构造函数中即进行了随机的操作。 然后程序进行若干次的迭代,在每次迭代过程中,进行选择、交叉及变异三个操作。 一选择操作 首先计算当前每个个体的适应度函数值,这里的适应度函数即为所要求的优化函数,然后归一化求得每个个体选中的概率,然后用轮盘赌的方法以允许重复的方式选择选择N个个体,即为选择之后的群体。

但实验时发现结果不好,经过仔细研究之后发现,这里在x、y取某些值的时候,目标函数计算出来的适应值可能会出现负值,这时如果按照把每个个体的适应值除以适应值的总和的进行归一化的话会出现问题,因为个体可能出现负值,总和也可能出现负值,如果归一化的时候除以了一个负值,选择时就会选择一些不良的个体,对实验结果造成影响。对于这个问题,我把适应度函数定为目标函数的函数值加一个正数,保证得到的适应值为正数,然后再进行一般的归一化和选择的操作。实验结果表明,之前的实验结果很不稳定,修正后的结果比较稳定,趋于最大值。 二交叉操作 首先是根据交叉概率probCross选择要交叉的个体进行交叉。

这里根据交叉参数crossnum进行多点交叉,首先随机生成交叉点位置,允许交叉点重合,两个重合的交叉点效果互相抵消,相当于没有交叉点,然后根据交叉点进行交叉操作,得到新的个体。 三变异操作 首先是根据变异概率probMutation选择要变异的个体。 变异时先随机生成变异的位置,然后把改位的01值翻转。

遗传算法求解背包问题

遗传算法求解背包问题 信管专业李鹏 201101002044 一、遗传算法(Genetic Algorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法,是从代表问题可能潜在的解集的一个种群(population)开始的,而一个种群则由经过基因(gene)编码的一定数目的个体(individual)组成。在每一代,根据问题域中个体的适应度(fitness)大小选择(selection)个体,并借助于自然遗传学的遗传算子(genetic operators)进行组合交叉(crossover)和变异(mutation),产生出代表新的解集的种群。 二、背包问题描述 背包问题是一个典型的组合优化问题,在计算理论中属于NP完全问题,主要应用于管理中的资源分配,资金预算,投资决策、装载问题的建模。传统“0/1”背包问题可以描述为:把具有一定体积和价值的n件不同种类物品放到一个有限容量的背包里,使得背包中物品的价值总量最大。 三、数学模型 背包问题可以描述如下:假设有n个物体,其重量用表示,价值用表示,背包的最大容量为b。这里和b都大于0。问题是要求背包所装的物体的总价值最大。背包问题的数学模型描述如下: (1) (2) (3) 约束条件(3)中表示物体i被选入背包,反之,表示物体i没有被选入背包。约束条件(2)表示背包的容量约束。

四、使用遗传算法解决“0-1背包问题”的思路:0-1背包的解可以编码为一串0-1字符串(0:不取,1:取);首先,随机产生M个0-1字符串,然后评价这些0-1字符串作为0-1背包问题的解的优劣;然后,随机选择一些字符串通过交叉、突变等操作产生下一代的M个字符串,而且较优的解被选中的概率要比较高。这样经过G代的进化后就可能会产生出0-1背包问题的一个“近似最优解”。 五、程序整体流程 (1)读取存取包的限种、商品的重要和价值的TXT文件; (2)初始化种群; (3)计算群体上每个个体的适应度值(Fitness) ; (4)评估适应度,对当前群体P(t)中每个个体Pi计算其适应度F(Pi),适应度表示了该个体的性能好坏; (5)依照Pc选择个体进行交叉操作; (6)仿照Pm对繁殖个体进行变异操作 (7)没有满足某种停止条件,则转第3步,否则进入8 ; (8)输出种群中适应度值最优的个体。 六、代码 function Main() %定义全局变量 global VariableNum POPSIZE MaxGens PXOVER PMutation VariableNum=3 %变量个数 POPSIZE=50 %种群大小 MaxGens=1000 %种群代数 PXOVER=0.8 %交叉概率 PMutation=0.2 %变异概率 %读取数据文件

一种基于遗传算法的Kmeans聚类算法

一种基于遗传算法的K-means聚类算法 一种基于遗传算法的K-means聚类算法 摘要:传统K-means算法对初始聚类中心的选取和样本的输入顺序非常敏感,容易陷入局部最优。针对上述问题,提出了一种基于遗传算法的K-means聚类算法GKA,将K-means算法的局部寻优能力与遗传算法的全局寻优能力相结合,通过多次选择、交叉、变异的遗传操作,最终得到最优的聚类数和初始质心集,克服了传统K-means 算法的局部性和对初始聚类中心的敏感性。关键词:遗传算法;K-means;聚类 聚类分析是一个无监督的学习过程,是指按照事物的某些属性将其聚集成类,使得簇间相似性尽量小,簇内相似性尽量大,实现对数据的分类[1]。聚类分析是数据挖掘 技术的重要组成部分,它既可以作为独立的数据挖掘工具来获取数据库中数据的分布情况,也可以作为其他数据挖掘算法的预处理步骤。聚类分析已成为数据挖掘主要的研究领域,目前已被广泛应用于模式识别、图像处理、数据分析和客户关系管理等领域中。K-means算法是聚类分析中一种基本的划分方法,因其算法简单、理论可靠、收敛速 度快、能有效处理较大数据而被广泛应用,但传统的K-means算法对初始聚类中心敏 感,容易受初始选定的聚类中心的影响而过早地收敛于局部最优解,因此亟需一种能克服上述缺点的全局优化算法。遗传算法是模拟生物在自然环境中的遗传和进化过程而形成的一种自适应全局优化搜索算法。在进化过程中进行的遗传操作包括编码、选择、交叉、变异和适者生存选择。它以适应度函数为依据,通过对种群个体不断进行遗传操作实现种群个体一代代地优化并逐渐逼近最优解。鉴于遗传算法的全局优化性,本文针 对应用最为广泛的K-means方法的缺点,提出了一种基于遗传算法的K-means聚类算法GKA(Genetic K-means Algorithm),以克服传统K-means算法的局部性和对初始聚类中心的敏感性。用遗传算法求解聚类问题,首先要解决三个问题:(1)如何将聚类问题的解编码到个体中;(2)如何构造适应度函数来度量每个个体对聚 类问题的适应程度,即如果某个个体的编码代表良好的聚类结果,则其适应度就高;反之,其适应度就低。适应度函数类似于有机体进化过程中环境的作用,适应度高的个体 在一代又一代的繁殖过程中产生出较多的后代,而适应度低的个体则逐渐消亡;(3) 如何选择各个遗传操作以及如何确定各控制参数的取值。解决了这些问题就可以利

遗传算法解决TSP问题

遗传算法解决TSP问题 姓名: 学号: 专业:

问题描叙 TSP问题即路径最短路径问题,从任意起点出发(或者固定起点),依次经过所有城市,一个城市只能进入和出去一次,所有城市必须经过一次,经过终点再到起点,从中寻找距离最短的通路。 通过距离矩阵可以得到城市之间的相互距离,从距离矩阵中的到距离最短路径,解决TSP问题的算法很多,如模拟退火算法,禁忌搜索算法,遗传算法等等,每个算法都有自己的优缺点,遗传算法收敛性好,计算时间少,但是得到的是次优解,得不到最有解。 算法设计 遗传算法属于进化算法的一种,它通过模仿自然界的选择与遗传的机理来寻找最优解. 遗传算法有三个基本算子:选择、交叉和变异。 数值方法求解这一问题的主要手段是迭代运算。一般的迭代方法容易陷入局部极小的陷阱而出现"死循环"现象,使迭代无法进行。遗传算法很好地克服了这个缺点,是一种全局优化算法。 生物在漫长的进化过程中,从低等生物一直发展到高等生物,可以说是一个绝妙的优化过程。这是自然环境选择的结果。人们研究生物进化现象,总结出进化过程包括复制、杂交、变异、竞争和选择。一些学者从生物遗传、进化的过程得到启发,提出了遗传算法。算法中称遗传的生物体为个体,个体对环境的适应程度用适应值(fitness)表示。适应值取决于个体的染色体,在算法中染色体常用一串数字表示,数字串中的一位对应一个基因。一定数量的个体组成一个群体。对所有个体进行选择、交叉和变异等操作,生成新的群体,称为新一代遗传算法计算程序的流程可以表示如下: 第一步准备工作 (1)选择合适的编码方案,将变量(特征)转换为染色体(数字串,串长为m)。通常用二进制编码。 (2)选择合适的参数,包括群体大小(个体数M)、交叉概率PC和变异概率Pm。 (3)确定适应值函数f(x)。f(x)应为正值。 第二步形成一个初始群体(含M个个体)。在边坡滑裂面搜索问题中,取已分析的可能滑裂面组作为初始群体。 第三步对每一染色体(串)计算其适应值fi,同时计算群体的总适应值。 第四步选择

遗传算法求解动态规划

Using Genetic Algorithms for Dynamic Scheduling
Ana Madureira * Carlos Ramos * Sílvio do Carmo Silva ? anamadur@dei.isep.ipp.pt,, csr@dei.isep.ipp.pt, scarmo@dps.uminho.pt
1
Institute of Engineering Polytechnic of Porto, GECAD - Knowledge Engineering and Decision Support Research Group, Dept. of Computer Science Rua de S?o Tomé, 4200 Porto-Portugal Phone: +351 228340500 Fax: +351 228321159
2 Minho University, Dept. of Production and Systems 4710-057, Braga -– Portugal, Phone: +351 253604745
Abstract
In most practical environments, scheduling is an ongoing reactive process where the presence of real time information continually forces reconsideration and revision of pre-established schedules. Scheduling algorithms that achieve good or near optimal solutions and can efficiently adapt them to perturbations are, in most cases, preferable to those that achieve optimal ones but that cannot implement such an adaptation. This reality, motivated us to concentrate on tools, which could deal with such dynamic, disturbed scheduling problems, both for single and multi-machine manufacturing settings, even though, due to the complexity of these problems, optimal solutions may not be possible to find. We decided to address the problem drawing upon the potential of Genetic Algorithms to deal with such complex situations. We decided to address the problem drawing upon the potential of Genetic Algorithms to deal with such complex situations. Since in a sense natural evolution is a process of continuous adaptation, it seems appropriate to consider Genetic Algorithms as good candidates for dynamic scheduling problems. This paper is concerned with vertical oriented detailed scheduling of Extended Job-Shop on dynamic environments. It addresses the scheduling of tasks, either simple or complex products, comprehending the parts fabrication and their multistage assembly into complex products. Key Words: Dynamic Scheduling, Population Dynamic Adaptation, Regenerating Mechanism, Genetic Algorithms.
1. INTRODUCTION
Research on the theory and practice of scheduling has been pursued for many years. Theoretical scheduling problems concerned with searching for optimal schedules subject to a limited number of constraints have adopted a variety of techniques including branch-and-bound and dynamic programming. From the point of view of combinatorial optimization the question of how to sequence and schedule jobs in a dynamic environment looks rather complex and is known to be NP-hard. For literature on this subject, see for example, Baker (1974), French (1982), Blazewicz et al. (2001), Pinedo (2001) and Brucker (2001). In generic terms, the scheduling process can be defined as the assignment of time-constrained jobs to timeconstrained resources within a pre-defined time framework, which represents the complete time horizon of the schedule. An admissible schedule will have to satisfy a set of hard and soft constraints imposed on jobs and resources. So, a scheduling problems can be seen as a decision making process for operations starting and resources to be used. A variety of characteristics and constraints related with jobs and production system, such as operation processing times, release and due dates, precedence constraints and resource availability, can affect scheduling decisions. If all jobs are known before processing starts a scheduling problem is said to be static, while, to classify a problem as dynamic it is sufficient that job release times are not fixed at a single point in time, i.e. jobs arrive to the system at different times. Scheduling problems can also be classified as either deterministic, when processing times and all other parameters are known and fixed, or as non-deterministic, when some or all parameters are uncertain (French, 1982). Most of the known work on scheduling deals with optimisation of scheduling problems in static environments, whereas, due to several sorts of random occurrences and perturbations, real world scheduling problems are usually of dynamic nature. Due to their dynamic nature, real scheduling problems have additional complexity in relation to static ones. However, in many situations, both static and dynamic problems, even for apparently simple cases, are hard to

matlab、lingo程序代码3-背包问题(遗传算法)复习过程

背包问题---遗传算法解决 function Population1=GA_copy(Population,p,w0,w) %复制算子 %Population为种群 n=length(Population(:,1)); fvalue=zeros(1,n); for i=1:n fvalue(i)=GA_beibao_fitnessvalue(Population(i,:),p,w0,w); end fval=fvalue/sum(fvalue); F(1)=0; for j=1:n F(j+1)=0; for k=1:j F(j+1)=F(j+1)+fval(k); end end for i=1:n test=rand; for j=1:n if((test>=F(j))&&(test

POP(j,z)=Population(i,z); end POP(j,l+1)=i; p(j)=randint(1,1,[1 l-1]); j=j+1; end end k0=j-1; k=floor(k0/2); if k>=1 for m=1:k for t=p(2*m-1)+1:l s=POP(2*m-1,t); POP(2*m-1,t)=POP(2*m,t); POP(2*m,t)=s; end end for m=1:k0 for i=1:l Population1(POP(m,l+1),i)=POP(m,i); end end end function fitnessvalue=GA_fitnessvalue(x,p,w0,w) %使用惩罚法计算适应度值 %x为染色体 %p为背包问题中每个被选物体的价值 %w0为背包问题中背包总容积 %w为背包问题中每个被选物品的容积 l=length(x); for i=1:l a(i)=p(i).*x(i); end f=sum(a); b=min(w0,abs(sum(w)-w0)); for i=1:l wx(i)=w(i).*x(i); end if abs(sum(wx)-w0)>b*0.99 p=0.99;

遗传算法解决TSP问题的matlab程序

1.遗传算法解决TSP 问题(附matlab源程序) 2.知n个城市之间的相互距离,现有一个推销员必须遍访这n个城市,并且每个城市 3.只能访问一次,最后又必须返回出发城市。如何安排他对这些城市的访问次序,可使其 4.旅行路线的总长度最短? 5.用图论的术语来说,假设有一个图g=(v,e),其中v是顶点集,e是边集,设d=(dij) 6.是由顶点i和顶点j之间的距离所组成的距离矩阵,旅行商问题就是求出一条通过所有顶 7.点且每个顶点只通过一次的具有最短距离的回路。 8.这个问题可分为对称旅行商问题(dij=dji,,任意i,j=1,2,3,…,n)和非对称旅行商 9.问题(dij≠dji,,任意i,j=1,2,3,…,n)。 10.若对于城市v={v1,v2,v3,…,vn}的一个访问顺序为t=(t1,t2,t3,…,ti,…,tn),其中 11.ti∈v(i=1,2,3,…,n),且记tn+1= t1,则旅行商问题的数学模型为: 12.min l=σd(t(i),t(i+1)) (i=1,…,n) 13.旅行商问题是一个典型的组合优化问题,并且是一个np难问题,其可能的路径数目 14.与城市数目n是成指数型增长的,所以一般很难精确地求出其最优解,本文采用遗传算法 15.求其近似解。 16.遗传算法: 17.初始化过程:用v1,v2,v3,…,vn代表所选n个城市。定义整数pop-size作为染色体的个数 18.,并且随机产生pop-size个初始染色体,每个染色体为1到18的整数组成的随机序列。 19.适应度f的计算:对种群中的每个染色体vi,计算其适应度,f=σd(t(i),t(i+1)). 20.评价函数eval(vi):用来对种群中的每个染色体vi设定一个概率,以使该染色体被选中 21.的可能性与其种群中其它染色体的适应性成比例,既通过轮盘赌,适应性强的染色体被 22.选择产生后台的机会要大,设alpha∈(0,1),本文定义基于序的评价函数为eval(vi)=al 23.pha*(1-alpha).^(i-1) 。[随机规划与模糊规划] 24.选择过程:选择过程是以旋转赌轮pop-size次为基础,每次旋转都为新的种群选择一个 25.染色体。赌轮是按每个染色体的适应度进行选择染色体的。 26.step1 、对每个染色体vi,计算累计概率qi,q0=0;qi=σeval(vj) j=1,…,i;i=1, 27.…pop-size. 28.step2、从区间(0,pop-size)中产生一个随机数r; 29.step3、若qi-1 step4、重复step2和step3共pop-size次,这样可以得到pop-size个复制的染色体。 30.grefenstette编码:由于常规的交叉运算和变异运算会使种群中产生一些无实际意义的 31.染色体,本文采用grefenstette编码《遗传算法原理及应用》可以避免这种情况的出现 32.。所谓的grefenstette编码就是用所选队员在未选(不含淘汰)队员中的位置,如: 33.8 15 2 16 10 7 4 3 11 14 6 12 9 5 18 13 17 1 34.对应: 35.8 14 2 13 8 6 3 2 5 7 3 4 3 2 4 2 2 1。 36.交叉过程:本文采用常规单点交叉。为确定交叉操作的父代,从到pop-size重复以下过 37.程:从[0,1]中产生一个随机数r,如果r 将所选的父代两两组队,随机产生一个位置进行交叉,如: 38.8 14 2 13 8 6 3 2 5 7 3 4 3 2 4 2 2 1 39. 6 12 3 5 6 8 5 6 3 1 8 5 6 3 3 2 1 1 40.交叉后为: 41.8 14 2 13 8 6 3 2 5 1 8 5 6 3 3 2 1 1 42. 6 12 3 5 6 8 5 6 3 7 3 4 3 2 4 2 2 1 43.变异过程:本文采用均匀多点变异。类似交叉操作中选择父代的过程,在r 选择多个染色体vi作为父代。对每一个 选择的父代,随机选择多个位置,使其在每位置

遗传算法解非线性方程

遗传算法解非线性方程组的Matlab程序 程序用MATLAB语言编写。之所以选择MATLB,是因为它简单,但又功能强大。写1行MATLAB程序,相当于写10行C++程序。在编写算法阶段,最好用MATLAB语言,算法验证以后,要进入工程阶段,再把它翻译成C++语言。 本程序的算法很简单,只具有示意性,不能用于实战。 非线性方程组的实例在函数(2)nonLinearSumError1(x)中,你可以用这个实例做样子构造你自己待解的非线性方程组。 %注意:标准遗传算法的一个重要概念是,染色体是可能解的2进制顺序号,由这个序号在可能解的集合(解空间)中找到可能解 %程序的流程如下: %程序初始化,随机生成一组可能解(第一批染色体) %1: 由可能解的序号寻找解本身(关键步骤) %2:把解代入非线性方程计算误差,如果误差符合要求,停止计算 %3:选择最好解对应的最优染色体 %4:保留每次迭代产生的最好的染色体,以防最好染色体丢失 %5: 把保留的最好的染色体holdBestChromosome加入到染色体群中 %6: 为每一条染色体(即可能解的序号)定义一个概率(关键步骤) %7:按照概率筛选染色体(关键步骤) %8:染色体杂交(关键步骤) %9:变异 %10:到1 %这是遗传算法的主程序,它需要调用的函数如下。 %由染色体(可能解的2进制)顺序号找到可能解: %(1)x=chromosome_x(fatherChromosomeGroup,oneDimensionSet,solutionS um); %把解代入非线性方程组计算误差函数:(2)functionError=nonLinearSumError1(x); %判定程是否得解函数:(3)[solution,isTrue]=isSolution(x,funtionError,solutionSumError); %选择最优染色体函数: %(4)[bestChromosome,leastFunctionError]=best_worstChromosome(fatherC hromosomeGroup,functionError); %误差比较函数:从两个染色体中,选出误差较小的染色体 %(5)[holdBestChromosome,holdLeastFunctionError]... % =compareBestChromosome(holdBestChromosome,holdLeastFunctionError,... % bestChromosome,leastFuntionError) %为染色体定义概率函数,好的染色体概率高,坏染色体概率低 %(6)p=chromosomeProbability(functionError); %按概率选择染色体函数: %(7)slecteChromosomeGroup=selecteChromome(fatherChromosomeGroup,p );

TSP问题的遗传算法求解

TSP问题的遗传算法求解 一、问题描述 假设有一个旅行商人要拜访N个城市,要求他从一个城市出发,每个城市最多拜访一次,最后要回到出发的城市,保证所选择的路径长度最短。 二、算法描述 (一)算法简介 遗传算法(GeneticAlgorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,通过模拟自然进化过程搜索最优解。遗传算法是从代表问题可能潜在的解集的一个种群(population)开始的,初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代(generation)演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应度(fitness)大小选择个体,并借助于自然遗传学的遗传算子(geneticoperators)进行组合交叉(crossover)和变异(mutation),产生出代表新的解集的种群。这个过程将导致种群像自然进化一样的后生代种群比前代更加适应于环境,末代种群中的最优个体经过解码(decoding),可以作为问题近似最优解。(摘自百度百科)。 (二)遗传算子 遗传算法中有选择算子、交叉算子和变异算子。 选择算子用于在父代种群中选择进入下一代的个体。 交叉算子用于对种群中的个体两两进行交叉,有Partial-MappedCrossover、OrderCrossover、Position-basedCrossover等交叉算子。 变异算子用于对种群中的个体进行突变。 (三)算法步骤描述 遗传算法的基本运算过程如下: 1.初始化:设置进化代数计数器t=0、设置最大进化代数T、交叉概率、变异概率、随机生成M个个体作为初始种群P 2.个体评价:计算种群P中各个个体的适应度 3.选择运算:将选择算子作用于群体。以个体适应度为基础,选择最优个体直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代 4.交叉运算:在交叉概率的控制下,对群体中的个体两两进行交叉 5.变异运算:在变异概率的控制下,对群体中的个体两两进行变异,即对某一个体的基因进行随机调整 6.经过选择、交叉、变异运算之后得到下一代群体P1。 重复以上1-6,直到遗传代数为T,以进化过程中所得到的具有最大适应度个体作为最优解输出,终止计算。 三、求解说明 (一)优化目标 给定二维数据int[][]pos用于存储各个城市的坐标,采用欧式距离代表城市之间的距离。利用遗传算法,找到不重复遍历所有城市的路径中,所走距离最短的路径。 (二)选择算子 选择算子采用轮盘赌选择,以每个个体的适应度为基础,为每个个体计算累积概率。

相关文档
最新文档