遗传算法JAVA精品毕业设计完整版.docx
《遗传算法JAVA精品毕业设计完整版.docx》由会员分享,可在线阅读,更多相关《遗传算法JAVA精品毕业设计完整版.docx(40页珍藏版)》请在冰豆网上搜索。
![遗传算法JAVA精品毕业设计完整版.docx](https://file1.bdocx.com/fileroot1/2022-10/26/0e8bfdae-b5fa-411b-9c71-43dc765974be/0e8bfdae-b5fa-411b-9c71-43dc765974be1.gif)
遗传算法JAVA精品毕业设计完整版
java常用代码---遗传算法
标签:
javadistancecalendarstringrandom算法
2011-11-1718:
23 5815人阅读 评论
(1) 收藏 举报
分类:
数据结构与算法实践(23)
importjava.util.*;
publicclassTsp{
privateStringcityName[]={"北京","上海","天津","重庆","哈尔滨","长春","沈阳","呼和浩特","石家庄","太原","济南","郑州","西安","兰州","银川","西宁","乌鲁木齐","合肥","南京","杭州","长沙","南昌","武汉","成都","贵州","福建","台北","广州","海口","南宁","昆明","拉萨","香港","澳门"};
//privateStringcityEnd[]=newString[34];
privateintcityNum=cityName.length;//城市个数
privateintpopSize=50;//种群数量
privateintmaxgens=20000;//迭代次数
privatedoublepxover=0.8;//交叉概率
privatedoublepmultation=0.05;//变异概率
privatelong[][]distance=newlong[cityNum][cityNum];
privateintrange=2000;//用于判断何时停止的数组区间
privateclassgenotype{
intcity[]=newint[cityNum];//单个基因的城市序列
longfitness;//该基因的适应度
doubleselectP;//选择概率
doubleexceptp;//期望概率
intisSelected;//是否被选择
}
privategenotype[]citys=newgenotype[popSize];
/**
*构造函数,初始化种群
*/
publicTsp(){
for(inti=0;icitys[i]=newgenotype();
int[]num=newint[cityNum];
for(intj=0;jnum[j]=j;
inttemp=cityNum;
for(intj=0;jintr=(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();
}
/**
*计算每个种群每个基因个体的适应度,选择概率,期望概率,和是否被选择。
*/
publicvoidCalAll(){
for(inti=0;icitys[i].fitness=0;
citys[i].selectP=0;
citys[i].exceptp=0;
citys[i].isSelected=0;
}
CalFitness();
CalSelectP();
CalExceptP();
CalIsSelected();
}
/**
*填充,将多选的填充到未选的个体当中
*/
publicvoidpad(){
intbest=0;
intbad=0;
while(true){
while(citys[best].isSelected<=1&&bestbest++;
while(citys[bad].isSelected!
=0&&badbad++;
for(inti=0;icitys[bad].city[i]=citys[best].city[i];
citys[best].isSelected--;
citys[bad].isSelected++;
bad++;
if(best==popSize||bad==popSize)
break;
}
}
/**
*交叉主体函数
*/
publicvoidcrossover(){
intx;
inty;
intpop=(int)(popSize*pxover/2);
while(pop>0){
x=(int)(Math.random()*popSize);
y=(int)(Math.random()*popSize);
executeCrossover(x,y);//xy两个体执行交叉
pop--;
}
}
/**
*执行交叉函数
*@param个体x
*@param个体y
*对个体x和个体y执行佳点集的交叉,从而产生下一代城市序列
*/
privatevoidexecuteCrossover(intx,inty){
intdimension=0;
for(inti=0;iif(citys[x].city[i]!
=citys[y].city[i]){
dimension++;
}
intdiffItem=0;
double[]diff=newdouble[dimension];
for(inti=0;iif(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=newdouble[dimension];
temp=gp(x,dimension);
for(intk=0;kfor(intj=0;jif(temp[j]==k){
doubleitem=temp[k];
temp[k]=temp[j];
temp[j]=item;
item=diff[k];
diff[k]=diff[j];
diff[j]=item;
}
inttempDimension=dimension;
inttempi=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(intk=0;kfor(intj=0;jif(temp[j]==k){
doubleitem=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++;
}
}
/**
*@paramindividual个体
*@paramdimension维数
*@return佳点集(用于交叉函数的交叉点)在executeCrossover()函数中使用
*/
privatedouble[]gp(intindividual,intdimension){
double[]temp=newdouble[dimension];
double[]temp1=newdouble[dimension];
intp=2*dimension+3;
while(!
isSushu(p))
p++;
for(inti=0;itemp[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(inti=0;itemp1[i]=temp[i];
Arrays.sort(temp1);
//排序
for(inti=0;ifor(intj=0;jif(temp[j]==temp1[i])
temp[j]=i;
returntemp;
}
/**
*变异
*/
publicvoidmutate(){
doublerandom;
inttemp;
inttemp1;
inttemp2;
for(inti=0;irandom=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;
}
}
}
/**
*打印当前代数的所有城市序列,以及其相关的参数
*/
publicvoidprint(){
/**
*初始化各城市之间的距离
*/
privatevoidinitDistance(){
for(inti=0;ifor(intj=