23
2 dimensional bit vector approach Mikio Kubo

2 dimensional bit vector approach

Embed Size (px)

DESCRIPTION

2 dimensional bit vector approach. Mikio Kubo. TIGER/Line graph DC.tmp 9559 nodes and 29818 arcs. Shortest Paths between all border nodes of 2 regions. Source region border nodes (red) and other nodes (yellow). Target region border nodes (red) and other nodes (yellow). Connecting network. - PowerPoint PPT Presentation

Citation preview

Page 1: 2 dimensional bit vector approach

2 dimensional bit vector approach

Mikio Kubo

Page 2: 2 dimensional bit vector approach

TIGER/Line graph DC.tmp    9559 nodes and 29818 arcs

Shortest Paths between all border nodes of 2 regions

Page 3: 2 dimensional bit vector approach

Source regionborder nodes (red) and other nodes (yellow)

Page 4: 2 dimensional bit vector approach

Target region

border nodes (red) and other nodes (yellow)

Page 5: 2 dimensional bit vector approach

Connecting network

Page 6: 2 dimensional bit vector approach

After concatenation of degree 2 nodes

Page 7: 2 dimensional bit vector approach

After shrinking the nodes aroundthe source and target regions

By storing all shortest path length between transit (cut) nodes, the shortest path problem between 2 regions is reduced to the problem on the graph above.

Page 8: 2 dimensional bit vector approach

TIGER/Line graph USA-road-d.NY264346 nodes and 733846 arcs

Page 9: 2 dimensional bit vector approach

degree frequency histogram [0, 28, 440, 32]

Arcs on shortest paths between border nodes (red)

Page 10: 2 dimensional bit vector approach

Connecting network and the graph after concatenation and shrinking the nodes in the regions

Page 11: 2 dimensional bit vector approach

終点領域から遠い順に最短路を解き,最短路木内の点を削除する( 59 回解くべきところを 25 回に削減)

Page 12: 2 dimensional bit vector approach

始点付近の拡大図

Page 13: 2 dimensional bit vector approach

Implementation

(Python +networkX)

Page 14: 2 dimensional bit vector approach

Read data and construct graph

n=len(x_cord) for i in range(n): # 点集合の追加 G.add_node(i) G.position[i]=(x_cord[i], y_cord[i]) m=len(edge_info) for (i,j,length) in edge_info: # 枝集合の追加 G.add_edge(i,j,length)

from pylab import *from networkx import * # モジュールの読み込みG=XGraph() # グラフインスタンスの生成G.position={} # 座標保管用の辞書

点の座標のリスト x_cord[],y_cord[]  枝情報 (i,j,length) のリスト edge_info[]

Page 15: 2 dimensional bit vector approach

draw(G,G.position,node_size=1000/n,with_labels=None,width=1,node_color='b',edge_color='g')

グラフの表示( position 指定,サイズ 1000/n, ラベルなし,線幅 1 ,点色 b ,枝色 g )

Page 16: 2 dimensional bit vector approach

最大の連結成分の抽出

# グラフ G の最大の連結成分( 0 番目)を H に入れる H=connected_component_subgraphs(G) [0]

# 点の座標の更新 H.position={} for node in H.nodes_iter(): (x,y)=G.position[node] H.position[node]=(x,y)

connected_component_subgraphs(G) は networkX の関数

Page 17: 2 dimensional bit vector approach

バケット( 2 次元格子)に点を入れる

Page 18: 2 dimensional bit vector approach

バケットの準備# 各バケットにおおよそ 100 の点を入れるようにバケット数を決めるn_bucket=int(sqrt(n/100))

# バケット (i,j) に所属する点のリストを準備bucket=[ [ [] for i in range(n_bucket) ] for j in range(n_bucket) ]

G.bucket={} # 点の所属するバケットを保管する辞書を準備

for node in G.nodes_iter(): (x,y)=G.position[node] i=int(x*n_bucket) j=int(y*n_bucket) bucket[i][j].append(node) # バケット (i,j) のリストに点を追加 G.bucket[node]=(i,j) # 辞書にバケット番号を保管

Page 19: 2 dimensional bit vector approach

バケットの縁の点集合

# 縁の点集合を保管するリストの準備border=[[[] for i in range(n_bucket)] for j in range(n_bucket)]

for i in range(n_bucket): for j in range(n_bucket): if len(bucket[i][j])>0: # 空でないバケットに対して for node in bucket[i][j]: for n1 in G.neighbors(node): # 隣接点集合( networkX ) if G.bucket[node] <> G.bucket[n1]: # 隣接点が異なるバケットに含まれているなら # 縁の点集合に追加

border[i][j].append(node)

Page 20: 2 dimensional bit vector approach

点の重複の除去

startnodes=set(border[start_i][start_j])

開始バケット( stgart_i,start_j) の縁の点集合の抽出

set() はリストから集合(重複がない要素の集まり)を抽出する関数

Page 21: 2 dimensional bit vector approach

2 バケット間の最短路計算paths=[] # パスを保管するリストの準備for s in set(border[start_i][start_j]): #networkX の最短路は遅い ->BoostGraphLibrary(BGL) を利用 pred=BoostGraph.findAllShortestPath(s) for t in set(border[end_i][end_j]):

dst=t  #終点 t から最短路木を辿る sp = [dst] while s != dst: # 最短路木の前の点 pred へ移動 dst=BoostGraph.vertexesid[ pred[BoostGraph.vertexes[dst]] ] sp.append(dst) sp.reverse() # 終点からの点列を逆にする paths.append(sp) # パスリストに追加

Page 22: 2 dimensional bit vector approach

G.clear() # グラフのクリアfor sp in paths: G.add_path(sp) # パスの追加

# 3倍の枝幅で描画 draw(G,G.position,node_size=1000/n,with_labels=None, width=3,node_color='b',edge_color='r')

Page 23: 2 dimensional bit vector approach

点の次数のヒストグラム

degseq=G.degree()   # 次数を計算してリストを返す関数dmax=max(degseq)+1 # 最大の次数を計算( max は python の関数)freq= [ 0 for d in range(dmax) ] # 頻度を保管するリストの準備for d in degseq: freq[d] += 1

print "degree frequency histgram",freq

結果 degree frequency histgram [0, 39, 648, 97, 18]