SA_TSA.java
上传用户:fstxyy
上传日期:2018-01-04
资源大小:11k
文件大小:13k
源码类别:

DNA

开发平台:

Java

  1. import java.lang.*;
  2. import java.io.*;
  3. import java.util.*;
  4. /**
  5. *class SA_TSA.java
  6. * author: nt
  7. * data: 2006-3-22
  8. *51 city
  9. * mini=result_______________: 11.180339887498949
  10. */
  11. public class SA_TSA
  12. {
  13. //the city 
  14. //String[][] map;
  15. private static double T=1000.0; //init the T
  16. private static final double CONTROL_T=0.995; //change the T
  17. private static final double T_e=0.01; //control the T
  18. private static final int CYCLE_NUMBER=560;  //search length
  19. private static final int CITY_NUMBER=51;  //city number
  20. private static CityMap[] citymap=new CityMap[CITY_NUMBER]; //city position
  21. public static void main(String args[])
  22. {
  23. SA_TSA tsa=new SA_TSA();
  24. // tsa.init(); 
  25. CityMap[] _citymap=new CityMap[CITY_NUMBER];
  26. CityMap[] temp_citymap=new CityMap[CITY_NUMBER];
  27. for (int init=0;init< CITY_NUMBER;init++ )
  28. {
  29. _citymap[init]=new CityMap();
  30. temp_citymap[init]=new CityMap();
  31. }
  32. getTime();
  33. System.out.println("开始初始化路径:....");
  34. _citymap=copy(citymap);
  35. for (int cyc=0;cyc<50;cyc++)
  36. {
  37. _citymap=getRoute(_citymap);
  38. }
  39. _citymap=tsa.getFirstRoute(_citymap);
  40. //get time
  41. System.out.println("初始化路径结束!");
  42. setcitymap(_citymap);
  43. System.out.println("初始路径长度"+": "+getRouteValue(citymap));
  44. getTime();
  45. Date begin=new Date();
  46. //
  47. //setcitymap(_citymap);
  48. //showMap(citymap);
  49. temp_citymap=tsa.settempcitymap(citymap);
  50. boolean terminate=false;
  51. /*
  52. _citymap=tsa.getRoute(citymap);
  53. System.out.println("__________第一次变换______________");
  54. //showMap(citymap);
  55. double way_value=getRouteValue(_citymap);
  56. double delta_v=way_value-routeValue;
  57. System.out.println("delta_v:"+delta_v);
  58. System.out.println("old_Value:"+routeValue);
  59. System.out.println("new_value:"+way_value);
  60. //System.out.println("random_d:"+random_d);
  61. */
  62. System.out.println("正在查找最优路径:....");
  63. double newvalue,oldValue,delta_v;
  64. while (T>T_e)
  65. {
  66. int cycle=0;
  67. //System.out.println("_______ldfkgdlfkg_______: ");
  68. //_citymap=tsa.getRoute(_citymap);
  69. //showMap(_citymap);
  70. //System.out.println("routeValue____2: "+getRouteValue(_citymap));
  71. _citymap=tsa.getRoute(citymap);
  72. do
  73. {
  74. //_citymap=tsa.getRoute(citymap);
  75. //System.out.println("routeValue____"+cycle+"_: "+tsa.getRouteValue(citymap));
  76. //System.out.println("T ____"+T);
  77. //System.out.println("查找过程"+cycle+": "+getRouteValue(_citymap));
  78. oldValue=getRouteValue(citymap);
  79. newvalue=getRouteValue(_citymap);
  80. delta_v=newvalue-oldValue;
  81. //System.out.println("old____"+cycle+"_: "+routeValue);
  82. //System.out.println("new____"+cycle+"_: "+way_value);
  83. //System.out.println("delta_v____"+cycle+"_: "+delta_v);
  84. if (delta_v <0)
  85. {
  86. //System.out.println("T _______________"+T);
  87. setcitymap(_citymap);
  88. _citymap=tsa.getRoute(citymap);
  89. }
  90. else
  91. {
  92. double random_d=tsa.getRandomDouble();
  93. double delta_e=get_exp(-delta_v);
  94. // System.out.println("delta_v:"+delta_v);
  95. ////
  96. // System.out.println("delta_e:"+delta_e);
  97. // System.out.println("random_d:"+random_d);
  98. //if (delta_e>random_d)
  99. if (delta_e>random_d)
  100. {
  101. setcitymap(_citymap);
  102. //System.out.println("________^^^^^^^______________");
  103. }
  104. _citymap=tsa.getRoute(citymap);
  105. }//if (delta_v<0)
  106. cycle++;
  107. //
  108. }
  109. while (cycle<CYCLE_NUMBER);
  110. double old_=tsa.getRouteValue(temp_citymap);
  111. double new_=getRouteValue(citymap);
  112. if (new_<old_)
  113. {
  114. // if (old_/new_ <1.00000001)
  115. // {
  116. // //terminate=true;
  117. // T=newT(T);
  118. // }
  119. // else
  120. // {
  121. // temp_citymap=settempcitymap(citymap);
  122. // T=newT(T);
  123. // }
  124. temp_citymap=settempcitymap(citymap);
  125. T=newT(T);
  126. System.out.println("change:"+new_);
  127. }
  128. else
  129. {
  130. T=newT(T);
  131. }
  132. // if (T<=T_e)
  133. // {
  134. // terminate=true;
  135. // }
  136. }/**/
  137. System.out.println("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
  138. //System.out.println("||||||||||||||||||||||||||||||");
  139. Date end=new Date();
  140. System.out.println("查找结果:");
  141. System.out.println("最优路径长度"+": "+getRouteValue(temp_citymap));
  142. //getTime();
  143. long waste=end.getTime() - begin.getTime();
  144. System.out.println("耗时: " +waste/1000+" 秒!");
  145. //showMap(temp_citymap);
  146. //showMap(citymap);
  147. }//main over
  148. /**
  149. *constrator: 
  150. */
  151. public SA_TSA()
  152. {
  153. try
  154. {
  155. init();
  156. }
  157. catch (IOException e)
  158. {
  159. System.out.println(e.toString());
  160. }
  161. }
  162. /**
  163. *method: initialize city map
  164. */
  165. private static void init()throws IOException
  166. {
  167. //init the citymap based on the array.txt
  168. int n;//the city number
  169. n=getCityNumber();
  170. //System.err.println("_____________"+n+"_____________");
  171. if (n!=CITY_NUMBER)
  172. {
  173. throw new NotEqulalException("city number shouder be equal the varial "CITY_NUMBER" you declare"+n);
  174. }
  175. String[] _city=getCityString();
  176. for (int i=0;i<n;i++)
  177. {
  178. citymap[i]=new CityMap(_city[i]);
  179. }
  180. }
  181. /**
  182. *method:getCityNumber
  183. *param: null
  184. *return: int the number of the citytxt file
  185. */
  186. private static int getCityNumber() throws IOException
  187. {
  188. BufferedReader br=new BufferedReader(new FileReader("array.txt"));
  189. int n=0;
  190. String Str_="";
  191. while ((Str_=br.readLine()) != null) 
  192.         {
  193. n++;
  194. }
  195. return n;
  196. }
  197. /**
  198. *method: getCityString
  199. *param: null
  200. *return String[]
  201. */
  202. private static String[] getCityString()throws IOException
  203. {
  204. //
  205. BufferedReader br=new BufferedReader(new FileReader("array.txt"));
  206. String Str="";
  207. String Str_="";
  208. char regx=';';
  209. int n=0;
  210. while ((Str_=br.readLine()) != null) 
  211.         {
  212. n++;
  213. Str+=Str_;
  214. Str+=regx;
  215. }
  216. Str=removeLastRegx(Str);
  217. //get the line to a array[]
  218. String[] _array=new String[n];
  219. _array=splitString(Str,(int)regx);
  220. return _array;
  221. }
  222. /**
  223. *method: splitString
  224. *param: args the string to split
  225. *param: c the char you want to match
  226. *return:  a array 
  227. */
  228. public static String[] splitString(String arg,int c)
  229. {
  230. String[] _array=new String[CITY_NUMBER];
  231. int cc=0;
  232. //System.out.println(arg.indexOf(c));
  233. while(arg.indexOf(c)!=-1)
  234.         {
  235. _array[cc]=arg.substring(0,arg.indexOf(c));
  236. arg=arg.substring(arg.indexOf(c)+1,arg.length());
  237. cc++;
  238.         }
  239. _array[cc]=arg;
  240.      return _array;
  241. }
  242. /**
  243. *method: cut the last char form the String
  244. */
  245. public static String removeLastRegx(String args)
  246. {
  247. //return args.substring(0,args.length()-1);
  248. if (args!=null)
  249. {
  250. return args.substring(0,args.length()-1);
  251. }
  252. else
  253. {
  254. return args;
  255. }
  256. }
  257. /**
  258. *method: getFirstRoute
  259. *param: CityMap
  260. *return: CityMap
  261. */
  262. private static CityMap[] getFirstRoute(CityMap[] cm)
  263. {
  264. //
  265. return getRoute(cm); 
  266. }
  267. /**
  268. *method: newT
  269. *param: double T
  270. *return: double a lower T
  271. */
  272. private static double newT(double t)
  273. {
  274. return t*CONTROL_T;
  275. }
  276. /**
  277. *method: get_exp
  278. *param: double_________________________________________________________________________-
  279. *return: double
  280. */
  281. private static double get_exp(double del)
  282. {
  283. //
  284. //System.out.println("Math.E"+Math.E);
  285. //System.out.println("del/T"+del/T);
  286. return Math.pow(Math.E,100*del/T);
  287. }
  288. /**
  289. *method: showMap(citymap)
  290. *param: CityMap[]
  291. *return: void
  292. */
  293. private static void showMap(CityMap[] cm)
  294. {
  295. System.out.println("the city map is:n______start________");
  296. int n=CITY_NUMBER;
  297. int count=0;
  298. for (int i=0;i<n;i++)
  299. {
  300. if (count % 18==0)
  301. {
  302. System.out.print("n");
  303. }
  304. count++;
  305. //System.out.print("--"+cm[i].getcity()+"("+cm[i].getxpos()+", "+cm[i].getypos()+")");
  306. System.out.print("--"+cm[i].getcity());
  307. }
  308. System.out.println("n_______end_________");
  309. }
  310. /**
  311. *method:getRandomInt
  312. */
  313. private static int getRandomInt()
  314. {
  315. Random random1 = new Random();
  316. return 1+(int)(Math.abs(random1.nextDouble())*(CITY_NUMBER-1))%(CITY_NUMBER-1);
  317. }
  318. /**
  319. *method: getRandomDouble()
  320. */
  321. private static double getRandomDouble()
  322. {
  323. Random random1 = new Random();
  324. return Math.abs(random1.nextDouble());
  325. }
  326. /**
  327. *method:getRouteValue()
  328. *param:
  329. *return: double
  330. */
  331. private static double getRouteValue()
  332. {
  333. CityMap[] cm=new CityMap[CITY_NUMBER];
  334. cm=copy(citymap);
  335. double routevalue=0.0;
  336. double px,py,qx,qy;
  337. for (int i=0;i<CITY_NUMBER-1;i++)
  338. {
  339. px=cm[i].getxpos();
  340. py=cm[i].getypos();
  341. qx=cm[i+1].getxpos();
  342. qy=cm[i+1].getypos();
  343. routevalue+=Math.pow((Math.pow(qx-px,2.0)+Math.pow(qy-py,2.0)),0.5);
  344. }
  345. double first_end;
  346. px=cm[0].getxpos();
  347. py=cm[0].getypos();
  348. qx=cm[CITY_NUMBER-1].getxpos();
  349. qy=cm[CITY_NUMBER-1].getypos();
  350. first_end=Math.pow((Math.pow(qx-px,2.0)+Math.pow(qy-py,2.0)),0.5);
  351. return routevalue+first_end;
  352. }
  353. /**
  354. *method:getRouteValue()
  355. *param:
  356. *return: double
  357. */
  358. private static double getRouteValue(CityMap[] cm)
  359. {
  360. //CityMap[] cm=new CityMap[CITY_NUMBER];
  361. //cm=citymap;
  362. double routevalue=0.0;
  363. double px,py,qx,qy;
  364. for (int i=0;i<CITY_NUMBER-1;i++)
  365. {
  366. px=cm[i].getxpos();
  367. py=cm[i].getypos();
  368. qx=cm[i+1].getxpos();
  369. qy=cm[i+1].getypos();
  370. routevalue+=Math.pow((Math.pow(qx-px,2.0)+Math.pow(qy-py,2.0)),0.5);
  371. // System.out.print("city_"+cm[i].getcity()+"   city_"+cm[i+1].getcity());
  372. // System.out.println("    "+(Math.pow((Math.pow(qx-px,2.0)+Math.pow(qy-py,2.0)),0.5)));
  373. //
  374. }
  375. double first_end;
  376. px=cm[0].getxpos();
  377. py=cm[0].getypos();
  378. qx=cm[CITY_NUMBER-1].getxpos();
  379. qy=cm[CITY_NUMBER-1].getypos();
  380. first_end=Math.pow((Math.pow(qx-px,2.0)+Math.pow(qy-py,2.0)),0.5);
  381. // System.out.print("city_"+cm[0].getcity()+"   city_"+cm[CITY_NUMBER-1].getcity());
  382. // System.out.println("    "+(Math.pow((Math.pow(qx-px,2.0)+Math.pow(qy-py,2.0)),0.5)));
  383. // System.out.println("_____________");
  384. return routevalue+first_end;
  385. }
  386. /**
  387. *method: setcitymap(CityMap[])
  388. *param:
  389. *return: void
  390. */
  391. private static void setcitymap(CityMap[] cm)
  392. {
  393. for (int i=0;i<CITY_NUMBER;i++)
  394. {
  395. citymap[i].setcity(cm[i].getcity());
  396. citymap[i].setxpos(cm[i].getxpos());
  397. citymap[i].setypos(cm[i].getypos());
  398. }
  399. }
  400. /**
  401. *method: settempcitymap(_citymap)
  402. *param:
  403. *return: void
  404. */
  405. private static CityMap[] settempcitymap(CityMap[] cm)
  406. {   
  407. CityMap[] c_m=new CityMap[CITY_NUMBER];
  408. for (int i=0;i<CITY_NUMBER;i++)
  409. {
  410. c_m[i]=new CityMap();
  411. c_m[i].setcity(cm[i].getcity());
  412. c_m[i].setxpos(cm[i].getxpos());
  413. c_m[i].setypos(cm[i].getypos());
  414. }
  415. return c_m;
  416. }
  417. /**
  418. *method: get time
  419. *param:
  420. *return: void
  421. */
  422. private static void getTime()
  423. {
  424. Date date = new Date(System.currentTimeMillis());
  425. String strdat="";
  426. strdat = date.toLocaleString();
  427. System.out.println("系统时间:"+strdat);
  428. }
  429. /**
  430. *method: copy a array
  431. */
  432. private static CityMap[] copy(CityMap[] cm)
  433. {
  434. CityMap[] c_m=new CityMap[CITY_NUMBER];
  435. for (int i=0;i<CITY_NUMBER;i++)
  436. {
  437. c_m[i]=new CityMap();
  438. c_m[i].setcity(cm[i].getcity());
  439. c_m[i].setxpos(cm[i].getxpos());
  440. c_m[i].setypos(cm[i].getypos());
  441. }
  442. return c_m;
  443. }
  444. /**
  445. *method: get another citymap from now citymap
  446. *param:  CityMap[]
  447. *return:  CityMap[]
  448. *change: 2006-3-27
  449. */
  450. private static CityMap[] getRoute(CityMap[] cmap)
  451. {
  452. CityMap[] cm=new CityMap[CITY_NUMBER];
  453. cm=copy(cmap);
  454. int n,m;
  455. n=getRandomInt();
  456. m=getRandomInt();
  457. //System.out.println("m=:"+m);
  458. //System.out.println("n=:"+n);
  459. while(m==n)
  460. {
  461. n=getRandomInt();
  462. m=getRandomInt();
  463. }
  464. //System.out.print("m=:"+m);
  465. //System.out.println("  n=:"+n);
  466. //CityMap[] _cm=new CityMap[CITY_NUMBER];
  467. //_cm=swap(cm);
  468. //System.out.print("m:"+m+" n:"+n);
  469. String TEMP_pc=cm[m].getcity();
  470. double TEMP_px=cm[m].getxpos();
  471. double TEMP_py=cm[m].getypos();
  472. cm[m].setcity(cm[n].getcity());
  473. cm[m].setxpos(cm[n].getxpos());
  474. cm[m].setypos(cm[n].getypos());
  475. cm[n].setcity(TEMP_pc);
  476. cm[n].setxpos(TEMP_px);
  477. cm[n].setypos(TEMP_py);
  478. return cm;
  479. }
  480. /**
  481. *method: get another citymap from now citymap
  482. *param:  CityMap[]
  483. *return:  CityMap[]
  484. *change: 2006-3-27 add
  485. */
  486. private static CityMap[] getRoute_(CityMap[] cmap)
  487. {
  488. CityMap[] cm=new CityMap[CITY_NUMBER];
  489. cm=copy(cmap);
  490. int a,b,c;
  491. a=getRandomInt();
  492. b=getRandomInt();
  493. c=getRandomInt();
  494. System.out.println("a=:"+a);
  495. System.out.println("b=:"+b);
  496. System.out.println("c=:"+c);
  497. while(a==b||a==c||b==c)
  498. {
  499. a=getRandomInt();
  500. b=getRandomInt();
  501. c=getRandomInt();
  502. }
  503. //System.out.print("m=:"+m);
  504. //System.out.println("  n=:"+n);
  505. //CityMap[] _cm=new CityMap[CITY_NUMBER];
  506. //_cm=swap(cm);
  507. //System.out.print("m:"+m+" n:"+n);
  508. String TEMP_pc=cm[a].getcity();
  509. double TEMP_px=cm[a].getxpos();
  510. double TEMP_py=cm[a].getypos();
  511. cm[a].setcity(cm[b].getcity());
  512. cm[a].setxpos(cm[b].getxpos());
  513. cm[a].setypos(cm[b].getypos());
  514. cm[b].setcity(cm[c].getcity());
  515. cm[b].setxpos(cm[c].getxpos());
  516. cm[b].setypos(cm[c].getypos());
  517. cm[c].setcity(TEMP_pc);
  518. cm[c].setxpos(TEMP_px);
  519. cm[c].setypos(TEMP_py);
  520. return cm;
  521. }
  522. };