rhuang.cis.k.hosei.ac.jp · Web...

26
+ Solutions for Exercise #9 Ex9-1

Transcript of rhuang.cis.k.hosei.ac.jp · Web...

Page 1: rhuang.cis.k.hosei.ac.jp · Web viewO(n2)のスペースでDを計算する場合、上記の式の他に以下の3つの式に従う。 ... d ik (k) と d kj k の値がすでに更新されていればこの値を、更新前であれば

+ Solutions for Exercise #9Ex9-1

Page 2: rhuang.cis.k.hosei.ac.jp · Web viewO(n2)のスペースでDを計算する場合、上記の式の他に以下の3つの式に従う。 ... d ik (k) と d kj k の値がすでに更新されていればこの値を、更新前であれば

Solution1.

2.

Page 3: rhuang.cis.k.hosei.ac.jp · Web viewO(n2)のスペースでDを計算する場合、上記の式の他に以下の3つの式に従う。 ... d ik (k) と d kj k の値がすでに更新されていればこの値を、更新前であれば

3.

4.

Page 4: rhuang.cis.k.hosei.ac.jp · Web viewO(n2)のスペースでDを計算する場合、上記の式の他に以下の3つの式に従う。 ... d ik (k) と d kj k の値がすでに更新されていればこの値を、更新前であれば

5.

6.

Page 5: rhuang.cis.k.hosei.ac.jp · Web viewO(n2)のスペースでDを計算する場合、上記の式の他に以下の3つの式に従う。 ... d ik (k) と d kj k の値がすでに更新されていればこの値を、更新前であれば

7.

Page 6: rhuang.cis.k.hosei.ac.jp · Web viewO(n2)のスペースでDを計算する場合、上記の式の他に以下の3つの式に従う。 ... d ik (k) と d kj k の値がすでに更新されていればこの値を、更新前であれば

Ex9-2

import java.util.PriorityQueue;import java.util.List;import java.util.ArrayList;import java.util.Collections;

