遗传算法的java源码

合集下载

遗传算法代码

遗传算法代码

遗传算法代码遗传算法是一种基于自然选择和遗传学原理的优化算法,用于解决许多复杂的优化问题,如机器学习、图像处理、组合优化等。

以下是一个简单的遗传算法代码示例:1. 初始化种群首先,我们需要创建一组初始个体,称为种群。

每个个体都是由一组基因表示的,这些基因可能是一些数字、布尔值或其他类型的值。

我们可以使用随机数生成器生成这些基因,并将它们组合成一个个体。

2. 适应度函数为了衡量每个个体的表现,我们需要编写一个适应度函数。

该函数将计算每个个体的适应度得分,该得分反映了该个体在解决优化问题方面的能力。

适应度函数将对每个个体进行评分,并将其分配到一个适应度等级。

3. 选择操作选择操作是基于每个个体的适应度得分来选择哪些个体将被选择并用于生成下一代种群。

较高适应度的个体将有更高的概率被选择,而较低适应度的个体将有更低的概率被选择。

这通常是通过轮盘赌选择方法实现的。

4. 交叉操作交叉操作是将两个个体的基因组合并以生成新的个体。

我们可以将两个随机个体中的某些基因进行交换,从而创建新的个体。

这样的交叉操作将增加种群的多样性,使其更有可能找到最优解。

5. 变异操作变异操作是用于引入种群中的随机性的操作。

在变异操作中,我们将随机选择一个个体,并随机更改其中的一个或多个基因。

这将引入新的、未经探索的基因组合,从而增加种群的多样性。

6. 迭代随着种群不断进化,每个个体的适应度得分也将不断提高。

我们将重复执行选择、交叉和变异操作,以生成新的个体,并淘汰旧的个体。

这个不断迭代的过程将继续,直到达到预设的迭代次数或找到最优解为止。

这是一个简单的遗传算法代码示例,它演示了如何使用遗传算法来解决优化问题。

在实际应用中,我们可以进一步对算法进行优化,以获得更好的结果。

遗传算法Java实现以及TSP问题遗传算法求解

遗传算法Java实现以及TSP问题遗传算法求解

遗传算法Java实现以及TSP问题遗传算法求解在以前的⽂章()中已经介绍过,遗传算法是⼀种基于达尔⽂⽣物进化论的启发式算法,它的核⼼思想就是优胜劣汰,适应性好的个体将在⽣存竞争中获得更⼤的⽣存机会,⽽适应差的将更有可能在竞争中失败,从⽽遭到淘汰。

1. ⽣物进化图1⽤了⼀个⾮常形象的实例,来表现进化机制对⽣物繁衍的作⽤。

可以设想,曾有⼀个时期动物就根本没有眼睛。

那时,动物在它们的环境中航⾏完全是靠嗅觉和触觉来躲避掠⾷它们的动物。

他们也相当擅长于这样做,因为他们靠这样已经历了成千上万个世代。

在那个时候,⿐⼦⼤和⼿脚长的男性是受⼥孩⼦们欢迎的。

然⽽,突然有⼀天,当两个动物配对时,⼀个基因突变发⽣在为⽪肤细胞提供的蓝图上。

这⼀突变使其后代在他们的头上发育出了⼀个具有相当光敏效应的细胞,使其后代能⾜够识别周围环境是亮的还是暗的。

这样就给他带来了⼀个微⼩的优点,因为,如果⼀种⾷⾁动物,⽐如⼀只鹰,来到了某个范围以内,则它将阻挡了光线,这时,该动物就会感觉得到,就可迅速跑到隐蔽的地⽅去躲藏起来。

另外,这种⽪肤细胞还能指⽰现在是晚上或⽩天,或告诉他现在是在地⾯之上或地⾯之下,这些信息在捕⾷和吸取营养时都能为它提供⽅便。

你能看到这⼀新型⽪肤细胞将使这⼀动物与群体中其余的动物相⽐,具备了稍多的优点,从⽽更容易获得异性的青睐,因此也就有更多的⽣存和繁殖的机会。

过了⼀段时间,由于进化机制的作⽤,许多动物的染⾊体中都会出现具有光敏⽪肤细胞的基因。

现在,如果你再作⼀些外推,想象这⼀光敏细胞基因得到了进⼀步的有利突变,则你能看到,经过许多许多世代后,光敏细胞经过分化形成为⼀个区域;这个区域不断变⼤,产⽣出⼀些更为确定的特征,例如形成⼀个晶体,或产⽣能区别颜⾊的视觉细胞;还可以想象,⼀个突变使某个动物由⼀个光敏区域改变为两个光敏区域,由此就使那个动物有了⽴体视觉。

⽴体视觉对⼀个⽣物体来说是⼀个巨⼤的进步,因为这能精确告诉他⽬标离开他有多远。

java-基于遗传算法求解货物装入车辆的问题(多对多)-已验证-可直接运行

java-基于遗传算法求解货物装入车辆的问题(多对多)-已验证-可直接运行

import java.util.ArrayList;import java.util.Collections;import java.util.List;import java.util.Random;// 这个类是遗传算法的核心。

它实现了遗传算法求解物流运输问题的各种方法。

