遗传算法实验报告

合集下载

实验六:遗传算法求解TSP问题实验2篇

实验六:遗传算法求解TSP问题实验2篇

实验六:遗传算法求解TSP问题实验2篇第一篇:遗传算法的原理与实现1. 引言旅行商问题(TSP问题)是一个典型的组合优化问题,它要求在给定一组城市和每对城市之间的距离后,找到一条路径,使得旅行商能够在所有城市中恰好访问一次并回到起点,并且总旅行距离最短。

遗传算法作为一种生物启发式算法,在解决TSP问题中具有一定的优势。

本实验将运用遗传算法求解TSP问题,以此来探讨和研究遗传算法在优化问题上的应用。

2. 遗传算法的基本原理遗传算法是模拟自然界生物进化过程的一种优化算法。

其基本原理可以概括为:选择、交叉和变异。

(1)选择:根据问题的目标函数,以适应度函数来评估个体的优劣程度,并按照适应度值进行选择,优秀的个体被保留下来用于下一代。

(2)交叉:从选出的个体中随机选择两个个体,进行基因的交换,以产生新的个体。

交叉算子的选择及实现方式会对算法效果产生很大的影响。

(3)变异:对新生成的个体进行基因的变异操作,以保证算法的搜索能够足够广泛、全面。

通过选择、交叉和变异操作,不断迭代生成新一代的个体,遗传算法能够逐步优化解,并最终找到问题的全局最优解。

3. 实验设计与实施(1)问题定义:给定一组城市和每对城市之间的距离数据,要求找到一条路径,访问所有城市一次并回到起点,使得旅行距离最短。

(2)数据集准备:选择适当规模的城市数据集,包括城市坐标和每对城市之间的距离,用于验证遗传算法的性能。

(3)遗传算法的实现:根据遗传算法的基本原理,设计相应的选择、交叉和变异操作,确定适应度函数的定义,以及选择和优化参数的设置。

(4)实验流程:a. 初始化种群:随机生成初始种群,每个个体表示一种解(路径)。

b. 计算适应度:根据适应度函数,计算每个个体的适应度值。

c. 选择操作:根据适应度值选择一定数量的个体,作为下一代的父代。

d. 交叉操作:对父代进行交叉操作,生成新的个体。

e. 变异操作:对新生成的个体进行变异操作,以增加搜索的多样性。

实验六:遗传算法求解TSP问题实验3篇

实验六:遗传算法求解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 )是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。

遗传算法是从代表问题可能潜在的解集的一个种群开始的,而一个种群则由经过基因编码的一定数目的个体组成。

每个个体实际上是染色体带有特征的实体。

在一开始需要实现从表现型到基因型的映射即编码工作。

由于仿照基因编码的工作很复杂,我们往往进行简化,如二进制编码,初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应度大小选择个体,并借助于自然遗传学的遗传算子进行组合交叉和变异,产生出代表新的解集的种群。

遗传算法求函数最大值实验报告

遗传算法求函数最大值实验报告

遗传算法求函数最大值实验报告遗传算法是一种模拟自然界进化过程的优化算法,它通过模拟生物进化过程中的遗传、交叉和变异等机制,逐步优化解空间中的个体,以找到问题的最优解。

在本次实验中,我们利用遗传算法来求解一个函数的最大值。

下面我们将详细介绍实验的过程和结果。

首先,我们选择了一个简单的函数作为实验对象,即f(x) = x^2,在x的范围为[-10, 10]。

我们的目标是找到使函数值最大的x。

首先,我们需要定义遗传算法中的基本元素,包括编码方式、适应度函数、选择策略、交叉和变异操作等。

在本实验中,我们选择二进制编码方式,将x的范围[-10, 10]离散化为10位的二进制编码。

适应度函数即为f(x) = x^2,它表示个体的适应度。

选择策略采用轮盘赌选择算法,交叉操作采用单点交叉,变异操作采用随机位变异。

接下来,我们需要初始化种群,并迭代进行交叉和变异操作,直到满足终止条件。

在每一代中,我们根据适应度函数对种群中的个体进行评估,并根据选择策略选择父代个体进行交叉和变异操作。

