• 検索結果がありません。

アルゴリズム論 (第5回)

N/A
N/A
Protected

Academic year: 2021

シェア "アルゴリズム論 (第5回)"

Copied!
24
0
0

読み込み中.... (全文を見る)

全文

(1)

アルゴリズム論

(第5回)

佐々木研(情報システム構築学講座)

講師  山田敬三

[email protected]

(2)

最短経路問題

(3)

最短経路問題

重み付きグラフを用いる.

与えられた始点と終点に対して,

辺の重みの総和が最小となる経路を見つける.

最も短い経路,最も安い経路などと解釈する.

(4)

隣接行列

0 1 3 0 3 5 1 2 2 1 3 1 1 4 4 2 5 4 3 6 2 3 7 3 4 5 1 5 7 2 5 8 5 6 7 2 7 8 4

0 1 2

3 4 5

6 7 8

0 1 2 3 4 5 6 7 8

0 3 5

1 3 2 1 4

2 2 4

3 5 1 2 3

4 4 1

5 4 1 2 5

6 2 2

7 3 2 2 4

8 5 4

重み付きグラフ

3 5

2

1 4 4

1

2 3 2 5

2 4

(5)

ダイクストラ法(最短経路長)

集合 X 内のノードだけを通る経路に限定して,始点からの最 短経路長を求める手続き.

集合 X を,始点だけを含む初期状態から,全ノードを含む集 合になるまで順次拡大することで,最短経路長を求める.

(6)

ダイクストラ法(最短経路長)

• あるノードからあるノードへの最 短経路長を求める.(ノード 0→

ノード 5 )

1. 初期状態

i.

始点(ノード 0 )の最短経路長を 0 にし, ノード 0 を太線で囲う.

ii.

ノード 0 の隣接ノードにノード 0 か らの 距離を最短経路長として与える.

この距離は更新される可能性がある

iii.

. 他のノードの経路長は とする. ∞

(7)

1 2 0

3 4 5

6 7 8

3 2

5 1 4

1

4

2 3 2

5

2 4

1

ダイクストラ法(最短経路長)

ノード 0 1 2 3 4 5 6 7 8 経路長 0 3 5 ∞ ∞ ∞ ∞ ∞

(8)

ダイクストラ法(最短経路長)

2. 探索するノードと最短経路長の決 定 以下の条件を満たすノードを調査 し,そのノードの現在の最短経路 長を正式な値として囲う.

i.

囲みの中のいずれかのノードの隣接 ノード

ii.

囲みの外のノードのうち,経路長が 最も小さいノード

ここで選択されたノードを u とす

る.

(9)

ダイクストラ法(最短経路長)

1 2

0

3 4 5

6 7 8

3 2

5 1 4

1

4

2 3 2

5

2 4

2

ノード

1

u

となる

1 2

0

3 4 5

6 7 8

3 2

5 1 4

1

4

2 3 2

5

2 4

ノード 0 1 2 3 4 5 6 7 8 経路長 0 3 5 ∞ ∞ ∞ ∞ ∞

ノード 0 1 2 3 4 5 6 7 8 経路長 0 3 5 ∞ ∞ ∞ ∞ ∞

(10)

ダイクストラ法(最短経路長)

3. 隣接ノードの最短経路長の更新

ノード u の隣接ノード v に対して 最短経路長を更新する.

i.

ノード u の最短経路長に u , v 間の重 みを加えた値を計算

ii.

その値が v の今の最短経路長よりも 小さければ値を更新

• 以上の処理をノード u の全隣接

ノードについて行う.

(11)

ダイクストラ法(最短経路長)

3 0 1 2

3 4 5

6 7 8

3 2

5 1 4

1

4

2 3 2

5

2 4

1 2

0

3 4 5

6 7 8

3 2

5 1 4

1

4

2 3 2

5

2 4

ノード 0 1 2 3 4 5 6 7 8 更新前 0 3 5 ∞ ∞ ∞ ∞ ∞ 更新後 0 3 5 4 7 ∞ ∞ ∞ ∞ ノード 0 1 2 3 4 5 6 7 8 経路長 0 3 5 4 7 ∞ ∞ ∞ ∞

ノード 0 1 2 3 4 5 6 7 8 経路長 0 3 5 4 7 ∞ ∞ ∞ ∞

(12)

ダイクストラ法(最短経路長)

4. 繰り返し & 終了条件

手順 2. からの処理を繰り返す.

終点(ノード 5 )の最短経路長が確定した時点で 終了.このとき,未探索ノードが存在する場合もある.

(13)

ダイクストラ法(最短経路長)

1 2

0

3 4 5

6 7 8

3 2

5 1 4

1

4

2 3 2

5

2 4

1 2

0

3 4 5

6 7 8

3 2

5 1 4

1

4

2 3 2

5

2 4

ノード 0 1 2 3 4 5 6 7 8 更新前 0 3 5 4 7 ∞ ∞ ∞ ∞ 更新後 0 3 5 4 7 6 7

(14)

ダイクストラ法(最短経路長)

1 2

0

3 4 5

6 7 8

3 2

5 1 4

1

