ダイクストラ法

| # Comments
最短経路問題を解くためのアルゴリズムである「ダイクストラ法 (Dijkstra's Algorithm)」というのをScalaで実装してみました。

参考にしたのは ダイクストラ法(最短経路問題) です。

ダイクストラ法 (Dijkstra's Algorithm) は最短経路問題を効率的に解くグラフ理論におけるアルゴリズムです。スタートノードからゴールノードまでの最短距離とその経路を求めることができます。

正しく実装出来ているかどうかはよくわかりません。。。

dijkstra.scala

object Dijkstra extends Application {

  case class Node(id: Int)

  val graph = Map(
    Node(0) -> Map(Node(1) -> 5, Node(2) -> 4, Node(3) -> 2),
    Node(1) -> Map(Node(0) -> 5, Node(2) -> 2, Node(5) -> 6),
    Node(2) -> Map(Node(0) -> 4, Node(1) -> 2, Node(3) -> 3, Node(4) -> 2),
    Node(3) -> Map(Node(0) -> 2, Node(2) -> 3, Node(4) -> 6),
    Node(4) -> Map(Node(2) -> 2, Node(3) -> 6, Node(5) -> 4),
    Node(5) -> Map(Node(1) -> 6, Node(4) -> 4)
  )

  def dijkstra(routes: Map[List[Node], Int]) : (Map[List[Node], Int]) = {
    val scanned = routes.flatMap {
      case (route, cost) => {
        graph(route(0)).flatMap {
          case (n, c) if routes.forall(_._1(0) != n) => Some((n :: route) -> (cost + c))
          case _ => None
        }
      }
    }
    if(scanned.isEmpty) {
      routes
    }
    else {
      dijkstra(routes + scanned.reduceLeft { (a, b) => if(a._2 < b._2) a else b })
    }
  }

  println(dijkstra(Map(List(Node(0)) -> 0)))

}

実行すると

Map(
  List(Node(0)) -> 0,
  List(Node(5), Node(4), Node(2), Node(0)) -> 10,
  List(Node(3), Node(0)) -> 2,
  List(Node(4), Node(2), Node(0)) -> 6,
  List(Node(1), Node(0)) -> 5,
  List(Node(2), Node(0)) -> 4
)

のように、各ノードへの最短経路がその時のコストと共に表示されます。
(上記は見やすいように空白・改行を入れてあります。)

途中計算を保持しないでワンステップずつすすむので、グラフが大きくなると破綻すると思われます。
まぁ、アルゴリズムの勉強用ということで。

comments powered by Disqus

Twitter Icon

AdSense

Creative Commons License
このブログはクリエイティブ・コモンズでライセンスされています。
Powered by Movable Type 5.14-ja

Google検索

カスタム検索

2013年10月

    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31