public class GeneticAlgorithm {// 定义问题所需的常量// 这些常量用于定义问题需要的一些参数,如种群大小、最大迭代次数和变异率等。

private static final int POPULATION_SIZE = 50; // 种群大小private static final int MAX_GENERATIONS = 100; // 最大迭代次数private static final double MUTATION_RATE = 0.02; // 变异率// 定义问题所需的变量// 这些变量表示问题需要的数据:货物列表、车辆列表和随机数生成器。

private List<Item> itemList; // 货物列表private List<Vehicle> vehicleList; // 车辆列表private Random random; // 随机数生成器// 这是遗传算法构造函数,用于初始化类中的变量。

public GeneticAlgorithm(List<Item> itemList, List<Vehicle> vehicleList) {this.itemList = itemList;this.vehicleList = vehicleList;this.random = new Random();}// 定义适应度函数// 这是适应度函数,用于计算染色体的适应度值(即物流方案的优劣程度)。

在此程序中,适应度函数根据车辆是否能够装下所有货物来计算染色体的适应度值。

遗传算法-JAVA【精品毕业设计】(完整版)

遗传算法-JAVA【精品毕业设计】(完整版)

java常用代码---遗传算法标签:javadistancecalendarstringrandom算法2011-11-17 18:23 5815人阅读评论(1) 收藏举报分类:数据结构与算法实践(23)import java.util.*;public class Tsp {private String cityName[]={"北京","上海","天津","重庆","哈尔滨","长春","沈阳","呼和浩特","石家庄","太原","济南","郑州","西安","兰州","银川","西宁","乌鲁木齐","合肥","南京","杭州","长沙","南昌","武汉","成都","贵州","福建","台北","广州","海口","南宁","昆明","拉萨","香港","澳门"}; //private String cityEnd[]=new String[34];private int cityNum=cityName.length; //城市个数private int popSize = 50; //种群数量private int maxgens = 20000; //迭代次数private double pxover = 0.8; //交叉概率private double pmultation = 0.05; //变异概率private long[][] distance = new long[cityNum][cityNum];private int range = 2000; //用于判断何时停止的数组区间private class genotype {int city[] = new int[cityNum]; //单个基因的城市序列long fitness; //该基因的适应度double selectP; //选择概率double exceptp; //期望概率int isSelected; //是否被选择}private genotype[] citys = new genotype[popSize];/*** 构造函数,初始化种群*/public Tsp() {for (int i = 0; i < popSize; i++) {citys[i] = new genotype();int[] num = new int[cityNum];for (int j = 0; j < cityNum; j++)num[j] = j;int temp = cityNum;for (int j = 0; j < cityNum; j++) {int r = (int) (Math.random() * temp);citys[i].city[j] = num[r];num[r] = num[temp - 1];temp--;}citys[i].fitness = 0;citys[i].selectP = 0;citys[i].exceptp = 0;citys[i].isSelected = 0;}initDistance();}/*** 计算每个种群每个基因个体的适应度,选择概率,期望概率,和是否被选择。

(完整版)遗传算法简介及代码详解

(完整版)遗传算法简介及代码详解

遗传算法简述及代码详解声明:本文内容整理自网络,认为原作者同意转载,如有冒犯请联系我。

遗传算法基本内容遗传算法为群体优化算法,也就是从多个初始解开始进行优化,每个解称为一个染色体,各染色体之间通过竞争、合作、单独变异,不断进化。

遗传学与遗传算法中的基础术语比较染色体:又可以叫做基因型个体(individuals)群体/种群(population):一定数量的个体组成,及一定数量的染色体组成,群体中个体的数量叫做群体大小。

初始群体:若干染色体的集合,即解的规模,如30,50等,认为是随机选取的数据集合。

适应度(fitness):各个个体对环境的适应程度优化时先要将实际问题转换到遗传空间,就是把实际问题的解用染色体表示,称为编码,反过程为解码/译码,因为优化后要进行评价(此时得到的解是否较之前解优越),所以要返回问题空间,故要进行解码。

SGA采用二进制编码,染色体就是二进制位串,每一位可称为一个基因;如果直接生成二进制初始种群,则不必有编码过程,但要求解码时将染色体解码到问题可行域内。

遗传算法的准备工作:1) 数据转换操作,包括表现型到基因型的转换和基因型到表现型的转换。

前者是把求解空间中的参数转化成遗传空间中的染色体或者个体(encoding),后者是它的逆操作(decoding)2) 确定适应度计算函数,可以将个体值经过该函数转换为该个体的适应度,该适应度的高低要能充分反映该个体对于解得优秀程度。

非常重要的过程。

遗传算法基本过程为:1) 编码,创建初始群体2) 群体中个体适应度计算3) 评估适应度4) 根据适应度选择个体5) 被选择个体进行交叉繁殖6) 在繁殖的过程中引入变异机制7) 繁殖出新的群体,回到第二步实例一:(建议先看实例二)求 []30,0∈x 范围内的()210-=x y 的最小值1) 编码算法选择为"将x 转化为2进制的串",串的长度为5位(串的长度根据解的精度设 定,串长度越长解得精度越高)。

遗传算法案例及源代码

遗传算法案例及源代码

