?? tsp_g.java
字號:
import java.awt.*;
import java.lang.*;
import java.io.*;
import java.lang.Math;
import javax.swing.*;
import java.util.Random;
/*
* Created on 2004-10-8
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
/**
* @author Bluewater
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
class TSP_g {
double[][] city;
int[][] oldparent1={},newparent;
int[] bestsequence;
int gen,maxgen,citynum,popsize;
double pmutation,pcross,pselect;
double[] pfitness,poldfitness;
public TSP_g()
{
this.citynum=20;
this.popsize=100;
bestsequence=new int[citynum];
this.pmutation=0.35;
this.pcross=1.0;
this.pselect=0.2;
this.gen=0;
this.city=new double[20][2];
oldparent1=new int[popsize][citynum];
newparent=new int[popsize][citynum];
initial(this.citynum);
poldfitness=calculate_fitness(oldparent1,this.popsize);
while(gen<5)
{
for(int i=0;i<popsize;i+=2)
{
cross();
gen++;
}
/*
隨機從P(t)中產生兩個父體交叉操作后產生兩個后代;
把這兩個后代加入中間群體P′(t)中;
}
對中間群體P′(t)中的每個個體進行變異操作;
從P(t)和P′(t)中進行選擇操作得到N個個體賦予新群體P(t+1)中;
計算P(t+1)中每個個體的適應度;
t++;*/
}
}
public void cross()
{
Random rr=new Random();
double probablity=0.0;
int num1,num2,crossposition;
num1=0;num2=0;crossposition=0;
try
{
probablity=rr.nextDouble();
num1=rr.nextInt(popsize-1);
num2=rr.nextInt(popsize-1);
crossposition=rr.nextInt(citynum-1);
}
catch(IllegalArgumentException ex)
{
ex.printStackTrace();
}
for(int i=0;i<popsize;i++)
for(int j=0;j<citynum;j++)
newparent[i][j]=oldparent1[i][j];
//進行交叉操作
if(probablity<=pcross)
{
crossaction(newparent[num1],newparent[num2],crossposition);
}
System.out.println("交叉后");
calculate_fitness(newparent,popsize);
System.out.println("交叉wanbi");
}
public void crossaction(int[] first,int[] second,int position)
{
int i,j;
int[] temp1=new int[citynum];
int[] temp2=new int[citynum];
for(i=0;i<citynum;i++)
{
temp1[i]=first[i];
temp2[i]=second[i];
}
changeorder(temp1,position);
changeorder(temp2,position);
for(i=0;i<position;i++)
for(j=0;j<citynum;j++)
{
if(temp2[j]==first[i])
temp2[j]=-1;
if(temp1[j]==second[i])
temp1[j]=-1;
}
int position_num=position;
for(i=0;i<citynum;i++)
{
if(temp2[i]!=-1)
{first[position_num]=temp2[i];
position_num++;
}
if(temp1[i]!=-1)
{second[position]=temp1[i];
position++;
}
}
}
public void changeorder(int[] data,int position)
{
int temp;
for(int i=0;i<position;i++)
{
temp=data[1];
for(int j=0;j<citynum-1;j++)
data[j]=data[j+1];
data[citynum-1]=temp;
}
}
//從文本中讀數據
public void readdata(int citynum) throws IOException
{
String str_temp;
try
{
RandomAccessFile file=new RandomAccessFile("g:\\javapro\\data.txt","r");
for(int i=0;i<citynum;i++)
{
try
{
str_temp=file.readLine();
this.city[i][0]=(Double.valueOf(str_temp)).doubleValue();
str_temp=file.readLine();
this.city[i][1]=(Double.valueOf(str_temp)).doubleValue();
}
catch(IOException ex)
{
ex.printStackTrace();
}
catch(ArrayIndexOutOfBoundsException ex)
{
ex.printStackTrace();
}
}
}
catch(FileNotFoundException ex)
{
ex.printStackTrace();
}
}
public void initial(int citynum)
{
int[] sequence=new int[citynum];
int i,j,nextnum;
try{
readdata(citynum);
}
catch(IOException ex)
{
ex.printStackTrace();
}
Random rr=new Random();
//產生第一代個體
for(i=0;i<popsize;i++)
for(j=0;j<citynum;j++)
{
oldparent1[i][j]=0;
}
for(j=0;j<popsize;j++)
{
//初始化序列
for(i=0;i<citynum;i++)
sequence[i]=i;
int length=citynum-1;
//隨機產生的序列
for(i=0;i<citynum;i++)
{
try
{
nextnum=rr.nextInt(length+1);
oldparent1[j][i]=sequence[nextnum];
for(int k=nextnum;k<length;k++)
sequence[k]=sequence[k+1];
length--;
}
catch(IllegalArgumentException ex)
{
ex.printStackTrace();
}
}
}
}
public double[] calculate_fitness(int[][] parent,int size)
{
double[] cityfitness=new double[size];//記錄種群的適應度值
double sum=0.0;
//計算適應度
for(int i=0;i<size;i++)
{
for(int j=0;j<citynum-1;j++)
{
sum+=distance(parent[i][j],parent[i][j+1]);
}
try{
cityfitness[i]=1/sum;
System.out.print("第"+(i+1)+"個 : ");
for(int j=0;j<citynum;j++)
System.out.print(parent[i][j]+",");
System.out.println(" "+cityfitness[i]);
}
catch(Exception ex)
{
ex.printStackTrace();
}
sum=0.0;
}
return cityfitness;
}
//x,y為城市的序號,此函數計算x,y之間的距離
public double distance(int x,int y)
{
double result=0.0;
result+=(city[x][0]-city[y][0])*(city[x][0]-city[y][0])+(city[x][1]-city[y][1])*(city[x][1]-city[y][1]);
return Math.sqrt(result);
}
public static void main(String args[]){
TSP_g test1=new TSP_g();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -