1. 程式人生 > 實用技巧 >celery原理與使用

celery原理與使用

一、主要功能
根據一幅地鐵路線圖,計算指定兩站之間最短(最少經過站數)乘車路線;並輸出指定地鐵線路的所有站點。

以北京地鐵為例,地鐵線路資訊儲存在data.txt中,格式如下:
地鐵線路總數
線路名1 站名1 站名2 站名3 ...
線路名2 站名1 站名2 站名3 ...
txt文件輸入舉例:
1號線 蘋果園 古城 八角遊樂園 八寶山 玉泉路 五棵松 萬壽路 公主墳 軍事博物館 木樨路 南禮士路 復興門 西單 天安門西 天安門東 王府井 東單 建國門 永安裡 國貿 大望路 四惠 四惠東
2號線 西直門 積水潭 鼓樓大街 安定門 雍和宮 東直門 東四十條 朝陽門 建國門 北京站 崇文門 前門 和平門 宣武門 長椿街 復興門 阜成門 車公莊 西直門

二、實現語言
java
三、實現演算法
BFS演算法
四、程式碼實現
1、Station
`package subway;

import java.util.ArrayList;

public class Station {
private String StationName;/記錄站點名/
private int dist;
private Station PreStation;/前驅結點/
private ArrayList Station = new ArrayList();/該站點的所有線路資訊/
private ArrayList NearStation = new ArrayList();/該站點的所有鄰近站點資訊

/
2、Line
package subway;

import java.util.ArrayList;

public class Line {
String LineName;/記錄當前線路名/
ArrayList Station = new ArrayList<>();/記錄該線路中所有的站點名/
}
3、檔案讀取
public static void read() {
File file =new File("E:\地鐵線路資訊.txt");

	BufferedReader reader=null;
	reader=new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8"));//讀取檔案內容
	String op=reader.readLine();
	
	while(op!=null) {
	String[] s=(op.split(" "));
	Line line=new Line();
	line.setLineName(s[0]);
		for(int i=1;i<s.length;i++) {
			line.addStation(s[i]);
			int j;
			for(j=0;j<stations.size();j++) {
				if(stations.get(j).getStationName().equals(s[i])) {
					stations.get(j).addStation(line.getLineName());
					if(i!=1) {
						stations.get(j).addNearStation(lastStation);
						lastStation.addNearStation(stations.get(j));
					}
					lastStation=stations.get(j);
					break;
				}
			}
			if(j==stations.size()) {//車站不存在
				Station station=new Station();
				station.addStation(s[0]);
				station.setStationName(s[i]);
				station.setDist(MaxValue);
				if(i!=1) {
					station.addNearStation(lastStation);
					lastStation.addNearStation(station);
				}
				stations.add(station);
				lastStation=station;
			}
		}
		lines.add(line);
	}
}

4、BFS演算法部分
public static void BFS(Station station) {
Queue queStation=new LinkedList<>();
station.dist=0;
queStation.offer(station);

	while(!queStation.isEmpty()) {
		Station s=queStation.poll();
		for(int i=0;i<s.getNearStation().size();i++) {
			if(s.getNearStation().get(i).getDist()==MaxValue) {
				s.getNearStation().get(i).setDist(s.getDist()+1);
				queStation.offer(s.getNearStation().get(i));
				s.getNearStation().get(i).setPreStation(s);
			}
		}
	}
}

五、測試用例
1:同一線路起始站測試

2:換線起始站測試

3:不存在的起始站測試

4:起始站相同測試

5:查詢正常線路

6:查詢不存線上路

7:輸入12之外資料

六、總結
這次的作業本來使用Dijkstra(迪傑斯特拉演算法)來實現的,後來改用BFS演算法,主要是因為BFS程式碼簡單,使用遞迴操作完成查詢,
BFS演算法的弊端在於只能輸出一個最短路徑,而Dijkstra可以解決這個問題。
但是我覺得這次的作業的難點在於資料的讀取和輸出,而不是演算法的難易,這次作業也複習了一些資料結構的知識以及在探索過程中學習了關於hashmap的相關知識,還是有很大收穫的。