다음과 같이 코드 코드를 복사합니다.
import java.util.*;
공개 클래스 Tsp {
private String cityName[]={"Beijing","Shanghai","Tianjin","Chongqing","Harbin","Changchun","Shenyang","Hohhot","Shijiazhuang","Taiyuan","Jinan" ,"정저우","시안","란저우","인촨","시닝","우루무치","허페이","난징","항저우","창사","난창","우한" ," 청두","구이저우","푸젠","타이베이","광저우","하이커우","난닝","쿤밍","라사","홍콩","마카오"};
//비공개 문자열 cityEnd[]=new String[34];
private int cityNum=cityName.length;//도시 수
private int popSize = 50; //인구 규모
private int maxgens = 20000; //반복 횟수
private double pxover = 0.8; //교차 확률
개인 이중 계산 = 0.05; //돌연변이 확률
private long[][] 거리 = 새로운 long[cityNum][cityNum];
private int range = 2000; //정지 시점을 결정하는 데 사용되는 배열 범위
개인 클래스 유전자형 {
int city[] = new int[cityNum] //단일 유전자의 도시 시퀀스
긴 적합성; //이 유전자의 적합성
double selectP; //선택 확률
double Exceptp; //예상 확률
int isSelected; //선택 여부
}
개인 유전자형[] 도시 = 새로운 유전자형[popSize];
/**
* 생성자, 모집단 초기화
*/
공개 Tsp() {
for (int i = 0; i < popSize; i++) {
도시[i] = 새로운 유전자형();
int[] num = 새로운 int[cityNum];
for(int j = 0; j < cityNum; j++)
숫자[j] = j;
int temp = cityNum;
for (int j = 0; j < cityNum; j++) {
int r = (int) (Math.random() * temp);
도시[i].city[j] = 숫자[r];
숫자[r] = 숫자[온도 - 1];
온도--;
}
도시[i].fitness = 0;
도시[i].selectP = 0;
도시[i].제외p = 0;
도시[i].isSelected = 0;
}
초기화거리();
}
/**
* 모집단 내 유전개체별로 적합도, 선택확률, 기대확률, 선택여부를 계산합니다.
*/
공공 무효 CalAll(){
for(int i = 0; i< popSize; i++){
도시[i].fitness = 0;
도시[i].selectP = 0;
도시[i].제외p = 0;
도시[i].isSelected = 0;
}
칼피트니스();
CalSelectP();
CalExceptP();
CalIsSelected();
}
/**
* 채우기, 선택되지 않은 개인으로 여러 선택 항목 채우기
*/
공개 무효 패드(){
int 최고 = 0;
int 불량 = 0;
동안(참){
while(citys[best].isSelected <= 1 && best<popSize-1)
최고++;
while(citys[bad].isSelected != 0 && bad<popSize-1)
나쁘다++;
for(int i = 0; i< cityNum; i++)
도시[나쁜].도시[i] = 도시[최고].도시[i];
도시[최고].isSelected --;
도시[나쁜].isSelected++;
나쁘다++;
if(최고 == popSize ||나쁨 == popSize)
부서지다;
}
}
/**
* 교차 주제 기능
*/
공개 무효 크로스오버() {
정수 x;
int y;
int pop = (int)(popSize* pxover /2);
동안(팝>0){
x = (int)(Math.random()*popSize);
y = (int)(Math.random()*popSize);
ExecuteCrossover(x,y);//xy 두 엔터티가 교차를 실행합니다.
팝--;
}
}
/**
* 크로스오버 기능 실행
* @param 개인 x
* @param 개인 y
* 개별 x와 개별 y에 대한 최적의 점 세트 교차를 수행하여 차세대 도시 시퀀스 생성
*/
개인 무효 실행 크로스오버(int x,int y){
정수 차원 = 0;
for( int i = 0 ;i < cityNum; i++)
if(citys[x].city[i] != 도시[y].city[i]){
차원++;
}
int diffItem = 0;
double[] diff = 새로운 double[차원];
for( int i = 0 ;i < cityNum; i++){
if(citys[x].city[i] != 도시[y].city[i]){
diff[diffItem] = 도시[x].city[i];
도시[x].도시[i] = -1;
도시[y].city[i] = -1;
diffItem++;
}
}
Arrays.sort(diff);
double[] 임시 = 새로운 double[dimension];
온도 = gp(x, 차원);
for(int k = 0; k< 차원;k++)
for(int j = 0; j< 차원; j++)
if(온도[j] == k){
이중 항목 = 온도[k];
온도[k] = 온도[j];
온도[j] = 항목;
항목 = 차이[k];
차이[k] = 차이[j];
diff[j] = 항목;
}
int tempDimension = 차원;
int 온도 = 0;
while(tempDimension> 0 ){
if(citys[x].city[tempi] == -1){
도시[x].city[tempi] = (int)diff[dimension - tempDimension];
임시차원 --;
}
템피++;
}
Arrays.sort(diff);
온도 = gp(y, 차원);
for(int k = 0; k< 차원;k++)
for(int j = 0; j< 차원; j++)
if(온도[j] == k){
이중 항목 = 온도[k];
온도[k] = 온도[j];
온도[j] = 항목;
항목 = 차이[k];
차이[k] = 차이[j];
diff[j] = 항목;
}
tempDimension = 차원;
온도 = 0;
while(tempDimension> 0 ){
if(citys[y].city[tempi] == -1){
도시[y].city[tempi] = (int)diff[dimension - tempDimension];
임시차원 --;
}
템피++;
}
}
/**
* @param 개인 개인
* @param 차원 차원
* @return 가장 좋은 점 집합(cross 함수에 사용되는 교차점)은 excuteCrossover() 함수에서 사용됩니다.
*/
private double[] gp(int 개별, int 차원){
double[] 임시 = 새로운 double[dimension];
double[] temp1 = 새로운 double[dimension];
int p = 2 * 차원 + 3;
동안(!isSushu(p))
p++;
for(int i = 0; i< 차원; i++){
temp[i] = 2*Math.cos(2*Math.PI*(i+1)/p) * (개별+1);
온도[i] = 온도[i] - (int)온도[i];
if(온도[i]<0)
온도[i] = 1+온도[i];
}
for(int i = 0; i< 차원; i++)
온도1[i] = 온도[i];
Arrays.sort(temp1);
//종류
for(int i = 0; i< 차원; i++)
for(int j = 0; j< 차원; j++)
if(온도[j]==온도1[i])
온도[j] = i;
복귀온도;
}
/**
* 돌연변이
*/
공개 무효 mutate(){
이중 무작위;
내부 온도;
int 임시1;
int 임시2;
for(int i = 0; i< popSize; i++){
무작위 = Math.random();
if(무작위<=순차화){
temp1 = (int)(Math.random() * (cityNum));
temp2 = (int)(Math.random() * (cityNum));
온도 = 도시[i].city[temp1];
도시[i].city[temp1] = 도시[i].city[temp2];
도시[i].city[temp2] = 온도;
}
}
}
/**
* 현재 대수학의 모든 도시 시퀀스 및 관련 매개변수를 인쇄합니다.
*/
공공 무효 인쇄(){
/**
* 도시 간 거리 초기화
*/
개인 무효 initDistance(){
for (int i = 0; i < cityNum; i++) {
for (int j = 0; j < cityNum; j++){
거리[i][j] = Math.abs(ij);
}
}
}
/**
* 모든 도시 시퀀스의 적합성을 계산합니다.
*/
개인 무효 CalFitness() {
for (int i = 0; i < popSize; i++) {
for (int j = 0; j < cityNum - 1; j++)
도시[i].fitness += 거리[citys[i].city[j]][citys[i].city[j + 1]];
도시[i].fitness += 거리[citys[i].city[0]][citys[i].city[cityNum - 1]];
}
}
/**
* 선택 확률 계산
*/
개인 무효 CalSelectP(){
장합 = 0;
for(int i = 0; i< popSize; i++)
합계 += 도시[i].fitness;
for(int i = 0; i< popSize; i++)
도시[i].selectP = (double)citys[i].fitness/sum;
}
/**
* 예상 확률 계산
*/
개인 무효 CalExceptP(){
for(int i = 0; i< popSize; i++)
도시[i].Exceptionp = (double)citys[i].selectP * popSize;
}
/**
* 도시 시퀀스가 더 나은지 계산하여 더 나은 도시 시퀀스를 선택하고 다음 세대에 진입합니다.
*/
개인 무효 CalIsSelected(){
int needSelecte = popSize;
for(int i = 0; i< popSize; i++)
if(도시[i].제외p<1){
도시[i].isSelected++;
필요선택 --;
}
double[] 임시 = 새로운 double[popSize];
for (int i = 0; i < popSize; i++) {
// 임시[i] = 도시[i].Exception - (int) 도시[i].Exception;
// 온도[i] *= 10;
임시[i] = 도시[i].제외p*10;
}
정수 j = 0;
동안(needSelecte != 0) {
for (int i = 0; i < popSize; i++) {
if ((int) temp[i] == j) {
도시[i].isSelected++;
needSelecte--;
if (needSelecte == 0)
부서지다;
}
}
j++;
}
}
/**
* @param x
* 숫자가 소수인지 확인하는 @return 함수
*/
개인 부울 isSushu(int x){
if(x<2)는 거짓을 반환합니다;
for(int i=2;i<=x/2;i++)
if(x%i==0&&x!=2) false를 반환합니다.
사실을 반환;
}
/**
* @param x 배열
* @return x 배열의 값이 모두 동일한지 여부. 동일하면 x.length 생성의 최적 결과가 동일하다는 의미이며, 알고리즘이 종료됩니다.
*/
개인 부울 isSame(long[] x){
for(int i = 0; i< x.length -1; i++)
if(x[i] !=x[i+1])
거짓을 반환;
사실을 반환;
}
/**
* 모든 세대에 대한 최적의 경로 순서를 인쇄합니다.
*/
개인 무효 printBestRoute(){
CalAll();
긴 온도 = 도시[0].fitness;
정수 인덱스 = 0;
for (int i = 1; i < popSize; i++) {
if(citys[i].fitness<temp){
온도 = 도시[i].fitness;
지수 = 나;
}
}
System.out.println();
System.out.println("최적의 경로 순서:");
for(int j = 0; j < cityNum; j++)
{
문자열 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();
}
/**
* 알고리즘 실행
*/
공개 무효 실행(){
long[] 결과 = 새로운 long[range];
//모든 숫자가 동일하지 않도록 결과가 초기화됩니다.
for(int i = 0; i< 범위; i++)
결과[i] = i;
int index = 0; //배열의 위치
int num = 1; //세대수
동안(maxgens>0){
System.out.println("------ "+num+" 생성--------- - ----");
CalAll();
인쇄();
인주();
크로스오버();
돌연변이();
맥스겐스 --;
긴 온도 = 도시[0].fitness;
for (int i = 1; i< popSize; i++)
if(citys[i].fitness<temp){
온도 = 도시[i].fitness;
}
System.out.println("최적의 솔루션: "+temp);
결과[색인] = 온도;
if(같음(결과))
부서지다;
인덱스++;
if(색인==범위)
인덱스 = 0;
숫자++;
}
printBestRoute();
}
/**
* @param 시작 시간
* @param b 종료 시간
*/
공개 무효 CalTime(캘린더 a,캘린더 b){
긴 x = b.getTimeInMillis() - a.getTimeInMillis();
긴 y = x/1000;
x = x - 1000*y;
System.out.println("알고리즘 실행 시간: "+y+"."+x+"초");
}
/**
* 프로그램 입학
*/
공개 정적 무효 메인(String[] args) {
Calendar a = Calendar.getInstance() //시작 시간
Tsp tsp = 새로운 Tsp();
tsp.run();
Calendar b = Calendar.getInstance() //종료 시간
tsp.CalTime(a, b);
}
}