【遗传算法实验报告 1600字】范文118
遗传算法实验报告4800字遗传算法实验报告1100字遗传算法实验报告1400字算法实验报告7700字算法设计实验报告7800字中南大学--算法实验报告人工智能实验报告
遗传算法实验报告
一、问题描述
对遗传算法的选择操作,设种群规模为4,个体用二进制编码,适应度函数,x的取值区间为[0,30]。
若遗传操作规定如下:
(1)选择概率为100%,选择算法为轮盘赌算法;
(2)交叉概率为1,交叉算法为单点交叉,交叉顺序按个体在种群中的顺序;
(3)变异几率为0
请编写程序,求取函数在区间[0,30]的最大值。
二、方法原理
遗传算法:遗传算法是借鉴生物界自然选择和群体进化机制形成的一种全局寻优算法。与传统的优化算法相比,遗传算法具有如下优点:不是从单个点,而是从多个点构成的群体开始搜索;在搜索最优解过程中,只需要由目标函数值转换得来的适应值信息,而不需要导数等其它辅助信息;搜索过程不易陷入局部最优点。目前,该算法已渗透到许多领域,并成为解决各领域复杂问题的有力工具。在遗传算法中,将问题空间中的决策变量通过一定编码方法表示成遗传空间的一个个体,它是一个基因型串结构数据;同时,将目标函数值转换成适应值,它用来评价个体的优劣,并作为遗传操作的依据。遗传操作包括三个算子:选择、交叉和变异。选择用来实施适者生存的原则,即把当前群体中的个体按与适应值成比例的概率复制到新的群体中,构成交配池(当前代与下一代之间的中间群体)。选择算子的作用效果是提高了群体的平均适应值。由于选择算子没有产生新个体,所以群体中最好个体的适应值不会因选择操作而有所改进。交叉算子可以产生新的个体,它首先使从交配池中的个体随机配对,然后将两两配对的个体按某种方式相互交换部分基因。变异是对个体的某一个或某一些基因值按某一较小概率进行改变。从产生新个体的能力方面来说,交叉算子是产生新个体的主要方法,它决定了遗传算法的全局搜索能力;而变异算子只是产生新个体的辅助方法,但也必不可少,因为它决定了遗传算法的局部搜索能力。交叉和变异相配合,共同完成对搜索空间的全局和局部搜索。
三、实现过程
(1)编码:使用二进制编码,随机产生一个初始种群。L表示编码长度,通常由对问题的求解精度决定,编码长度L越长,可期望的最优解的精度也就越高,过大的L会增大运算量。
(2)生成初始群体:种群规模表示每一代种群中所含个体数目。随机产生N个初始串结构数据,每个串结构数据成为一个个体,N个个体组成一个初始群体,N表示种群规模的大小。当N取值较小时,可提高遗传算法的运算速度,但却降低种群的多样性,容易引起遗传算法早熟,出现假收敛;而N当取值较大时,又会使得遗传算法效率降低。一般建议的取值范围是20—100。遗传算法以该群体作为初始迭代点;
(3)适应度检测:根据实际标准计算个体的适应度,评判个体的优劣,即该个体所代表的可行解的优劣。本例中适应度即为所求的目标函数;
(4)选择:从当前群体中选择优良(适应度高的)个体,使它们有机会被选中进入下一次迭代过程,舍弃适应度低的个体。本例中采用轮盘赌的选择方法,即个体被选择的几率与其适应度值大小成正比;
(5)交叉:遗传操作,根据设置的交叉概率对交配池中个体进行基因交叉操作,形成新一代的种群,新一代中间个体的信息来自父辈个体,体现了信息交换的原则。交叉概率控制着交叉操作的频率,由于交叉操作是遗传算法中产生新个体的主要方法,所以交叉概率通常应取较大值;但若过大的话,又可能破坏群体的优良模式。一般取0.4到0.99。
(6)变异:随机选择中间群体中的某个个体,以变异概率大小改变个体某位基因的值。变异为产生新个体提供了机会。变异概率也是影响新个体产生的一个因素,变异概率小,产生新个体少;变异概率太大,又会使遗传算法变成随机搜索。一般取变异概率为0.0001—0.1。
(7)终止进化代数。本例中规定遗传代数的收敛判据,根据设置好的进化代数,搜索到规定代数后自动停止。
四、具体代码
代码如下:
五、实验结果
六、实验总结
经过实验的实践,使我更加清楚了解了遗传算法的应用与原理。
1234第二篇:遗传算法实验报告5400字
遗传算法实验报告
专业:自动化姓名:**学号:**
摘要:遗传算法,是基于达尔文进化理论发展起来的一种应用广泛、高效的随机搜索与优化方法。本实验利用遗传算法来实现求函数最大值的优化问题,其中的步骤包括初始化群体、个体评价、选择运算、交叉运算、变异运算、终止条件判断。该算法具有覆盖面大、减少进入局部最优解的风险、自主性等特点。此外,遗传算法不是采用确定性原则而是采用概率的变迁规则来指导搜索方向,具有动态自适应的优点。
关键词:串集最优化评估迭代变异
一:实验目的
熟悉和掌握遗传算法的运行机制和求解的基本方法。
遗传算法是一种基于空间搜索的算法,它通过自然选择、遗传、变异等操作以及达尔文的适者生存的理论,模拟自然进化过程来寻找所求问题的答案。其求解过程是个最优化的过程。一般遗传算法的主要步骤如下:
(1)随机产生一个确定长度的特征字符串组成的初始种群。。
(2)对该字符春种群迭代地执行下面的步骤a和步骤b,直到满足停止准则为止:
a计算种群中每个个体字符串的适应值;
b应用复制、交叉和变异等遗传算子产生下一代种群。
(3)把在后代中表现的最好的个体字符串指定为遗传算法的执行结果,即为问题的一
个解。
二:实验要求
已知函数y=f(x1,x2,x3,x4)=1/(x12+x22+x32+x42+1),其中-5≤x1,x2,x3,x4≤5,用遗传算法求y的最大值。
三:实验环境
操作系统:Microsoft Windows 7
软件:Microsoft Visual studio2010
四:实验原理与步骤
1、遗传算法的思想
生物的进化是以集团为主体的。与此相对应,遗传算法的运算对象是由M个个体所组成的集合,称为群体。与生物一代一代的自然进化过程相类似,遗传算法的运算过程也是一个反复迭代过程,第t代群体极为P(t),进过一代遗传和进化后,得到第t+1代群体,他们也是由多个个体组成的集合,记做P(t+1)。这个群体不断地经过遗传和进化操作,并且每次都按照有优胜劣汰的规则将适应度较高的个体更多地遗传到下一代,这样最终在群体中将会得到一个优良的个体X,它所对应的表现性X将达到或接近于问题的最优解。
2、算法实现步骤
①、产生初始种群:产生初始种群的方法通常有两种:一种是完全随机的方法产生的,适合于对问题的解无任何先验知识的情况;另一种是将某些先验知识转变为必须满足的一组要求,然后在满足这些要求的解中再随机地选择样本,t=0,随机产生n个个体形成一个初始群体P(t),该群体代表优化问题的一些可能解的集合;
②适应度评价函数:按编码规则,将群体P(t)中的每一个个体的基因码所对应的自变量取值代入目标函数,算出其函数值f,i=1,2,…,n,f越大,表示该个体有较高的适应度,更适合于f所定义的生存环境,适应度f为群体进化提供了依据;
③选择:按一定概率从群体P(t)中选出m个个体,作为双亲用于繁殖后代,产生新的个体加入下一个群体P(t+1)中。此处选用轮盘算法,也就是比例选择算法,个体被选择的概率与其适应度成正比。
④交叉(重组):对于选中的用于繁殖的每一个个体,选择一种交叉方法,产生新的个体;此处采取生成随机数决定交叉的个体与交叉的位置。
⑤变异:以一定的概率Pm从群体P(t+1)中随机选择若干个个体,对于选中的个体随机选择某个位置,进行变异;
⑥对产生新一代的群体返回步骤③再进行评价,交叉、变异如此循环往复,使群体中个体的适应度和平均适应度不断提高,直至最优个体的适应度达到某一限值或最优个体的适应度和群体的平均适应度不再提高,则迭代过程收敛,算法结束。
五:实验结果
实验结果的显示取决于判断算法终止的条件,这里可以有两种选择:1、在程序中设定迭代的次数;2在程序中设定适应值。本实验是在程序中实验者输入需要迭代的次数来判断程序终结的。
六:实验小结
在实验过程中,我觉得发现算子的选择对实验结果有一定程度的影响,所以除了采用PPT上的算子选取外,也同样尝试了其他的算子选择方法。
1、选择算子
①、排序选择方法。基于个体按适应度大小的排序来分配个体被选中的概率,这种算法与轮盘算法的思路差不多。
②、保存最佳个体策略。由于选择、交配、变异等操作的随机性,当代最优秀的个体可能会被破坏,所以可以采用保存当代最优秀的个体,参与到下一代的选择过程中。
不过总的来说,轮盘算法还是选取选择算子最有效、最常用的算法。
2、交叉算子
①、单点交叉。是指在个体编码串中随机设置一个交叉点,在该店交换配对的两条染色体上的基因。
②、两点交叉与多点交叉。在选择交叉算子的过程中,单点交叉是最简单的方法,又称简单交叉,两点甚至多点交叉,是交配两点之间的染色体,比单点交叉的适应性更高,不过程序略复杂。
本实验采用的是均匀交叉,在选定位置后每一位基因都以相同的概率进行交叉。
附上实验代码(visualstudio2010环境下运行)
#include<iostream>
#include<ctime>
#include<iomanip>
#include<algorithm>
usingnamespacestd;
intmain()
{
srand(time(0));
doublearr[5][4];//初始化
cout<<"初始化:"<<endl;
for(inti=0;i<5;i++)
{
cout<<"C"<<i<<"";
for(intj=0;j<4;j++)
{
arr[i][j]=((-5000+rand()%100000)*0.0001);
cout<<setiosflags(ios::left)<<setw(8)<<arr[i][j]<<"";
}
cout<<endl;
}
doubleresult[5];doublebest_result;doubleresult1[5];//适应值计算
for(inti=0;i<5;i++)
{
doublesum=0;
for(intj=0;j<4;j++)
sum+=arr[i][j]*arr[i][j];
result[i]=1/(sum+1);
}
for(inti=0;i<5;i++)
result1[i]=result[i];
sort(result1,result1+5);
best_result=result1[4];cout<<"初始化后进行适应值计算,最大值best_result:"<<best_result<<endl;
intn;cout<<"请输入需要迭代的次数:";cin>>n;inttest_num=1;doubletest_result;
while(test_num<=n)
{
cout<<"第"<<test_num<<"次迭代:"<<endl;
doublesum_result=0;doublepecentage[5];//选择
for(inti=0;i<5;i++)
sum_result+=result[i];
for(inti=0;i<5;i++)
{
pecentage[i]=result[i]/sum_result;
}
doublea;doublearr1[5][4];
for(inti=0;i<5;i++)
for(intj=0;j<5;j++)
arr1[i][j]=arr[i][j];
for(inti=0;i<5;i++)
{
a=(rand()%100)*0.01;
if(a<=pecentage[0])
for(intj=0;j<4;j++)
arr[i][j]=arr1[0][j];
if(a>pecentage[0]&&a<=(pecentage[0]+pecentage[1]))
for(intj=0;j<4;j++)
arr[i][j]=arr1[1][j];
if(a>(pecentage[0]+pecentage[1])&&a<=(pecentage[0]+pecentage[1]+pecentage[2]))
for(intj=0;j<4;j++)
arr[i][j]=arr1[2][j];
if(a>(pecentage[0]+pecentage[1]+pecentage[2])&&a<=(pecentage[0]+pecentage[1]+pecentage[2]+pecentage[3]))
for(intj=0;j<4;j++)
arr[i][j]=arr1[3][j];
if(a>(pecentage[0]+pecentage[1]+pecentage[2]+pecentage[3])&&a<=(pecentage[0]+pecentage[1]+pecentage[2]+pecentage[3]+pecentage[4]))
for(intj=0;j<4;j++)
arr[i][j]=arr1[4][j];
}
doublemating_pecentage=0.88;doublemating[5];intnum;doubletend[4]={0};//交配
for(inti=0;i<5;i++)
{
mating[i]=(rand()%100)*0.01;
}
for(inti=0;i<5;i++)
{
if(mating[i]<=0.88)
{
for(intk=i+1;k<5;k++)
{
if(mating[k]<=0.88&&arr[i][0]!=arr[k][0])
{
num=rand()%3;
for(intl=num+1;l<4;l++)
tend[l]=arr[i][l];
for(intm=num+1;m<4;m++)
{
arr[i][m]=arr[k][m];
arr[k][m]=tend[m];
}
}
mating[k]=1;
break;
}
}
}
doublevariation[5][4];//变异
for(inti=0;i<5;i++)
{
for(intj=0;j<4;j++)
variation[i][j]=(rand()%100)*0.01;
}
for(inti=0;i<5;i++)
for(intj=0;j<4;j++)
if(variation[i][j]<0.1)
arr[i][j]=(-5000+rand()%10000)*0.0001;
cout<<"新群体:"<<endl;
for(inti=0;i<5;i++)
{
for(intj=0;j<4;j++)
cout<<setiosflags(ios::left)<<setw(8)<<arr[i][j]<<"";
cout<<endl;
}
for(inti=0;i<5;i++)//重新评价
{
doublesum=0;
for(intj=0;j<4;j++)
sum+=arr[i][j]*arr[i][j];
result[i]=1/(sum+1);
}
for(inti=0;i<5;i++)
result1[i]=result[i];
sort(result1,result1+5);
test_result=result1[4];if(test_result>best_result)best_result=test_result;
cout<<"适应值计算,更新best_result:"<<best_result<<endl;
test_num++;
}
system("pause");
return0;
}
+更多类似范文┣ 进化算法,遗传算法3700字┣ 北京理工大学计算机实验八报告表100字┣ 人工智能(遗传算法)3000字┣ 实验八实验报告表100字┣ 更多遗传算法实验报告人工智能基础实验报告
蒙特卡洛算法目录
蒙特卡洛算法····································································································1概述:··············································································································1思考步骤:···········································································································1应用:··············································································································1特点:··············································································································2参考资料·······································································································3
概述:蒙特卡罗法(MonteCarlomethod)也称统计模拟法、统计试验法。是把概率现象作为研究对象的数值模拟方法。是按抽样调查法求取统计值来推定未知特性量的计算方法。蒙特卡罗是摩纳哥的著名赌城,该法为表明其随机抽样的本质而命名。故适用于对离散系统进行计算仿真试验。在计算仿真中,通过构造一个和系统性能相近似的概率模型,并在数字计算机上进行随机试验,可以模拟系统的随机特性。蒙特卡洛方法的理论基础是大数定律。大数定律是描述相当多次数重复试验的结果的定律,在大数定理的保证下:利用事件发生的频率作为事件发生的概率的近似值。所以只要设计一个随机试验,使一个事件的概率与某未知数有关,然后通过重复试验,以频率近似值表示概率,即可求得该未知数的近似值。样本数量越多,其平均就越趋近于真实值。此种方法可以求解微分方程,求多重积分,求特征值等。
思考步骤:蒙特卡罗方法一般分为三个步骤,包括构造随机的概率的过程,从构造随机概率分布中抽样,求解估计量。
1构造随机的概率过程对于本身就具有随机性质的问题,要正确描述和模拟这个概率过程。对于本来不是随机性质的确定性问题,比如计算定积分,就必须事先构造一个人为的概率过程了。它的某些参数正好是所要求问题的解,即要将不具有随机性质的问题转化为随机性质的问题。如本例中求圆周率的问题,是一个确定性的问题,需要事先构造一个概率过程,将其转化为随机性问题,即豆子落在圆内的概率,而π就是所要求的解。
2从已知概率分布抽样由于各种概率模型都可以看作是由各种各样的概率分布构成的,因此产生已知概率分布的随机变量,就成为实现蒙特卡罗方法模拟实验的基本手段。如本例中采用的就是最简单、最基本的(0,1)上的均匀分布,而随机数是我们实现蒙特卡罗模拟的基本工具。
3求解估计量实现模拟实验后,要确定一个随机变量,作为所要求问题的解,即无偏估计。建立估计量,相当于对实验结果进行考察,从而得到问题的解。如求出的近似π就认为是一种无偏估计。应用:求圆周率。计算圆周率时可以考虑将一个单位圆放在一个正方形中,从而将求解圆周率转化为计算出圆和正方形面积的比例。由于C语言效率更高,就用C语言来实现了。
/*Note:YourchoiceisCIDE*/#include"stdio.h"#include"stdlib.h"#includevoidmain(){intj=10;//运行十亿次while(j-->0){inti=1,count=0;while(i++count++;}}printf("%lf ",count*4.0/i);}}运行结果:特点:一般情况下,蒙特卡罗算法的特点是,采样越多,越近似最优解。优点:对于具有统计性质的问题可以直接进行解决,对于连续性的问题也不必进行离散化处理。缺点:1、对于确定性问题转化成随机性问题做的估值处理,丧失精确性,得到一个接近准确的N值也不太容易。2、如果解空间的可能情况很多则很难求解(NP问题)
参考资料[1]萧浩辉.决策科学辞典:人民出版社,1995[2]陈磊,姚伟召,郭全魁,王秀华著,效能评估理论、方法及应用,北京邮电大学出版社,2016.01[3]百度百科蒙特卡罗法2022年12月