计算智能作业三:遗传算法计算问题1.问题描述:求下述二元函数的最大值:222121),(m ax x x x x f +=S.t. }7,6,5,4,3,2,1{1∈x }7,6,5,4,3,2,1{2∈x2.程序结构:(1)变量:C :是一个1*6数组,每个数组里面是一个6位二进制数,它是遗传算法中的染色体。

new_c:每一轮的新变量c 。

first_c:初始群体矩阵。

sur_value :个体适应值的概率值,为0-1之间的数,所有概率值和为1。

survived :经过选择运算后产生的个体基因型组合。

intersect_c :经过交叉运算后产生的个体基因型组合。

mutation_c :经过变异运算后产生的个体基因型组合。

f :最后计算得到的最大值 (2)程序里面的方程function out = value_function( ci ):价值函数(自适应度函数),即222121),(x x x x f +=。

function [ sur_value ] = calc_value( c ):计算群体中每一个个体的适应度的值function survived = surviver( sur_value ):利用概率选择函数 function [ intersect_c ] = intersect( new_c ):交叉运算function [ mutation_c ,mutation_value] = mutation( intersect_c ):变异运算3.源程序(1)遗传算法的主程序主程序包括初始群体产生,最终结果展示,即各函数之间的调用关系。

个体编码遗传算法的运算对象是表示个体的符号串,所以必须把变量 x1, x2 编码为无符号二进制整数。

这个二进制整数位个体的基因型。

因为x1, x2 为 0 ~ 7之间的整数,所以分别用3位无符号二进制整数来表示,将它们连接在一起所组成的6位无符号二进制数就形成了个体的基因型,表示一个可行解。

遗传算法随机森林代码

遗传算法随机森林代码

遗传算法随机森林代码以下是使用遗传算法构建随机森林的代码示例:```pythonimport numpy as npfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import accuracy_score# 定义遗传算法参数population_size = 20num_generations = 10mutation_rate = 0.01# 定义随机森林参数num_trees = 10max_features = "sqrt"# 定义遗传算法辅助函数def create_individual():return np.random.randint(2, size=num_features)def fitness(individual):selected_features = [i for i in range(num_features) if individual[i] == 1]X_train_selected = X_train[:, selected_features]X_test_selected = X_test[:, selected_features]model = RandomForestClassifier(n_estimators=num_trees, max_features=max_features)model.fit(X_train_selected, y_train)y_pred = model.predict(X_test_selected)return accuracy_score(y_test, y_pred)def crossover(parent1, parent2):crossover_point = np.random.randint(1, num_features)child = np.concatenate((parent1[:crossover_point], parent2[crossover_point:]))return childdef mutate(individual):for i in range(num_features):if np.random.random() < mutation_rate:individual[i] = 1 - individual[i]return individual# 加载数据X = np.load("features.npy")y = np.load("labels.npy")num_features = X.shape[1]# 划分数据集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 初始化种群population = [create_individual() for _ in range(population_size)]# 遗传算法主循环for generation in range(num_generations):# 计算适应度fitness_scores = [fitness(individual) for individual in population]# 选择父代parents = [population[i] for i in np.argsort(fitness_scores)[-2:]]# 生成子代offspring = [crossover(parents[0], parents[1]) for _ in range(population_size - 2)]# 变异offspring = [mutate(individual) for individual in offspring]# 更新种群population = parents + offspring# 选择最佳个体best_individual = population[np.argmax([fitness(individual) for individual in population])]# 选择最佳特征子集selected_features = [i for i in range(num_features) if best_individual[i] == 1]X_train_selected = X_train[:, selected_features]X_test_selected = X_test[:, selected_features]# 构建随机森林model = RandomForestClassifier(n_estimators=num_trees, max_features=max_features)model.fit(X_train_selected, y_train)# 预测并评估模型y_pred = model.predict(X_test_selected)accuracy = accuracy_score(y_test, y_pred)print("Accuracy:", accuracy)```请注意,这只是一个简单的示例代码,实际使用中可能需要根据具体问题进行适当的修改和调整。

遗传算法详解及Java实现

遗传算法详解及Java实现

遗传算法详解及Java实现1. 遗传算法的起源20世纪60年代中期,美国密西根大学的John Holland提出了位串编码技术,这种编码既适合于变异又适合杂交操作,并且他强调将杂交作为主要的遗传操作。

遗传算法的通用编码技术及简单有效的遗传操作为其广泛的应用和成功奠定了基础。

2. 遗传算法的目的解决经典数学方法无法有效地求出最优解的复杂的、大规模的难题。

3. 遗传算法的思想遗传算法通常使用二进制编码来仿照基因编码,初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代(generation)演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应度(fitness)大小选择个体,并借助于自然遗传学的遗传算子(genetic operators)进行组合交叉(crossover)和变异(mutation),产生出代表新的解集的种群。

4. 遗传算法的步骤?(1) 用固定长度的染色体表示问题变量域,选择染色体种群数量为N,交叉概率为C,突变概率为M?(2) 定义适应性函数来衡量问题域上单个染色体的性能或适应性。

适应性函数是在繁殖过程中选择配对染色体的基础。

?(3) 随机产生一个大小为N的染色体的种群。

?(4) 计算每个染色体的适应性。

?(5) 在当前种群中选择一对染色体。

双亲染色体被选择的概率和其适应性有关。

适应性高的染色体被选中的概率高于适应性低的染色体。

?(6) 通过执行遗传操作——交叉和突变产生一对后代染色体。

?(7) 将后代染色体放入新种群中。

?(8) 重复步骤5,直到新染色体种群的大小等于初始种群的大小N为止。

?(9) 用新(后代)染色体种群取代初始(双亲)染色体种群。

?(10) 回到步骤4,重复这个过程直到满足终止条件为止。

5. 算法思路:?(1) 变量作为实数,可以视为演化算法的表现型形式。

从表现型到基因型的映射称为编码。

我们这里采用二进制编码,将某个变量值代表的个体表示为一个{0,1}二进制串。

遗传算法java代码

遗传算法java代码

遗传算法java代码我们非常抱歉,我们的AI技术不支持撰写程序代码,建议您参考专业的编程网站或书籍。

以下是有关遗传算法的一些概述,希望对您有所帮助。

遗传算法是一种生物学上的进化理论转化为计算机中的求解算法。

遗传算法最初主要用于解决组合优化问题,例如最短路径问题、最优化问题等。

随着计算机软硬件的进步,遗传算法已经被广泛应用于机器学习、人工智能、数据挖掘等领域。

遗传算法的实现方式通常是基于种群的演化来逐步优化解。

其基本流程如下:1.初始化种群,生成随机的基因序列来代表解。

2.评价种群中的个体,计算每个个体的适应度函数值,用于衡量解的好坏程度。

3.选择操作:根据适应度函数的值,选择出最好的个体来进行交叉和变异操作。

4.交叉操作:从两个个体中选择一定长度的染色体来进行交换,生成新的个体。

5.变异操作:对某些基因进行随机更改,生成新的个体。

6.更新种群:根据选择、交叉和变异操作生成新的种群,并重复2和3步骤,直到达到终止条件。

下面是遗传算法的Java代码实现://定义一个染色体类,表示问题的解public class Chromosome {private boolean[] genes;private double fitness;public Chromosome(boolean[] genes, double fitness) {this.genes = genes;this.fitness = fitness;}public boolean[] getGenes() {return genes;}public void setGenes(boolean[] genes) {this.genes = genes;}public double getFitness() {return fitness;}public void setFitness(double fitness) {this.fitness = fitness;}}//定义一个种群类,表示解的集合public class Population {private Chromosome[] chromosomes;public Population(int size) {chromosomes = new Chromosome[size]; for (int i = 0; i < size; i++) {boolean[] genes = new boolean[10];for (int j = 0; j < 10; j++) {genes[j] = Math.random() < 0.5;}chromosomes[i] = new Chromosome(genes, 0); }}public void evaluateFitness(FitnessFunction function) { for (Chromosome chromosome : chromosomes) { double fitnessValue =function.evaluate(chromosome.getGenes());chromosome.setFitness(fitnessValue);}}public Chromosome selectParent() {double sum = 0;for (Chromosome chromosome : chromosomes) { sum += chromosome.getFitness();}double random = Math.random() * sum;double partialSum = 0;for (Chromosome chromosome : chromosomes) { partialSum += chromosome.getFitness();if (partialSum >= random) {return chromosome;}}return null;}public void crossover(double rate, int length) {for (int i = 0; i < chromosomes.length; i++) {if (Math.random() < rate) {Chromosome parent1 = selectParent();Chromosome parent2 = selectParent();boolean[] child1 = new boolean[10];boolean[] child2 = new boolean[10];int pivot = (int) (Math.random() * 10);for (int j = 0; j < 10; j++) {if (j < pivot) {child1[j] = parent1.getGenes()[j];child2[j] = parent2.getGenes()[j];} else {child1[j] = parent2.getGenes()[j];child2[j] = parent1.getGenes()[j];}}chromosomes[i] = new Chromosome(child1, 0); chromosomes[i+1] = new Chromosome(child2, 0); i++;}}}public void mutate(double rate) {for (Chromosome chromosome : chromosomes) {for (int i = 0; i < 10; i++) {if (Math.random() < rate) {chromosome.getGenes()[i]= !chromosome.getGenes()[i];}}}}public void sort() {Arrays.sort(chromosomes, newComparator<Chromosome>() {@Overridepublic int compare(Chromosome o1, Chromosome o2) { if (o1.getFitness() > o2.getFitness()) {return -1;} else if (o1.getFitness() < o2.getFitness()) {return 1;} else {return 0;}}});}public Chromosome getBestChromosome() {sort();return chromosomes[0];}}//定义一个适应度函数类,用于计算染色体的适应度函数值public interface FitnessFunction {double evaluate(boolean[] genes);}//示例代码:用于求解一个最大化一元函数f(x) = x^2在区间[0,63]上的最优解public class Main {public static void main(String[] args) {int populationSize = 100;double crossoverRate = 0.8;double mutationRate = 0.01;int crossoverLength = 5;int maxGeneration = 5000;Population population = new Population(populationSize); FitnessFunction function = new FitnessFunction() {@Overridepublic double evaluate(boolean[] genes) {int x = 0;for (int i = 0; i < genes.length; i++) {if (genes[i]) {x += Math.pow(2, i);}}return x * x;};for (int i = 0; i < maxGeneration; i++) {population.evaluateFitness(function);System.out.printf("Generation %d, best fitnessvalue %.2f%n", i, population.getBestChromosome().getFitness()); if (population.getBestChromosome().getFitness() == 4096) {break;}population.crossover(crossoverRate, crossoverLength); population.mutate(mutationRate);}Chromosome bestChromosome =population.getBestChromosome();System.out.printf("Best chromosome: ");for (int i = 0; i < 10; i++) {if (bestChromosome.getGenes()[i]) {System.out.print("1");} else {System.out.print("0");}System.out.printf(", best fitness value %.2f%n", bestChromosome.getFitness());}}注:这份Java代码只是一个示例,具体的实现方式和参数的选择需要根据具体的问题和数据集合来确定。

遗传算法java代码

遗传算法java代码

遗传算法java代码遗传算法(Genetic Algorithm)是一种基于生物进化的启发式算法,通过模拟自然选择、交叉和突变等基因操作来优化问题的解。

以下是一个基于Java的遗传算法示例代码:```javaimport java.util.ArrayList;import java.util.List;import java.util.Random;//假设我们要求解的问题是求一个二进制序列的最大值,这个序列的长度为10public class GeneticAlgorithm//染色体长度private static final int CHROMOSOME_LENGTH = 10;//种群大小private static final int POPULATION_SIZE = 100;//迭代次数private static final int MAX_GENERATIONS = 100;//交叉概率private static final double CROSSOVER_RATE = 0.8;//变异概率private static final double MUTATION_RATE = 0.1; //随机数生成器private static final Random RANDOM = new Random(; //个体类private static class Individual//染色体private int[] chromosome;//适应度private double fitness;public Individuachromosome = new int[CHROMOSOME_LENGTH];fitness = 0.0;}//初始化染色体public void initializeChromosomfor (int i = 0; i < CHROMOSOME_LENGTH; i++) chromosome[i] = RANDOM.nextInt(2);}}//计算个体的适应度public void calculateFitnesint decimalValue = 0;for (int i = CHROMOSOME_LENGTH - 1; i >= 0; i--) decimalValue += chromosome[i] * Math.pow(2, CHROMOSOME_LENGTH - i - 1);}fitness = decimalValue;}//获取个体的适应度public double getFitnesreturn fitness;}//获取染色体public int[] getChromosomreturn chromosome;}//设置染色体public void setChromosome(int[] chromosome)this.chromosome = chromosome;}}//生成初始种群private static List<Individual> createInitialPopulatioList<Individual> population = new ArrayList<>(;for (int i = 0; i < POPULATION_SIZE; i++)Individual individual = new Individual(;individual.initializeChromosome(;population.add(individual);}return population;}//选择父母个体private static Individual selectParent(List<Individual> population)double sumFitness = 0.0;for (Individual individual : population)sumFitness += individual.getFitness(;}double randomFitness = RANDOM.nextDouble( * sumFitness;double cumulativeFitness = 0.0;for (Individual individual : population)cumulativeFitness += individual.getFitness(;if (cumulativeFitness > randomFitness)return individual;}}return population.get(0);}//交叉操作private static Individual crossover(Individual parent1, Individual parent2)Individual offspring = new Individual(;int[] parent1Chromosome = parent1.getChromosome(;int[] parent2Chromosome = parent2.getChromosome(;int crossoverPoint = RANDOM.nextInt(CHROMOSOME_LENGTH - 1) + 1;int[] offspringChromosome = new int[CHROMOSOME_LENGTH];System.arraycopy(parent1Chromosome, 0, offspringChromosome, 0, crossoverPoint);System.arraycopy(parent2Chromosome, crossoverPoint, offspringChromosome, crossoverPoint, CHROMOSOME_LENGTH - crossoverPoint);offspring.setChromosome(offspringChromosome);return offspring;}//变异操作private static void mutate(Individual individual)int[] chromosome = individual.getChromosome(;for (int i = 0; i < CHROMOSOME_LENGTH; i++)if (RANDOM.nextDouble( < MUTATION_RATE)chromosome[i] = chromosome[i] == 0 ? 1 : 0;}}individual.setChromosome(chromosome);}//遗传算法主函数public static void main(String[] args)List<Individual> population = createInitialPopulation(;for (int generation = 0; generation < MAX_GENERATIONS; generation++)for (Individual individual : population)individual.calculateFitness(;}Individual bestIndividual = population.get(0);for (Individual individual : population)if (individual.getFitness( > bestIndividual.getFitness() bestIndividual = individual;}}System.out.println("Generation: " + generation + " Best Individual: " + bestIndividual.getFitness();List<Individual> newPopulation = new ArrayList<>(;while (newPopulation.size( < POPULATION_SIZE)Individual parent1 = selectParent(population);Individual parent2 = selectParent(population);Individual offspring = crossover(parent1, parent2);mutate(offspring);newPopulation.add(offspring);}population = newPopulation;}}```以上示例代码实现了一个简单的二进制序列的最大化遗传算法。

遗传算法计算最大值代码

遗传算法计算最大值代码

遗传算法,解决y=x^2 x属于[0,31] 的最大值问题。

C言语#include<stdio.h>#include<time.h>#include<stdlib.h>typedef struct{int code; //染色体int degree;//适应度}Indi;Indi group[40];//种群规模为40void Judge(Indi &x){x.degree=x.code*x.code;}int happened(double p)//发生一个p=0~1间概率的事件{return rand()<(int)(p*RAND_MAX);}void Cross(Indi &x,Indi &y)//交叉操作{Indi z,z1;int temp,temp1;temp=x.code&0x3;temp1=y.code&0x3;z.code=x.code-temp+temp1;z1.code=y.code-temp1+temp;Judge(z);Judge(z1);if(x.degree<y.degree){if(z.degree>=x.degree) //如果新个体不如双亲,淘汰之x=z;}else{if(z.degree>=y.degree)y=z;}if(x.degree<y.degree){if(z1.degree>=x.degree) //如果新个体不如双亲,淘汰之x=z1;}else{if(z1.degree>=y.degree)y=z1;}}void main(){Indi indidest;int i,j,best,x,y,c;int sum,strick,SUM=0;static int n=0;srand(time(NULL));for(i=0;i<40;++i)//随机得到初始种群{group[i].code=rand()%32;Judge(group[i]);}for(i=1;i<=10;++i)//固定进化10代{for(sum=0,best=0,j=0;j<40;++j){sum+=group[j].degree;//求总的适应度sumif(group[j].degree>group[best].degree){best=j;//求当前最优个体}}printf("第%2d代中最优个体为 %d (%d) 平均适应度为 %10f\n",i,group[best].code,group[best].degree,sum/40.0);for(c=40;c;--c){strick=(int)((float)rand()/RAND_MAX*sum); //赌盘中的色子,选择个体x,y for(x=0;x<40&&strick>=group[x].degree;++x)strick-=group[x].degree;strick=(int)((float)rand()/RAND_MAX*sum);for(y=0;y<40&&strick>=group[y].degree;++y)strick-=group[y].degree;if(happened(0.9))Cross(group[x],group[y]);//交叉}}}。

遗传算法源码

遗传算法源码

function [result,individual]=GA_OPT(popsize,stringlength,pc,pm,fun,a,b)%popsize初始种群数量%stringlength染色体长度%fun需要优化的函数%a,b是区间上下界%pc交叉概率0.9%pm变异概率0.08popsize=200;fun=@(x)x.* sin(10*pi*x)+2.0;stringlength=22;pc=0.9;pm=0.08;a=-1;b=2;pop=initial(popsize,stringlength,fun,a,b);%产生初始种群for i=1:200[bestindividual,bestvalue]=best(pop,stringlength);%计算个体适应度值newpop=selection(pop,popsize,stringlength);%比例选择运算newpop=crossover(newpop,stringlength,fun,a,b,pc);%单点交叉运算newpop=mutation(newpop,stringlength,fun,a,b,pm);%基本位变异运算pop=newpop;%产生新一代种群end[bestindividual,bestvalue]=best(pop,stringlength);result=bestvalue;individual=bestindividual;%得到最优函数值%--------种群初始化,随机生成二进制与解码-------------%function pop=initial(popsize,stringlength,fun,a,b)pop=round(rand(popsize,stringlength+2));%随机生成二进制数for i=1:popsize %在种群内pop(i,stringlength+1)=sum(2.^(stringlength-1:-1:0).*pop(i,1:stringlength))*(b-a)/(2^stringlength-1)+a; %把二进制数转化为对应的十进制数pop(i,stringlength+2)=fun(pop(i,stringlength+1));%求出二进制转化为十进制数后对应的函数值,为下面的计算个体适应值做准备%生成的pop矩阵为popsize*(stringlength+2)的矩阵,前面的stringlength列位二进制数%第stringlength+1列为二进制数转化为对应的十进制数,第stringlength+2列为二进制对应的函数值end%------------选择算子,按转轮赌方式方式选择-------------%function newpop=selection(pop,popsize,stringlength)totalfit=sum(pop(:,stringlength+2));%求种群中所有适应度函数之和prob=pop(:,stringlength+2)/totalfit;%计算每个个体占种群之和的比例prob=cumsum(prob);%计算比例的累积总和newin=1;while newin<=popsize %转轮赌方式生成新的个体rns=rand; %模拟赌盘操作,随机产生一个概率i=find(prob>rns);%找出个体的概率满足转轮赌方式的个体,即找出可以遗传到下一代的个体i=i(1);newpop(newin,:)=pop(i, :);%生成新的种群newin=newin+1;%继续循环end%----------------交叉算子,实现交叉运算-------------------%function newpop=crossover(newpop,stringlength,fun,a,b,pc)[px,py]=size(newpop);%求出新种群矩阵的大小(行和列)for i=1:2:px-1if rand<=pc%如果产生的随机数小于交叉概率,则进行交叉cpoint=unidrnd(stringlength-1);%随机生成一个1到stringlength-1的数,作为交叉点newpop(i,1:stringlength)=[newpop(i,1:cpoint),newpop(i+1,(cpoint+1):stringlength)];newpop(i+1,1:stringlength)=[newpop(i+1,1:cpoint),newpop(i,(cpoint+1):stringlength)];%在交叉点处实现第i与i+1二进制数的交叉newpop(i,stringlength+1)=sum(2.^(stringlength-1:-1:0).*newpop(i,1:stringlength))*(b-a)/(2^stringlen gth-1)+a;newpop(i+1,stringlength+1)=sum(2.^(stringlength-1:-1:0).*newpop(i+1,1:stringlength))*(b-a)/(2^stri nglength-1)+a;%算出交叉后的二进制数对应的十进制数newpop(i,stringlength+2)=fun(newpop(i,stringlength+1));newpop(i+1,stringlength+1)=fun(newpop(i+1,stringlength+1));%算出交叉后的二进制数对应的函数值elsenewpop(i, :)=newpop(i, :);newpop(i+1, :)=newpop(i+1, :);%形成新的种群矩阵endend%-----------------变异算子,实现变异运算-------------------%function newpop=mutation(newpop,stringlength,fun,a,b,pm)[px,py]=size(newpop);%求出新种群矩阵的大小(行和列)for i=1:pxif(rand<=pm)%随机生成一个概率小于变异概率后,实现变异运算mpoint=unidrnd(stringlength);%随机生成一个1到stringlength的数,作为变异点newpop(i,mpoint)=abs(newpop(i,mpoint)-1);%在变异点实现变异,使0变为1,1变为0 newpop(i,stringlength+1)=sum(2.^(stringlength-1:-1:0).*newpop(i,1:stringlength))*(b-a)/(2^stringlen gth-1)+a;%算出变异后的二进制数对应的十进制数newpop(i,stringlength+2)=fun(newpop(i,stringlength+1));%算出变异后的二进制数对应的函数值elsenewpop(i, :)=newpop(i, :);%形成新的种群矩阵endend%----------------求最大适应值-----------------%function [bestindividual,bestfit]=best(pop,stringlength)[px,py]=size(pop);%求出新种群矩阵的大小(行和列)bestindividual=pop(1,stringlength+1);bestfit=pop(1,stringlength+2);%把种群的第一个数作为初始值for i=2:px%在种群中从第二项开始if bestfit<pop(i,stringlength+2)%种群中如果哪一项比哪一项大,则代替之bestfit=pop(i,stringlength+2);bestindividual=pop(i,stringlength+1);%选出种群中最大的适应值,自变量的值和函数值endend。

遗传算法代码汇总

遗传算法代码汇总

% 求下列函数的最小值%% y=20+x(1).^2+x(2).^2-10*(cos(2*pi.*x(1))+cos(2*pi.*x(2))) %%思路:可以转化为y=10+x.^2-10*cos(2*pi.*x),循环两次,求y值和。

%% 将x 的值用一个14位的二值形式表示为二值问题,一个14位的二值数提供的分辨率是每为(10-0)/(2^14-1)≈0.001 。

%% 将变量域[-5,5] 离散化为二值域[0,16383], x=0+10*b/16383, 其中 b 是[0, 16383] 中的一个二值数。

%% %%--------------------------------------------------------------------------------------------------------------%%--------------------------------------------------------------------------------------------------------------%% 编程%-----------------------------------------------% 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的矩阵,% roud对矩阵的每个单元进行圆整。

基于遗传算法的中药药对挖掘系统的设计(附Java代码)

基于遗传算法的中药药对挖掘系统的设计(附Java代码)

基于遗传算法的中药药对挖掘系统的设计(附Java代码)关联规则是数据挖掘中的重要技术之一,它能反映在事务数据库中数据项之间同时出现的规律,并发现不同数据项之间的联系。

关联规则通过量化的数字描述数据项A的出现对数据项B的出现产生的影响。

例如在大型商场中牛奶的销售对面包的销售的影响,发现这样的规则...<p>关联规则是数据挖掘中的重要技术之一,它能反映在事务数据库中数据项之间同时出现的规律,并发现不同数据项之间的联系。

关联规则通过量化的数字描述数据项A的出现对数据项B的出现产生的影响。

例如在大型商场中牛奶的销售对面包的销售的影响,发现这样的规则不仅可以应用于商品货架设计、货存安排,而且可以根据购买模式对用户进行分类,制定相应商务决策、销售策略。

<br />由于关联规则挖掘具有重要的现实意义,吸引了许多学者的研究,提出了众多的关联规则挖掘算法。

目前,所有的关联规则挖掘算法都是基于支持度-置信度框架理论,具有较多的局限性。

本文通过分析这些不足之处,引入双向关联规则的概念,实现了基于遗传算法的双向关联规则挖掘算法。

<br /><br />摘&nbsp; 要<br />用数据挖掘技术研究了中药方剂配伍的规律。

主要工作:分析了关联规则存在的问题,引入双向关联规则的概念;介绍了遗传算法的基本原理,研究了遗传算法在数据挖掘中的应用;将方剂库转换为位图矩阵,大大提高搜索效率;开发了一个基于遗传算法的中药药对药组挖掘系统。

论文组织如下:介绍了研究背景和意义;阐述了相关的理论基础;提出了系统的设计方案;详细展示了基于遗传算法的双向关联规则挖掘系统的实现过程,包括位图矩阵的实现,个体的编码方法,适应度函数的设计,规则的提取,选择、交叉、变异等遗传操作的实现等;利用脾胃类方剂库对系统进行了测试,并对测试结果进行了分析。

结果证明:该系统能够快速高效地从方剂库中找出具有重要意义的药对药组,对中医药的研究发展有一定意义。

遗传算法源码

遗传算法源码

***************************************************** *********/* 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 <stdio.h>#include <stdlib.h>#include <math.h>/* Change any of these parameters to match your needs */struct genotype /* genotype (GT), a member of the population */#define POPSIZE 50 #define MAXGENS 1000 #define NVARS 3 #define PXOVER 0.8 #define PMUTATION 0.15 #define TRUE 1#define FALSE 0int generation;int cur_best;FILE *galog;/* population size *//* max. number of generations */ /* no. of problem variables */ /* probability of crossover */ /* probability of mutation */ /* current generation no. *//* best individual *//* an output file */double gene[NV ARS]; /* a string of variables */ double fitness; /* GT's fitness */double upper[NV ARS]; /* GT's variables upper bound */ double lower[NV ARS]; /* GT's variables lower bound */ double rfitness; /* relative fitness */double cfitness; /* cumulative fitness */};struct genotype population[POPSIZE+1]; /* population */struct genotype newpopulation[POPSIZE+1]; /* new population; *//* replaces the */ /* oldgeneration *//* Declaration of procedures used by this genetic algorithm */ void initialize(void);double randval(double, double);void evaluate(void);void keep_the_best(void);void elitist(void);void select(void);void crossover(void);void Xover(int,int);void swap(double *,double *);void mutate(void);void report(void);****************************************************** *******/* Initialization function: Initializes the values of genes *//* within the variables bounds. It also initializes (to zero) */ /* all fitness values for each member of the population. It *//* reads upper and lower bounds of each variable from the *//* input file 'gadata.txt'. It randomly generates values */ /* between these bounds for each gene of each genotype in the *//* population. The format of the input file 'gadata.txt' is *//* var1_lower_bound var1_upper bound */ /* var2_lower_bound var2_upper bound ... */ /***************************************************************/ 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);/* initialize variables within the bounds */for (i = 0; i < NV ARS; i++){fscanf(infile, "%lf",&lbound);fscanf(infile, "%lf",&ubound);for (j = 0; j < POPSIZE; j++){population[j].fitness = 0;population[j].rfitness = 0;population[j].cfitness = 0;population[j].lower = lbound;population[j].upper= ubound;population[j].gene = randval(population[j].lower,population[j].upper);}}fclose(infile);}/***********************************************************/ /* Random value generator: Generates a value within bounds */ /***********************************************************/ double randval(double low, double high)double val;val = ((double)(rand()%1000)/1000.0)*(high - low) + low;return(val);}/************************************************************* / /* Evaluation function: This takes a user defined function.*/ /* Each time this is changed, the code has to berecompiled. *//* The current function is:x[1F2-x[1]*x[2]+x[3] */ /************************************************************* /void evaluate(void){int mem;int i;double x[NVARS+1];for (mem = 0; mem < POPSIZE; mem++){for (i = 0; i < NVARS; i++)x[i+1] = population[mem].gene;population[mem].fitness = (x[1]*x[1]) - (x[1]*x[2]) +x[3];}•************************************************** *********'/* Keep_the_best function: This function keeps track of the */ /* best member of the population. Note that the last entry in *//* the array Population holds a copy of the best individual *//***************************************************************/ void keep_the_best(){int mem;int i;cur_best = 0; /* stores the index of the best individual */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 < NVARS; i++)population[POPSIZE].gene = population[cur_best].gene;******************************************************* *******/* Elitist function: The best member of the previous generation */ /* is stored as the last in the array. If the best member of */ /* the current generation is worse then the best member of the */ /* previous generation, the latter one would replace the worst */ /* member of the current population *//****************************************************************/ 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.fitness > population[i+1].fitness){if (population.fitness >= best){best = population.fitness;best_mem = i;if (population[i+1].fitness <= worst){worst = population[i+1].fitness;worst_mem = i + 1;}}else{if (population.fitness <= worst){worst = population.fitness;worst_mem = i;}if (population[i+1].fitness >= best){best = population[i+1].fitness;best_mem = i + 1;}}}/* if best individual from the new population is better than */ /* the best individual from the previous population, then/* copy the best from the new population; else replace the */ /* worst individual from the current population with the */*//* best one from the previous generation*/if (best >= population[POPSIZE].fitness){for (i = 0; i < NVARS; i++)population[POPSIZE].gene = population[best_mem].gene;population[POPSIZE].fitness = population[best_mem].fitness; } else{for (i = 0; i < NVARS; i++)population[worst_mem].gene = population[POPSIZE].gene;population[worst_mem].fitness = population[POPSIZE].fitness; }}/**************************************************************/ /* Selection function: Standard proportional selection for *//* maximization problems incorporating elitist model - makes */ /* sure that the best member survives *//**************************************************************/ void select(void) int mem, i, j, k;double sum = 0;double p;/* find total fitness of the population */for (mem = 0; mem < POPSIZE; mem++){sum += population[mem].fitness;}/* calculate relative fitness */for (mem = 0; mem < POPSIZE; mem++){population[mem].rfitness = population[mem].fitness/sum;}population[0].cfitness = population[0].rfitness;/* calculate cumulative fitness */for (mem = 1; mem < POPSIZE; mem++){population[mem].cfitness = population[mem-1].cfitness +population[mem].rfitness;} /* finally select survivors using cumulative fitness. */ for (i = 0; i < POPSIZE; i++){p = rand()%1000/1000.0;if (p < population[0].cfitness)newpopulation = population[0];else{for (j = 0; j < POPSIZE;j++)if (p >= population[j].cfitness &&p<population[j+1].cfitness)newpopulation = population[j+1];}}/* once a new population is created, copy it back */for (i = 0; i < POPSIZE; i++)population = newpopulation;}/***************************************************************/ /* Crossover selection: selects two parents that take part in */ /* the crossover. Implements a single point crossover *//***************************************************************/ void crossover(void)int i, 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);elseone = mem;}}}/**************************************************************//* Crossover: performs crossover of the two selected parents. */void Xover(int one, int two)int i;int point; /* crossover point *//* select crossover point */if(NVARS > 1){if(NVARS == 2)point = 1;elsepoint = (rand() % (NVARS - 1)) + 1;for (i = 0; i < point; i++)swap(&population[one].gene, &population[two].gene);}}/*************************************************************/ /* Swap: A swap procedure that helps in swapping 2 variables */ /*************************************************************/void swap(double *x, double *y){double temp;temp = *x;*x = *y;*y = temp;}/**************************************************************/ /* Mutation: Random uniform mutation. A variable selected for */ /* mutation is replaced by a random value between lower and */ /* upper bounds of this variable *//**************************************************************/ void mutate(void){int i, j;double lbound, hbound;double x;for (i = 0; i < POPSIZE; i++)for (j = 0; j < NVARS; j++){x = rand()%1000/1000.0;if (x < PMUTATION){/* find the bounds on the variable to be mutated*/ lbound = population.lower[j];hbound = population.upper[j];population.gene[j] = randval(lbound, hbound);/* Report function: Reports progress of the simulation. Data */ /* dumped into the output file are separated by commas */•**************************************************** *******'void report(void){int i;double best_val; /* best population fitness */double avg; /* avg population fitness */double stddev;/* std. deviation of population fitness */double sum_square; /* sum of square for std. calc */ double square_sum; /* square of sum for std. calc */ double sum; /* total population fitness */sum = 0.0;sum_square = 0.0;for (i = 0; i < POPSIZE; i++)sum += population.fitness;sum_square += population.fitness * population.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, "\n%5d, %6.3f, %6.3f, %6.3f \n\n", generation,best_val, avg, stddev);} /**************************************************************/ /* Main function: Each generation involves selecting the best */ /* members, performing crossover & mutation and then */ /* evaluating the resulting population, until the terminating */ /* condition is satisfied *//**************************************************************/ void main(void){int i;if ((galog = fopen("galog.txt","w"))==NULL){exit(1);generation = 0;fprintf(galog, "\n generation best average standard \n");fprintf(galog, " number value fitness deviation \n"); initialize();evaluate();keep_the_best();while(generation<MAXGENS){generation++;select();crossover();mutate();report();evaluate();elitist();}fprintf(galog,"\n\n Simulation completed\n");fprintf(galog,"\n Best member: \n");for (i = 0; i < NVARS; i++){fprintf (galog,"\n var(%d)= %3.3f",i,population[POPSIZE].gene);fprintf(galog,"\n\n Best fitness= %3.3f",population[POPSIZE].fitness);fclose(galog);printf("Success\n");}/************************************************************ *'与人方便,与己方便。

Java语言描述标准遗传算法

Java语言描述标准遗传算法

标准遗传算法(2008-08-10 16:03:11)标签:染色体遗传算法 best if private 杂谈1、利用标准遗传算法求解函数f(x)=(x-5)*(x-5)的最小值,其中x属于区间[-255,255],算法的参数自己设定。

要求:1)给出求解本问题的标准遗传算法源代码(要有注释)序界面:算法的流程图:开始初始化染色体计算适度值选择操作交叉操作变异操作适合度最优染色体条件终止结束源程序:import java.awt.BorderLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;class Best {public int generations; //最佳适应值代号public String str; //最佳染色体public double fitness; //最佳适应值}public class SGAFrame extends JFrame {private JTextArea textArea;private String str = "";private Best best = null; //最佳染色体private String[] ipop = new String[10]; //染色体private int gernation = 0; //染色体代号public static final int GENE = 22; //基因数public static void main(String args[]) {try {SGAFrame frame = new SGAFrame();frame.setVisible(true);} catch (Exception e) {e.printStackTrace();}}public SGAFrame() { // SGAFrame类的构造函数super();this.ipop = inialPops();getContentPane().setLayout(null);setBounds(100, 100, 461, 277);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);final JLabel label = new JLabel();label.setText("X的区间:");label.setBounds(23, 10, 88, 15);getContentPane().add(label);final JLabel label_1 = new JLabel();label_1.setText("[-255,255]");label_1.setBounds(92, 10, 84, 15);getContentPane().add(label_1);final JButton button = new JButton();button.addActionListener(new ActionListener() {public void actionPerformed(final ActionEvent e) {SGAFrame s = new SGAFrame();str = str + s.process() + "\n";textArea.setText(str);}});button.setText("求最小值");button.setBounds(323, 27, 99, 23);getContentPane().add(button);final JLabel label_2 = new JLabel();label_2.setText("利用标准遗传算法求解函数f(x)=(x-5)*(x-5)的最小值:"); label_2.setBounds(23, 31, 318, 15);getContentPane().add(label_2);final JPanel panel = new JPanel();panel.setLayout(new BorderLayout());panel.setBounds(23, 65, 399, 164);getContentPane().add(panel);final JScrollPane scrollPane = new JScrollPane();panel.add(scrollPane, BorderLayout.CENTER);textArea = new JTextArea();scrollPane.setViewportView(textArea);//}private String inialPop() {String res = "";for (int i = 0; i < GENE; i++) {if (Math.random() > 0.5) {res += "0";} else {res += "1";}}return res;}private String[] inialPops() {String[] ipop = new String[10];for (int i = 0; i < 10; i++) {ipop[i] = inialPop();}return ipop;}private double calculatefitnessvalue(String str) {int b = Integer.parseInt(str, 2);//String str1 = "" + "/n";double x = -255 + b * (255 - (-255)) / (Math.pow(2, GENE) - 1); //System.out.println("X = " + x);double fitness = -(x - 5) * (x - 5);//System.out.println("f(x)=" + fitness);//str1 = str1 + "X=" + x + "/n"//+ "f(x)=" + "fitness" + "/n";//textArea.setText(str1);return fitness;}private void select() {double evals[] = new double[10]; // 所有染色体适应值double p[] = new double[10]; // 各染色体选择概率double q[] = new double[10]; // 累计概率double F = 0; // 累计适应值总和for (int i = 0; i < 10; i++) {evals[i] = calculatefitnessvalue(ipop[i]);if (best == null) {best = new Best();best.fitness = evals[i];best.generations = 0;best.str = ipop[i];} else {if (evals[i] > best.fitness) // 最好的记录下来{best.fitness = evals[i];best.generations = gernation;best.str = ipop[i];}}F = F + evals[i]; // 所有染色体适应值总和}for (int i = 0; i < 10; i++) {p[i] = evals[i] / F;if (i == 0)q[i] = p[i];else {q[i] = q[i - 1] + p[i];}}for (int i = 0; i < 10; i++) {double r = Math.random();if (r <= q[0]) {ipop[i] = ipop[0];} else {for (int j = 1; j < 10; j++) {if (r < q[j]) {ipop[i] = ipop[j];break;}}}}}private void cross() {String temp1, temp2;for (int i = 0; i < 10; i++) {if (Math.random() < 0.25) {double r = Math.random();int pos = (int) (Math.round(r * 1000)) % GENE;if (pos == 0) {pos = 1;}temp1 = ipop[i].substring(0, pos)+ ipop[(i + 1) % 10].substring(pos);temp2 = ipop[(i + 1) % 10].substring(0, pos)+ ipop[i].substring(pos);ipop[i] = temp1;ipop[(i + 1) / 10] = temp2;}}}private void mutation() {for (int i = 0; i < 4; i++) {int num = (int) (Math.random() * GENE * 10 + 1);int chromosomeNum = (int) (num / GENE) + 1; // 染色体号int mutationNum = num - (chromosomeNum - 1) * GENE; // 基因号 if (mutationNum == 0)mutationNum = 1;chromosomeNum = chromosomeNum - 1;if (chromosomeNum >= 10)chromosomeNum = 9;//System.out.println("变异前" + ipop[chromosomeNum]);String temp;if (ipop[chromosomeNum].charAt(mutationNum - 1) == '0') {if (mutationNum == 1) {temp = "1" + ipop[chromosomeNum].substring(mutationNum);} else {if (mutationNum != GENE) {temp = ipop[chromosomeNum].substring(0, mutationNum - 1) + "1" + ipop[chromosomeNum].substring(mutationNum);} else {temp = ipop[chromosomeNum].substring(0, mutationNum - 1) + "1";}}} else {if (mutationNum == 1) {temp = "0" + ipop[chromosomeNum].substring(mutationNum);} else {if (mutationNum != GENE) {temp = ipop[chromosomeNum].substring(0, mutationNum - 1) + "0" + ipop[chromosomeNum].substring(mutationNum);} else {temp = ipop[chromosomeNum].substring(0, mutationNum - 1) + "1";}}}ipop[chromosomeNum] = temp;//System.out.println("变异后" + ipop[chromosomeNum]);}}public String process() {String str = "";for (int i = 0; i < 10000; i++) {this.select();this.cross();this.mutation();gernation = i;}str = "最小值" + best.fitness + ",第" + best.generations + "个染色体"; return str;}}2)多次运行程序,观察运行结果,给出你对标准遗传算法优缺点的判断(可以从是否收敛、收敛速度,参数设置等方面考虑)。

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