




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
package GA;import java.util.*;public class Tsp private String cityName=北京,上海,天津,重庆,哈尔滨,长春,沈阳,呼和浩特,石家庄,太原,济南,郑州,西安,兰州,银川,西宁,乌鲁木齐,合肥,南京,杭州,长沙,南昌,武汉,成都,贵州,福建,台北,广州,海口,南宁,昆明,拉萨,香港,澳门; /private String cityEnd=new String34; 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 longcityNumcityNum; private int range = 2000; /用于判断何时停止的数组区间 private class genotype int city = new intcityNum; /单个基因的城市序列 long fitness; /该基因的适应度 double selectP; /选择概率 double exceptp; /期望概率 int isSelected; /是否被选择 private genotype citys = new genotypepopSize; /* * 构造函数,初始化种群 */ public Tsp() for (int i = 0; i popSize; i+) citysi = new genotype(); int num = new intcityNum; for (int j = 0; j cityNum; j+) numj = j; int temp = cityNum; for (int j = 0; j cityNum; j+) int r = (int) (Math.random() * temp); citysi.cityj = numr; numr = numtemp - 1; temp-; citysi.fitness = 0; citysi.selectP = 0; citysi.exceptp = 0; citysi.isSelected = 0; initDistance(); /* * 计算每个种群每个基因个体的适应度,选择概率,期望概率,和是否被选择。 */ public void CalAll() for( int i = 0; i popSize; i+) citysi.fitness = 0; citysi.selectP = 0; citysi.exceptp = 0; citysi.isSelected = 0; CalFitness(); CalSelectP(); CalExceptP(); CalIsSelected(); /* * 填充,将多选的填充到未选的个体当中 */ public void pad() int best = 0; int bad = 0; while(true) while(citysbest.isSelected = 1 & bestpopSize-1) best +; while(citysbad.isSelected != 0 & badpopSize-1) bad +; for(int i = 0; i0) 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(citysx.cityi != citysy.cityi) dimension +; int diffItem = 0; double diff = new doubledimension; for( int i = 0 ;i cityNum; i+) if(citysx.cityi != citysy.cityi) diffdiffItem = citysx.cityi; citysx.cityi = -1; citysy.cityi = -1; diffItem +; Arrays.sort(diff); double temp = new doubledimension; temp = gp(x, dimension); for( int k = 0; k dimension;k+) for( int j = 0; j 0 ) if(citysx.citytempi = -1) citysx.citytempi = (int)diffdimension - tempDimension; tempDimension -; tempi +; Arrays.sort(diff); temp = gp(y, dimension); for( int k = 0; k dimension;k+) for( int j = 0; j 0 ) if(citysy.citytempi = -1) citysy.citytempi = (int)diffdimension - tempDimension; tempDimension -; tempi +; /* * param individual 个体 * param dimension 维数 * return 佳点集 (用于交叉函数的交叉点) 在executeCrossover()函数中使用 */ private double gp(int individual, int dimension) double temp = new doubledimension; double temp1 = new doubledimension; int p = 2 * dimension + 3; while(!isSushu(p) p+; for( int i = 0; i dimension; i+) tempi = 2*Math.cos(2*Math.PI*(i+1)/p) * (individual+1); tempi = tempi - (int)tempi; if( temp i 0) tempi = 1+tempi; for( int i = 0; i dimension; i+) temp1i = tempi; Arrays.sort(temp1); /排序 for( int i = 0; i dimension; i+) for( int j = 0; j dimension; j+) if(tempj=temp1i) tempj = 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 = citysi.citytemp1; citysi.citytemp1 = citysi.citytemp2; citysi.citytemp2 = temp; /* * 打印当前代数的所有城市序列,以及其相关的参数 */ public void print() /* * 初始化各城市之间的距离 */ private void initDistance() for (int i = 0; i cityNum; i+) for (int j = 0; j cityNum; j+) distanceij = Math.abs(i-j); /* * 计算所有城市序列的适应度 */ private void CalFitness() for (int i = 0; i popSize; i+) for (int j = 0; j cityNum - 1; j+) citysi.fitness += distancecitysi.cityjcitysi.cityj + 1; citysi.fitness += distancecitysi.city0citysi.citycityNum - 1; /* * 计算选择概率 */ private void CalSelectP() long sum = 0; for( int i = 0; i popSize; i+) sum += citysi.fitness; for( int i = 0; i popSize; i+) citysi.selectP = (double)citysi.fitness/sum; /* * 计算期望概率 */ private void CalExceptP() for( int i = 0; i popSize; i+) citysi.exceptp = (double)citysi.selectP * popSize; /* * 计算该城市序列是否较优,较优则被选择,进入下一代 */ private void CalIsSelected() int needSelecte = popSize; for( int i = 0; i popSize; i+) if( citysi.exceptp1) citysi.isSelected+; needSelecte -; double temp = new doublepopSize; for (int i = 0; i popSize; i+) / tempi = citysi.exceptp - (int) citysi.exceptp;/ tempi *= 10; tempi = citysi.exceptp*10; int j = 0; while (needSelecte != 0) for (int i = 0; i popSize; i+) if (int) tempi = j) citysi.isSelected+; needSelecte-; if (needSelecte = 0) break; j+; /* * param x * return 判断一个数是否是素数的函数 */ private boolean isSushu( int x) if(x2) 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(xi !=xi+1) return false; return true; /* * 打印任意代最优的路径序列 */ private void printBestRoute() CalAll(); long temp = citys0.fitness; int index = 0; for (int i = 1; i popSize; i+) if(citysi.fitnesstemp) temp = citysi.fitness; index = i; System.out.println(); System.out.println(最佳路径的序列:); for (int j = 0; j cityNum; j+) String cityEnd=cityNamecitysindex.cityj; for(int m=0;mcityEnd.length;m+) System.out.print(cityEndm + ); /System.out.print(citysindex.cityj + cityNamecitysindex.cityj + ); /System.out.print(cityNamecitysindex.cityj); System.out.println(); /* * 算法执行 */ public void run() long result = new longrange; /result初始化为所有的数字都不相等 for( int i = 0; i0) System.out.println(- 第 +num+ 代 -); CalAll(); print(); pad(); crossover(); mutate(); maxgens -; lo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 重庆丰都县2025年上半年事业单位公开遴选试题含答案分析
- 毛皮市场:繁荣与机遇
- 河北省文安县2025年上半年事业单位公开遴选试题含答案分析
- 2025版石子行业绿色采购与销售战略合作协议
- 2025年度消防设备租赁与维护三方合作协议
- 2025版网络安全软件技术服务合同
- 2025定制加工合同范本:珠宝首饰定制加工合作协议
- 2025版新媒体内容运营与推广社会化媒体营销服务协议
- 2025版石材进出口贸易与金融服务合同
- 2025版彭园一处场地招租与电子商务平台合作协议
- 2025年广安市中考化学试卷真题(含标准答案及解析)
- 甘肃省陇南市成县县属国有企业招聘笔试题库2025
- dcs权限管理制度
- 2025年陕西山西青海宁夏高考历史试卷真题答案详解(课件)
- 口腔设备学发展史
- 2025年广西专业技术人员继续教育公需科目(二)答案
- 浙江一般公需课从大模型到智能超算的思考题库及答案
- 供电公司质量月活动方案
- 外墙防水渗漏红外检测技术
- 仓库销售活动方案
- 二手电车买卖合同范本
评论
0/150
提交评论