通过交叉和变异操作,产生新的子代个体,并替代原有种群中的个体。

在本次实验中,我们设置了100个个体的种群,并进行了100代的迭代。

实验结果显示,经过多次迭代,算法逐渐优化到了最优解。

最终找到了使函数值最大的x,即x=10,对应的函数值为100。

总结起来,本次实验利用遗传算法求解函数的最大值,展示了遗传算法在优化问题中的应用。

通过适当选择编码方式、适应度函数和操作策略,我们可以有效地找到问题的最优解。

在后续的研究中,我们可以进一步探索遗传算法在更复杂问题上的应用,并通过改进算法的参数和操作策略来提高算法的性能。

遗传算法实验报告

遗传算法实验报告

遗传算法实验报告遗传算法实验报告引言:遗传算法是一种模拟生物进化过程的优化算法,通过模拟自然选择、遗传变异和交叉等操作,逐步优化问题的解。

本实验旨在探究遗传算法在解决优化问题中的应用,并通过实验验证其效果。

一、实验背景遗传算法最早由美国科学家约翰·霍兰德于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. 实现一个简单的遗传算法程序;3. 运用该程序求解一个具体的优化问题。

三、实验步骤1. 确定问题:选择一个具体的优化问题,如旅行商问题;2. 设计编码方式:将问题转化为遗传算法可以处理的编码形式,如二进制编码;3. 初始化种群:随机生成一定数量的个体作为初始种群;4. 评估适应度:根据问题的目标函数,计算每个个体的适应度;5. 选择操作:根据适应度选择优秀的个体作为父代,采用轮盘赌等方法进行选6. 交叉操作:对选出的父代进行交叉操作,生成新的个体;7. 变异操作:对新个体进行变异操作,引入随机性;8. 更新种群:将原种群和新生成的个体合并,更新种群;9. 判断终止条件:判断是否满足终止条件,如达到最大迭代次数或找到最优解;10. 输出结果:输出找到的最优解。

四、实验结果本实验选择旅行商问题作为优化问题进行求解。

旅行商问题是一个经典的组合优化问题,目标是找到一条最短路径,使得旅行商可以依次访问一系列城市并回到起点。

经过多次实验,得到了如下结果:- 初始种群大小为100个个体;- 迭代次数为1000次;- 交叉概率为0.8,变异概率为0.01;- 最优解为路径长度为1000的路径。

五、实验分析通过对遗传算法的实验结果进行分析,可以得出以下结论:1. 遗传算法能够在一定程度上寻找到问题的最优解,但并不能保证一定找到全局最优解;2. 实验中的参数设置对算法的性能有很大影响,不同的参数设置可能导致不同的结果;3. 遗传算法适用于解决各种优化问题,但对于复杂问题可能需要更多的优化和六、实验总结通过本次实验,我们深入了解了遗传算法的原理和应用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

遗传算法实验报告专业:自动化姓名:张俊峰学号:13351067 摘要:遗传算法,是基于达尔文进化理论发展起来的一种应用广泛、高效的随机搜索与优化方法。

本实验利用遗传算法来实现求函数最大值的优化问题,其中的步骤包括初始化群体、个体评价、选择运算、交叉运算、变异运算、终止条件判断。

该算法具有覆盖面大、减少进入局部最优解的风险、自主性等特点。

此外,遗传算法不是采用确定性原则而是采用概率的变迁规则来指导搜索方向,具有动态自适应的优点。

关键词:串集最优化评估迭代变异一:实验目的熟悉和掌握遗传算法的运行机制和求解的基本方法。

遗传算法是一种基于空间搜索的算法,它通过自然选择、遗传、变异等操作以及达尔文的适者生存的理论,模拟自然进化过程来寻找所求问题的答案。

其求解过程是个最优化的过程。

