Copy kode kodenya sebagai berikut:
import java.util.*;
kelas publik Sdt {
private String cityName[]={"Beijing", "Shanghai", "Tianjin", "Chongqing", "Harbin", "Changchun", "Shenyang", "Hohhot", "Shijiazhuang", "Taiyuan", "Jinan" ,"Zhengzhou", "Xi'an", "Lanzhou", "Yinchuan", "Xining", "Urumqi", "Hefei", "Nanjing", "Hangzhou", "Changsha", "Nanchang", "Wuhan" ," Chengdu", "Guizhou", "Fujian", "Taipei", "Guangzhou", "Haikou", "Nanning", "Kunming", "Lhasa", "Hong Kong", "Macau"};
//String pribadi cityEnd[]=String baru[34];
private int cityNum=cityName.length;//Jumlah kota
private int popSize = 50; //Ukuran populasi
private int maxgens = 20000; //Jumlah iterasi
pxover ganda pribadi = 0,8; //probabilitas crossover
pmulasi ganda pribadi = 0,05; //probabilitas mutasi
pribadi panjang[][] jarak = new long[cityNum][cityNum];
private int range = 2000; //Rentang array digunakan untuk menentukan kapan harus berhenti
genotipe kelas privat {
int city[] = new int[cityNum]; //Urutan kota dari satu gen
kebugaran jangka panjang; //Kebugaran gen ini
pilih gandaP; //probabilitas pemilihan
pengecualian ganda; //probabilitas yang diharapkan
int isSelected; //Apakah dipilih
}
genotipe pribadi[] kota = genotipe baru[ukuran pop];
/**
* Konstruktor, inisialisasi populasi
*/
sdt publik() {
untuk (int i = 0; i < Ukuran pop; i++) {
kota[i] = genotipe baru();
int[] angka = int baru[nomor kota];
untuk (int j = 0; j <Nomor kota; j++)
angka[j] = j;
int temp = angka kota;
untuk (int j = 0; j < Jumlah kota; j++) {
int r = (int) (Matematika.acak() * suhu);
kota[i].kota[j] = angka[r];
angka[r] = angka[suhu - 1];
suhu--;
}
kota[i].kebugaran = 0;
kota[i].pilihP = 0;
kota[i].kecualip = 0;
kota[i].isSelected = 0;
}
initDistance();
}
/**
* Hitung kebugaran, probabilitas seleksi, probabilitas yang diharapkan, dan apakah dipilih untuk setiap individu genetik di setiap populasi.
*/
kekosongan publik CalAll(){
untuk(int i = 0; i< Ukuran pop; i++){
kota[i].kebugaran = 0;
kota[i].pilihP = 0;
kota[i].kecualip = 0;
kota[i].isSelected = 0;
}
CalFitness();
CalSelectP();
CalExceptP();
CalIsSelected();
}
/**
* Isi, isi beberapa pilihan menjadi individu yang tidak dipilih
*/
ruang kosong publik(){
int terbaik = 0;
int buruk = 0;
sementara(benar){
while(kota[terbaik].dipilih <= 1 && terbaik<popSize-1)
terbaik++;
while(kota[buruk].isDipilih != 0 && buruk<popSize-1)
buruk++;
untuk(int i = 0; i< angka kota; i++)
kota[buruk].kota[i] = kota[terbaik].kota[i];
kota[terbaik].isSelected --;
kota[buruk].isSelected++;
buruk++;
if(terbaik == ukuran pop ||buruk == ukuran pop)
merusak;
}
}
/**
* Fungsi lintas subjek
*/
persilangan kekosongan publik() {
ke dalam x;
ke dalam kamu;
int pop = (int)(Ukuran pop* pxover /2);
sementara(pop>0){
x = (int)(Matematika.acak()*ukuran pop);
y = (int)(Matematika.acak()*ukuran pop);
mengeksekusiCrossover(x,y);//xy dua entitas mengeksekusi crossover
pop--;
}
}
/**
* Jalankan fungsi crossover
* @param individu x
* @param individu y
* Lakukan perpotongan kumpulan titik terbaik untuk individu x dan individu y untuk menghasilkan rangkaian kota generasi berikutnya
*/
kekosongan pribadi mengeksekusiCrossover(int x,int y){
int dimensi = 0;
untuk( int i = 0 ;i < jumlah kota; i++)
if(kota[x].kota[i] != kota[y].kota[i]){
dimensi++;
}
int diffItem = 0;
double[] diff = double[dimensi] baru;
untuk( int i = 0 ;i < jumlah kota; i++){
if(kota[x].kota[i] != kota[y].kota[i]){
diff[diffItem] = kota[x].kota[i];
kota[x].kota[i] = -1;
kota[y].kota[i] = -1;
diffItem++;
}
}
Array.sort(diff);
double[] temp = double[dimensi] baru;
suhu = gp(x, dimensi);
untuk(int k = 0; k< dimensi;k++)
untuk(int j = 0; j< dimensi; j++)
jika(suhu[j] == k){
item ganda = suhu[k];
suhu[k] = suhu[j];
suhu[j] = barang;
barang = perbedaan[k];
perbedaan[k] = perbedaan[j];
perbedaan[j] = barang;
}
int tempDimensi = dimensi;
int waktu = 0;
while(tempDimensi> 0 ){
if(kota[x].kota[tempi] == -1){
kota[x].kota[tempi] = (int)diff[dimensi - tempDimensi];
dimensi suhu --;
}
tempi++;
}
Array.sort(diff);
suhu = gp(y, dimensi);
untuk(int k = 0; k< dimensi;k++)
untuk(int j = 0; j< dimensi; j++)
jika(suhu[j] == k){
item ganda = suhu[k];
suhu[k] = suhu[j];
suhu[j] = barang;
barang = perbedaan[k];
perbedaan[k] = perbedaan[j];
perbedaan[j] = barang;
}
tempDimensi = dimensi;
suhu = 0;
while(tempDimensi> 0 ){
if(kota[y].kota[tempi] == -1){
kota[y].kota[tempi] = (int)diff[dimensi - tempDimensi];
dimensi suhu --;
}
tempi++;
}
}
/**
* @param individu individu
* @param dimensi dimensi
* @return Kumpulan titik terbaik (titik persimpangan yang digunakan untuk fungsi silang) digunakan dalam fungsi mengeksekusiCrossover()
*/
pribadi ganda[] gp(int individu, int dimensi){
double[] temp = double[dimensi] baru;
double[] temp1 = double[dimensi] baru;
int p = 2 * dimensi + 3;
while(!isSushu(p))
p++;
untuk(int i = 0; i< dimensi; i++){
temp[i] = 2*Math.cos(2*Math.PI*(i+1)/p) * (individu+1);
suhu[i] = suhu[i] - (int) suhu[i];
jika(suhu[i]<0)
suhu[i] = 1+suhu[i];
}
untuk(int i = 0; i< dimensi; i++)
suhu1[i] = suhu[i];
Array.sort(temp1);
//Menyortir
untuk(int i = 0; i< dimensi; i++)
untuk(int j = 0; j< dimensi; j++)
jika(temp[j]==temp1[i])
suhu[j] = saya;
suhu kembali;
}
/**
* Mutasi
*/
kekosongan publik bermutasi(){
acak ganda;
ke suhu;
int suhu1;
int suhu2;
untuk(int i = 0; i< Ukuran pop; i++){
acak = Matematika.acak();
if(acak<=pmultasi){
temp1 = (int)(Matematika.acak() * (angkakota));
temp2 = (int)(Matematika.acak() * (Nomor kota));
temp = kota[i].kota[temp1];
kota[i].kota[temp1] = kota[i].kota[temp2];
kota[i].kota[temp2] = suhu;
}
}
}
/**
* Cetak semua urutan kota dari aljabar saat ini dan parameter terkaitnya
*/
pencetakan kekosongan publik(){
/**
* Inisialisasi jarak antar kota
*/
kekosongan pribadi initDistance(){
untuk (int i = 0; i < jumlah kota; i++) {
untuk (int j = 0; j < jumlah kota; j++){
jarak[i][j] = Matematika.abs(ij);
}
}
}
/**
* Hitung kebugaran semua rangkaian kota
*/
kekosongan pribadi CalFitness() {
untuk (int i = 0; i < Ukuran pop; i++) {
untuk (int j = 0; j < angka kota - 1; j++)
kota[i].kebugaran += jarak[kota[i].kota[j]][kota[i].kota[j + 1]];
kota[i].kebugaran += jarak[kota[i].kota[0]][kota[i].kota[nomorkota - 1]];
}
}
/**
* Hitung probabilitas seleksi
*/
kekosongan pribadi CalSelectP(){
jumlah panjang = 0;
untuk(int i = 0; i< Ukuran pop; i++)
jumlah += kota[i].kebugaran;
untuk(int i = 0; i< Ukuran pop; i++)
kota[i].pilihP = (ganda)kota[i].kebugaran/jumlah;
}
/**
* Hitung probabilitas yang diharapkan
*/
kekosongan pribadi CalExceptP(){
untuk(int i = 0; i< Ukuran pop; i++)
kota[i].kecualip = (ganda)kota[i].pilihP * ukuran pop;
}
/**
* Hitung apakah rangkaian kotanya lebih baik, maka akan dipilih yang lebih baik dan masuk ke generasi selanjutnya
*/
kekosongan pribadi CalIsSelected(){
int perluPilih = ukuran pop;
untuk(int i = 0; i< Ukuran pop; i++)
if( kota[i].kecualip<1){
kota[i].isSelected++;
perluPilih --;
}
ganda[] temp = ganda baru[Ukuran pop];
untuk (int i = 0; i < Ukuran pop; i++) {
// temp[i] = kota[i].kecualip - (int) kota[i].kecualip;
// suhu[i] *= 10;
temp[i] = kota[i].kecualip*10;
}
ke dalam j = 0;
sementara (perluPilih != 0) {
untuk (int i = 0; i < Ukuran pop; i++) {
jika ((int) suhu[i] == j) {
kota[i].isSelected++;
perluPilih--;
jika (perluPilih == 0)
merusak;
}
}
j++;
}
}
/**
* @paramx
* @return berfungsi untuk menentukan apakah suatu bilangan prima
*/
boolean pribadi isSushu(int x){
jika(x<2) mengembalikan salah;
untuk(int i=2;i<=x/2;i++)
if(x%i==0&&x!=2) mengembalikan salah;
kembali benar;
}
/**
* @param x susunan
* @return Apakah nilai array x semuanya sama. Jika sama, berarti hasil optimal dari pembangkitan x.length adalah sama, dan algoritma berakhir
*/
boolean pribadi isSame(panjang[] x){
untuk(int i = 0; i< x.panjang -1; i++)
jika(x[i] !=x[i+1])
kembali salah;
kembali benar;
}
/**
* Cetak urutan jalur optimal untuk generasi apa pun
*/
kekosongan pribadi printBestRoute(){
CalAll();
suhu panjang = kota[0].kebugaran;
int indeks = 0;
untuk (int i = 1; i < Ukuran pop; i++) {
if(kota[i].kebugaran<temp){
temp = kota[i].kebugaran;
indeks = saya;
}
}
Sistem.keluar.println();
System.out.println("Urutan jalur terbaik:");
untuk (int j = 0; j <Nomor kota; j++)
{
String cityEnd[]={cityName[citys[index].city[j]]};
for(int m=0;m<cityEnd.length;m++)
{
Sistem.keluar.cetak(cityEnd[m] + " ");
}
}
//Sistem.keluar.cetak(kota[indeks].kota[j] + Namakota[kota[indeks].kota[j]] + " ");
//Sistem.keluar.cetak(Namakota[kota[indeks].kota[j]]);
Sistem.keluar.println();
}
/**
* Eksekusi algoritma
*/
menjalankan kekosongan publik(){
panjang[] hasil = panjang[jarak] baru;
//hasil diinisialisasi sehingga semua angka tidak sama
untuk(int i = 0; i< rentang; i++)
hasil[i] = saya;
int indeks = 0; //Posisi dalam array
int angka = 1; //generasi ke-num
sementara(maxgens>0){
System.out.println("----------------- generasi "+num+"-------------------- - ----");
CalAll();
mencetak();
bantalan();
persilangan();
mengubah();
maxgens --;
suhu panjang = kota[0].kebugaran;
untuk (int i = 1; i< ukuran pop; i++)
if(kota[i].kebugaran<temp){
temp = kota[i].kebugaran;
}
System.out.println("Solusi optimal: "+temp);
hasil[indeks] = suhu;
if(isSame(hasil))
merusak;
indeks++;
jika(indeks==kisaran)
indeks = 0;
nomor++;
}
printRute Terbaik();
}
/**
* @param waktu mulai
* @param b waktu berakhir
*/
public void CalTime(Kalender a,Kalender b){
panjang x = b.getTimeInMillis() - a.getTimeInMillis();
panjang y = x/1000;
x = x - 1000*kamu;
System.out.println("Waktu eksekusi algoritma: "+y+"."+x+" detik");
}
/**
* Pintu masuk program
*/
public static void main(String[] args) {
Kalender a = Kalender.getInstance(); //Waktu mulai
Sdt sdt = sdt baru();
sdt.jalankan();
Kalender b = Kalender.getInstance(); //Waktu berakhir
sdt.CalTime(a, b);
}
}