人工智能 遗传算法实验报告
实验六:遗传算法求解TSP问题实验3篇
实验六:遗传算法求解TSP问题实验3篇以下是关于遗传算法求解TSP问题的实验报告,分为三个部分,总计超过3000字。
一、实验背景与原理1.1 实验背景旅行商问题(Traveling Salesman Problem,TSP)是组合优化中的经典问题。
给定一组城市和每两个城市之间的距离,求解访问每个城市一次并返回出发城市的最短路径。
TSP 问题具有很高的研究价值,广泛应用于物流、交通运输、路径规划等领域。
1.2 遗传算法原理遗传算法(Genetic Algorithm,GA)是一种模拟自然选择和遗传机制的搜索算法。
它通过选择、交叉和变异操作生成新一代解,逐步优化问题的解。
遗传算法具有全局搜索能力强、适用于多种优化问题等优点。
二、实验设计与实现2.1 实验设计本实验使用遗传算法求解TSP问题,主要包括以下步骤:(1)初始化种群:随机生成一定数量的个体(路径),每个个体代表一条访问城市的路径。
(2)计算适应度:根据路径长度计算每个个体的适应度,适应度越高,路径越短。
(3)选择操作:根据适应度选择优秀的个体进入下一代。
(4)交叉操作:随机选择两个个体进行交叉,生成新的个体。
(5)变异操作:对交叉后的个体进行变异,增加解的多样性。
(6)更新种群:将新生成的个体替换掉上一代适应度较低的个体。
(7)迭代:重复步骤(2)至(6),直至满足终止条件。
2.2 实验实现本实验使用Python语言实现遗传算法求解TSP问题。
以下为实现过程中的关键代码:(1)初始化种群```pythondef initialize_population(city_num, population_size): population = []for _ in range(population_size):individual = list(range(city_num))random.shuffle(individual)population.append(individual)return population```(2)计算适应度```pythondef calculate_fitness(population, distance_matrix): fitness = []for individual in population:path_length =sum([distance_matrix[individual[i]][individual[i+1]] for i in range(len(individual) 1)])fitness.append(1 / path_length)return fitness```(3)选择操作```pythondef selection(population, fitness, population_size): selected_population = []fitness_sum = sum(fitness)fitness_probability = [f / fitness_sum for f in fitness]for _ in range(population_size):individual = random.choices(population, fitness_probability)[0]selected_population.append(individual)return selected_population```(4)交叉操作```pythondef crossover(parent1, parent2):index1 = random.randint(0, len(parent1) 2)index2 = random.randint(index1 + 1, len(parent1) 1)child1 = parent1[:index1] +parent2[index1:index2] + parent1[index2:]child2 = parent2[:index1] +parent1[index1:index2] + parent2[index2:]return child1, child2```(5)变异操作```pythondef mutation(individual, mutation_rate):for i in range(len(individual)):if random.random() < mutation_rate:j = random.randint(0, len(individual) 1) individual[i], individual[j] = individual[j], individual[i]return individual```(6)更新种群```pythondef update_population(parent_population, child_population, fitness):fitness_sum = sum(fitness)fitness_probability = [f / fitness_sum for f in fitness]new_population =random.choices(parent_population + child_population, fitness_probability, k=len(parent_population)) return new_population```(7)迭代```pythondef genetic_algorithm(city_num, population_size, crossover_rate, mutation_rate, max_iterations): distance_matrix =create_distance_matrix(city_num)population = initialize_population(city_num, population_size)for _ in range(max_iterations):fitness = calculate_fitness(population, distance_matrix)selected_population = selection(population, fitness, population_size)parent_population = []child_population = []for i in range(0, population_size, 2):parent1, parent2 = selected_population[i], selected_population[i+1]child1, child2 = crossover(parent1, parent2)child1 = mutation(child1, mutation_rate)child2 = mutation(child2, mutation_rate)parent_population.extend([parent1, parent2]) child_population.extend([child1, child2])population =update_population(parent_population, child_population, fitness)best_individual =population[fitness.index(max(fitness))]best_path_length =sum([distance_matrix[best_individual[i]][best_individual[i +1]] for i in range(len(best_individual) 1)])return best_individual, best_path_length```三、实验结果与分析3.1 实验结果本实验选取了10个城市进行测试,遗传算法参数设置如下:种群大小:50交叉率:0.8变异率:0.1最大迭代次数:100实验得到的最佳路径长度为:1953.53.2 实验分析(1)参数设置对算法性能的影响种群大小:种群大小会影响算法的搜索能力和收敛速度。
人工智能 遗传算法实验报告
人工智能试验陈述学号:姓名:试验名称:遗传算法试验日期: 2016.1.5【试验名称】遗传算法【试验目标】控制遗传算法的基起源基础理,熟习遗传算法的运行机制,学会用遗传算法来求解问题.【试验道理】遗传算法(Genetic Algorithm)是模仿达尔文生物进化论的天然选择和遗传学机理的生物进化进程的盘算模子,是一种经由过程模仿天然进化进程搜刮最优解的办法.遗传算法是从代表问题可能潜在的解集的一个种群开端的,而一个种群则由经由基因编码的必定命目标个别构成.每个个别现实上是染色体带有特点的实体.在一开端须要实现从表示型到基因型的映射即编码工作.因为模仿基因编码的工作很庞杂,我们往往进行简化,如二进制编码,初代种群产生之后,按照适者生计和优越劣汰的道理,逐代演变产生出越来越好的近似解,在每一代,依据问题域中个别的顺应度大小选择个别,并借助于天然遗传学的遗传算子进行组合交叉和变异,产生出代表新的解集的种群.这个进程将导致种群像天然进化一样的后生代种群比前代加倍顺应于情况,末代种群中的最优个别经由解码,可以作为问题近似最优解.遗传算法程度流程图为:【试验内容】标题:已知f(x)=x*sin(x)+1,xÎ[0,2p],求f(x)的最大值和最小值.数据构造:struct poptype{double gene[length];//染色体double realnumber;//对应的实数xdouble fitness;//顺应度double rfitness;//相对顺应度double cfitness;//累计顺应度};struct poptype population[popsize+1];//最后一位存放max/minstruct poptype newpopulation[popsize+1];//染色体编码:[0,2]x π∈,变量长度为 2 π,取小数点后6位,因为2262322*102;π<<是以,染色体由23位字节的二进制矢量暗示,则X 与二进制串(<b 22 b 21…… b 0>)2之间的映射如下:()22222102010bb ......b 2'i i i b x =⎛⎫=•= ⎪⎝⎭∑;232'21x x π=- 顺应度函数: 因为请求f(x)的最值,所以顺应度函数即可为f(x).但为了确保在轮赌法选择过中,每个个别都有被选中的可能性,是以须要将所有顺应度调剂为大于0的值.是以,设计求最大值的顺应度函数如下:将最小问题转化为求-f(x)的最大值,同理,设计最小值的顺应度函数如下:种群大小:本试验默以为50,再进行种群初始化.试验参数:重要有迭代数,交叉概率,变异概率这三个参数.一般交叉概率在0.6-0.9规模内,变异概率在0.01-0.1规模内.可以经由过程手动输入进行调试.重要代码如下:void initialize()//种群初始化{srand(time(NULL));int i,j;for(i=0;i<popsize;i++)for(j=0;j<23;j++)population[i].gene[j]=rand()%2;void transform()//染色体转化为实数x{int i,j;for(i=0;i<=popsize+1;i++){population[i].realnumber=0;for(j=0;j<23;j++)population[i].realnumber+=population[i].gene[j]*pow(2 ,j);population[i].realnumber=population[i].realnumber*2*p i/(pow(2,23)-1);}}void cal_fitness()//盘算顺应度{int i;for(i=0;i<popsize;i++)population[i].fitness=population[i].realnumber*sin(po pulation[i].realnumber)+6;}void select()//选择操纵{int mem,i,j,k;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<population[j+1].cfitness)newpopulation[i]=population[j+1];}}for (i=0;i<popsize;i++)//复制给下一代population[i]=newpopulation[i];}void cross()//交叉操纵{int i, mem, one;int first = 0;double x;for(mem=0;mem<popsize;mem++){x = rand()%1000/1000.0;if (x<pcross){++first;if (first%2==0)Xover(one,mem);//个别间染色体进行交叉函数else one=mem;}}}void mutate()//变异操纵{int i, j,t;double x;for (i=0;i<popsize;i++)for(j=0;j<length;j++){x=rand()%1000/1000.0;if (x<pvariation){if(population[i].gene[j])population[i].gene[j]=0; else population[i].gene[j]=1;}}}void cal_max()//盘算最大值{int i;double max,sum=0;int max_m;max=population[0].fitness;for(i=0;i<popsize-1;i++){if(population[i].fitness>population[i+1].fitness)if(population[i].fitness>=max){max=population[i].fitness;max_m=i;}else if(population[i+1].fitness>=max){max=population[i+1].fitness;max_m=i + 1;}}if(max>population[popsize].fitness){iteration=0;for (i=0;i<length;i++)population[popsize].gene[i]=population[max_m].gene[i]; population[popsize].fitness=population[max_m].fitness; }for (i=0;i<length;i++)sum=population[popsize].gene[i]-population[max_m].gene[i];if(sum==0)iteration++;transform();printf("%f,%f,%f,%f\n",population[popsize].fitness,po pulation[popsize+1].fitness,population[popsize].realnumbe r,population[popsize+1].realnumber);}【试验成果】。
人工智能遗传算法实验报告
人工智能实验报告学号:姓名:实验名称:遗传算法实验日期:2016.1.5【实验名称】遗传算法【实验目的】掌握遗传算法的基本原理,熟悉遗传算法的运行机制,学会用遗传算法来求解问题。
【实验原理】遗传算法( Genetic Algorithm )是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。
遗传算法是从代表问题可能潜在的解集的一个种群开始的,而一个种群则由经过基因编码的一定数目的个体组成。
每个个体实际上是染色体带有特征的实体。
在一开始需要实现从表现型到基因型的映射即编码工作。
由于仿照基因编码的工作很复杂,我们往往进行简化,如二进制编码,初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应度大小选择个体,并借助于自然遗传学的遗传算子进行组合交叉和变异,产生出代表新的解集的种群。
这个过程将导致种群像自然进化一样的后生代种群比前代更加适应于环境,末代种群中的最优个体经过解码,可以作为问题近似最优解。
遗传算法程度流程图为:【实验名称】遗传算法【实验目的】掌握遗传算法的基本原理,熟悉遗传算法的运行机制,学会用遗传算法来求解问题。
【实验原理】遗传算法( Genetic Algorithm )是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。
遗传算法是从代表问题可能潜在的解集的一个种群开始的,而一个种群则由经过基因编码的一定数目的个体组成。
每个个体实际上是染色体带有特征的实体。
在一开始需要实现从表现型到基因型的映射即编码工作。
由于仿照基因编码的工作很复杂,我们往往进行简化,如二进制编码,初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应度大小选择个体,并借助于自然遗传学的遗传算子进行组合交叉和变异,产生出代表新的解集的种群。
遗传算法报告
遗传算法实验报告一、实验目的1、 掌握遗传算法原理;2、 学会编写遗传算法程序寻找函数最大值。
二、实验设备装有matlab7.0以上版本软件的PC 机一台三、实验原理传统的优化理论都是通过调整模型的参数来得到期望的结果,而遗传优化算法是根据生物界的遗传和自然选择的原理来实现的,它的学习过程是通过保持和修改群体解中的个体特性,并且保证这种修改能够使下一代的群体中的有利于与期望特性相近的个体在整个群体份额中占有的比例越来越多。
与基于代数学的优化方法一样,遗传算法是通过连续不断地队群体进行改进来搜索函数的最大值。
遗传算法的搜索结果会有很大的差异。
遗传学习的基本机理是使那些优于群体中其他个体的个体具有生存、繁殖以及保持更多基因给下一代的机会。
遗传算法实质上是在群体空间中寻求较优解。
四、实验步骤及内容1、实验步骤:(1)群体初始化;(2)评价群体中每一个体性能;(3)选择下一代个体;(4)执行简单的操作算子(如交叉、变异);(5)评价下一代群体的性能;(6)判断终止条件满足否?若不,则转(3)继续,若满足,则结束。
2、实验内容:寻找函数 22212121(,)100()(1)f x x x x x =-+- 的最大值及所对应的x1和x2的值。
( 2.048 2.048i x -≤≤)五、实验程序clc;clear;%**************************遗传算法*****************************num=80;A1=rand(num,10); %生成随机数A2=rand(num,10);A1=round(A1); %编码A2=round(A2);times=100;for k=1:times %遗传次数SIZE(k)=size(A1,1);for i=1:size(A1,1)B1(i)=binvec2dec(A1(i,:));%二进制转换十进制B2(i)=binvec2dec(A2(i,:));X1(i)=4.096*B1(i)/1023-2.048;%映射到实际取值范围X2(i)=4.096*B2(i)/1023-2.048;H(i)=100*(X1(i)^2-X2(i))^2+(1-X1(i))^2;%计算函数值endJ=1./H;[J1,IX]=sort(J);Hm(k)=H(IX(1)); %得本次迭代的函数最大值Xm1(k)=X1(IX(1));%得本次迭代的使函数值最大的X1值Xm2(k)=X2(IX(1));%得本次迭代的使函数值最大的X2值S=sum(H)/size(H,2); %求适应度C1=[];C2=[];for i=1:size(A1,1)%复制过程if round(H(i)/S)==0 %为0则淘汰C1=C1;C2=C2;elseif round(H(i)/S)==1 %为1保留一次C1=[C1;A1(i,:)];C2=[C2;A2(i,:)];elseif round(H(i)/S)==2 %为2保留两次C1=[C1;A1(i,:);A1(i,:)];C2=[C2;A2(i,:);A2(i,:)];elseif round(H(i)/S)==3 %为3保留三次C1=[C1;A1(i,:);A1(i,:);A1(i,:)];C2=[C2;A2(i,:);A2(i,:);A2(i,:)];elseif round(H(i)/S)==4 %为4保留四次C1=[C1;A1(i,:);A1(i,:);A1(i,:);A1(i,:)];C2=[C2;A2(i,:);A2(i,:);A2(i,:);A2(i,:)];else %其他值时保留五次C1=[C1;A1(i,:);A1(i,:);A1(i,:);A1(i,:);A1(i,:)]; C2=[C2;A2(i,:);A2(i,:);A2(i,:);A2(i,:);;A2(i,:)]; endendA1=C1;A2=C2;for i=1:size(A1,1) %交叉a=rand;%生成本次交叉概率b=round(rand*9+1);%确定交叉位置if a>=0.6c=round(rand*(size(A1,1)-1)+1);%开始交叉D=A1(i,1:b);A1(i,1:b)=A2(c,1:b);A2(c,1:b)=D;endendfor i=1:size(A1,1) %变异e=rand;%生成变异概率f=round(rand*9+1);%确定变异位置if e<=0.1A1(i,f)=~A1(i,f);%开始变异A2(i,f)=~A2(i,f);endendendHH=1./Hm;[Q,IY]=sort(HH);Hmax=Hm(IY(1)) %最优解X1you=Xm1(IY(1)) %最优解时X1值X2you=Xm2(IY(1)) %最优解时X2值t=IY(1)%寻得最优解时的迭代次数s=SIZE(t)%训得最优解时种群中个体个数%************************寻优曲线********************** count=1:times;%figure(1);subplot(2,1,1);plot(count,Hm,'r.-');grid on;title('寻优曲线');xlabel('迭代次数');ylabel('函数取值');%figure(2);subplot(2,1,2);plot(count,SIZE,'b.-');grid on;title('种群个数曲线');xlabel('迭代次数');ylabel('种群个数');六、实验结果第一次运行结果:Hmax = 3.9059e+003 ,X1you = -2.0480,X2you = -2.0480,t =26,s = 42(此结果是最优解)第二次运行结果:Hmax = 3.8855e+003,X1you =-2.0440,X2you =-2.0480,t = 27,s =44(此结果不为最优解)第三次运行结果:Hmax = 3.9059e+003,X1you = -2.0480,X2you =-2.0480,t =17,s =60(此结果是最优解)改变初始种群个体个数为30Hmax = 3.8308e+003,X1you = -2.0440,X2you =-2.0040,t = 7,s = 24 (此结果不为最优解)改变迭代次数为30Hmax =3.8805e+003,X1you = -2.0440,X2you =-2.0440,t = 28,s = 57(此次不为最优解)七、分析实验结果在初始种群为80,迭代次数为100情况下,第一次和第三次运行结果寻得了最优解,而第二次并没寻得最优解,并且第一次和第三次寻得最优解时的迭代次数t和寻得最优解时的种群中个体个数s也不一样。
人工智能遗传算法实验报告
人工智能遗传算法实验报告摘要:遗传算法是一种算法设计和算法实现的一种方法,通过大量的数据进行比较,通过计算和迭代优化,寻找出最优解。
通过对实验数据进行分析和计算,得出了一套适合于计算科学的、高效的人工智能算法。
关键词:人工智能;算法;计算科学;实验作者简介:吴晓峰(1988年7月-),汉族,清华大学计算机系1995年9月毕业于清华大学。
现任北京航空航天大学计算机科学与技术学院教授、博士生导师。
曾任中国科学院计算技术研究所研究员、博士生导师。
一、背景人工智能(Artificial Intelligence)是指利用计算机对人的认知能力进行处理、分析、推理的技术系统。
人工智能领域的研究内容包括了智能系统功能的实现,智能系统的组成、智能系统在不同应用场景下所发挥的作用、智能系统在人与人之间扮演的角色以及智能系统对人类行为所产生的影响等问题。
我国在近年来,以谷歌、微软、百度等为代表的世界人工智能巨头纷纷加大研发力度及相关投入为标志,人工智能技术已经在社会各领域开始崭露头角。
随着人工智能领域在我国经济、科技、文化等方面都有了飞速发展以及中国在人工智能领域所取得的一些成就,我们应该更加重视人工智能技术领域所带来的影响。
本文主要介绍人工智能算法目前最先进的算法及未来发展方向。
本报告将通过一个多月时间对人工智能算法中涉及到的人工智能算法特点、算法原理以及常见问题进行分析总结,以得出一些人工智能算法相关的发展趋势与展望,从而更加深刻地认识人工智能所带来的社会变革与产业变革以及人工智能技术发展的新趋势与新方向之间的关系。
二、实验研究思路在研究人工智能时要做很多实验,首先,要确定好问题的类型,有什么方法能够快速的找到最优解,或者是一些特定的算法。
其次,还要确定实验用到具体的数据类型和数据集。
对于数据集而言,我们主要包括三个部分。
第一部分是需要确定的问题所在的数据集可以在计算机中实现。
第二部分是数据集的选取和组合后在计算机中可以实现的具体算法问题。
遗传算法实验报告
遗传算法实验报告遗传算法实验报告引言:遗传算法是一种模拟生物进化过程的优化算法,通过模拟自然选择、遗传变异和交叉等操作,逐步优化问题的解。
本实验旨在探究遗传算法在解决优化问题中的应用,并通过实验验证其效果。
一、实验背景遗传算法最早由美国科学家约翰·霍兰德于20世纪60年代提出,其灵感来源于达尔文的进化论。
遗传算法通过基因编码、适应度评估、选择、交叉和变异等操作,模拟了进化过程中的遗传和变异,从而找到问题的最优解。
二、实验目的本实验旨在通过遗传算法解决一个经典的优化问题,验证其在解决实际问题中的有效性。
同时,对遗传算法的参数设置和操作过程进行调整和优化,以提高算法的性能。
三、实验步骤1. 问题定义:选择一个经典的优化问题,例如旅行商问题(TSP)或背包问题。
2. 解空间建模:将问题的解表示为染色体,设计基因编码方式。
3. 适应度函数定义:根据问题的特点,设计一个能够评估染色体解的适应度函数。
4. 初始化种群:随机生成一组初始染色体,作为种群。
5. 选择操作:根据适应度函数,选择一部分较优秀的染色体作为父代。
6. 交叉操作:通过交叉操作,生成新的子代染色体。
7. 变异操作:对子代染色体进行变异操作,引入新的基因变异。
8. 适应度评估:计算新的子代染色体的适应度。
9. 父代替换:根据适应度函数,选择一部分较优秀的子代染色体替换掉父代染色体。
10. 终止条件判断:判断是否满足终止条件,若满足则结束算法,否则返回步骤5。
11. 输出结果:输出最优解及其适应度值。
四、实验结果与分析通过实验,我们得到了一组优化问题的最优解,并计算出其适应度值。
通过观察实验结果,我们可以发现遗传算法在解决优化问题中的有效性。
同时,我们还可以通过调整遗传算法的参数和操作过程,进一步提高算法的性能。
五、实验总结通过本次实验,我们深入了解了遗传算法的原理和应用。
遗传算法作为一种优化算法,具有较强的适应性和鲁棒性,在解决实际问题中具有广泛的应用前景。
遗传算法实验报告
人工智能实验报告遗传算法实验报告一、问题描述对遗传算法的选择操作,设种群规模为4,个体用二进制编码,适应度函数,x的取值区间为[0,30]。
若遗传操作规定如下:(1)选择概率为100%,选择算法为轮盘赌算法;(2)交叉概率为1,交叉算法为单点交叉,交叉顺序按个体在种群中的顺序;(3)变异几率为0请编写程序,求取函数在区间[0,30]的最大值。
二、方法原理遗传算法:遗传算法是借鉴生物界自然选择和群体进化机制形成的一种全局寻优算法。
与传统的优化算法相比,遗传算法具有如下优点:不是从单个点,而是从多个点构成的群体开始搜索;在搜索最优解过程中,只需要由目标函数值转换得来的适应值信息,而不需要导数等其它辅助信息;搜索过程不易陷入局部最优点。
目前,该算法已渗透到许多领域,并成为解决各领域复杂问题的有力工具。
在遗传算法中,将问题空间中的决策变量通过一定编码方法表示成遗传空间的一个个体,它是一个基因型串结构数据;同时,将目标函数值转换成适应值,它用来评价个体的优劣,并作为遗传操作的依据。
遗传操作包括三个算子:选择、交叉和变异。
选择用来实施适者生存的原则,即把当前群体中的个体按与适应值成比例的概率复制到新的群体中,构成交配池(当前代与下一代之间的中间群体)。
选择算子的作用效果是提高了群体的平均适应值。
由于选择算子没有产生新个体,所以群体中最好个体的适应值不会因选择操作而有所改进。
交叉算子可以产生新的个体,它首先使从交配池中的个体随机配对,然后将两两配对的个体按某种方式相互交换部分基因。
变异是对个体的某一个或某一些基因值按某一较小概率进行改变。
从产生新个体的能力方面来说,交叉算子是产生新个体的主要方法,它决定了遗传算法的全局搜索能力;而变异算子只是产生新个体的辅助方法,但也必不可少,因为它决定了遗传算法的局部搜索能力。
交叉和变异相配合,共同完成对搜索空间的全局和局部搜索。
三、实现过程(1)编码:使用二进制编码,随机产生一个初始种群。
遗传算法实验报告豆
遗传算法实验报告豆实验报告:遗传算法在问题求解中的应用1. 引言遗传算法是一种模拟自然进化过程的优化算法,适用于解决复杂的优化问题。
在遗传算法中,通过模拟“遗传、变异、选择”等进化过程,逐渐进化出最优解。
本实验旨在通过编写代码,使用遗传算法解决一个优化问题,并对结果进行评估与分析。
2. 实验目标本实验要求使用遗传算法解决一个函数极值求解问题。
具体要求如下:- 目标函数:f(x) = 3x^4 - 4x^3 - 12x^2 + 2x + 6- 变量范围:-10 <= x <= 10- 求解目标:找到使得f(x)取得最大值的x的取值。
3. 实验步骤本次实验采用Python语言编写代码,使用遗传算法进行求解。
具体步骤如下:(1)初始化种群:随机生成一定数量的个体,并将其编码成二进制串表示。
(2)选择操作:通过计算适应度函数值,按照一定的策略选择个体。
这里采用轮盘赌选择策略,适应度越高的个体被选中的概率越大。
(3)交叉操作:随机选择两个个体,按照一定的概率进行交叉操作。
采用单点交叉的方法,将两个个体的某一位进行交换。
(4)变异操作:对选中的个体按照一定的概率进行变异操作。
这里采用单点变异的方法,随机选择一个位点进行变异。
(5)迭代操作:重复上述步骤,直到满足终止条件(迭代次数达到设定值或者达到了较好的适应度值)为止。
4. 实验结果与分析经过运行1000次实验,并进行统计,得到了一组实验结果。
最终,遗传算法找到了一个较好的近似解,f(x)取得最大值时的x的取值为2.976,并且f(x)取得的最大值为102.441。
下面对结果进行详细分析。
4.1. 初始种群影响初始种群的选择对于遗传算法的收敛速度和找到全局最优解的准确性都有一定的影响。
本次实验,我们随机生成了一定数量的个体作为初始种群,经过实验发现,初始种群越大,算法在相同条件下的迭代次数越少,收敛速度越快。
4.2. 参数选择遗传算法中的参数选择也对算法求解效果有一定影响。
TSP的遗传算法程序实验报告
TSP的遗传算法程序一、实验原理遗传算法的流程如图所示:二、程序的主要思想使用C语言实现TSP的遗传算法根据遗传算法的原理,自定义所需的初始染色体长度、初始群体大小、最大的迭代次数、交叉概率以及变异概率。
初始时生成与染色体长度相同个数的城市,为每个城市随机生成平面坐标,将城市的初始生成的顺序作为初始的路径,即第一条染色体。
计算路径中相邻城市之间的距离,并进行保存。
将生成的城市再进行多次的重新排列,得到多条不同的路径,将这些路径作为初始群体里的染色体,计算每条路径的长度。
通过自定义的适应度函数计算染色体的适应度,通过交叉、变异生成新的种群。
对新种群继续迭代操作,直到达到初始定义的迭代次数,获得最终的路径及路径图。
三、程序的主要步骤①染色体初始化的子函数1)void initialize()2){int k,j,minx,miny,maxx,maxy;3)initdata();4)minx=0;5)miny=0;6)maxx=0;maxy=0;7)for(k=0;k<lchrom;k++)8){x[k]=rand();9)if(x[k]>maxx)maxx=x[k];10)if(x[k]<minx)minx=x[k];11)y[k]=rand();12)if(y[k]>maxy)maxy=y[k];13)if(y[k]<miny)miny=y[k];14)}15)if((maxx-minx)>(maxy-miny))16){maxxy=maxx-minx;}17)else {maxxy=maxy-miny;}18)maxdd=0.0;19)for(k=0;k<lchrom;k++)20)for(j=0;j<lchrom;j++)21){dd[k*lchrom+j]=hypot(x[k]-x[j],y[k]-y[j]);22)if(maxdd<dd[k*lchrom+j])maxdd=dd[k*lchrom+j];23)}24)refpd=dd[lchrom-1];25)for(k=0;k<lchrom;k++)26)refpd=refpd+dd[k*lchrom+k+2];27)for(j=0;j<lchrom;j++)28)dd[j*lchrom+j]=4.0*maxdd;29)ff=(0.765*maxxy*pow(lchrom,0.5));30)minpp=0;31)min=dd[lchrom-1];32)for(j=0;j<lchrom-1;j++)33){if(dd[lchrom*j+lchrom-1]<min)34){min=dd[lchrom*j+lchrom-1];35)minpp=j;36)}37)}38)initpop();39)statistics(oldpop);40)initreport();41)}7) for(k=0;k<lchrom;k++)8) {x[k]=rand();9) if(x[k]>maxx)maxx=x[k];10)if(x[k]<minx)minx=x[k];11)y[k]=rand();12)if(y[k]>maxy)maxy=y[k]13)if(y[k]<miny)miny=y[k];14)}此段程序是初始化多个城市的坐标值(x,y),其中(x[k],y[k])代表第k+1个城市的坐标值,也相当于初始染色体的第k+1个基因值。
遗传算法课程心得体会
遗传算法课程心得体会篇一:遗传算法实验报告江南大学物联网工程学院实验报告课程名称人工智能实验名称遗传算法实验日期 20XX-4-10 班级计科1305姓名游思睿学号 1030413529 实验报告要求1.实验名称 2.实验要求 3.实验环境 4.实验步骤 5.实验体会一、实验目的:基本了解遗传算法的原理和具体程序实现。
二、实验内容:利用遗传算法计算二元函数的最大值个体编码遗传算法的运算对象是表示个体的符号串,所以必须把变量 x1, x2 编码为一种符号串。
本题中,用无符号二进制整数来表示。
因 x1, x2 为 0 ~ 7之间的整数,所以分别用3位无符号二进制整数来表示,将它们连接在一起所组成的6位无符号二进制数就形成了个体的基因型,表示一个可行解。
例如,基因型 X=101110 所对应的表现型是:x=[ 5,6 ]。
个体的表现型x和基因型X之间可通过编码和解码程序相互转换。
初始群体的产生遗传算法是对群体进行的进化操作,需要给其淮备一些表示起始搜索点的初始群体数据。
本例中,群体规模的大小取为4,即群体由4个个体组成,每个个体可通过随机方法产生。
如:011101,101011,011100,111001适应度汁算遗传算法中以个体适应度的大小来评定各个个体的优劣程度,从而决定其遗传机会的大小。
本例中,目标函数总取非负值,并且是以求函数最大值为优化目标,故可直接利用目标函数值作为个体的适应度。
选择运算选择运算把当前群体中适应度较高的个体按某种规则或模型遗传到下一代群体中。
一般要求适应度较高的个体将有更多的机会遗传到下一代群体中。
本例中,我们采用与适应度成正比的概率来确定各个个体复制到下一代群体中的数量。
其具体操作过程是:先计算出群体中所有个体的适应度的总和 ?fi ;其次计算出每个个体的相对适应度的大小 fi / ?fi ,它即为每个个体被遗传到下一代群体中的概率。
每个概率值组成一个区域,全部概率值之和为1;最后再产生一个0到1之间的随机数,依据该随机数出现在上述哪一个概率区域内来确定各个个体被选中的次数。
遗传算法求解TSP问题实验报告(仅供参照)
人工智能实验报告实验六遗传算法实验II一、实验目的:熟悉和掌握遗传算法的原理、流程和编码策略,并利用遗传求解函数优化问题,理解求解TSP问题的流程并测试主要参数对结果的影响。
二、实验原理:旅行商问题,即TSP问题(Traveling Salesman Problem)是数学领域中著名问题之一。
假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路经的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。
路径的选择目标是要求得的路径路程为所有路径之中的最小值。
TSP问题是一个组合优化问题。
该问题可以被证明具有NPC计算复杂性。
因此,任何能使该问题的求解得以简化的方法,都将受到高度的评价和关注。
遗传算法的基本思想正是基于模仿生物界遗传学的遗传过程。
它把问题的参数用基因代表,把问题的解用染色体代表(在计算机里用二进制码表示),从而得到一个由具有不同染色体的个体组成的群体。
这个群体在问题特定的环境里生存竞争,适者有最好的机会生存和产生后代。
后代随机化地继承了父代的最好特征,并也在生存环境的控制支配下继续这一过程。
群体的染色体都将逐渐适应环境,不断进化,最后收敛到一族最适应环境的类似个体,即得到问题最优的解。
要求利用遗传算法求解TSP问题的最短路径。
三、实验内容:1、参考实验系统给出的遗传算法核心代码,用遗传算法求解TSP的优化问题,分析遗传算法求解不同规模TSP问题的算法性能。
2、对于同一个TSP问题,分析种群规模、交叉概率和变异概率对算法结果的影响。
3、增加1种变异策略和1种个体选择概率分配策略,比较求解同一TSP问题时不同变异策略及不同个体选择分配策略对算法结果的影响。
4、上交源代码。
四、实验报告要求:1、画出遗传算法求解TSP问题的流程图。
2、分析遗传算法求解不同规模的TSP问题的算法性能。
规模越大,算法的性能越差,所用时间越长。
3、对于同一个TSP问题,分析种群规模、交叉概率和变异概率对算法结果的影响。
遗传算法实验报告
实验一利用遗传算法求 Rosenbrock 函数的极大值实验目的:1 进一步加深对遗传算法理论的理解2 读懂遗传算法求极值的程序3 掌握二进制编码的实现方法实验内容:已知Rosenbrock 函数:对Rosenbrock 函数极大值遗传算法仿真程序进行学习及分析。
实验要求:1 阅读下面的程序,找到该程序的“编码、解码” 及“复制、交换、变异” 的程序段;2 指出该程序中“种群大小”“终止进化代数”“交换概率”“变异概率” 各参数的值分别为多少。
种群大小:100;终止进化代数:200;交换概:0.8;变异概:0.13 通过改变“群体大小、终止进化代数、交叉概率、变异概率”,分析各参数对优化效果的影响。
4 记录程序运行结果。
将种群大小改为120,终止进化代数改为80,交换概率改为0.7,变异概率改为0.15得到如下结果最优结果为Max_Value =3905.9实验二求函数的极小值实验目的:1 掌握遗传算法求极小值的程序2 掌握多变量极值问题的编码实现方法3 掌握遗传算法的三个基本算子程序实现实验内容:已知含三自变量函数如下:利用遗传算法求函数的极小值。
实验要求:1 以实验一程序为基础,修改相应程序段,实现上述函数最小值计算;2 记录程序运行结果3 多次运行程序,结果是否相同?为什么?第一次Min_Value =0.00087第二次Min_Value =0.0013多次运行结果不一样是由于在优化的过程中在某一代会出现不同的走向,因此每次实验结果会不一样。
图1第一次运行结果图2 第二次运行结果实验三 基于遗传算法求解 TSP 问题实验目的:1 理解 TSP 问题的含义2 掌握遗传算法求解 TSP 问题的编码方法3 学会选取合适的适应度函数4 根据已给的程序, 理解三个遗传算子的实现方法实验内容:TSP 问题是典型的优化问题, 遗传算法是解决优化问题的有效方法。
根据已给的遗传算法程序, 求解当城市数量分别为 8 和 30 时, 得到的最优路径。
基于遗传算法求解TSP问题实验报告
基于遗传算法求解TSP问题班级,学号,姓名摘要:巡回旅行商问题(TSP)是一个组合优化方面的问题,从理论上讲,使用穷举法不但可以求解TSP问题,而且还可以得到最优解。
但是,利用穷举法所耗费的时间巨大的,当问题的规模很大时,穷举法的执行效率较低,不能满足及时的需要。
遗传算法是计算机科学人工智能领域中用于解决最优化的一种搜索启发式算法,是进化算法的一种。
该算法通过模拟生物学交叉、变异等方式,是当前向最优解的方向进化,因此使用于TSP问题的求解。
关键词:人工智能;TSP问题;遗传算法本组成员:林志青,韩会雯,赵昊罡本人分工:掌握遗传算法的基本原理,编写遗传算法中部分匹配交叉、循环交叉和循序交叉的具体实现过程。
1 引言旅行商问题,即TSP问题,是一个最优解的求解问题。
假设有n个城市,并且每个城市之间的距离已知,则如何只走一遍并获得最短路径为该问题的具体解释。
对于TSP问题的解决,有穷举法、分支限界法等求解方式,该文章主要介绍遗传算法求解过程。
遗传算法简称GA,在本质上是一种求解问题的高效并行全局搜索方法。
遗传算法从任意一个初始化的群体出发,通过随机选择、交叉和变异等遗传操作,使群体一代一代的进化到搜索空间中越来越好的区域,直至抵达最优解。
在遗传算法中,交叉操作为主要操作之一,包括部分匹配交叉、循环交叉和顺序交叉等。
2 算法原理与系统设计执行遗传算法,根据需要设定相应的交叉因子、变异因子和迭代次数,并选择相应的交叉算法,当程序图形显示并运算时会得到当前的最优解,判断是否获得最终的最优解,若已得到所需结果,则停止运行,否则继续执行。
具体流程图如下所示:部分匹配交叉(PMX):先随机生成两个交叉点,定义这两点间的区域为匹配区域,并交换两个父代的匹配区域。
如下图所示:父代A:872 | 130 | 9546父代B:983 | 567 | 1420交换后变为:temp A: 872 | 567 | 9546temp B: 983 | 130 | 1420对于 temp A、tempB中匹配区域以外出现的数码重复,要依据匹配区域内的位置逐一进行替换。
遗传算法求解TSP问题实验报告
人工智能实验报告实验六遗传算法实验II一、实验目的:熟悉和掌握遗传算法的原理、流程和编码策略,并利用遗传求解函数优化问题,理解求解TSP问题的流程并测试主要参数对结果的影响。
二、实验原理:旅行商问题,即TSP问题(Traveling Salesman Problem)是数学领域中著名问题之一。
假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路经的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。
路径的选择目标是要求得的路径路程为所有路径之中的最小值。
TSP问题是一个组合优化问题。
该问题可以被证明具有NPC计算复杂性。
因此,任何能使该问题的求解得以简化的方法,都将受到高度的评价和关注。
遗传算法的基本思想正是基于模仿生物界遗传学的遗传过程。
它把问题的参数用基因代表,把问题的解用染色体代表(在计算机里用二进制码表示),从而得到一个由具有不同染色体的个体组成的群体。
这个群体在问题特定的环境里生存竞争,适者有最好的机会生存和产生后代。
后代随机化地继承了父代的最好特征,并也在生存环境的控制支配下继续这一过程。
群体的染色体都将逐渐适应环境,不断进化,最后收敛到一族最适应环境的类似个体,即得到问题最优的解。
要求利用遗传算法求解TSP问题的最短路径。
三、实验内容:1、参考实验系统给出的遗传算法核心代码,用遗传算法求解TSP的优化问题,分析遗传算法求解不同规模TSP问题的算法性能。
2、对于同一个TSP问题,分析种群规模、交叉概率和变异概率对算法结果的影响。
3、增加1种变异策略和1种个体选择概率分配策略,比较求解同一TSP问题时不同变异策略及不同个体选择分配策略对算法结果的影响。
4、上交源代码。
四、实验报告要求:1、画出遗传算法求解TSP问题的流程图。
2、分析遗传算法求解不同规模的TSP问题的算法性能。
规模越大,算法的性能越差,所用时间越长。
3、对于同一个TSP问题,分析种群规模、交叉概率和变异概率对算法结果的影响。
遗传算法实验
实验四遗传算法实验一、实验目的:熟悉和掌握遗传算法的原理、流程和编码策略,并利用遗传求解函数优化问题,理解求解TSP问题的流程并测试主要参数对结果的影响。
二、实验原理:旅行商问题,即TSP问题(TravelingSalesmanProblem)是数学领域中著名问题之一。
假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路经的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。
路径的选择目标是要求得的路径路程为所有路径之中的最小值。
TSP问题是一个组合优化问题。
该问题可以被证明具有NPC计算复杂性。
因此,任何能使该问题的求解得以简化的方法,都将受到高度的评价和关注。
遗传算法的基本思想正是基于模仿生物界遗传学的遗传过程。
它把问题的参数用基因代表,把问题的解用染色体代表(在计算机里用二进制码表示),从而得到一个由具有不同染色体的个体组成的群体。
这个群体在问题特定的环境里生存竞争,适者有最好的机会生存和产生后代。
后代随机化地继承了父代的最好特征,并也在生存环境的控制支配下继续这一过程。
群体的染色体都将逐渐适应环境,不断进化,最后收敛到一族最适应环境的类似个体,即得到问题最优的解。
要求利用遗传算法求解TSP问题的最短路径。
三、实验内容及要求1、参考实验系统给出的遗传算法核心代码,用遗传算法求解TSP的优化问题,分析遗传算法求解不同规模TSP问题的算法性能。
2、对于同一个TSP问题,分析种群规模、交叉概率和变异概率对算法结果的影响。
3、增加1种变异策略和1种个体选择概率分配策略,比较求解同一TSP问题时不同变异策略及不同个体选择分配策略对算法结果的影响。
4、上交源代码。
四、实验结果(根据实验报告要求)1、画出遗传算法求解TSP问题的流程图。
2、分析遗传算法求解不同规模的TSP问题的算法性能。
(1)遗传算法执行方式说明:适应度值计算方法:当前路线的路径长度个体选择概率分配方法:适应度比例方法选择个体方法:轮盘赌选择交叉类型:PMX交叉变异类型:两点互换变异(2)实验模拟结果:城市个数历欢最好适应度历次最差适应度运行时间/血688.854388.3543379910146.009154.679352515210.027250.067429720278.942366.18L644025392.002■168,03630430513.155567.738704735627.6336S4.323855240745.577735,756927245727.03S25.06810434图2图1由图1和图2可知,遗传算法执行时间随着TSP问题规模的增大而增大,并且大致为线性增长。
遗传算法求解TSP问题实验报告
一、 实验目的加深对逻辑程序运行机理的理解,掌握MATLAB 语言的特点、熟悉其编程环境,同时为后面的人工智能程序设计做好准备。
1、熟悉MATLAB 语言编程环境的使用;2、了解MATLAB 语言中常量、变量的表示方法;3、了解利用MATLAB 进行事实库、规则库的编写方法;二、 实验环境计算机 哈尔滨工程大学计算机学院实验室三、 预习要求实验前应阅读实验指导书,了解实验目的、预习MATLAB 语言的相关知识。
四、 实验内容1、学习使用MATLAB ,包括进入MATLAB 主程序、编辑源程序、修改环境目录、退出等基本操作。
2、在MATLAB 集成环境下调试运行简单的MATLAB 程序,如描述亲属关系的MATLAB 程序或其他小型演绎数据库程序等。
五、 实验方法和步骤步骤一 针对TSP 问题,确定编码。
可采用十进制编码法,对城市进行编号,每个城市分别用1到n 之间不同的整数表示,n 个整数的一个排列就代表了旅行商问题。
步骤二 针对TSP 问题,适应度函数可定义为:其中d (ci ,ci+1)表示相邻城市之间的距离。
步骤三 针对TSP 问题,确定交叉规则。
对于采用整数编码表示的染色体,可以有以下交叉规则:(1)常规交叉法 ∑=+=n i i i c c d s f 11),(1)(设有父代1和父代2,交配后产生子代1和子代2。
随机选取一个交配位,子代1交配位之前的基因选自父代1交配位之前的基因,交配位之后的基因,从父代2中按顺序选取那些没有出现过的基因。
子代2也进行类似的处理。
交叉位(黑色所示为交叉位)父代1: 1 2 3 4 5 6 7 8父代2: 5 2 1 7 3 8 6 4子代1: 1 2 3 4 5 7 8 6子代2: 5 2 1 7 3 4 6 8步骤四确定变异规则,以下三种变异规则可任选一种。
(1)基于位置的变异:该方法随机地产生两个变异位,然后将第二个变异位上的基因移动到第一个变异位之前。
2023年基于遗传算法求解TSP问题实验报告
基于遗传算法求解TSP问题班级, 学号, 姓名摘要: 巡回旅行商问题(TSP)是一种组合优化方面旳问题, 从理论上讲, 使用穷举法不仅可以求解TSP问题, 并且还可以得到最优解。
不过, 运用穷举法所花费旳时间巨大旳, 当问题旳规模很大时, 穷举法旳执行效率较低, 不能满足及时旳需要。
遗传算法是计算机科学人工智能领域中用于处理最优化旳一种搜索启发式算法, 是进化算法旳一种。
该算法通过模拟生物学交叉、变异等方式, 是目前向最优解旳方向进化, 因此使用于TSP问题旳求解。
关键词: 人工智能;TSP问题;遗传算法本组组员: 林志青, 韩会雯, 赵昊罡本人分工:掌握遗传算法旳基本原理, 编写遗传算法中部分匹配交叉、循环交叉和循序交叉旳详细实现过程。
1 引言旅行商问题, 即TSP问题, 是一种最优解旳求解问题。
假设有n个都市, 并且每个都市之间旳距离已知, 则怎样只走一遍并获得最短途径为该问题旳详细解释。
对于TSP问题旳处理, 有穷举法、分支限界法等求解方式, 该文章重要简介遗传算法求解过程。
遗传算法简称GA, 在本质上是一种求解问题旳高效并行全局搜索措施。
遗传算法从任意一种初始化旳群体出发, 通过随机选择、交叉和变异等遗传操作, 使群体一代一代旳进化到搜索空间中越来越好旳区域, 直至抵达最优解。
在遗传算法中, 交叉操作为重要操作之一, 包括部分匹配交叉、循环交叉和次序交叉等。
2 算法原理与系统设计执行遗传算法, 根据需要设定对应旳交叉因子、变异因子和迭代次数, 并选择对应旳交叉算法,当程序图形显示并运算时会得到目前旳最优解, 判断与否获得最终旳最优解, 若已得到所需成果, 则停止运行, 否则继续执行。
详细流程图如下所示:部分匹配交叉(PMX): 先随机生成两个交叉点, 定义这两点间旳区域为匹配区域, 并互换两个父代旳匹配区域。
如下图所示:父代A: 872 | 130 | 9546父代B: 983 | 567 | 1420互换后变为:temp A: 872 | 567 | 9546temp B: 983 | 130 | 1420对于 temp A.tempB中匹配区域以外出现旳数码反复, 要根据匹配区域内旳位置逐一进行替代。
遗传算法实验报告
信息与管理科学学院计算机科学系实验报告课程名称:人工智能实验名称:遗传算法问题姓名:鹏海贾美丽妍汉昭学号:1510003063 1510003024班级:计科实验室:软件技术实验室指导教师:慧日期:2016.11.09&&遗传算法问题一、实验目的1.熟悉和掌握遗传算法的原理、实质;2.学会使用遗传算法解决问题;3.学会编写遗传算法程序寻找函数最值;二、实验原理遗传算法是仿真生物遗传学和自然选择机理,通过人工方式所构造的一类搜索算法,从某种程度上说遗传算法是对生物进化构成进行的数学方式仿真。
在遗传算法中染色体对应的是一系列符号序列,在标准的遗传算法(即基本遗传算法)中,通常用0, 1组成的位串表示,串上各个位置对应基因座,各位置上的取值对应等位基因。
遗传算法对染色体进行处理,染色体称为基因个体。
一定数量的基因个体组成基因种群。
种群中个体的数目为种群的规模,各个体对环境的适应程度称为适应度。
三、实验容用遗传算法求根号2,也就是求方程f(x)=x*x-2=0的正整数解,x=1时f(1)<0,x=2时f(2)>0,由介值定理,则1到2中间存在一个根,根据代数基本定理和根的对称性知这就是我们要找的根,由目标函数得到适应度函数,我们选择个体都在[1,2]之间,那适应度函数我可以取j(x)=40/(2+|x*x-2|)-10,由x的取值围知j的围是(0,10)x和y交叉就用取平均(x+y)/2,交叉概率取0.9,变异概率为0,四、步骤分析1.选择目标函数,确定变量定义域及编码精度,形成编码方案2.随机产生一个规模为(即该种群中含有个体)的种群23.个体评价:计算群体P(t)中各个个体适应度4.选择运算:将选择算子作用于群体。
选择的目的是把优化的个体直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代。
选择操作是建立在群体中个体的适应度评估基础上的。
(选择运算用轮盘赌算法)5.对被选择进入匹配池中的个体进行交叉操作,形成新种群6.以小概率在种群中选择个体进行变异操作形成新种群7.计算每个个体的适值8.根据适值概率选择新个体形成新种群9.检查结束条件,若满足则算法结束,当前种群中适值最高的个体即所求解;否则转3选择操作:首先要知道适应度函数,所谓的适应度函数就是评价函数,通常是问题的目的函数(或它的倒数),它描述了个体的优劣程度同时也决定了选择操作的概率,设fi表示第i个个体的适应度值,那选择第i个个体的概率就是fi/∑fj,简单来说,这个概率的大小就决定了该个体是被淘汰还是被保留。
关于遗传算法的实验报告
3.014470 y=-3.814470y=-3.814470 y=-3.014470 y=-3.S14470 y—3.014170V-3.8144M V—3.81447By=-3.81447011-^3.814470 y- 3-014470
jc=4.913437
x =4,911915
3c=4.91291Sx=4.?1291& X-4.91291&x=4.913203
■M. 913283x=4.913203x-4.913203
x-4.912820>=4.912916 x=4_91291t
y- 3.014470 y=-3-814470 y=-3.814470 y=-3.814470y—3.81W0y* 3
public:
GA(){
Pc=0.25;
Pm=0.01;
Num_Population=50;
Num_Iteration=100;
}
void GA_Init();
void Crossover_Operation();
void Select_Operation();
void Mutation_Operation();
x=2.Q88621
P=2.81429?
I he
Nd.B4
鼻enEEt ion =
ei 0101 an ooei 1 eeioaai iot
x=2.Q88621
9-2-B147??
T he
4帖
jener^at ion "
fit010101aneiiRaionniiBi
«=2.08&£21
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
人工智能实验报告
学号:
姓名:
实验名称:遗传算法
实验日期:2016.1.5
【实验名称】遗传算法
【实验目的】
掌握遗传算法的基本原理,熟悉遗传算法的运行机制,学会用遗传算法来求解问题。
【实验原理】
遗传算法(Genetic Algorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。
遗传算法是从代表问题可能潜在的解集的一个种群开始的,而一个种群则由经过基因编码的一定数目的个体组成。
每个个体实际上是染色体带有特征的实体。
在一开始需要实现从表现型到基因型的映射即编码工作。
由于仿照基因编码的工作很复杂,我们往往进行简化,如二进制编码,初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应度大小选择个体,并借助于自然遗传学的遗传算子进行组合交叉和变异,产生出代表新的解集的种群。
这个过程将导致种群像自然进化一样的后生代种群比前代更加适应于环境,末代种群中的最优个体经过解码,可以作为问题近似最优解。
遗传算法程度流程图为:
【实验内容】
题目:已知f(x)=x*sin(x)+1,x ∈[0,2π],求f(x)的最大值和最小值。
数据结构:
struct poptype {
double gene[length];//染色体 double realnumber;//对应的实数x double fitness;//适应度
double rfitness;//相对适应度 double cfitness;//累计适应度 };
struct poptype population[popsize+1];//最后一位存放max/min struct poptype newpopulation[popsize+1];//
染色体编码:
[0,2]x π∈,变量长度为2 π,取小数点后6位,由于2262322*102;π<<
因此,染色体由23位字节的二进制矢量表示,则X 与二进制串(<b 22 b 21…… b 0>)2之间的映射如下:
()
222221
2
010
b
b ......b 2'i i i b x =⎛⎫
=•= ⎪⎝⎭∑;23
2'21x x π=- 适应度函数:
由于要求f(x)的最值,所以适应度函数即可为f(x)。
但为了确保在轮赌法选择过中,每个个体都有被选中的可能性,因此需要将所有适应度调整为大于0的值。
因此,设计求最大值的适应度函数如下:
max ()5sin 6;
eval f x x x =+=+
将最小问题转化为求-f(x)的最大值,同理,设计最小值的适应度函数如下:
min ()5sin 4;eval f x x x =-+=-+
种群大小:
本实验默认为50,再进行种群初始化。
实验参数:
主要有迭代数,交叉概率,变异概率这三个参数。
一般交叉概率在0.6-0.9范围内,变异概率在0.01-0.1范围内。
可以通过手动输入进行调试。
主要代码如下:
void initialize()//种群初始化 {
srand(time(NULL));
int i,j;
for(i=0;i<popsize;i++)
for(j=0;j<23;j++)
population[i].gene[j]=rand()%2;
void transform()//染色体转化为实数x
{
int i,j;
for(i=0;i<=popsize+1;i++)
{
population[i].realnumber=0;
for(j=0;j<23;j++)
population[i].realnumber+=population[i].gene[j]*pow(2,j);
population[i].realnumber=population[i].realnumber*2*pi/(pow(2,23)-1);
}
}
void cal_fitness()//计算适应度
{
int i;
for(i=0;i<popsize;i++)
population[i].fitness=population[i].realnumber*sin(population[i].realnumber)+6; }
void select()//选择操作
{
int mem,i,j,k;
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<population[j+1].cfitness)
newpopulation[i]=population[j+1];
}
}
for (i=0;i<popsize;i++)//复制给下一代
population[i]=newpopulation[i];
}
void cross()//交叉操作
{
int i, mem, one;
int first = 0;
double x;
for(mem=0;mem<popsize;mem++)
{
x = rand()%1000/1000.0;
if (x<pcross)
{
++first;
if (first%2==0) Xover(one,mem);//个体间染色体进行交叉函数
else one=mem;
}
}
}
void mutate()//变异操作
{
int i, j,t;
double x;
for (i=0;i<popsize;i++)
for(j=0;j<length;j++)
{
x=rand()%1000/1000.0;
if (x<pvariation)
{
if(population[i].gene[j]) population[i].gene[j]=0;
else population[i].gene[j]=1;
}
}
}
void cal_max()//计算最大值
{
int i;
double max,sum=0;
int max_m;
max=population[0].fitness;
for(i=0;i<popsize-1;i++)
{
if(population[i].fitness>population[i+1].fitness)
if(population[i].fitness>=max)
{
max=population[i].fitness;
max_m=i;
}
else if(population[i+1].fitness>=max)
{
max=population[i+1].fitness;
max_m=i + 1;
}
}
if(max>population[popsize].fitness)
{
iteration=0;
for (i=0;i<length;i++)
population[popsize].gene[i]=population[max_m].gene[i];
population[popsize].fitness=population[max_m].fitness;
}
for (i=0;i<length;i++)
sum=population[popsize].gene[i]-population[max_m].gene[i];
if(sum==0) iteration++;
transform();
printf("%f,%f,%f,%f\n",population[popsize].fitness,population[popsize+1].fitness,popula tion[popsize].realnumber,population[popsize+1].realnumber);
}
【实验结果】。