class Vertex implements Comparable<Vertex>{ public final String name; public Edge[] adjacencies; public double minDistance = Double.POSITIVE_INFINITY; // このノードに辿り着くまでの最小距

// 離のデフォルト値は最大 public Vertex previous; // このノードに辿り着く直前に通った

// ノード public Vertex(String argName) { name = argName; } public String toString() { return name; } public int compareTo(Vertex other) { return Double.compare(minDistance, other.minDistance); }}

class Edge{ public final Vertex target; // リンクで結ばれたノード public final double weight; // ノード target への移動にかかるコスト public Edge(Vertex argTarget, double argWeight) { target = argTarget; weight = argWeight; }}

public class Dijkstra{ public static void computePaths(Vertex source) // ノード source から各ノードまでの

// 最小距離の計算 { source.minDistance = 0.; // 自分への経路の weight は最小 PriorityQueue<Vertex> vertexQueue = new PriorityQueue<Vertex>(); // 探索対象となるノード vertexQueue.add(source); // ノード source から経路探索する

while (!vertexQueue.isEmpty()) { // 探索対象ノードが全てなくなるまで// 繰り返す

Vertex u = vertexQueue.poll(); // 探索対象ノードの先頭を取り出す

// Visit each edge exiting u for (Edge e : u.adjacencies) // 探索中ノード u の各リンクに対して { Vertex v = e.target; // リンク e でノード u と結ばれたノ

// ード v までのノード s からの最小// weight を求める

double weight = e.weight; double distanceThroughU = u.minDistance + weight;

Page 7: rhuang.cis.k.hosei.ac.jp · Web viewO(n2)のスペースでDを計算する場合、上記の式の他に以下の3つの式に従う。 ... d ik (k) と d kj k の値がすでに更新されていればこの値を、更新前であれば

if (distanceThroughU < v.minDistance) { // ノード u を経由したノード v まで// の距離が既知のノード v までの// 距離より小さい時

vertexQueue.remove(v); // ノード v を一度消す v.minDistance = distanceThroughU ; // ノード v までの最小距離を更新する v.previous = u; // ノード u をノード v に辿り着く直

// 前のノードとする vertexQueue.add(v); // 更新したノード v を探索対象ノード} // に加え直す

} } }

public static List<Vertex> getShortestPathTo(Vertex target) { List<Vertex> path = new ArrayList<Vertex>(); for (Vertex vertex = target; vertex != null; vertex = vertex.previous) path.add(vertex); Collections.reverse(path); return path; }

public static void main(String[] args) { Vertex v0 = new Vertex("Redvile");

Vertex v1 = new Vertex("Blueville");Vertex v2 = new Vertex("Greenville");Vertex v3 = new Vertex("Orangeville");Vertex v4 = new Vertex("Purpleville");

v0.adjacencies = new Edge[]{ new Edge(v1, 5), new Edge(v2, 10),

new Edge(v3, 8) };v1.adjacencies = new Edge[]{ new Edge(v0, 5), new Edge(v2, 3), new Edge(v4, 7) };v2.adjacencies = new Edge[]{ new Edge(v0, 10),

new Edge(v1, 3) };v3.adjacencies = new Edge[]{ new Edge(v0, 8), new Edge(v4, 2) };v4.adjacencies = new Edge[]{ new Edge(v1, 7),

new Edge(v3, 2) };Vertex[] vertices = { v0, v1, v2, v3, v4 };

computePaths(v0); for (Vertex v : vertices)

{ System.out.println("Distance to " + v + ": " + v.minDistance); List<Vertex> path = getShortestPathTo(v); System.out.println("Path: " + path);}

}}

+ Solutions for Exercise #10Ex10-1

Page 8: rhuang.cis.k.hosei.ac.jp · Web viewO(n2)のスペースでDを計算する場合、上記の式の他に以下の3つの式に従う。 ... d ik (k) と d kj k の値がすでに更新されていればこの値を、更新前であれば

Example solution

A matrix C is calculated in regular matrix multiplication as below:

Page 9: rhuang.cis.k.hosei.ac.jp · Web viewO(n2)のスペースでDを計算する場合、上記の式の他に以下の3つの式に従う。 ... d ik (k) と d kj k の値がすでに更新されていればこの値を、更新前であれば

A matrix C is calculated in the shortest-paths algorithms

Ex10-2

Page 10: rhuang.cis.k.hosei.ac.jp · Web viewO(n2)のスペースでDを計算する場合、上記の式の他に以下の3つの式に従う。 ... d ik (k) と d kj k の値がすでに更新されていればこの値を、更新前であれば

Example solution

O(n3)のスペースで D を計算するとき、以下の式に従う。

d ij(k)=min (d ij

( k−1 ) , d ik( k−1)+dk j

(k−1 ))

O(n2)のスペースで D を計算する場合、上記の式の他に以下の 3 つの式に従う。

d ij(k)=min (d ij

( k−1 ) , d ik( k )+dkj

( k−1 ))

d ij(k)=min (d ij

( k−1 ) , d ik( k−1)+dkj

(k ))

d ij(k)=min (d ij

( k−1 ) , d ik( k )+dkj

( k ))

d ik(k)とdkj

( k )の値がすでに更新されていればこの値を、更新前であればd ik(k−1)とdkj

( k−1)を用いて計算する。

Page 11: rhuang.cis.k.hosei.ac.jp · Web viewO(n2)のスペースでDを計算する場合、上記の式の他に以下の3つの式に従う。 ... d ik (k) と d kj k の値がすでに更新されていればこの値を、更新前であれば

+ Solutions for Exercise #11Ex11-1

import java.util.PriorityQueue;import java.util.List;import java.util.ArrayList;import java.util.Collections;

class Vertex{public final String name;public Edge[] adjacencies;public double minDistance = 0;public boolean visited;public Vertex previous;

public Vertex(String argName) {name = argName;visited = false;

}

public String toString() {return name;

}}

class Edge implements Comparable<Edge>{public final Vertex present;public final Vertex target;public final double weight;

public Edge(Vertex argPresent, Vertex argTarget, double argWeight) {present = argPresent;target = argTarget;weight = argWeight;

}public int compareTo(Edge other) {

return Double.compare(weight, other.weight);}

}

public class Prim {public static void computePaths(Vertex source) {

source.minDistance = 0.;source.visited = true;PriorityQueue<Edge> edgeQueue = new PriorityQueue<Edge>();for(int i=0; i<source.adjacencies.length; i++){

edgeQueue.add(source.adjacencies[i]);}

while (!edgeQueue.isEmpty()) {Edge e = edgeQueue.poll();Vertex u = e.target;if(!u.visited){

u.visited = true;u.minDistance = e.present.minDistance + e.weight;

Page 12: rhuang.cis.k.hosei.ac.jp · Web viewO(n2)のスペースでDを計算する場合、上記の式の他に以下の3つの式に従う。 ... d ik (k) と d kj k の値がすでに更新されていればこの値を、更新前であれば

u.previous = e.present;for(int i=0; i<u.adjacencies.length; i++){

edgeQueue.add(u.adjacencies[i]);}

}}

}

public static List<Vertex> getShortestPathTo(Vertex target) {List<Vertex> path = new ArrayList<Vertex>();for (Vertex vertex = target; vertex != null; vertex = vertex.previous)

path.add(vertex);Collections.reverse(path);return path;

}

public static void main(String[] args) {Vertex v0 = new Vertex("Redvile");Vertex v1 = new Vertex("Blueville");Vertex v2 = new Vertex("Greenville");Vertex v3 = new Vertex("Orangeville");Vertex v4 = new Vertex("Purpleville");

v0.adjacencies = new Edge[] { new Edge(v0, v1, 5), new Edge(v0, v2, 10), new Edge(v0, v3, 8) };

v1.adjacencies = new Edge[] { new Edge(v1, v0, 5), new Edge(v1, v2, 3), new Edge(v1, v4, 7) };

v2.adjacencies = new Edge[] { new Edge(v2, v0, 10), new Edge(v2, v1, 3) };v3.adjacencies = new Edge[] { new Edge(v3, v0, 8), new Edge(v3, v4, 2) };v4.adjacencies = new Edge[] { new Edge(v4, v1, 7), new Edge(v4, v3, 2) };Vertex[] vertices = { v0, v1, v2, v3, v4 };computePaths(v0);for (Vertex v : vertices) {

System.out.println("Distance to " + v + ": " + v.minDistance);List<Vertex> path = getShortestPathTo(v);System.out.println("Path: " + path);

}}

}

8.

Page 13: rhuang.cis.k.hosei.ac.jp · Web viewO(n2)のスペースでDを計算する場合、上記の式の他に以下の3つの式に従う。 ... d ik (k) と d kj k の値がすでに更新されていればこの値を、更新前であれば

Ex11-2

Example solution

Page 14: rhuang.cis.k.hosei.ac.jp · Web viewO(n2)のスペースでDを計算する場合、上記の式の他に以下の3つの式に従う。 ... d ik (k) と d kj k の値がすでに更新されていればこの値を、更新前であれば

1.

Page 15: rhuang.cis.k.hosei.ac.jp · Web viewO(n2)のスペースでDを計算する場合、上記の式の他に以下の3つの式に従う。 ... d ik (k) と d kj k の値がすでに更新されていればこの値を、更新前であれば

2.

3.

Page 16: rhuang.cis.k.hosei.ac.jp · Web viewO(n2)のスペースでDを計算する場合、上記の式の他に以下の3つの式に従う。 ... d ik (k) と d kj k の値がすでに更新されていればこの値を、更新前であれば

4.

5.

Page 17: rhuang.cis.k.hosei.ac.jp · Web viewO(n2)のスペースでDを計算する場合、上記の式の他に以下の3つの式に従う。 ... d ik (k) と d kj k の値がすでに更新されていればこの値を、更新前であれば

6.

7.

Page 18: rhuang.cis.k.hosei.ac.jp · Web viewO(n2)のスペースでDを計算する場合、上記の式の他に以下の3つの式に従う。 ... d ik (k) と d kj k の値がすでに更新されていればこの値を、更新前であれば

8.

9.

Page 19: rhuang.cis.k.hosei.ac.jp · Web viewO(n2)のスペースでDを計算する場合、上記の式の他に以下の3つの式に従う。 ... d ik (k) と d kj k の値がすでに更新されていればこの値を、更新前であれば

10.

11.

Page 20: rhuang.cis.k.hosei.ac.jp · Web viewO(n2)のスペースでDを計算する場合、上記の式の他に以下の3つの式に従う。 ... d ik (k) と d kj k の値がすでに更新されていればこの値を、更新前であれば

12.

13.

Page 21: rhuang.cis.k.hosei.ac.jp · Web viewO(n2)のスペースでDを計算する場合、上記の式の他に以下の3つの式に従う。 ... d ik (k) と d kj k の値がすでに更新されていればこの値を、更新前であれば

14.

15.

Page 22: rhuang.cis.k.hosei.ac.jp · Web viewO(n2)のスペースでDを計算する場合、上記の式の他に以下の3つの式に従う。 ... d ik (k) と d kj k の値がすでに更新されていればこの値を、更新前であれば

16.

17.

Page 23: rhuang.cis.k.hosei.ac.jp · Web viewO(n2)のスペースでDを計算する場合、上記の式の他に以下の3つの式に従う。 ... d ik (k) と d kj k の値がすでに更新されていればこの値を、更新前であれば

+ Solutions for Exercise #12Ex12

Example solution