TS.java, change:2008-10-18,size:2190bpublic class TS { 
final static int TS_SIZE = 10; 
final static int TS_ITERATIONS = 100000; 
 
Methord mthd_f; 
double targetFun; // 最优目标函数值 
 
double targetX[]; // 目标解 
String tsList[]; // 禁忌表 
int listPoint; 
 
// 初始化 
TS() { 
mthd_f = new TSP(); 
if (mthd_f.getLen() == 0)// 初始化 
mthd_f.init(); 
targetX = new double[mthd_f.getLen()]; 
tsList = new String[TS_SIZE]; 
listPoint = 0; 

 
/** 
 * 初始化 
 *  
 * @param nMthd 
 *            计算的目标 
 */ 
TS(Methord nMthd) { 
mthd_f = nMthd; 
if (mthd_f.getLen() == 0)// 初始化 
mthd_f.init(); 
targetX = new double[mthd_f.getLen()]; 
tsList = new String[TS_SIZE]; 
listPoint = 0; 

 
/** 
 * 更新禁忌表 
 */ 
void change() { 
tsList[listPoint] = mthd_f.getChange(); 
listPoint = (listPoint + 1) % TS_SIZE; 

 
/** 
 * 查找禁忌表 
 *  
 * @param strChange 
 *            需要查找的操作 
 * @return 如果是禁忌,则返回true,否则返回false 
 */ 
Boolean findTaboo(String strChange) { 
Boolean rslt = false; 
for (int i = 0; i  TS_SIZE; i++) { 
if (strChange.equalsIgnoreCase(tsList[i]) == true) { 
rslt = true; 
break; 


return rslt; 

 
// 打印输出结果 
public String toString() { 
String result = "\n==TS==> FBEST:" + targetFun + "\nAnd the BEST X is: "; 
for (int i = 0; i  mthd_f.getLen(); i++) { 
result += (" [" + i + "]=" + targetX[i]); 

return result; 

 
/** 
 * 主TS算法函数 
 */ 
public void ts() { 
targetFun = mthd_f.f(); 
mthd_f.getCopyX(targetX); 
 
double lastX[] = new double[mthd_f.getLen()]; 
mthd_f.getCopyX(lastX); 
double lastFun = mthd_f.f(); 
 
for (int i = 0; i  TS_ITERATIONS; i++) { 
mthd_f.getNextX(); 
double tmpFun = mthd_f.f(); 
 
if ( (tmpFun  lastFun && (findTaboo(mthd_f.getChange()) == false)) // 不在禁忌表内 
|| (tmpFun  targetFun)) { // 可以破禁 
if (tmpFun  targetFun) { // 更新最好解 
targetFun = tmpFun; 
mthd_f.getCopyX(targetX); 

change(); 
mthd_f.getCopyX(lastX); 
lastFun = tmpFun; 
} else { // 禁忌生效 
mthd_f.setX(lastX); 
// System.out.println("禁忌生效"); 



 

TSP.java, change:2008-11-28,size:3816bpublic class TSP implements Methord { 
final static int LEN = 2000; 
final static int MAX_ROAD = 15; 
final static int MIN_ROAD = 1; 
final static int CHANGE_LEN = 3; 
final static int CHANGE_I = 1; 
final static int CHANGE_J = 2; 
int tspX[]; 
double distance[][]; 
int s_i; 
int s_j; 
 
/** 
 * 交换下标为s_j的s_i的变量tspX的值产生新变量 
 */ 
private void swap() { 
int tmp = tspX[s_i]; 
tspX[s_i] = tspX[s_j]; 
tspX[s_j] = tmp; 

 
// private int toInt(String str){ 
// str.trim(); 
// int len = str.length(); 
// char ch[] = new char[len]; 
// ch = str.toCharArray(); 
// int result = 0; 
// for(int i=0;i<len;i++){ 
// if(ch[i]>'9'||ch[i]<'0'){ 
// result = 0; 
// break; 
// } 
// result = (result*10 + ch[i]-'0'); 
// } 
// return result; 
// } 
 
/** 
 * 生成一个介于minRand和maxRand之间的随机整数 >=minRand but <maxRand 
 * @param minRand 随机整数下界,可相等 
 * @param maxRand 随机整数上界,不等于 
 * @return 介于minRand和maxRand之间的随机整数  
 */ 
private int rand(int minRand, int maxRand) { 
return (int) (Math.random() * (maxRand - minRand) + minRand); 

 
@Override 
public double f() { 
// TODO Auto-generated method stub 
double result = 0; 
for (int i = 0; i  LEN; i++) { 
result += (tspX[i]  tspX[(i + 1) % LEN] ? distance[tspX[i]][tspX[(i + 1) 
% LEN]] 
: distance[tspX[(i + 1) % LEN]][tspX[i]]); 

return result; 

 
@Override 
public String getChange() { 
return (s_i>s_j) ? ("swap " + s_i + " and " + s_j): 
               ("swap " + s_j + " and " + s_i); 

 
@Override 
public void getCopyX(double[] x) { 
// TODO Auto-generated method stub 
for (int i = 0; i  LEN; i++) { 
x[i] = tspX[i]; 

 

 
@Override 
public int getLen() { 
// TODO Auto-generated method stub 
return LEN; 

 
@Override 
public void getNextX() { 
// TODO Auto-generated method stub 
s_i = rand(0, LEN); 
s_j = rand(0, LEN); 
while (s_j == s_i) { 
s_j = rand(0, LEN); 

swap(); 
 

 
@Override 
public void init() { 
// TODO Auto-generated method stub 
/* 
 * tspX = new int[LEN]; distance = new double[LEN][LEN]; int 
 * p[]={7,3,4,8,2,1,5,6}; int q[][]={{0,2,4,6,10,8,2,1}, 
 * {0,0,2,5,9,4,8,7}, {0,0,0,1,2,7,12,11}, {0,0,0,0,1,7,14,5}, 
 * {0,0,0,0,0,2,4,14}, {0,0,0,0,0,0,2,7}, {0,0,0,0,0,0,0,1}, 
 * {0,0,0,0,0,0,0,0}}; for(int i=0;i<LEN;i++){ tspX[i]=p[i]-1; for(int 
 * j=0;j<LEN;j++){ distance[i][j]=q[i][j]; } } 
 */ 
tspX = new int[LEN]; 
int flagX[] = new int[LEN]; 
distance = new double[LEN][LEN]; 
for (int i = 0; i  LEN; i++) { 
flagX[i] = 0; 

for (int i = 0; i  LEN; i++) { 
int t = rand(0, LEN); 
while (flagX[t] != 0) { 
t = rand(0, LEN); 

tspX[i] = t; 
flagX[t] = 1; 

for (int i = 0; i  LEN; i++) { 
for (int j = i + 1; j  LEN; j++) { 
distance[i][j] = rand(MIN_ROAD, MAX_ROAD); 



 
@Override 
public void setX(double[] x) { 
// TODO Auto-generated method stub 
for (int i = 0; i  LEN; i++) { 
tspX[i] = (int) x[i]; 


 
// @Override 
// public void setChange(String strChange) { 
// // TODO Auto-generated method stub 
// String strChanges[] = new String[CHANGE_LEN]; 
// strChanges = strChange.split(strChange,3); 
// s_i = toInt(strChanges[CHANGE_I]); 
// s_j = toInt(strChanges[CHANGE_J]); 
// } 
 
@Override 
public String toString() { 
String result; 
result = "X:"; 
for (int i = 0; i  LEN; i++) { 
result += (" [" + i + "]:" + tspX[i]); 

result += "\nDistance:\n"; 
for (int i = 0; i  LEN; i++) { 
result += ("[" + i + "]"); 
for (int j = 0; j  LEN; j++) { 
result += (" " + distance[i][j]); 

result += "\n"; 

result += " and F:"; 
result += f(); 
return result; 

 
} 代码比较长,问题有两个,
1,红色字体部分的Methord接口的定义在哪?没有定义它怎么能@override?
2,这两个.java怎么编译在一块?我用的是NetBeans IDE 7.2,直接放在源包里就行了吗?有了解的说下,或者说下在其他平台或环境下怎么编译也行。

解决方案 »

  1.   

    是这一句public class TSP implements Methord 
    我发现没标明红色,抱歉
      

  2.   

    第1个问题:没见到红色字,
    第2个问题:类代码前加一句 package aa;
    aa是文件的路径,程序所在目录有aa这个文件夹即可
      

  3.   

    看项目里是否有Methord这个类,或所用jar包里是否有
      

  4.   

    我是从这里下载的源代码http://www.pudn.com/downloads138/sourcecode/math/detail590988.html
      

  5.   

     你这个问题很纠结。。 你自己包里有没有 Methord你还不知道啊?
      

  6.   

    我给出下载网页的链接了,我只是想看看禁忌算法的java实现,顺便学习java的基础知识
      

  7.   

    他给的不是一个项目的文件包,就两个.java文件
      

  8.   

    大哥们快来,如何用PHP实现js中的escape结果,谢谢谢比如,在JS中用
    escape("http://www.baidu.com/?1234556");
    得到
    http%3A//www.baidu.com/%3F1234556求教,怎么在用PHP中把http://www.baidu.com/?1234556变成http%3A//www.baidu.com/%3F1234556
      

  9.   

    第三个问题:
    result += (" [" + i + "]:" + tspX[i]); 
    这行代码的数学表达式上的含义是什么?" [" + i + "]:"表示字符串“[i]”吗? 不是应该算出个数值吗?
      

  10.   

    java.lang.reflect 
    Class Method
    我搜索java Methord 发现了上述类,您所说的“所用jar包里是否有”是什么意思?小弟刚刚接触java对各种术语都还不是很了解,勿怪问题问得太傻瓜。您是否是说“package”“import”,我确实奇怪源代码里为什么没有这种东西,貌似一般的都有