4

2 3 2

5

2 4

1 2

0

3 4 5

6 7 8

3 2

5 1 4

1

4

2 3 2

5

2 4

ノード 0 1 2 3 4 5 6 7 8 更新前 0 3 5 4 7 6 7 更新後 0 3 5 4 7 9 6 7

(15)

ダイクストラ法(最短経路長)

1 2

0

3 4 5

6 7 8

3 2

5 1 4

1

4

2 3 2

5

2 4

1 2

0

3 4 5

6 7 8

3 2

5 1 4

1

4

2 3 2

5

2 4

(16)

ダイクストラ法(最短経路長)

1 2

0

3 4 5

6 7 8

3 2

5 1 4

1

4

2 3 2

5

2 4

1 2

0

3 4 5

6 7 8

3 2

5 1 4

1

4

2 3 2

5

2 4

ノード 0 1 2 3 4 5 6 7 8 更新前 0 3 5 4 7 9 6 7 更新後 0 3 5 4 7 8 6 7

(17)

ダイクストラ法(最短経路長)

1 2

0

3 4 5

6 7 8

3 2

5 1 4

1

4

2 3 2

5

2 4

1 2

0

3 4 5

6 7 8

3 2

5 1 4

1

4

2 3 2

5

2 4

ノード 0 1 2 3 4 5 6 7 8 更新前 0 3 5 4 7 8 6 7 更新後 0 3 5 4 7 8 6 7 11

(18)

使用するデータ

#define NODES 9 /* ノードの数 */

#define INF 999 /* 無限大 */

struct node { /* ノード */

int dist; /* 始点からの距離 */

int flag; /* 囲みの中かどうか */

};

int matrix[NODES][NODES]; /* 隣接行列 */

struct node node_dat[NODES]; /* ノード情報 */

(19)

処理手順

1.

隣接行列を作成

graph2.dat

を読込み,隣接行列作 成 辺が存在しないノード間は無限大(

I NF

2.

初期設定

ノード情報を表す

node_dat[]

のメ ンバの,

dist

を無限大に,

flag

0

を代入

3.

探索処理

ノード

0

を始点,ノード

5

を終点とす る探索

4.

結果を出力

(20)

探索処理

void dijkstra(int start, int end) 1. 始点の囲みへの登録

node_dat[start].flag に囲みの中にあるこ とを示す 1 を代入

2. 始点と隣接ノードの経路長の設定

始点の経路長を 0 に,隣接ノードの,そのノー ドまでの距離をメンバ dist に代入

3. 囲み外の経路長が最小のノードの調査

node_dat[x].flagnode_dat[x].dist を参照し,囲み外の最小経路長のノード u を求 める.

(21)

探索処理

4. ノード u の囲みへの登録

手順 1. のように,ノード u を囲み内に登録 5. ノード u の隣接ノードの経路長の更新

ノード u の隣接ノードであり,囲み外の ノード v に対し経路長を計算し, node_d at[v].dist よりも小さい場合は更新

6. 次のノードの探索

手順 3. に戻り,次のノードを探索 ノード u が終点である場合は終了

(22)

最短経路

• これまでのアルゴリズムでは,最短経 路長を求めるものであって,

最短経路ではない.

• ダイクストラ法を改良することで最短 経路を求める.

u

v

w

x

(23)

使用するデータ

#define NODES 9 /* ノードの数 */

#define INF 999 /* 無限大 */

#define END_OF_PATH –1 /* 終端を示す */

struct node { /* ノード */

int dist; /* 始点からの距離 */

int flag; /* 囲みの中かどうか */

int path; /* 前の隣接ノード */

};

int matrix[NODES][NODES]; /* 隣接行列 */

struct node node_dat[NODES]; /* ノード情報 * /

(24)

追加点

• 手順 2. 始点と隣接ノードの経路長の設 定 ノード startpathEND_OF_PAT H に設定

• 手順 5. ノード u の隣接ノードの経路長 更新 ノード u の隣接ノード v の更新時に,

ノード u はノード v までの最短経路を 導くノードなので, node_dat[v].pa thu を代入

• 終点から逆順にパスを表示

参照

関連したドキュメント

 毒性の強いC1. tetaniは生物状試験でグルコース 分解陰性となるのがつねであるが,一面グルコース分

世界的流行である以上、何をもって感染終息と判断するのか、現時点では予測がつかないと思われます。時限的、特例的措置とされても、かなりの長期間にわたり

〔問4〕通勤経路が二以上ある場合

最愛の隣人・中国と、相互理解を深める友愛のこころ

また、完了後調査における鳥類確認種数が 46 種で、評価書(44 種)及び施行 前(37

、コメント1点、あとは、期末の小 論文で 70 点とします(「全て持ち込 み可」の小論文式で、①最も印象に 残った講義の要約 10 点、②最も印象 に残った Q&R 要約

LF/HF の変化である。本研究で はキャンプの日数が経過するほど 快眠度指数が上昇し、1日目と4 日目を比較すると 9.3 点の差があ った。

そこで、そもそも損害賠償請求の根本の規定である金融商品取引法 21 条の 2 第 1