62,615
社区成员
发帖
与我相关
我的任务
分享
TS.java, change:2008-10-18,size:2190b
public 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:3816b
public 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;
}
}