資源簡介
本代碼為用Java實現的模擬退火求解旅行商問題,希望對大家有幫助

代碼片段和文件信息
/**
?*?實現Inter.java接口中的函數
?*?不要添加?package語句
?*/
import?java.util.*;
import?java.io.*;
public?class?Annealing?implements?Inter{
/**
?*?不要定義static?的變量
?*/
/*
?初始參數的確定
康立山等人的方法:
初始溫度t0=280;
?在每個溫度下采用固定的迭代次數,Lk=100n,n為城市數;
溫度的衰減系數=0.92,即tk+1=0.92×tk;
算法的停止準則為:當相鄰兩個溫度得到的解無任何變化時算法停止。*/
class?city{
public?String?name;
public?double?x;
public?double?y;
public?city(String?s)
{
String[]?tmp?=?s.split(“\\s+“);
name?=?tmp[0];
x?=?Double.parseDouble(tmp[1]);
y?=?Double.parseDouble(tmp[2]);
}
}
Vector?vec?=?new?Vector();
int?n??=?0;
int?num?=?0;
public?void?getStrategy(String?inputFile){
try{
File?f?=?new?File(inputFile);
FileReader?fr?=?new?FileReader(f);
BufferedReader?br?=?new?BufferedReader(fr);
String?line?=?br.readLine();
n?=?Integer.parseInt(line);
while((line?=?br.readLine())?!=?null)
{
vec.add(new?city(line));
}
}catch?(IOException?e)?{
//?TODO?Auto-generated?catch?block
e.printStackTrace();
}
int?route1[]?=?new?int[n];
int?route2[]?=?new?int[n];
double?t?=?2;
double?best;
int?a[]?=?new?int[n];
for(int?i?=?0;i? {
a[i]?=?i;
}
double?f??=?getValue(a);
best?=?f;
while(t?>=?0.001)
{
for(int?i?=?0;i?10*n;i?++)
{
int?aa[]?=?getPath(a);
double?ff?=?getValue(aa);
if(ff? {
num?++;
f?=?ff;
a?=?aa;
route1?=?a;
if(best?>?f)
{
best?=?f;
route2?=?a;
}
}
if(ff?>=?f?)
{
double?db?=?Math.exp(-1*(ff-f)/t);
if?(db?>?Math.random())
{
num?++;
f?=?ff;
a?=?aa;
route1?=?a;
}
}
}
t?*=?0.95;
}
System.out.print(“(“);
for(int?i?=?0;i? System.out.print(vec.get(route1[i]).name?+?““);
System.out.println(vec.get(route1[n-1]).name?+?“)?“+f);
System.out.print(“(“);
for(int?i?=?0;i? System.out.print(vec.get(route2[i]).name?+?““);
System.out.println(vec.get(route2[n-1]).name?+?“)?“?+?best);
System.out.println(num);
}
public?int[]?getPath(int?a[])
{
int?s?=?a.length;
int?b[]?=?new?int[s];
Random?r?=?new?Random();
int?x?=?r.nextInt(10);
int?y?=??r.nextInt(10);
while(y?==?x)
y?=?r.nextInt(10);
if(x? int?k?=?0;
for(int?i?=?0;i? {
if(i? b[i]?=?a[i];
else?if(i?>?y)
b[i]?=?a[i];
else?{
b[i]?=?a[y?-?k];
k++;
}
}
}
else?{
int?yy?=?yk?=?1;
for(int?i?=?0;i? {
if(i?<=?yy)
{
b[i]?=?a[y];
y?--?;
}
else?if(i?>=?x)
{
b[i]?=?a[s-k];
k?++;
}
else
b[i]?=?a[i];
}
}
if(Arrays.equals(a?b))
return?getPath(a);
else
return?b;
}
public?double?getValue(int?a[])
{
double?length?=?0;
int?k?=?a.length?-?1;
for(int?i?=?0;i? {
double?tmp
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????3493??2009-12-15?10:49??模擬退火\Annealing.java
?????文件????????152??2009-12-08?23:34??模擬退火\Inter.java
?????文件????????287??2009-12-15?10:33??模擬退火\Test.java
?????文件??????26112??2010-05-26?20:13??模擬退火\說明.doc
?????目錄??????????0??2010-05-26?20:13??模擬退火
-----------?---------??----------?-----??----
????????????????30044????????????????????5
評論
共有 條評論