一般遗传算法的主要步骤如下:(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 studio 2010四:实验原理与步骤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、交叉算子①、单点交叉。

是指在个体编码串中随机设置一个交叉点,在该店交换配对的两条染色体上的基因。

②、两点交叉与多点交叉。

在选择交叉算子的过程中,单点交叉是最简单的方法,又称简单交叉,两点甚至多点交叉,是交配两点之间的染色体,比单点交叉的适应性更高,不过程序略复杂。

本实验采用的是均匀交叉,在选定位置后每一位基因都以相同的概率进行交叉。

附上实验代码(visual studio 2010环境下运行)#include<iostream>#include<ctime>#include<iomanip>#include <algorithm>using namespace std;int main(){srand(time(0));double arr[5][4]; //初始化cout<<"初始化:"<<endl;for(int i=0;i<5;i++){cout<<"C"<<i<<" ";for(int j=0;j<4;j++){arr[i][j]=((-5000+rand()%100000)*0.0001);cout<<setiosflags(ios::left)<<setw(8)<<arr[i][j]<<" ";}cout<<endl;}double result[5];double best_result; double result1[5]; //适应值计算for(int i=0;i<5;i++){double sum=0;for(int j=0;j<4;j++)sum+=arr[i][j]*arr[i][j];result[i]=1/(sum+1);}for(int i=0;i<5;i++)result1[i]=result[i];sort(result1,result1+5);best_result=result1[4];cout<<"初始化后进行适应值计算,最大值best_result:"<<best_result<<endl;int n;cout<<"请输入需要迭代的次数:";cin>>n;int test_num=1;double test_result;while(test_num<=n){cout<<"第"<<test_num<<"次迭代:"<<endl;double sum_result=0;double pecentage[5]; //选择for(int i=0;i<5;i++)sum_result+=result[i];for(int i=0;i<5;i++){pecentage[i]=result[i]/sum_result;}double a;double arr1[5][4];for(int i=0;i<5;i++)for(int j=0;j<5;j++)arr1[i][j]=arr[i][j];for(int i=0;i<5;i++){a=(rand()%100)*0.01;if(a<=pecentage[0])for(int j=0;j<4;j++)arr[i][j]=arr1[0][j];if(a>pecentage[0]&&a<=(pecentage[0]+pecentage[1]))for(int j=0;j<4;j++)arr[i][j]=arr1[1][j];if(a>(pecentage[0]+pecentage[1])&&a<=(pecentage[0]+pecentage[1]+pecentage[2])) for(int j=0;j<4;j++)arr[i][j]=arr1[2][j];if(a>(pecentage[0]+pecentage[1]+pecentage[2])&&a<=(pecentage[0]+pecentage[1]+pecenta ge[2]+pecentage[3]))for(int j=0;j<4;j++)arr[i][j]=arr1[3][j];if(a>(pecentage[0]+pecentage[1]+pecentage[2]+pecentage[3])&&a<=(pecentage[0]+pecenta ge[1]+pecentage[2]+pecentage[3]+pecentage[4]))for(int j=0;j<4;j++)arr[i][j]=arr1[4][j];}double mating_pecentage=0.88;double mating[5];int num;double tend[4]={0}; //交配for(int i=0;i<5;i++){mating[i]=(rand()%100)*0.01;}for(int i=0;i<5;i++){if(mating[i]<=0.88){for(int k=i+1;k<5;k++){if(mating[k]<=0.88&&arr[i][0]!=arr[k][0]){num=rand()%3;for(int l=num+1;l<4;l++)tend[l]=arr[i][l];for(int m=num+1;m<4;m++){arr[i][m]=arr[k][m];arr[k][m]=tend[m];}}mating[k]=1;break;}}}double variation[5][4]; //变异for(int i=0;i<5;i++){for(int j=0;j<4;j++)variation[i][j]=(rand()%100)*0.01;}for(int i=0;i<5;i++)for(int j=0;j<4;j++)if(variation[i][j]<0.1)arr[i][j]=(-5000+rand()%10000)*0.0001;cout<<"新群体:"<<endl;for(int i=0;i<5;i++){for(int j=0;j<4;j++)cout<<setiosflags(ios::left)<<setw(8)<<arr[i][j]<<" ";cout<<endl;}for(int i=0;i<5;i++) //重新评价{double sum=0;for(int j=0;j<4;j++)sum+=arr[i][j]*arr[i][j];result[i]=1/(sum+1);}for(int i=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");return 0;}。

相关文档
最新文档