- 浏览: 45736 次
- 性别:
- 来自: 北京
-
最新评论
遗传算法
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> 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(); } /** * 计算每个种群每个基因个体的适应度,选择概率,期望概率,和是否被选择。 */ public void CalAll(){ for( int i = 0; i< popSize; i++){ citys[i].fitness = 0; citys[i].selectP = 0; citys[i].exceptp = 0; citys[i].isSelected = 0; } CalFitness(); CalSelectP(); CalExceptP(); CalIsSelected(); } /** * 填充,将多选的填充到未选的个体当中 */ public void pad(){ int best = 0; int bad = 0; while(true){ while(citys[best].isSelected <= 1 && best<popSize-1) best ++; while(citys[bad].isSelected != 0 && bad<popSize-1) bad ++; for(int i = 0; i< cityNum; i++) citys[bad].city[i] = citys[best].city[i]; citys[best].isSelected --; citys[bad].isSelected ++; bad ++; if(best == popSize ||bad == popSize) break; } } /** * 交叉主体函数 */ public void crossover() { int x; int y; int pop = (int)(popSize* pxover /2); while(pop>0){ x = (int)(Math.random()*popSize); y = (int)(Math.random()*popSize); executeCrossover(x,y);//x y 两个体执行交叉 pop--; } } /** * 执行交叉函数 * @param 个体x * @param 个体y * 对个体x和个体y执行佳点集的交叉,从而产生下一代城市序列 */ private void executeCrossover(int x,int y){ int dimension = 0; for( int i = 0 ;i < cityNum; i++) if(citys[x].city[i] != citys[y].city[i]){ dimension ++; } int diffItem = 0; double[] diff = new double[dimension]; for( int i = 0 ;i < cityNum; i++){ if(citys[x].city[i] != citys[y].city[i]){ diff[diffItem] = citys[x].city[i]; citys[x].city[i] = -1; citys[y].city[i] = -1; diffItem ++; } } Arrays.sort(diff); double[] temp = new double[dimension]; temp = gp(x, dimension); for( int k = 0; k< dimension;k++) for( int j = 0; j< dimension; j++) if(temp[j] == k){ double item = temp[k]; temp[k] = temp[j]; temp[j] = item; item = diff[k]; diff[k] = diff[j]; diff[j] = item; } int tempDimension = dimension; int tempi = 0; while(tempDimension> 0 ){ if(citys[x].city[tempi] == -1){ citys[x].city[tempi] = (int)diff[dimension - tempDimension]; tempDimension --; } tempi ++; } Arrays.sort(diff); temp = gp(y, dimension); for( int k = 0; k< dimension;k++) for( int j = 0; j< dimension; j++) if(temp[j] == k){ double item = temp[k]; temp[k] = temp[j]; temp[j] = item; item = diff[k]; diff[k] = diff[j]; diff[j] = item; } tempDimension = dimension; tempi = 0; while(tempDimension> 0 ){ if(citys[y].city[tempi] == -1){ citys[y].city[tempi] = (int)diff[dimension - tempDimension]; tempDimension --; } tempi ++; } } /** * @param individual 个体 * @param dimension 维数 * @return 佳点集 (用于交叉函数的交叉点) 在executeCrossover()函数中使用 */ private double[] gp(int individual, int dimension){ double[] temp = new double[dimension]; double[] temp1 = new double[dimension]; int p = 2 * dimension + 3; while(!isSushu(p)) p++; for( int i = 0; i< dimension; i++){ temp[i] = 2*Math.cos(2*Math.PI*(i+1)/p) * (individual+1); temp[i] = temp[i] - (int)temp[i]; if( temp [i]< 0) temp[i] = 1+temp[i]; } for( int i = 0; i< dimension; i++) temp1[i] = temp[i]; Arrays.sort(temp1); //排序 for( int i = 0; i< dimension; i++) for( int j = 0; j< dimension; j++) if(temp[j]==temp1[i]) temp[j] = i; return temp; } /** * 变异 */ public void mutate(){ double random; int temp; int temp1; int temp2; for( int i = 0 ; i< popSize; i++){ random = Math.random(); if(random<=pmultation){ temp1 = (int)(Math.random() * (cityNum)); temp2 = (int)(Math.random() * (cityNum)); temp = citys[i].city[temp1]; citys[i].city[temp1] = citys[i].city[temp2]; citys[i].city[temp2] = temp; } } } /** * 打印当前代数的所有城市序列,以及其相关的参数 */ public void print(){ /** * 初始化各城市之间的距离 */ private void initDistance(){ for (int i = 0; i < cityNum; i++) { for (int j = 0; j < cityNum; j++){ distance[i][j] = Math.abs(i-j); } } } /** * 计算所有城市序列的适应度 */ private void CalFitness() { for (int i = 0; i < popSize; i++) { for (int j = 0; j < cityNum - 1; j++) citys[i].fitness += distance[citys[i].city[j]][citys[i].city[j + 1]]; citys[i].fitness += distance[citys[i].city[0]][citys[i].city[cityNum - 1]]; } } /** * 计算选择概率 */ private void CalSelectP(){ long sum = 0; for( int i = 0; i< popSize; i++) sum += citys[i].fitness; for( int i = 0; i< popSize; i++) citys[i].selectP = (double)citys[i].fitness/sum; } /** * 计算期望概率 */ private void CalExceptP(){ for( int i = 0; i< popSize; i++) citys[i].exceptp = (double)citys[i].selectP * popSize; } /** * 计算该城市序列是否较优,较优则被选择,进入下一代 */ private void CalIsSelected(){ int needSelecte = popSize; for( int i = 0; i< popSize; i++) if( citys[i].exceptp<1){ citys[i].isSelected++; needSelecte --; } double[] temp = new double[popSize]; for (int i = 0; i < popSize; i++) { // temp[i] = citys[i].exceptp - (int) citys[i].exceptp; // temp[i] *= 10; temp[i] = citys[i].exceptp*10; } int j = 0; while (needSelecte != 0) { for (int i = 0; i < popSize; i++) { if ((int) temp[i] == j) { citys[i].isSelected++; needSelecte--; if (needSelecte == 0) break; } } j++; } } /** * @param x * @return 判断一个数是否是素数的函数 */ private boolean isSushu( int x){ if(x<2) return false; for(int i=2;i<=x/2;i++) if(x%i==0&&x!=2) return false; return true; } /** * @param x 数组 * @return x数组的值是否全部相等,相等则表示x.length代的最优结果相同,则算法结束 */ private boolean isSame(long[] x){ for( int i = 0; i< x.length -1; i++) if(x[i] !=x[i+1]) return false; return true; } /** * 打印任意代最优的路径序列 */ private void printBestRoute(){ CalAll(); long temp = citys[0].fitness; int index = 0; for (int i = 1; i < popSize; i++) { if(citys[i].fitness<temp){ temp = citys[i].fitness; index = i; } } System.out.println(); System.out.println("最佳路径的序列:"); for (int j = 0; j < cityNum; j++) { String cityEnd[]={cityName[citys[index].city[j]]}; for(int m=0;m<cityEnd.length;m++) { System.out.print(cityEnd[m] + " "); } } //System.out.print(citys[index].city[j] + cityName[citys[index].city[j]] + " "); //System.out.print(cityName[citys[index].city[j]]); System.out.println(); } /** * 算法执行 */ public void run(){ l发表评论
相关推荐
在Java编程世界中,"java源代码实例系列之三供参考"是一个旨在引导初学者深入理解Java编程概念的教程。这个实例系列通过实际的代码示例来解释Java的基础知识,帮助开发者逐步掌握这门强大的面向对象语言。在这个章节...
java编程实例源代码,对初学者非常有帮助。里面有100个实例。
"java简单实例程序源代码"这个压缩包包含了一系列章节相关的Java实例源代码,适合初学者和有经验的开发者用来加深对Java语言的理解。以下是这些章节可能涉及的重要知识点的详细解释: 1. **CH11**: 这个章节可能...
100个Java经典编程实例源代码100个Java经典编程实例源代码100个Java经典编程实例源代码100个Java经典编程实例源代码100个Java经典编程实例源代码100个Java经典编程实例源代码
通过学习这些Java源代码实例,初学者可以逐步理解并掌握Java编程语言的核心特性。这些实例不仅提供了理论知识的实践平台,还有助于培养良好的编程习惯和问题解决能力。同时,这些实例也可以作为自我检查和提升的工具...
本资源"JAVA图形界面实例源代码"提供了丰富的GUI实现示例,旨在帮助初学者和进阶开发者更好地理解和应用Java GUI技术。 首先,我们需要了解Java中的Swing和JavaFX两个主要的GUI库。Swing是Java AWT(Abstract ...
【描述】提到的"国内Java培训郝斌视频的一些源代码,上课PPT"意味着这个压缩包中包含两部分主要资料:一是郝斌在视频课程中讲解的Java源代码实例,二是他的授课幻灯片。源代码是学习编程的重要组成部分,因为它直观...
Java游戏中斜视角编辑器及引擎源代码.rar Java游戏使命的召唤源码.rar Java游戏沙丘城堡源代码.rar Java源码的仿QQ聊天程序.rar Java用GZIP压缩解压文件.rar Java用Zip压缩多个文件实例源码.rar Java用的在线地图...
【标题】"JAVA源代码100实例"涵盖了Java编程语言中的各种常见应用场景和技术点,旨在帮助初学者和进阶者通过实际操作来理解和掌握Java编程。这些实例旨在解决实际问题,提供了一手的编程经验,是提升Java编程技能的...
这个压缩包文件包含了多种Java源代码实例,是初学者探索和学习Java编程的理想资源。以下将详细解析这些源代码可能涉及的知识点,以帮助你更好地理解和应用Java。 1. **基础语法**:所有编程语言都有其基本的语法...
这些源代码实例涵盖了Java的基础概念到进阶特性,是学习和理解Java语法、编程技巧以及解决问题的有效工具。 首先,Java源代码的学习应从基础语法开始。这可能包括变量声明、数据类型(如基本类型和引用类型)、控制...
这些源代码实例可能会包含更多关于如何使用继承和多态性的示例,比如抽象类、final关键字、访问修饰符的应用以及如何在实际项目中利用这些特性提高代码结构的清晰度和可维护性。学习并理解这些示例,对于深入理解和...
在Java编程领域,一个"java工程源代码实例"通常指的是包含了一系列类、接口、方法和其他相关资源的项目,这些组合起来构成了一个可运行的程序。Java工程是开发人员用来组织和管理代码的方式,使得代码更加模块化,...
Java坦克大战网络对战版源代码.rar Java声音播放程序源代码.rar JAVA实现CLDC与MIDP底层编程的代码.rar Java实现HTTP连接与浏览,Java源码下载.rar Java实现的FTP连接与数据浏览程序.rar Java实现的放大镜效果附有...
首先,你需要读取Java源代码文件,然后使用`ASTParser`类来创建一个解析器实例。解析器可以设置不同的解析选项,如源代码版本、绑定级别等。以下是一个基本示例: ```java ASTParser parser = ASTParser.newParser...
通过这些Java源代码实例,开发者可以: 1. 学习基本语法:包括变量、数据类型、运算符、流程控制语句等。 2. 掌握面向对象编程:类、对象、继承、多态、接口等。 3. 熟悉集合框架:List、Set、Map的使用和实现原理...
6. **多线程**:Java提供强大的多线程支持,源代码可能包含Thread类、Runnable接口以及同步机制(如synchronized关键字、wait()、notify()方法)的实例,让读者了解如何在并发环境下编写程序。 7. **网络编程**:...
### 加密Java源代码 #### 知识点概述: 在提供的描述中,主要涉及的是Java源代码加密的相关技术,特别是利用DES(数据加密标准)算法进行加密的过程。本篇文章将详细解析Java源代码加密的基本原理、DES算法的工作...
这个文件可能包含了一系列章节,每个章节都有相应的源代码实例,供读者下载、编译和运行,以加深对课程内容的理解。 总的来说,这份"JAVA学习源代码"资源是一个完整的Java学习套餐,不仅提供了理论知识,还提供了...
《中小型Java游戏实例:探索国外Java源代码》 在编程世界中,Java作为一种跨平台、面向对象的语言,因其强大的性能和灵活性,常被用于开发各种类型的应用程序,其中包括游戏。本资源“中小型Java游戏实例 国外Java...