北京地铁出行规划

@[toc]

北京地铁出行规划

计划书

https://www.cnblogs.com/Zssss/p/11556392.html

源代码

https://github.com/zucc-Zs/Subway

代码思路

通过读取subway.txt文件,将各条线路上的站点都建立起来,当读取到相同站点名,就会判断为换乘站或者环形线路(即起点站与终点站相同),但是仍会再次保存。然后相邻站点之间路径设置为1,同一站点之间路径设为0,其他所有路径设置为max意味着,建立起一个矩阵,然后就是进行dijkstra算法,寻找最短路径。

思路详情:

1、subway.txt详情

1号线 苹果园 古城 八角游乐园 八宝山 玉泉路 五棵松 万寿路 公主坟 军事博物馆 木樨地 南礼士路 复兴门 西单 天安门西 天安门东 王府井 东单 建国门 永安里 国贸 大望路 四惠 四惠东
2号线 西直门 车公庄 阜成门 复兴门 长椿街 宣武门 和平门 前门 崇文门 北京站 建国门 朝阳门 东四十条 东直门 雍和宫 安定门 鼓楼大街 积水潭 西直门
4号线大兴线 安河桥北 北宫门 西苑 圆明园 北京大学东门 中关村 海淀黄庄 人民大学 魏公村 国家图书馆 动物园 西直门 新街口 平安里 西四 灵境胡同 西单 宣武门 菜市口 陶然亭 北京南站 马家堡 角门西 公益西桥 新宫 西红门 高米店北 高米店南 枣园 清源路 黄村西大街 黄村火车站 义和庄 生物医药基地 天宫院
5号线 宋家庄 刘家窑 蒲黄榆 天坛东门 磁器口 崇文门 东单 灯市口 东四 张自忠路 北新桥 雍和宫 和平里北街 和平西桥 惠新西街南口 惠新西街北口 大屯桥东 北苑路北 立水桥南 立水桥 天通苑南 天通苑 天通苑北
6号线 金安桥 杨庄 西黄村 廖公庄 田村 海淀五路居 慈寿寺 花园桥 白石桥南 车公庄西 车公庄 平安里 北海北 南锣鼓巷 东四 朝阳门 东大桥 呼家楼 金台路 十里堡 青年路 褡裢坡 黄渠 常营 草房 物资学院路 通州北关 北运河西 北运河东 郝家庄 东夏园 潞城
7号线 北京西站 湾子 达官营 广安门内 菜市口 虎坊街 珠市口 桥湾 磁器口 广渠门内 广渠门外 双井 九龙山 大郊亭 百子湾 化工 南楼梓庄 欢乐谷景区 垡头 双合 焦化厂
8号线 朱辛庄 育知路 平西府 回龙观东大街 霍营 育新 西小口 永泰庄 林萃桥 森林公园南门 奥林匹克公园 奥体中心 北土城 安华桥 安德里北街 鼓楼大街 什刹海 南锣鼓巷 中国美术馆
8号线南段 珠市口 天桥 永定门外 木樨园 海户屯 大红门南 和义 东高地 火箭万源 五福堂 德茂 瀛海
9号线 国家图书馆 白石桥南 白堆子 军事博物馆 北京西站 六里桥东 六里桥 七里庄 丰台东大街 丰台南路 科怡路 丰台科技园 郭公庄
10号线 劲松 双井 国贸 金台夕照 呼家楼 团结湖 农业展览馆 亮马桥 三元桥 太阳宫 芍药居 惠新西街南口 安贞门 北土城 健德门 牡丹园 西土城 知春路 知春里 海淀黄庄 苏州街 巴沟 火器营 长春桥 车道沟 慈寿寺 西钓鱼台 公主坟 莲花桥 六里桥 西局 泥洼 丰台站 首经贸 纪家庙 草桥 角门西 角门东 大红门 石榴庄 宋家庄 成寿寺 分钟寺 十里河 潘家园 劲松
13号线 西直门 大钟寺 知春路 五道口 上地 西二旗 龙泽 回龙观 霍营 立水桥 北苑 望京西 芍药居 光熙门 柳芳 东直门
14号线西段 张郭庄 园博园 大瓦窑 郭庄子 大井 七里庄 西局
14号线东段 善各庄 来广营 东湖渠 望京 阜通 望京南 将台 东风北桥 枣营 朝阳公园 金台路 大望路 九龙山 平乐园 北工大西门 十里河 方庄 蒲黄榆 景泰 永定门外 北京南站
15号线 清华东路西口 六道口 北沙滩 奥林匹克公园 安立路 大屯路东 关庄 望京西 望京 望京东 崔各庄 马泉营 孙河 国展 花梨坎 后沙峪 南沙信 石门 顺义 俸伯
16号线 北安河 温阳路 稻香湖路 屯佃 永丰 永丰南 西北旺 马连洼 农大南路 西苑
燕房线 燕山 房山城关 饶乐府 马各庄 大石河东 星城 阎村 紫草坞 阎村东
房山线 阎村东 苏庄 良乡南关 良乡大学城西 良乡大学城 良乡大学城北 广阳城 篱笆房 长阳 稻田 大葆台 郭公庄
亦庄线 宋家庄 肖村 小红门 旧宫 亦庄桥 亦庄文化园 万源街 荣京东街 荣昌东街 同济南路 经海路 次渠南 次渠 亦庄火车站
机场线 东直门 三元桥 T2航站楼 T3航站楼
新机场新 草桥 大兴新城 大兴机场
昌平线 昌平西山口 十三陵景区 昌平 昌平东关 北邵洼 南邵 沙河高教园 沙河 巩华城 朱辛庄 生命科学园 西二旗
八通线 四惠 四惠东 高碑店 传媒大学 双桥 管庄 八里桥 通州北苑 果园 九棵树 梨园 临河里 土桥
西郊线 香山 植物园 万安 茶棚 颐和园西门 巴沟
s1线 石厂 小园 栗园庄 上岸 桥户营 四道桥 金安桥
  • 优点:便于新增、修改站点和线路,看起来比较直观
  • 缺点:不能快速识别出换乘站

