地下鉄の旅行ルート計画の概要

githubの住所:https://github.com/anarkhwqh/Subway


データ処理

これは、円形の経路、始点と同じ局の端末局である場合、次のようにtxtファイルに道路名とサイト名を横切る鉄道線は、形式は次のとおりです。

1号线 苹果园 古城 八角游乐园········四惠 四惠东
2号线 西直门 积水潭 鼓楼大街········车公庄 西直门
·
·
·
S1线  石厂 小园 栗园庄············ 四道桥 金安桥

ファイル機能を読みます

public void loadSubwayFile(String subway_file) {
    BufferedReader reader = null;
    File subway = new File(subway_file);
    try {
        reader = new BufferedReader(new FileReader(subway));
        String t = null;
        while ((t = reader.readLine()) != null) {
            List<String> line = Arrays.asList(t.split(" "));
            station.add(line);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

格納された地下鉄の各行、リストとして保存し、各配列に行と、List<List<String>>によってステーションMap<String, Integer> name_num数、各地下鉄駅

public void mapping() {
    int cnt = 1;
    for (List<String> line : station) {
        //因为下标为0的都为线路名称,所以i从1开始
        for (int i = 1; i < line.size(); i++) {
            if (!name_num.containsKey(line.get(i))) {
                num_name.put(cnt, line.get(i));
                name_num.put(line.get(i), cnt++);
            }
        }
    }
}

ショーよるCNT数、332地下鉄の駅の合計

ダイクストラの道順

ダイクストラ

private static int[][] c = new int[500][500];
//存储地铁站连通情况,c[i][j]等于1表示两站相邻,等于0表示不相邻
private static int[] prev = new int[500];
//存储最短路径
private static int[] dist = new int[500];
//存储最短距离
private static boolean[] s = new boolean[500];
//记录某点是否遍历过
private static int n = 332;
//总站点数

void Dijkstra(int v) {
    Arrays.fill(s, false);
    Arrays.fill(prev, 0);
    for (int i = 1; i <= n; i++) {
        dist[i] = c[v][i];
        if (dist[i] != 999999)
            prev[i] = v;
    }
    dist[v] = 0;
    s[v] = true;

    for (int i = 2; i <= n; i++) {
        int tmp = 999999;
        int u = v;
        for (int j = 1; j <= n; j++) {
            if ((!s[j]) && dist[j] < tmp) {
                u = j;
                tmp = dist[j];
            }
        }

        s[u] = true;

        for (int j = 1; j <= n; j++) {
            if (dist[u] + c[u][j] < dist[j]) {
                dist[j] = dist[u] + c[u][j];
                prev[j] = u;
            } else if (dist[u] + c[u][j] == dist[j]) {
                int a = searchPath(v, u);
                int b = searchPath(v, prev[j]);
                if (u != j && a < b) {
                    if (a < b)
                        prev[j] = u;
                    else {
                        for (List<String> line : station) {
                            if (line.contains(num_name.get(u)) && line.contains(num_name.get(j)))
                                prev[j] = u;
                        }
                    }
                }
            }
        }
    }
}

上記においてmapping()機能するためにc[][]初期化します

for (int i = 1; i < line.size(); i++) {
    if (i != 1) {
        int a = name_num.get(line.get(i));
        int b = name_num.get(line.get(i - 1));
        c[a][b] = c[b][a] = 1;
    }
}

SearchPathの

int searchPath(int v, int u) {
    int[] que = new int[500];
    int cnt = 0;//换乘次数
    int tot = 1;
    que[tot] = u;
    tot++;
    int tmp = prev[u];
    while (tmp != v) {
        que[tot] = tmp;
        tot++;
        tmp = prev[tmp];
    }
    que[tot] = v;
    for (int i = tot; i >= 1; i--) {
        boolean f = false;
        if (i == tot)
            f = true;
        else if (i != 1) {
            for (List<String> line : station) {
                if (line.contains(num_name.get(que[i + 1])) && line.contains(num_name.get(que[i - 1]))) {
                    f = true;
                    break;
                }
            }
        }
        if (i != 1 && !f) {
            cnt++;
        }
    }
    return cnt;
}

UIインターフェイス

直接JavaでUIを書かれたページやアプリのno形式、などの比較的シンプルなインターフェース

サンプルテスト

  • 長いルート

  • 重複路線

  • 出発点または終了点のエラーを入力します。

  • 開始と終了が同じです

#欠損とATと結論づけ
地下鉄マップ疎なグラフであり、ダイクストラのアルゴリズムが密グラフの、しかしにより少ないメトロポイントに適しているので、速度が速くなります。自体はその後、エリア拡大の部分が、選択地下鉄駅では、マップをドラッグしますが、実装されていないことができ、エリアをクリック、購入時に地下鉄の駅でのページに似た決定的な答えを試してみたいの可視化が続きます。JavaでUIインターフェイスを書くときに解決する問題ではありませんでした、適切なサイズに調整した画像を入れて歪みが常に非常に深刻です、私は解決する方法がわかりません。最後に、個々の割り当て、非効率的、官僚冒頭のために、非常に頻繁にバグがコードを書くの過程で思考内容の一部は、バグをバック調整に時間がかかるにつながる、包括されていないです。

おすすめ

転載: www.cnblogs.com/anarkh/p/11672050.html