SCMOPTは様々なシステム(モジュール)を有機的に結合したものである.

ソルバーのエラークラス

class SolverError[source]

SolverError() :: Exception

ソルバーのエラーのための例外クラス

地点(顧客)間の距離と移動時間の計算関数 compute_durations

OSRMを必要とする.

引数:

  • cust_df: 顧客データフレーム(名称と緯度・経度情報をもつデータフレーム)
  • plnt_df: 工場データフレーム(オプション;既定値 None)

返値:

  • durations: 地点間の移動時間(計算に失敗した場合には大きな数字が入っている.)
  • distances: 地点間の道路距離(計算に失敗した場合には大きな数字が入っている.)
  • node_df: 点のデータフレーム(顧客もしくは顧客と工場を結合したもの)

compute_durations[source]

compute_durations(cust_df, plnt_df=None)

compute_durations関数の使用例

cust_df = pd.read_csv(folder+"Cust.csv")
#durations,  distances, node_df = compute_durations(cust_df)
#print(durations[0])

地点間の距離と移動時間のデータフレームを生成する関数 make_time_df

引数:

  • node_df: 点のデータフレーム(顧客もしくは顧客と工場を結合したもの)
  • durations: 地点間の移動時間(計算に失敗した場合には大きな数字が入っている.)
  • distances: 地点間の道路距離(計算に失敗した場合には大きな数字が入っている.)

返値:

  • time_df: 発地,着地,移動時間(秒),道路距離(m)を入れたデータフレーム

make_time_df[source]

make_time_df(node_df, durations, distances)

make_time_df関数の使用例

#time_df.head()
#time_df.to_csv(folder + "melos/time.csv")

time_dfからdurationsとdistancesを生成する関数 make_durations

上で作成した time_df から,移動時間と移動距離を生成する.

引数:

  • time_df: 移動時間と道路距離を保持するデータフレーム

返値:

  • durations: 移動時間行列
  • distances: 道路距離行列

make_durations[source]

make_durations(time_df)

make_durations関数の使用例

time_df = pd.read_csv(folder + "melos/time.csv")
durations, distances = make_durations(time_df)
distances
array([[      0.,  427015.,  546453., ..., 2247148., 2288685., 3080358.],
       [ 426987.,       0.,  183876., ..., 1815653., 1857189., 2648863.],
       [ 546501.,  183838.,       0., ..., 1736609., 1778145., 2569819.],
       ...,
       [2247483., 1814532., 1736893., ...,       0.,  132654.,  924327.],
       [2293427., 1860476., 1782837., ...,  134850.,       0.,  795782.],
       [3083057., 2650105., 2572466., ...,  924479.,  795964.,       0.]])

seabornのカラーパレットと色数を指定すると、Plotly用のカラーパレットを返す関数 get_colorpalette

seabornのカラーパレットと色数を指定すると、Plotly用のカラーパレットを返す.

使用できるseabornのパレット名は,以下の通り.

deep, muted, bright, pastel, dark, colorblind

get_colorpalette[source]

get_colorpalette(colorpalette='pastel', n_colors=1)

get_colorpalette関数の使用例

n_legends = 12
x = np.arange(0, 1, .01)
y = np.random.rand(n_legends, 100) + \
  np.arange(n_legends).reshape(-1, 1)

colors = get_colorpalette('pastel', n_legends)
data = [
    go.Scatter(
        x=x, y=y[i], name=f'Legend {i}',
        marker={'color':colors[i]})
    for i in range(n_legends)]
fig = go.Figure(data=data)
#plotly.offline.plot(fig);

グラフクラス SCMGraph

サプライ・チェインのためのグラフクラス

SCMGraphクラスは,networkXの有向グラフクラスDiGraphから派生したものであり,以下のメソッドが追加されている.

  • random_directed_tree(n=1, seed=None):ランダムな有向木を生成する.引数は点数n(既定値1)と擬似乱数の種seed(既定値None).- layered_network(num_in_layer=None, p=0.5, seed=None): ランダムな層型の有向グラフを生成する. 引数num_in_layerは,各層内の点数を入れたリストで既定値は[1,1],pは枝の発生確率で既定値は0.5,seedは擬似乱数の種である.
  • layout(): 有向グラフを描画する際の座標を返す関数.返値は点の名称をキーとし,点のx,y座標を値とした辞書.
  • down_order(): 閉路を含まない有向グラフに対して,供給地点側から需要地点側の順番で点を返すジェネレータ関数.
  • up_order(): 閉路を含まない有向グラフに対して,需要地点側から供給地点側の順番で点を返すジェネレータ関数.
  • dp_order(): 有向木に対して,葉から順番に点を生成するジェネレータ関数. 安全在庫配置問題に対する動的最適化で用いる.
  • bfs(start): 点startを開始点として,広がり優先探索で点を生成するジェネレータ関数.
  • find_ancestors(): 各点から到達可能な点の集合(自分自身を含む)を保持するリスト.点の順序はup_orderとする.

class SCMGraph[source]

SCMGraph(incoming_graph_data=None, **attr) :: DiGraph

SCMGraph is a class of directed graph with edge weight that can be any object. I just use the functions such as in_degree, out_degree, successors, predecessors, in_edges_iter, out_edges_iter. So it is convertible to any graph class that can access the adjacent nodes more quickly.

SCMGraphの使用例

階層型ネットワークを生成し,点の座標(レイアウト)を計算して描画する.

%matplotlib inline 
G = SCMGraph()
G.layered_network(num_in_layer=[3, 2, 3], p=0.4, seed=123)
pos = G.layout()
nx.draw(G, pos=pos, with_labels=True, node_color="Yellow")
print("up order")
for i in G.up_order():
    print(i, end=" ")
up order
7 6 3 5 4 2 1 0 
print("down order")
for i in G.down_order():
    print(i, end=" ")
down order
2 1 0 4 7 5 3 6 
print("dp order")
for i in G.dp_order():
    print(i, end=" ")

G.remove_edge(0, 3)

for i in G.dp_order():
    print(i, end=" ")
dp order
Graph is not a tree.
0 1 2 3 5 6 7 4 
print("bfs")
for i in G.bfs():
    print(i, end=" ")
bfs
0 4 5 6 7 

random_directed_tree関数

ランダムな有向木を生成する。

引数: 点数 n

返値: 点数 n のランダムな有向木

G = SCMGraph()
G.random_directed_tree(10, seed=1)
pos = G.layout()
nx.draw(G, pos=pos, with_labels=True, node_color="Yellow")