2、站点类

StationName: 站点名
LineName: 线路名
Order: 在线路中的序号

public class BeanStation {
    private String StationName;
    private  String LineName;
    private int Order;

    public void setStationName(String stationName) {
        StationName = stationName;
    }

    public String getStationName() {
        return StationName;
    }

    public void setLineName(String lineName) {
        LineName = lineName;
    }

    public String getLineName() {
        return LineName;
    }

    public void setOrder(int order) {
        Order = order;
    }

    public int getOrder() {
        return Order;
    }
}

3、Dijkstra算法

import jdk.nashorn.internal.ir.VarNode;

import java.util.ArrayList;
import java.util.List;

public class Dijkstra {
    private static int N = 99999;

    public static ArrayList dijkstra(int vs, int[][] Graph, int vk) {

        int n = Graph[0].length;
        int[] prenode = new int[n];  //前驱节点
        int[] mindist = new int[n];  //最短距离
        boolean[] find = new boolean[n];  //是否访问
        int vnear = 0; //最近节点

        //初始化
        for(int i=0;i list = new ArrayList();
        int t = vk;
        while(t != vs) {
            list.add(t);
            t = prenode[t];
        }
        if(mindist[vk] != N)
            list.add(prenode[t]);

        return list;

    }
}

4、读取文件函数

load函数用于简单的读取txt并输出
loadMap函数用于读取txt并逐个建立起站点,并返回站点列表
loadMatrix函数用于读取txt并返回每条线路中的站点数列表

import javax.swing.plaf.synth.SynthOptionPaneUI;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;
import java.io.*;

public class ReadTxt {
    public static void load(String fileName) {
        File file = new File(fileName);

        try {
            BufferedReader bf = new BufferedReader(new FileReader(file));

            String content = "";

            while (content != null) {
                content = bf.readLine();

                if (content == null) {
                    break;
                }

                System.out.println(content);
            }
            bf.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static List loadMap(String fileName) {
        List list = new ArrayList<>();

        File file = new File(fileName);

        try {
            BufferedReader bf = new BufferedReader(new FileReader(file));

            String content = "";

            while (content != null) {
                content = bf.readLine();

                if (content == null) {
                    break;
                }

                String[] str = content.trim().split(" ");

                for(int i=1;i loadMatrix(String fileName) {
        List list = new ArrayList<>();

        File file = new File(fileName);

        try {
            BufferedReader bf = new BufferedReader(new FileReader(file));

            String content = "";

            while (content != null) {
                content = bf.readLine();

                if (content == null) {
                    break;
                }

                String[] str = content.trim().split(" ");

                list.add(str.length-1);

            }
            bf.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
        return list;
    }
}

5、功能函数

功能的具体实现,以及各种报错提示

import javax.swing.plaf.synth.SynthOptionPaneUI;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;
import java.io.*;

public class Run {
    public static void load(String filename) {
        ReadTxt.load(filename);
    }
    public static void line(String filename, String line, String output) throws Exception{
        List list = ReadTxt.loadMap(filename);
        int count = 0;
        for (int i=0;i list = ReadTxt.loadMap(filename);
        List alist = ReadTxt.loadMatrix(filename);
        int sum = 0;
        for (int i=0;i blist = new ArrayList ();
        for(int i = 0 ; i < list.size() ; i++){
            blist.add(list.get(i).getStationName());
        }

        int max = 99999;
        int a[][] = new int[sum][sum];
        for(int i=0;i clist = Dijkstra.dijkstra(endOrder, a, startOrder);
        ArrayList dlist = new ArrayList ();
        for(int i = 0 ; i < clist.size() ; i++){
            dlist.add(blist.get(clist.get(i)));
        }
        Set set = new HashSet();
        for(String str: dlist){
            set.add(str);
        }

        if(set.size() == 1)
            throw new Exception("不存在通路!");

        FileWriter fileWriter = new FileWriter(output);//创建文本文件
        fileWriter.write("站点数:"+set.size()+"\r\n");//写入 \r\n换行

        fileWriter.write(blist.get(clist.get(0))+' ');
        for(int i=1;i

6、运行函数

“-map”参数:显示完整地铁线路
“-a”参数:查找某线路上的所有站点
“-b”参数:查找两个站点之间的最短路径

public class subway {
    public static void main(String[] args) throws Exception {
        if(args[0].equals("-map")){
            Run.load(args[1]);
        }
        else if(args[0].equals("-a")){
            if(!args[2].equals("-map") || !args[4].equals("-o")){
                throw new Exception("输入参数有误!");
            }
            else
                Run.line(args[3], args[1], args[5]);
        }
        else if(args[0].equals("-b")){
            if(!args[3].equals("-map") || !args[5].equals("-o")){
                throw new Exception("输入参数有误!");
            }
            else
                Run.serach(args[4], args[1], args[2], args[6]);
        }
        else
            throw new Exception("输入参数有误!");
    }
}

运行示例

  1. -map subway.txt 北京地铁出行规划_第1张图片
  2. -a 西郊线 -map subway.txt -o station.txt
    北京地铁出行规划_第2张图片
  3. -b 香山 焦化厂 -map subway.txt -o roution.txt 北京地铁出行规划_第3张图片
  4. -a 东线 -map subway.txt -o station.txt 北京地铁出行规划_第4张图片
  5. -b 杭州 焦化厂 -map subway.txt -o roution.txt北京地铁出行规划_第5张图片
  6. -c 香山 焦化厂 -map subway.txt -o roution.txt 北京地铁出行规划_第6张图片
  7. -a 西郊线 -map subway.txt -p station.txt在这里插入图片描述

你可能感兴趣的:(北京地铁出行规划)