北京地下鉄路線計画
12176 ワード
一.プロジェクト紹介GitHubリンク:https://github.com/zhangyahui-0902/Subway コアアルゴリズム:Dijkstraアルゴリズム編纂言語:java需要分析:1.map subway.txt地下鉄路線情報2-a 1号線を路線名ですべてのサイト情報を取得する-o station.txtはこのテキストファイルに情報を書いて、3.bリンゴ園八宝山は両サイトを通じて最も短絡径-o rを獲得します。outine.txtは通過するサイトをこの文書ファイルに書く作業:1.subway.txtの情報を読み取り、それぞれのサイトの名前、所属回線、隣接サイトをそれぞれの回線に格納し、各回線も格納する。2.入力された回線名によって出力する。出発駅と終了サイトが存在するかどうかを調べる。出発駅と終了駅が同じかどうかなどの異常状況の処理
独立に完成できない原因:出発駅と終了駅を入力して、習ったディジ・ステラアルゴリズムに基づいて修正したいですが、もともと学んだのはマトリックス形式で記憶しています。長い間考えていますが、マトリックス形式をリスト形式に変えて最短パス計算法を完成することができませんでした。結局はアルゴリズムとlistに対する認識が足りないです。ファイル導入方式はsubway.txtフォーマットを設計します。
独立に完成できない原因:出発駅と終了駅を入力して、習ったディジ・ステラアルゴリズムに基づいて修正したいですが、もともと学んだのはマトリックス形式で記憶しています。長い間考えていますが、マトリックス形式をリスト形式に変えて最短パス計算法を完成することができませんでした。結局はアルゴリズムとlistに対する認識が足りないです。ファイル導入方式はsubway.txtフォーマットを設計します。
1
...
java読み取り方式1.パスを通してファイルを作成します。このファイルが存在しない場合、入力形式が正しくないと出力ファイルが正しくありません。2.存在する場合は、ファイルを通じてバイトを文字ストリームに流し、文字入力ストリームからテキストを読み出してバッファ文字にします。二重forループを通して、第一重forループはライン数を基準にして、1行目の完全なラインを読んで、ラインを文字列配列に格納します。文字列配列の最初のものがライン名です。サイト情報を専門に記憶するリストを設定します。第二重forループは、文字列配列を巡回することによって、サイトの名前をサイトに格納し、サイトはリストに格納され、並べられた第二重forループは、ラインの大きさによって、各サイトの隣接局をサイトに格納し、サイトはリストに格納し、最後にラインをhashMapに格納する。File file=new File(path);
if(file.exists()) {
FileInputStream fl = new FileInputStream(file);
InputStreamReader br=new InputStreamReader(fl,"UTF-8");
BufferedReader reader=new BufferedReader(br);
String content="";
for(int i=0;i<22;i++) {
content=reader.readLine();
String[] lineArr=content.split(" ");
List line=new ArrayList();
String linename=lineArr[0];
for(int j=1;j linkedStations=line.get(j).getLinkStations();
if (j == 0) {
linkedStations.add(line.get(j + 1));
line.get(j).setLinkStations(linkedStations);
} else if (j == (line.size()-1) ) {
linkedStations.add(line.get(j - 1));
line.get(j).setLinkStations(linkedStations);
}else {
linkedStations.add(line.get(j+1));
linkedStations.add(line.get(j-1));
line.get(j).setLinkStations(linkedStations);
}
}
lineSet.add(line);
}
reader.close();
}
else
System.out.println(" ");
}
三.記憶構造設計局構造public class Station {
private String name;
private String line;
private List linkStations=new ArrayList<>();
}
回線構造public class Routine {
private Station begin;
private Station end;
private int distance=0;
private List passStations=new ArrayList<>();
}
四.最短経路1.analsis Listは、サイトresultMapを記憶するために使用され、サイトとラインgetLink Stations方法を使用して、任意のサイトの隣接サイトリストget NextStation()方法で距離が一番小さい局を見つけるために使用されます。まず、開始局がanlysis Listリストに格納されているかどうかを判断します。存在しない場合は追加します。resultMapが空であるかどうかを判断し、もし空であれば、開始局を通じて隣接局のリストを得て、リストの中のサイトを巡回し、回線中の開始局、終了局、距離、隣接局を設定し、このサイトと回線をresultMapに格納する。最小距離のサイトparentを見つけて、parentを通じて、隣のサイトのリストを見つけて、リストの中のサイトを巡回して、新しくparentを通じて通ったサイトリストを作成して、サイトを通じて線を見つけて、この線の上の距離、経由するサイトを設定して、サイトとそのサイトの線をresultMapに保存します。巡回終了後、parentをanalysListに存在させ、再帰的にプログラムを実行し、最後に終了局で得られた回線に戻る。if (!analysisList.contains(star)) {
analysisList.add(star);
}
if (resultMap.isEmpty()) {
List linkStations = getLinkStations(star);
for (Station station : linkStations) {
Routine routine = new Routine();
routine.setBegin(star);
routine.setEnd(station);
int distance = 1;
routine.setDistance(distance);
routine.getPassStations().add(station);
resultMap.put(station, routine);
}
}
Station parent = getNextStation();
if (parent == null) {
Routine routine = new Routine();
routine.setDistance(0);
routine.setBegin(star);
routine.setEnd(end);
return resultMap.put(end, routine);
}
if (parent.equals(end)) {
return resultMap.get(parent);
}
List childLinkStations = getLinkStations(parent);
for (Station child : childLinkStations) {
if (analysisList.contains(child)) {
continue;
}
int distance = 1+resultMap.get(parent).getDistance();
if (parent.getName().equals(child.getName())) {
distance = 0;
}
List parentPassStations = resultMap.get(parent).getPassStations();
Routine childResult = resultMap.get(child);
if (childResult != null) {
if (childResult.getDistance() > distance) {
childResult.setDistance(distance);
childResult.getPassStations().clear();
childResult.getPassStations().addAll(parentPassStations);
childResult.getPassStations().add(child);
}
} else {
childResult = new Routine();
childResult.setDistance(distance);
childResult.setBegin(star);
childResult.setEnd(child);
childResult.getPassStations().addAll(parentPassStations);
childResult.getPassStations().add(child);
}
resultMap.put(child, childResult);
}
analysisList.add(parent);
shortest(star, end);
return resultMap.get(end);
五.入出力設計入力設計1.ファイル情報の読み取り-map subway.txt
2.回線名により、全線を取得する-a 1 -map subway.txt -o station.txt
3.出発駅と終了駅によって最短経路を得る-b -map subway.txt -o routine.txt
具体的な実現コード if(args.length==2&&args[0].equals("-map"))
Subway.Data(args[1]);
else if(args.length==6&&args[0].equals("-a")&&args[2].equals("-map")&&args[4].equals("-o")) {
Subway.Data(args[3]);
writeRoute(args[1],args[5]);// station.txt
}
else if(args.length==7&&args[0].equals("-b")&&args[3].equals("-map")&&args[5].equals("-o")){
Subway.Data(args[4]);
Result(args[1],args[2],args[6]);
// routine.txt
}
else {
System.out.println(" ");
}
出力設計は、ルート名に基づいて、ルート1を取得します。パスを通してファイルを作成し、サイト情報を保存します。2.すべてのサイトを巡回することによって、すべてのサイトの回線名が入力されたライン3を取得します。ラインを巡回することによって、そのライン上のサイト情報をテキストに書き込みます。 List route=null;
int flag=1;
File file=new File(path);
FileWriter fw =new FileWriter(file);;
for(List l:Subway.lineSet){
flag=1;
for(Station s:l) {
if(!s.getLine().equals(linename))
flag=0;
}
if(flag==1) {
route=l;
}
}
if(route==null) {
fw.write(" ");
fw.close();
}
else {
if(file.exists()&&file.isFile()) {
try {
fw.write(linename);
fw.write("\r
");
for(Station s:route) {
fw.write(s.getName());//
fw.write("\r
");
}
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
else
fw.write(" ");
fw.close();
}
試験例1.通常の状況の運転パラメータ-a 1 -map subway.txt -o station.txt
実行結果1
2.異常状況運転パラメータ(回線は存在しません)-a 2 -map subway.txt -o station.txt
実行結果
運転パラメータ(コマンドパラメータが不正)-a 1 -map subway.txt -m station.txt
実行結果
運転パラメータ(コマンドが不正です)-c 1 -map subway.txt -o station.txt
実行結果
二つのサイトから最短経路を取得する局1.サイト名を介して検索局が存在するかどうかは、同じであるかどうか2.存在しているかどうかを確認し、異なる場合は、最短ルート3を取得する。存在しないか、または同じでない場合は、対応する情報を出力する。File file=new File(path);
Station b;
Station o;
FileWriter fw;
try {
fw=new FileWriter(file);
Routine routine;
b=Dijkstra.findStation(begin,Subway.lineSet);
o=Dijkstra.find(end,Subway.lineSet);
if(o!=null&&b!=null&&!o.getName().equals(b.getName())) {
routine=Dijkstra.shortest(b,o);
if(routine!=null) {
if(b.getLinkStations().contains(o)) {
fw.write("-> "+b.getLine());
fw.write("\r
");
fw.write(b.getName());
fw.write("\r
");
fw.write(o.getName());
fw.close();
}
else {
fw.write("-> "+routine.getPassStations().get(1).getLine());
fw.write("\r
");
fw.write(b.getName());
fw.write("\r
");
for(int i=0;i "+routine.getPassStations().get(i+1).getLine());
fw.write("\r
");
}
}
fw.write(o.getName());
fw.write("\r
");
fw.write(" "+routine.getPassStations().size());
fw.close();
}
}else {
fw.write(" ");
fw.close();
}
}
else if(b==null) {
fw.write(" ");
fw.close();
}
else if(o==null) {
fw.write(" ");
fw.close();
}
else if(begin.equals(end)) {
fw.write(" ");
fw.close();
}
}
catch (IOException e) {
e.printStackTrace();
}
}
試験例の正常状況1.乗換1.1両駅の隣接運転パラメータは存在しません。-b -map subway.txt -o routine.txt
実行結果-> 1
1.2両局は隣接しない運転パラメータ(いずれもシングル局)-b -map subway.txt -o routine.txt
実行結果-> 1
6
運転パラメータ(全部乗り換え駅です)-b -map subway.txt -o routine.txt
実行結果-> 4
3
運転パラメータ(ワンストップ、乗り換え駅)-b -map subway.txt -o routine.txt
実行結果-> 4
3
2.乗り換え運転パラメータがあります。(全部単駅です。)-b -map subway.txt -o routine.txt
実行結果-> 4
-> 7
7
異常状況運転パラメータ-b -map subway.txt -o routine.txt
実行結果
運転パラメータ-b -map subway.txt -o routine.txt
実行結果
運転パラメータ-b -map subway.txt -o routine.txt
実行結果