Skip to content

Instantly share code, notes, and snippets.

@enakai00
Last active August 15, 2022 08:02
Show Gist options
  • Save enakai00/4d6043b852587fe99ea67184420a6155 to your computer and use it in GitHub Desktop.
Save enakai00/4d6043b852587fe99ea67184420a6155 to your computer and use it in GitHub Desktop.
chap5.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "chap5.ipynb",
"provenance": [],
"collapsed_sections": [],
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/enakai00/4d6043b852587fe99ea67184420a6155/chap5.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"source": [
"## 環境準備"
],
"metadata": {
"id": "evzu_3wZZnS_"
}
},
{
"cell_type": "code",
"source": [
"!pip install pulp"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "ZGH7xhSbZhD4",
"outputId": "03e9871a-2135-4058-f0c2-22b3814cd7e6"
},
"execution_count": 1,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n",
"Requirement already satisfied: pulp in /usr/local/lib/python3.7/dist-packages (2.6.0)\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"import pulp\n",
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"from itertools import product\n",
"from pandas import DataFrame, Series"
],
"metadata": {
"id": "Szy_mcQuJa4C"
},
"execution_count": 2,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"## 問題設定"
],
"metadata": {
"id": "dIyJ7yNyRSUV"
}
},
{
"cell_type": "code",
"source": [
"np.random.seed(10)\n",
"num_places = 10 # 地点の数\n",
"num_days = 30 # 計画の対象日数\n",
"num_requests = 120 # 荷物の数\n",
"\n",
"mean_travel_time_to_destinations = 100 # 自社から平均的に100分程度距離に配達先候補があるとしてデータを作る.\n",
"H_regular = 8*60 # 8時間が定時労働\n",
"H_max_overtime = 3*60 # 残業3時間まで\n",
"c = 3000//60 # 残業による経費60分 3000円\n",
"W = 4000 # 4 トントラックを利用\n",
"delivery_outsourcing_unit_cost = 4600 # 100kg あたり4600円の配送費用\n",
"delivery_time_window = 3 # 連続する3日が配達可能な候補日となる.\n",
"avg_weight = 1000 # 荷物の平均的な重さを1000kgとする\n",
"\n",
"###\n",
"\n",
"K = range(num_places) # 地点の集合\n",
"o = 0 # 自社拠点を表す地点\n",
"K_minus_o = K[1:] # 配達先の集合\n",
"_K = np.random.normal(0, mean_travel_time_to_destinations, size=(len(K), 2)) # 各地点の座標を設定\n",
"_K[o,:] = 0 # 自社拠点は原点とする.\n",
"t = np.array([[np.floor(np.linalg.norm(_K[k] - _K[l])) for k in K] for l in K]) # 各地点間の移動時間行列(分)\n",
"\n",
"D = range(num_days) # 日付の集合\n",
"R = range(num_requests) # 荷物の集合\n",
"k = np.random.choice(K_minus_o, size=len(R)) # k[r] は 荷物 r の配送先を表す\n",
"d_0 = np.random.choice(D, size=len(R)) # d_0[r] は荷物 r の配送可能日の初日を表す\n",
"d_1 = d_0 + delivery_time_window-1 # d_1[r] は荷物 r の配送可能日の最終日を表す\n",
"w = np.floor(np.random.gamma(10, avg_weight/10, size=len(R))) # w[r] が荷物 r の重さ(kg)を表す\n",
"f = np.ceil(w/100)*delivery_outsourcing_unit_cost # f[r] が荷物 r の外部委託時の配送料を表す"
],
"metadata": {
"id": "4C2bUXm_RVLU"
},
"execution_count": 3,
"outputs": []
},
{
"cell_type": "code",
"source": [
"_ = DataFrame(_K, columns=['x', 'y']).plot(\n",
" kind='scatter', x='x', y='y', figsize=(5 ,5))"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 334
},
"id": "LSspakEfR4nz",
"outputId": "87167205-ca4a-46d2-8822-f0e49871f91c"
},
"execution_count": 4,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 360x360 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"source": [
"## 補助問題\n",
"\n",
"指定された拠点をすべて通る最短経路を求める"
],
"metadata": {
"id": "_Oguck-8XG2O"
}
},
{
"cell_type": "code",
"source": [
"def simulate_route(z): # z : 訪問先の one-hot 表現\n",
" if z[0] == 0:\n",
" return None\n",
"\n",
" problem = pulp.LpProblem(sense=pulp.LpMinimize)\n",
" x = pulp.LpVariable.dicts('x', [(k, l) for k in K for l in K if k != l], cat='Binary')\n",
" u = pulp.LpVariable.dicts('u', K_minus_o, lowBound=1) # MTZ formulation\n",
" h = pulp.LpVariable('h', lowBound=0, cat='Continuous') # 残業時間\n",
"\n",
" for k in K:\n",
" # k からの移動先は1箇所以下\n",
" problem += pulp.lpSum([x[k, l] for l in K if k != l]) <= 1\n",
"\n",
" if z[k] == 1: # k を通る場合\n",
" problem += pulp.lpSum([x[k, l] for l in K if k != l]) == 1\n",
" problem += pulp.lpSum([x[l, k] for l in K if k != l]) == 1\n",
" else: # k を通らない場合\n",
" problem += pulp.lpSum([x[k, l] for l in K if k != l]) == 0\n",
" problem += pulp.lpSum([x[l, k] for l in K if k != l]) == 0\n",
"\n",
" # 出発地点を必ず通るための制約\n",
" for k in K_minus_o:\n",
" for l in K_minus_o:\n",
" if k == l:\n",
" continue\n",
" problem += (u[k] + 1 <= u[l] + len(K_minus_o) * (1-x[k, l]))\n",
"\n",
" # 残業時間の制約\n",
" travel = pulp.lpSum([t[k, l]*x[k, l] for k in K for l in K if k != l])\n",
" problem += (travel - H_regular <= h)\n",
" problem += (h <= H_max_overtime)\n",
"\n",
" problem += travel\n",
"\n",
" result = problem.solve()\n",
" if result != 1:\n",
" return None\n",
"\n",
" route = {(k, l): x[k, l].value() for k in K for l in K if k != l}\n",
" return {'route': route,\n",
" 'travel': travel.value(),\n",
" 'overtime': h.value()}"
],
"metadata": {
"id": "O-a3LCqXX595"
},
"execution_count": 5,
"outputs": []
},
{
"cell_type": "code",
"source": [
"def show_route(route):\n",
"\n",
" fig = plt.figure(figsize=(5, 5))\n",
" ax = fig.add_subplot(1, 1, 1)\n",
"\n",
" length = 0\n",
" ax.scatter(_K[:,0], _K[:,1])\n",
" for i in K:\n",
" plt.annotate(i, (_K[i,0]+5, _K[i,1]+1))\n",
"\n",
" for k in K:\n",
" for l in K:\n",
" if k == l:\n",
" continue\n",
" if route[k, l] == 1:\n",
" length += t[k, l]\n",
" print('dist {} -> {}: {}'.format(k, l, t[k, l]))\n",
" ax.arrow(x=_K[k, 0], y=_K[k, 1], dx=_K[l, 0]-_K[k, 0], dy=_K[l, 1]-_K[k, 1], \n",
" length_includes_head=True, head_width=5, color='gray', alpha=0.5)\n",
" print('total length: {}'.format(length))\n",
"\n",
"destinations = (1, 0, 0, 0, 1, 1, 0, 1, 0, 0)\n",
"route = simulate_route(destinations)['route']\n",
"show_route(route)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 412
},
"id": "rkAG-Zvse8Kl",
"outputId": "0eb929dc-a9ed-4116-ad9f-8d24d5509077"
},
"execution_count": 6,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"dist 0 -> 4: 17.0\n",
"dist 4 -> 7: 65.0\n",
"dist 5 -> 0: 127.0\n",
"dist 7 -> 5: 78.0\n",
"total length: 287.0\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 360x360 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"source": [
"%%time\n",
"def enumerate_routes():\n",
" routes_info = {}\n",
"\n",
" for z in product([0,1], repeat=len(K)):\n",
" result = simulate_route(z)\n",
" if result is not None:\n",
" routes_info[z] = result\n",
"\n",
" return routes_info\n",
"\n",
"routes_info = enumerate_routes()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "hkQTGntXlE1d",
"outputId": "cbb497eb-0eca-4c9b-ef9d-5e5b94b1d6de"
},
"execution_count": 7,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"CPU times: user 6.4 s, sys: 2.55 s, total: 8.94 s\n",
"Wall time: 48.9 s\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"len(routes_info.keys())"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Tb7J41dCpNQC",
"outputId": "437ae1ab-61d4-4186-827c-391399acc3f6"
},
"execution_count": 8,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"285"
]
},
"metadata": {},
"execution_count": 8
}
]
},
{
"cell_type": "markdown",
"source": [
"## 日付別に「配送計画(対処するリクエストの組)」の候補群を用意する"
],
"metadata": {
"id": "BSZ9AE4PNkau"
}
},
{
"cell_type": "code",
"source": [
"def is_OK(requests):\n",
" if sum([w[r] for r in requests]) > W: # 荷重オーバー\n",
" return None\n",
"\n",
" z = [0] * len(K)\n",
" z[0] = 1\n",
" for r in requests:\n",
" z[k[r]] = 1\n",
"\n",
" z = tuple(z)\n",
" if z in routes_info.keys():\n",
" return routes_info[z]\n",
" else:\n",
" return None"
],
"metadata": {
"id": "Y4I-UZ4lzAbK"
},
"execution_count": 9,
"outputs": []
},
{
"cell_type": "code",
"source": [
"def _enumerate_feasible_schedules(current_requests, requests_candidates, result):\n",
" if len(requests_candidates) == 0:\n",
" return result\n",
"\n",
" # 次のリクエストを加えない場合を先に探索\n",
" result = _enumerate_feasible_schedules(current_requests, requests_candidates[1:], result)\n",
"\n",
" # 次のリクエストを加える場合を探索するか検討\n",
" new_requests = current_requests + [requests_candidates[0]]\n",
" route_info = is_OK(new_requests)\n",
"\n",
" # 次のリクエストを加えても重量オーバーしなければこの探索経路を進める\n",
" if route_info is not None:\n",
" new_result = result + [(new_requests, route_info)]\n",
" result = _enumerate_feasible_schedules(new_requests, requests_candidates[1:], new_result)\n",
"\n",
" return result\n",
"\n",
"def enumerate_feasible_schedules(requests_candidates):\n",
" return _enumerate_feasible_schedules([], requests_candidates, [])"
],
"metadata": {
"id": "OeepJYkE48cJ"
},
"execution_count": 10,
"outputs": []
},
{
"cell_type": "code",
"source": [
"def enumerate_schedule(d):\n",
" requests_candidates = [r for r in R if d_0[r] <= d <= d_1[r]]\n",
" result = enumerate_feasible_schedules(requests_candidates)\n",
"\n",
" # 刈り取り\n",
" hold_flag = [True] * len(result)\n",
" for i in range(len(result)-1):\n",
" if not hold_flag[i]:\n",
" continue\n",
" requests_i = result[i][0]\n",
" route_info_i = result[i][1]\n",
" \n",
" for j in range(i+1, len(result)):\n",
" if not hold_flag[i]: # i が消えたらこれ以上の判定は不要\n",
" break\n",
" if not hold_flag[j]:\n",
" continue\n",
" requests_j = result[j][0]\n",
" route_info_j = result[j][1]\n",
" \n",
" if set(requests_i).issubset(set(requests_j)): # j の方がたくさん運ぶ\n",
" if route_info_i['overtime'] >= route_info_j['overtime']: # j の方が残業が少ない\n",
" hold_flag[i] = False # i は不要\n",
"\n",
" if set(requests_j).issubset(set(requests_i)): # i の方がたくさん運ぶ\n",
" if route_info_j['overtime'] >= route_info_i['overtime']: # i の方が残業が少ない\n",
" hold_flag[j] = False # j は不要\n",
"\n",
" feasible_schedules = []\n",
" for i in range(len(result)):\n",
" if hold_flag[i]:\n",
" feasible_schedules.append(result[i])\n",
" return feasible_schedules"
],
"metadata": {
"id": "m4Qv0xRE4FfA"
},
"execution_count": 11,
"outputs": []
},
{
"cell_type": "code",
"source": [
"%%time\n",
"feasible_schedules = {}\n",
"for d in D:\n",
" feasible_schedules[d] = enumerate_schedule(d)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "6VyFMGhTIHqT",
"outputId": "9a525cf8-d43f-4002-ce12-f81ba3940825"
},
"execution_count": 12,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"CPU times: user 5.93 s, sys: 117 ms, total: 6.05 s\n",
"Wall time: 6.07 s\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"print('一日の最大スケジュール候補数:', max([len(df) for df in feasible_schedules.values()]))\n",
"print('スケジュール候補数の合計:', sum([len(df) for df in feasible_schedules.values()]))"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "_E7nd-y5urnK",
"outputId": "60af5abd-601b-4d70-f3e5-5dcf8d9e0811"
},
"execution_count": 13,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"一日の最大スケジュール候補数: 939\n",
"スケジュール候補数の合計: 8430\n"
]
}
]
},
{
"cell_type": "markdown",
"source": [
"## 最適な配送計画を選択"
],
"metadata": {
"id": "2pgdqcHJ1m4q"
}
},
{
"cell_type": "code",
"source": [
"problem = pulp.LpProblem(sense=pulp.LpMinimize)\n",
"\n",
"z = {} # 日毎にどの配送計画を採用するかを示す変数\n",
"deliver_count = {r: pulp.LpAffineExpression() for r in R} # 対応済みリクエスト\n",
"h = {} # 日毎の残業時間\n",
"\n",
"for d in D:\n",
" for q in range(len(feasible_schedules[d])):\n",
" z[d, q] = pulp.LpVariable('z_{}_{}'.format(d, q), cat='Binary')\n",
"\n",
"for d in D:\n",
" for q, schedule in enumerate(feasible_schedules[d]):\n",
" requests_q = schedule[0]\n",
" for r in requests_q:\n",
" deliver_count[r] += z[d, q]\n",
"\n",
"for d in D:\n",
" h[d] = pulp.lpSum(\n",
" [z[d, q] * schedule[1]['overtime']\n",
" for q, schedule in enumerate(feasible_schedules[d])]\n",
" )\n",
"\n",
"# 外注するリクエスト\n",
"y = {}\n",
"for r in R:\n",
" y[r] = pulp.LpVariable('y_{}'.format(r), cat='Continuous', lowBound=0, upBound=1) # 0 or 1 に最適化される\n",
"\n",
"\n",
"# Constraints\n",
"for d in D:\n",
" problem += (\n",
" pulp.lpSum(z[d, q] for q in range(len(feasible_schedules[d]))) == 1\n",
" )\n",
"\n",
"for r in R:\n",
" problem += (\n",
" y[r] >= 1 - deliver_count[r]\n",
" )\n",
"\n",
"# Objective\n",
"obj_overtime = pulp.lpSum([c * h[d] for d in D])\n",
"obj_outsourcing = pulp.lpSum([f[r] * y[r] for r in R])\n",
"\n",
"problem += (obj_overtime + obj_outsourcing)"
],
"metadata": {
"id": "7neh-KRqN2jD"
},
"execution_count": 14,
"outputs": []
},
{
"cell_type": "code",
"source": [
"%%time\n",
"problem.solve()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "xslO_svuTnwP",
"outputId": "3ee433fb-b7f7-4c50-bea5-c1939772a99f"
},
"execution_count": 15,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"CPU times: user 258 ms, sys: 14.7 ms, total: 273 ms\n",
"Wall time: 7.08 s\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"1"
]
},
"metadata": {},
"execution_count": 15
}
]
},
{
"cell_type": "code",
"source": [
"optimal_schedule = {}\n",
"for d in D:\n",
" for q, schedule in enumerate(feasible_schedules[d]):\n",
" if z[d, q].value() == 1:\n",
" print(d, schedule)\n",
" optimal_schedule[d] = {\n",
" 'requests': schedule[0],\n",
" 'route': schedule[1]['route']\n",
" }"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "W5kcbQAMTz15",
"outputId": "4f3a1e3f-4399-4b08-99ce-597064700cc2"
},
"execution_count": 16,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"0 ([26, 100, 112], {'route': {(0, 1): 0.0, (0, 2): 0.0, (0, 3): 0.0, (0, 4): 1.0, (0, 5): 0.0, (0, 6): 0.0, (0, 7): 0.0, (0, 8): 0.0, (0, 9): 0.0, (1, 0): 0.0, (1, 2): 0.0, (1, 3): 0.0, (1, 4): 0.0, (1, 5): 0.0, (1, 6): 0.0, (1, 7): 0.0, (1, 8): 0.0, (1, 9): 0.0, (2, 0): 0.0, (2, 1): 0.0, (2, 3): 0.0, (2, 4): 0.0, (2, 5): 0.0, (2, 6): 0.0, (2, 7): 0.0, (2, 8): 0.0, (2, 9): 0.0, (3, 0): 0.0, (3, 1): 0.0, (3, 2): 0.0, (3, 4): 0.0, (3, 5): 0.0, (3, 6): 0.0, (3, 7): 0.0, (3, 8): 0.0, (3, 9): 0.0, (4, 0): 0.0, (4, 1): 0.0, (4, 2): 0.0, (4, 3): 0.0, (4, 5): 0.0, (4, 6): 0.0, (4, 7): 0.0, (4, 8): 0.0, (4, 9): 1.0, (5, 0): 0.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 0.0, (5, 4): 0.0, (5, 6): 0.0, (5, 7): 0.0, (5, 8): 0.0, (5, 9): 0.0, (6, 0): 0.0, (6, 1): 0.0, (6, 2): 0.0, (6, 3): 0.0, (6, 4): 0.0, (6, 5): 0.0, (6, 7): 0.0, (6, 8): 0.0, (6, 9): 0.0, (7, 0): 1.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 0.0, (7, 6): 0.0, (7, 8): 0.0, (7, 9): 0.0, (8, 0): 0.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 0.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 0.0, (8, 9): 0.0, (9, 0): 0.0, (9, 1): 0.0, (9, 2): 0.0, (9, 3): 0.0, (9, 4): 0.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 1.0, (9, 8): 0.0}, 'travel': 437.0, 'overtime': 0.0})\n",
"1 ([52, 100, 103, 112], {'route': {(0, 1): 0.0, (0, 2): 0.0, (0, 3): 0.0, (0, 4): 0.0, (0, 5): 0.0, (0, 6): 0.0, (0, 7): 1.0, (0, 8): 0.0, (0, 9): 0.0, (1, 0): 0.0, (1, 2): 0.0, (1, 3): 0.0, (1, 4): 0.0, (1, 5): 0.0, (1, 6): 0.0, (1, 7): 0.0, (1, 8): 0.0, (1, 9): 0.0, (2, 0): 0.0, (2, 1): 0.0, (2, 3): 0.0, (2, 4): 0.0, (2, 5): 0.0, (2, 6): 0.0, (2, 7): 0.0, (2, 8): 0.0, (2, 9): 0.0, (3, 0): 0.0, (3, 1): 0.0, (3, 2): 0.0, (3, 4): 1.0, (3, 5): 0.0, (3, 6): 0.0, (3, 7): 0.0, (3, 8): 0.0, (3, 9): 0.0, (4, 0): 1.0, (4, 1): 0.0, (4, 2): 0.0, (4, 3): 0.0, (4, 5): 0.0, (4, 6): 0.0, (4, 7): 0.0, (4, 8): 0.0, (4, 9): 0.0, (5, 0): 0.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 1.0, (5, 4): 0.0, (5, 6): 0.0, (5, 7): 0.0, (5, 8): 0.0, (5, 9): 0.0, (6, 0): 0.0, (6, 1): 0.0, (6, 2): 0.0, (6, 3): 0.0, (6, 4): 0.0, (6, 5): 0.0, (6, 7): 0.0, (6, 8): 0.0, (6, 9): 0.0, (7, 0): 0.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 1.0, (7, 6): 0.0, (7, 8): 0.0, (7, 9): 0.0, (8, 0): 0.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 0.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 0.0, (8, 9): 0.0, (9, 0): 0.0, (9, 1): 0.0, (9, 2): 0.0, (9, 3): 0.0, (9, 4): 0.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 0.0, (9, 8): 0.0}, 'travel': 293.0, 'overtime': 0.0})\n",
"2 ([10, 52, 112, 113], {'route': {(0, 1): 0.0, (0, 2): 0.0, (0, 3): 1.0, (0, 4): 0.0, (0, 5): 0.0, (0, 6): 0.0, (0, 7): 0.0, (0, 8): 0.0, (0, 9): 0.0, (1, 0): 0.0, (1, 2): 0.0, (1, 3): 0.0, (1, 4): 0.0, (1, 5): 0.0, (1, 6): 0.0, (1, 7): 0.0, (1, 8): 0.0, (1, 9): 0.0, (2, 0): 0.0, (2, 1): 0.0, (2, 3): 0.0, (2, 4): 0.0, (2, 5): 0.0, (2, 6): 0.0, (2, 7): 0.0, (2, 8): 0.0, (2, 9): 0.0, (3, 0): 0.0, (3, 1): 0.0, (3, 2): 0.0, (3, 4): 0.0, (3, 5): 1.0, (3, 6): 0.0, (3, 7): 0.0, (3, 8): 0.0, (3, 9): 0.0, (4, 0): 1.0, (4, 1): 0.0, (4, 2): 0.0, (4, 3): 0.0, (4, 5): 0.0, (4, 6): 0.0, (4, 7): 0.0, (4, 8): 0.0, (4, 9): 0.0, (5, 0): 0.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 0.0, (5, 4): 0.0, (5, 6): 0.0, (5, 7): 0.0, (5, 8): 1.0, (5, 9): 0.0, (6, 0): 0.0, (6, 1): 0.0, (6, 2): 0.0, (6, 3): 0.0, (6, 4): 0.0, (6, 5): 0.0, (6, 7): 0.0, (6, 8): 0.0, (6, 9): 0.0, (7, 0): 0.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 0.0, (7, 6): 0.0, (7, 8): 0.0, (7, 9): 0.0, (8, 0): 0.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 1.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 0.0, (8, 9): 0.0, (9, 0): 0.0, (9, 1): 0.0, (9, 2): 0.0, (9, 3): 0.0, (9, 4): 0.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 0.0, (9, 8): 0.0}, 'travel': 462.0, 'overtime': 0.0})\n",
"3 ([10, 86, 88, 109], {'route': {(0, 1): 0.0, (0, 2): 0.0, (0, 3): 0.0, (0, 4): 0.0, (0, 5): 0.0, (0, 6): 0.0, (0, 7): 0.0, (0, 8): 0.0, (0, 9): 1.0, (1, 0): 0.0, (1, 2): 0.0, (1, 3): 0.0, (1, 4): 0.0, (1, 5): 0.0, (1, 6): 0.0, (1, 7): 0.0, (1, 8): 0.0, (1, 9): 0.0, (2, 0): 0.0, (2, 1): 0.0, (2, 3): 0.0, (2, 4): 0.0, (2, 5): 0.0, (2, 6): 0.0, (2, 7): 0.0, (2, 8): 1.0, (2, 9): 0.0, (3, 0): 0.0, (3, 1): 0.0, (3, 2): 0.0, (3, 4): 0.0, (3, 5): 0.0, (3, 6): 0.0, (3, 7): 0.0, (3, 8): 0.0, (3, 9): 0.0, (4, 0): 0.0, (4, 1): 0.0, (4, 2): 0.0, (4, 3): 0.0, (4, 5): 0.0, (4, 6): 0.0, (4, 7): 0.0, (4, 8): 0.0, (4, 9): 0.0, (5, 0): 0.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 0.0, (5, 4): 0.0, (5, 6): 0.0, (5, 7): 0.0, (5, 8): 0.0, (5, 9): 0.0, (6, 0): 0.0, (6, 1): 0.0, (6, 2): 0.0, (6, 3): 0.0, (6, 4): 0.0, (6, 5): 0.0, (6, 7): 0.0, (6, 8): 0.0, (6, 9): 0.0, (7, 0): 0.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 0.0, (7, 6): 0.0, (7, 8): 0.0, (7, 9): 0.0, (8, 0): 1.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 0.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 0.0, (8, 9): 0.0, (9, 0): 0.0, (9, 1): 0.0, (9, 2): 1.0, (9, 3): 0.0, (9, 4): 0.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 0.0, (9, 8): 0.0}, 'travel': 585.0, 'overtime': 105.0})\n",
"4 ([28, 32, 64, 99], {'route': {(0, 1): 0.0, (0, 2): 0.0, (0, 3): 0.0, (0, 4): 0.0, (0, 5): 0.0, (0, 6): 0.0, (0, 7): 1.0, (0, 8): 0.0, (0, 9): 0.0, (1, 0): 0.0, (1, 2): 0.0, (1, 3): 0.0, (1, 4): 0.0, (1, 5): 0.0, (1, 6): 0.0, (1, 7): 0.0, (1, 8): 1.0, (1, 9): 0.0, (2, 0): 0.0, (2, 1): 0.0, (2, 3): 0.0, (2, 4): 0.0, (2, 5): 0.0, (2, 6): 0.0, (2, 7): 0.0, (2, 8): 0.0, (2, 9): 0.0, (3, 0): 0.0, (3, 1): 0.0, (3, 2): 0.0, (3, 4): 0.0, (3, 5): 0.0, (3, 6): 0.0, (3, 7): 0.0, (3, 8): 0.0, (3, 9): 0.0, (4, 0): 0.0, (4, 1): 0.0, (4, 2): 0.0, (4, 3): 0.0, (4, 5): 0.0, (4, 6): 0.0, (4, 7): 0.0, (4, 8): 0.0, (4, 9): 0.0, (5, 0): 0.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 0.0, (5, 4): 0.0, (5, 6): 0.0, (5, 7): 0.0, (5, 8): 0.0, (5, 9): 0.0, (6, 0): 0.0, (6, 1): 1.0, (6, 2): 0.0, (6, 3): 0.0, (6, 4): 0.0, (6, 5): 0.0, (6, 7): 0.0, (6, 8): 0.0, (6, 9): 0.0, (7, 0): 0.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 0.0, (7, 6): 1.0, (7, 8): 0.0, (7, 9): 0.0, (8, 0): 1.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 0.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 0.0, (8, 9): 0.0, (9, 0): 0.0, (9, 1): 0.0, (9, 2): 0.0, (9, 3): 0.0, (9, 4): 0.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 0.0, (9, 8): 0.0}, 'travel': 457.0, 'overtime': 0.0})\n",
"5 ([3, 16, 69, 115], {'route': {(0, 1): 1.0, (0, 2): 0.0, (0, 3): 0.0, (0, 4): 0.0, (0, 5): 0.0, (0, 6): 0.0, (0, 7): 0.0, (0, 8): 0.0, (0, 9): 0.0, (1, 0): 0.0, (1, 2): 0.0, (1, 3): 0.0, (1, 4): 0.0, (1, 5): 1.0, (1, 6): 0.0, (1, 7): 0.0, (1, 8): 0.0, (1, 9): 0.0, (2, 0): 0.0, (2, 1): 0.0, (2, 3): 0.0, (2, 4): 0.0, (2, 5): 0.0, (2, 6): 0.0, (2, 7): 0.0, (2, 8): 0.0, (2, 9): 0.0, (3, 0): 0.0, (3, 1): 0.0, (3, 2): 0.0, (3, 4): 0.0, (3, 5): 0.0, (3, 6): 0.0, (3, 7): 0.0, (3, 8): 0.0, (3, 9): 0.0, (4, 0): 0.0, (4, 1): 0.0, (4, 2): 0.0, (4, 3): 0.0, (4, 5): 0.0, (4, 6): 0.0, (4, 7): 0.0, (4, 8): 0.0, (4, 9): 0.0, (5, 0): 0.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 0.0, (5, 4): 0.0, (5, 6): 0.0, (5, 7): 1.0, (5, 8): 0.0, (5, 9): 0.0, (6, 0): 0.0, (6, 1): 0.0, (6, 2): 0.0, (6, 3): 0.0, (6, 4): 0.0, (6, 5): 0.0, (6, 7): 0.0, (6, 8): 0.0, (6, 9): 0.0, (7, 0): 1.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 0.0, (7, 6): 0.0, (7, 8): 0.0, (7, 9): 0.0, (8, 0): 0.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 0.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 0.0, (8, 9): 0.0, (9, 0): 0.0, (9, 1): 0.0, (9, 2): 0.0, (9, 3): 0.0, (9, 4): 0.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 0.0, (9, 8): 0.0}, 'travel': 513.0, 'overtime': 33.0})\n",
"6 ([33, 58, 81, 114], {'route': {(0, 1): 1.0, (0, 2): 0.0, (0, 3): 0.0, (0, 4): 0.0, (0, 5): 0.0, (0, 6): 0.0, (0, 7): 0.0, (0, 8): 0.0, (0, 9): 0.0, (1, 0): 0.0, (1, 2): 0.0, (1, 3): 0.0, (1, 4): 0.0, (1, 5): 0.0, (1, 6): 1.0, (1, 7): 0.0, (1, 8): 0.0, (1, 9): 0.0, (2, 0): 0.0, (2, 1): 0.0, (2, 3): 0.0, (2, 4): 0.0, (2, 5): 0.0, (2, 6): 0.0, (2, 7): 0.0, (2, 8): 0.0, (2, 9): 0.0, (3, 0): 0.0, (3, 1): 0.0, (3, 2): 0.0, (3, 4): 0.0, (3, 5): 0.0, (3, 6): 0.0, (3, 7): 0.0, (3, 8): 0.0, (3, 9): 0.0, (4, 0): 0.0, (4, 1): 0.0, (4, 2): 0.0, (4, 3): 0.0, (4, 5): 0.0, (4, 6): 0.0, (4, 7): 0.0, (4, 8): 0.0, (4, 9): 0.0, (5, 0): 0.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 0.0, (5, 4): 0.0, (5, 6): 0.0, (5, 7): 0.0, (5, 8): 0.0, (5, 9): 0.0, (6, 0): 1.0, (6, 1): 0.0, (6, 2): 0.0, (6, 3): 0.0, (6, 4): 0.0, (6, 5): 0.0, (6, 7): 0.0, (6, 8): 0.0, (6, 9): 0.0, (7, 0): 0.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 0.0, (7, 6): 0.0, (7, 8): 0.0, (7, 9): 0.0, (8, 0): 0.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 0.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 0.0, (8, 9): 0.0, (9, 0): 0.0, (9, 1): 0.0, (9, 2): 0.0, (9, 3): 0.0, (9, 4): 0.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 0.0, (9, 8): 0.0}, 'travel': 413.0, 'overtime': 0.0})\n",
"7 ([17, 22, 50, 73, 118], {'route': {(0, 1): 0.0, (0, 2): 0.0, (0, 3): 1.0, (0, 4): 0.0, (0, 5): 0.0, (0, 6): 0.0, (0, 7): 0.0, (0, 8): 0.0, (0, 9): 0.0, (1, 0): 0.0, (1, 2): 0.0, (1, 3): 0.0, (1, 4): 0.0, (1, 5): 0.0, (1, 6): 0.0, (1, 7): 0.0, (1, 8): 0.0, (1, 9): 0.0, (2, 0): 0.0, (2, 1): 0.0, (2, 3): 0.0, (2, 4): 0.0, (2, 5): 0.0, (2, 6): 0.0, (2, 7): 0.0, (2, 8): 0.0, (2, 9): 0.0, (3, 0): 0.0, (3, 1): 0.0, (3, 2): 0.0, (3, 4): 0.0, (3, 5): 0.0, (3, 6): 0.0, (3, 7): 0.0, (3, 8): 0.0, (3, 9): 1.0, (4, 0): 1.0, (4, 1): 0.0, (4, 2): 0.0, (4, 3): 0.0, (4, 5): 0.0, (4, 6): 0.0, (4, 7): 0.0, (4, 8): 0.0, (4, 9): 0.0, (5, 0): 0.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 0.0, (5, 4): 0.0, (5, 6): 0.0, (5, 7): 0.0, (5, 8): 0.0, (5, 9): 0.0, (6, 0): 0.0, (6, 1): 0.0, (6, 2): 0.0, (6, 3): 0.0, (6, 4): 0.0, (6, 5): 0.0, (6, 7): 0.0, (6, 8): 0.0, (6, 9): 0.0, (7, 0): 0.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 0.0, (7, 6): 0.0, (7, 8): 0.0, (7, 9): 0.0, (8, 0): 0.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 0.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 0.0, (8, 9): 0.0, (9, 0): 0.0, (9, 1): 0.0, (9, 2): 0.0, (9, 3): 0.0, (9, 4): 1.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 0.0, (9, 8): 0.0}, 'travel': 388.0, 'overtime': 0.0})\n",
"8 ([41, 76, 78, 105], {'route': {(0, 1): 0.0, (0, 2): 0.0, (0, 3): 0.0, (0, 4): 1.0, (0, 5): 0.0, (0, 6): 0.0, (0, 7): 0.0, (0, 8): 0.0, (0, 9): 0.0, (1, 0): 0.0, (1, 2): 0.0, (1, 3): 0.0, (1, 4): 0.0, (1, 5): 0.0, (1, 6): 1.0, (1, 7): 0.0, (1, 8): 0.0, (1, 9): 0.0, (2, 0): 0.0, (2, 1): 0.0, (2, 3): 0.0, (2, 4): 0.0, (2, 5): 0.0, (2, 6): 0.0, (2, 7): 0.0, (2, 8): 0.0, (2, 9): 0.0, (3, 0): 0.0, (3, 1): 0.0, (3, 2): 0.0, (3, 4): 0.0, (3, 5): 0.0, (3, 6): 0.0, (3, 7): 0.0, (3, 8): 0.0, (3, 9): 0.0, (4, 0): 0.0, (4, 1): 1.0, (4, 2): 0.0, (4, 3): 0.0, (4, 5): 0.0, (4, 6): 0.0, (4, 7): 0.0, (4, 8): 0.0, (4, 9): 0.0, (5, 0): 0.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 0.0, (5, 4): 0.0, (5, 6): 0.0, (5, 7): 0.0, (5, 8): 0.0, (5, 9): 0.0, (6, 0): 0.0, (6, 1): 0.0, (6, 2): 0.0, (6, 3): 0.0, (6, 4): 0.0, (6, 5): 0.0, (6, 7): 1.0, (6, 8): 0.0, (6, 9): 0.0, (7, 0): 1.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 0.0, (7, 6): 0.0, (7, 8): 0.0, (7, 9): 0.0, (8, 0): 0.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 0.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 0.0, (8, 9): 0.0, (9, 0): 0.0, (9, 1): 0.0, (9, 2): 0.0, (9, 3): 0.0, (9, 4): 0.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 0.0, (9, 8): 0.0}, 'travel': 472.0, 'overtime': 0.0})\n",
"9 ([19, 43, 47, 95], {'route': {(0, 1): 0.0, (0, 2): 0.0, (0, 3): 1.0, (0, 4): 0.0, (0, 5): 0.0, (0, 6): 0.0, (0, 7): 0.0, (0, 8): 0.0, (0, 9): 0.0, (1, 0): 0.0, (1, 2): 0.0, (1, 3): 0.0, (1, 4): 0.0, (1, 5): 0.0, (1, 6): 0.0, (1, 7): 0.0, (1, 8): 0.0, (1, 9): 0.0, (2, 0): 0.0, (2, 1): 0.0, (2, 3): 0.0, (2, 4): 0.0, (2, 5): 0.0, (2, 6): 0.0, (2, 7): 0.0, (2, 8): 0.0, (2, 9): 0.0, (3, 0): 0.0, (3, 1): 0.0, (3, 2): 0.0, (3, 4): 0.0, (3, 5): 1.0, (3, 6): 0.0, (3, 7): 0.0, (3, 8): 0.0, (3, 9): 0.0, (4, 0): 0.0, (4, 1): 0.0, (4, 2): 0.0, (4, 3): 0.0, (4, 5): 0.0, (4, 6): 0.0, (4, 7): 0.0, (4, 8): 0.0, (4, 9): 0.0, (5, 0): 0.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 0.0, (5, 4): 0.0, (5, 6): 0.0, (5, 7): 0.0, (5, 8): 1.0, (5, 9): 0.0, (6, 0): 0.0, (6, 1): 0.0, (6, 2): 0.0, (6, 3): 0.0, (6, 4): 0.0, (6, 5): 0.0, (6, 7): 0.0, (6, 8): 0.0, (6, 9): 0.0, (7, 0): 0.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 0.0, (7, 6): 0.0, (7, 8): 0.0, (7, 9): 0.0, (8, 0): 1.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 0.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 0.0, (8, 9): 0.0, (9, 0): 0.0, (9, 1): 0.0, (9, 2): 0.0, (9, 3): 0.0, (9, 4): 0.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 0.0, (9, 8): 0.0}, 'travel': 441.0, 'overtime': 0.0})\n",
"10 ([24, 63, 80, 85], {'route': {(0, 1): 1.0, (0, 2): 0.0, (0, 3): 0.0, (0, 4): 0.0, (0, 5): 0.0, (0, 6): 0.0, (0, 7): 0.0, (0, 8): 0.0, (0, 9): 0.0, (1, 0): 0.0, (1, 2): 0.0, (1, 3): 0.0, (1, 4): 0.0, (1, 5): 0.0, (1, 6): 1.0, (1, 7): 0.0, (1, 8): 0.0, (1, 9): 0.0, (2, 0): 0.0, (2, 1): 0.0, (2, 3): 0.0, (2, 4): 0.0, (2, 5): 0.0, (2, 6): 0.0, (2, 7): 0.0, (2, 8): 0.0, (2, 9): 0.0, (3, 0): 0.0, (3, 1): 0.0, (3, 2): 0.0, (3, 4): 0.0, (3, 5): 0.0, (3, 6): 0.0, (3, 7): 0.0, (3, 8): 0.0, (3, 9): 0.0, (4, 0): 0.0, (4, 1): 0.0, (4, 2): 0.0, (4, 3): 0.0, (4, 5): 0.0, (4, 6): 0.0, (4, 7): 0.0, (4, 8): 0.0, (4, 9): 0.0, (5, 0): 0.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 0.0, (5, 4): 0.0, (5, 6): 0.0, (5, 7): 0.0, (5, 8): 0.0, (5, 9): 0.0, (6, 0): 0.0, (6, 1): 0.0, (6, 2): 0.0, (6, 3): 0.0, (6, 4): 0.0, (6, 5): 0.0, (6, 7): 1.0, (6, 8): 0.0, (6, 9): 0.0, (7, 0): 1.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 0.0, (7, 6): 0.0, (7, 8): 0.0, (7, 9): 0.0, (8, 0): 0.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 0.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 0.0, (8, 9): 0.0, (9, 0): 0.0, (9, 1): 0.0, (9, 2): 0.0, (9, 3): 0.0, (9, 4): 0.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 0.0, (9, 8): 0.0}, 'travel': 454.0, 'overtime': 0.0})\n",
"11 ([11, 34, 35, 55], {'route': {(0, 1): 0.0, (0, 2): 1.0, (0, 3): 0.0, (0, 4): 0.0, (0, 5): 0.0, (0, 6): 0.0, (0, 7): 0.0, (0, 8): 0.0, (0, 9): 0.0, (1, 0): 0.0, (1, 2): 0.0, (1, 3): 0.0, (1, 4): 0.0, (1, 5): 0.0, (1, 6): 0.0, (1, 7): 0.0, (1, 8): 0.0, (1, 9): 0.0, (2, 0): 0.0, (2, 1): 0.0, (2, 3): 0.0, (2, 4): 0.0, (2, 5): 0.0, (2, 6): 0.0, (2, 7): 0.0, (2, 8): 0.0, (2, 9): 1.0, (3, 0): 0.0, (3, 1): 0.0, (3, 2): 0.0, (3, 4): 0.0, (3, 5): 0.0, (3, 6): 0.0, (3, 7): 0.0, (3, 8): 0.0, (3, 9): 0.0, (4, 0): 0.0, (4, 1): 0.0, (4, 2): 0.0, (4, 3): 0.0, (4, 5): 0.0, (4, 6): 0.0, (4, 7): 0.0, (4, 8): 0.0, (4, 9): 0.0, (5, 0): 0.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 0.0, (5, 4): 0.0, (5, 6): 0.0, (5, 7): 0.0, (5, 8): 0.0, (5, 9): 0.0, (6, 0): 0.0, (6, 1): 0.0, (6, 2): 0.0, (6, 3): 0.0, (6, 4): 0.0, (6, 5): 0.0, (6, 7): 0.0, (6, 8): 0.0, (6, 9): 0.0, (7, 0): 1.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 0.0, (7, 6): 0.0, (7, 8): 0.0, (7, 9): 0.0, (8, 0): 0.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 0.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 0.0, (8, 9): 0.0, (9, 0): 0.0, (9, 1): 0.0, (9, 2): 0.0, (9, 3): 0.0, (9, 4): 0.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 1.0, (9, 8): 0.0}, 'travel': 435.0, 'overtime': 0.0})\n",
"12 ([23, 46, 98, 104], {'route': {(0, 1): 0.0, (0, 2): 0.0, (0, 3): 1.0, (0, 4): 0.0, (0, 5): 0.0, (0, 6): 0.0, (0, 7): 0.0, (0, 8): 0.0, (0, 9): 0.0, (1, 0): 0.0, (1, 2): 0.0, (1, 3): 0.0, (1, 4): 0.0, (1, 5): 0.0, (1, 6): 0.0, (1, 7): 0.0, (1, 8): 0.0, (1, 9): 0.0, (2, 0): 0.0, (2, 1): 0.0, (2, 3): 0.0, (2, 4): 0.0, (2, 5): 0.0, (2, 6): 0.0, (2, 7): 0.0, (2, 8): 0.0, (2, 9): 0.0, (3, 0): 0.0, (3, 1): 0.0, (3, 2): 0.0, (3, 4): 0.0, (3, 5): 1.0, (3, 6): 0.0, (3, 7): 0.0, (3, 8): 0.0, (3, 9): 0.0, (4, 0): 0.0, (4, 1): 0.0, (4, 2): 0.0, (4, 3): 0.0, (4, 5): 0.0, (4, 6): 0.0, (4, 7): 0.0, (4, 8): 0.0, (4, 9): 0.0, (5, 0): 0.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 0.0, (5, 4): 0.0, (5, 6): 0.0, (5, 7): 0.0, (5, 8): 1.0, (5, 9): 0.0, (6, 0): 0.0, (6, 1): 0.0, (6, 2): 0.0, (6, 3): 0.0, (6, 4): 0.0, (6, 5): 0.0, (6, 7): 0.0, (6, 8): 0.0, (6, 9): 0.0, (7, 0): 0.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 0.0, (7, 6): 0.0, (7, 8): 0.0, (7, 9): 0.0, (8, 0): 1.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 0.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 0.0, (8, 9): 0.0, (9, 0): 0.0, (9, 1): 0.0, (9, 2): 0.0, (9, 3): 0.0, (9, 4): 0.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 0.0, (9, 8): 0.0}, 'travel': 441.0, 'overtime': 0.0})\n",
"13 ([9, 53, 75, 90], {'route': {(0, 1): 1.0, (0, 2): 0.0, (0, 3): 0.0, (0, 4): 0.0, (0, 5): 0.0, (0, 6): 0.0, (0, 7): 0.0, (0, 8): 0.0, (0, 9): 0.0, (1, 0): 0.0, (1, 2): 0.0, (1, 3): 0.0, (1, 4): 0.0, (1, 5): 0.0, (1, 6): 1.0, (1, 7): 0.0, (1, 8): 0.0, (1, 9): 0.0, (2, 0): 0.0, (2, 1): 0.0, (2, 3): 0.0, (2, 4): 0.0, (2, 5): 0.0, (2, 6): 0.0, (2, 7): 0.0, (2, 8): 0.0, (2, 9): 0.0, (3, 0): 0.0, (3, 1): 0.0, (3, 2): 0.0, (3, 4): 0.0, (3, 5): 0.0, (3, 6): 0.0, (3, 7): 0.0, (3, 8): 0.0, (3, 9): 0.0, (4, 0): 0.0, (4, 1): 0.0, (4, 2): 0.0, (4, 3): 0.0, (4, 5): 0.0, (4, 6): 0.0, (4, 7): 0.0, (4, 8): 0.0, (4, 9): 0.0, (5, 0): 0.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 0.0, (5, 4): 0.0, (5, 6): 0.0, (5, 7): 0.0, (5, 8): 0.0, (5, 9): 0.0, (6, 0): 0.0, (6, 1): 0.0, (6, 2): 0.0, (6, 3): 0.0, (6, 4): 0.0, (6, 5): 0.0, (6, 7): 1.0, (6, 8): 0.0, (6, 9): 0.0, (7, 0): 1.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 0.0, (7, 6): 0.0, (7, 8): 0.0, (7, 9): 0.0, (8, 0): 0.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 0.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 0.0, (8, 9): 0.0, (9, 0): 0.0, (9, 1): 0.0, (9, 2): 0.0, (9, 3): 0.0, (9, 4): 0.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 0.0, (9, 8): 0.0}, 'travel': 454.0, 'overtime': 0.0})\n",
"14 ([5, 12, 27, 36], {'route': {(0, 1): 0.0, (0, 2): 1.0, (0, 3): 0.0, (0, 4): 0.0, (0, 5): 0.0, (0, 6): 0.0, (0, 7): 0.0, (0, 8): 0.0, (0, 9): 0.0, (1, 0): 0.0, (1, 2): 0.0, (1, 3): 0.0, (1, 4): 0.0, (1, 5): 0.0, (1, 6): 0.0, (1, 7): 0.0, (1, 8): 0.0, (1, 9): 0.0, (2, 0): 0.0, (2, 1): 0.0, (2, 3): 0.0, (2, 4): 0.0, (2, 5): 0.0, (2, 6): 0.0, (2, 7): 0.0, (2, 8): 0.0, (2, 9): 1.0, (3, 0): 0.0, (3, 1): 0.0, (3, 2): 0.0, (3, 4): 0.0, (3, 5): 0.0, (3, 6): 0.0, (3, 7): 0.0, (3, 8): 0.0, (3, 9): 0.0, (4, 0): 0.0, (4, 1): 0.0, (4, 2): 0.0, (4, 3): 0.0, (4, 5): 0.0, (4, 6): 0.0, (4, 7): 0.0, (4, 8): 0.0, (4, 9): 0.0, (5, 0): 0.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 0.0, (5, 4): 0.0, (5, 6): 0.0, (5, 7): 0.0, (5, 8): 0.0, (5, 9): 0.0, (6, 0): 0.0, (6, 1): 0.0, (6, 2): 0.0, (6, 3): 0.0, (6, 4): 0.0, (6, 5): 0.0, (6, 7): 0.0, (6, 8): 0.0, (6, 9): 0.0, (7, 0): 0.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 0.0, (7, 6): 0.0, (7, 8): 0.0, (7, 9): 0.0, (8, 0): 0.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 0.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 0.0, (8, 9): 0.0, (9, 0): 1.0, (9, 1): 0.0, (9, 2): 0.0, (9, 3): 0.0, (9, 4): 0.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 0.0, (9, 8): 0.0}, 'travel': 371.0, 'overtime': 0.0})\n",
"15 ([29, 30, 56, 62], {'route': {(0, 1): 1.0, (0, 2): 0.0, (0, 3): 0.0, (0, 4): 0.0, (0, 5): 0.0, (0, 6): 0.0, (0, 7): 0.0, (0, 8): 0.0, (0, 9): 0.0, (1, 0): 0.0, (1, 2): 0.0, (1, 3): 0.0, (1, 4): 0.0, (1, 5): 0.0, (1, 6): 1.0, (1, 7): 0.0, (1, 8): 0.0, (1, 9): 0.0, (2, 0): 0.0, (2, 1): 0.0, (2, 3): 0.0, (2, 4): 0.0, (2, 5): 0.0, (2, 6): 0.0, (2, 7): 0.0, (2, 8): 0.0, (2, 9): 0.0, (3, 0): 0.0, (3, 1): 0.0, (3, 2): 0.0, (3, 4): 0.0, (3, 5): 0.0, (3, 6): 0.0, (3, 7): 0.0, (3, 8): 0.0, (3, 9): 0.0, (4, 0): 0.0, (4, 1): 0.0, (4, 2): 0.0, (4, 3): 0.0, (4, 5): 0.0, (4, 6): 0.0, (4, 7): 0.0, (4, 8): 0.0, (4, 9): 0.0, (5, 0): 0.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 0.0, (5, 4): 0.0, (5, 6): 0.0, (5, 7): 0.0, (5, 8): 0.0, (5, 9): 0.0, (6, 0): 0.0, (6, 1): 0.0, (6, 2): 0.0, (6, 3): 0.0, (6, 4): 0.0, (6, 5): 0.0, (6, 7): 1.0, (6, 8): 0.0, (6, 9): 0.0, (7, 0): 1.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 0.0, (7, 6): 0.0, (7, 8): 0.0, (7, 9): 0.0, (8, 0): 0.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 0.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 0.0, (8, 9): 0.0, (9, 0): 0.0, (9, 1): 0.0, (9, 2): 0.0, (9, 3): 0.0, (9, 4): 0.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 0.0, (9, 8): 0.0}, 'travel': 454.0, 'overtime': 0.0})\n",
"16 ([37, 45, 54, 116], {'route': {(0, 1): 1.0, (0, 2): 0.0, (0, 3): 0.0, (0, 4): 0.0, (0, 5): 0.0, (0, 6): 0.0, (0, 7): 0.0, (0, 8): 0.0, (0, 9): 0.0, (1, 0): 0.0, (1, 2): 1.0, (1, 3): 0.0, (1, 4): 0.0, (1, 5): 0.0, (1, 6): 0.0, (1, 7): 0.0, (1, 8): 0.0, (1, 9): 0.0, (2, 0): 1.0, (2, 1): 0.0, (2, 3): 0.0, (2, 4): 0.0, (2, 5): 0.0, (2, 6): 0.0, (2, 7): 0.0, (2, 8): 0.0, (2, 9): 0.0, (3, 0): 0.0, (3, 1): 0.0, (3, 2): 0.0, (3, 4): 0.0, (3, 5): 0.0, (3, 6): 0.0, (3, 7): 0.0, (3, 8): 0.0, (3, 9): 0.0, (4, 0): 0.0, (4, 1): 0.0, (4, 2): 0.0, (4, 3): 0.0, (4, 5): 0.0, (4, 6): 0.0, (4, 7): 0.0, (4, 8): 0.0, (4, 9): 0.0, (5, 0): 0.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 0.0, (5, 4): 0.0, (5, 6): 0.0, (5, 7): 0.0, (5, 8): 0.0, (5, 9): 0.0, (6, 0): 0.0, (6, 1): 0.0, (6, 2): 0.0, (6, 3): 0.0, (6, 4): 0.0, (6, 5): 0.0, (6, 7): 0.0, (6, 8): 0.0, (6, 9): 0.0, (7, 0): 0.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 0.0, (7, 6): 0.0, (7, 8): 0.0, (7, 9): 0.0, (8, 0): 0.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 0.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 0.0, (8, 9): 0.0, (9, 0): 0.0, (9, 1): 0.0, (9, 2): 0.0, (9, 3): 0.0, (9, 4): 0.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 0.0, (9, 8): 0.0}, 'travel': 477.0, 'overtime': 0.0})\n",
"17 ([8, 20, 79, 96], {'route': {(0, 1): 1.0, (0, 2): 0.0, (0, 3): 0.0, (0, 4): 0.0, (0, 5): 0.0, (0, 6): 0.0, (0, 7): 0.0, (0, 8): 0.0, (0, 9): 0.0, (1, 0): 0.0, (1, 2): 0.0, (1, 3): 0.0, (1, 4): 0.0, (1, 5): 0.0, (1, 6): 0.0, (1, 7): 0.0, (1, 8): 1.0, (1, 9): 0.0, (2, 0): 0.0, (2, 1): 0.0, (2, 3): 0.0, (2, 4): 0.0, (2, 5): 0.0, (2, 6): 0.0, (2, 7): 0.0, (2, 8): 0.0, (2, 9): 0.0, (3, 0): 0.0, (3, 1): 0.0, (3, 2): 0.0, (3, 4): 0.0, (3, 5): 0.0, (3, 6): 0.0, (3, 7): 0.0, (3, 8): 0.0, (3, 9): 0.0, (4, 0): 0.0, (4, 1): 0.0, (4, 2): 0.0, (4, 3): 0.0, (4, 5): 0.0, (4, 6): 0.0, (4, 7): 0.0, (4, 8): 0.0, (4, 9): 0.0, (5, 0): 0.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 0.0, (5, 4): 0.0, (5, 6): 0.0, (5, 7): 0.0, (5, 8): 0.0, (5, 9): 0.0, (6, 0): 0.0, (6, 1): 0.0, (6, 2): 0.0, (6, 3): 0.0, (6, 4): 0.0, (6, 5): 0.0, (6, 7): 0.0, (6, 8): 0.0, (6, 9): 0.0, (7, 0): 1.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 0.0, (7, 6): 0.0, (7, 8): 0.0, (7, 9): 0.0, (8, 0): 0.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 0.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 1.0, (8, 9): 0.0, (9, 0): 0.0, (9, 1): 0.0, (9, 2): 0.0, (9, 3): 0.0, (9, 4): 0.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 0.0, (9, 8): 0.0}, 'travel': 386.0, 'overtime': 0.0})\n",
"18 ([13, 49, 59, 70], {'route': {(0, 1): 0.0, (0, 2): 0.0, (0, 3): 1.0, (0, 4): 0.0, (0, 5): 0.0, (0, 6): 0.0, (0, 7): 0.0, (0, 8): 0.0, (0, 9): 0.0, (1, 0): 0.0, (1, 2): 0.0, (1, 3): 0.0, (1, 4): 0.0, (1, 5): 0.0, (1, 6): 0.0, (1, 7): 0.0, (1, 8): 0.0, (1, 9): 0.0, (2, 0): 0.0, (2, 1): 0.0, (2, 3): 0.0, (2, 4): 0.0, (2, 5): 0.0, (2, 6): 0.0, (2, 7): 0.0, (2, 8): 0.0, (2, 9): 0.0, (3, 0): 0.0, (3, 1): 0.0, (3, 2): 0.0, (3, 4): 1.0, (3, 5): 0.0, (3, 6): 0.0, (3, 7): 0.0, (3, 8): 0.0, (3, 9): 0.0, (4, 0): 0.0, (4, 1): 0.0, (4, 2): 0.0, (4, 3): 0.0, (4, 5): 0.0, (4, 6): 0.0, (4, 7): 0.0, (4, 8): 1.0, (4, 9): 0.0, (5, 0): 0.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 0.0, (5, 4): 0.0, (5, 6): 0.0, (5, 7): 0.0, (5, 8): 0.0, (5, 9): 0.0, (6, 0): 0.0, (6, 1): 0.0, (6, 2): 0.0, (6, 3): 0.0, (6, 4): 0.0, (6, 5): 0.0, (6, 7): 0.0, (6, 8): 0.0, (6, 9): 0.0, (7, 0): 0.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 0.0, (7, 6): 0.0, (7, 8): 0.0, (7, 9): 0.0, (8, 0): 1.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 0.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 0.0, (8, 9): 0.0, (9, 0): 0.0, (9, 1): 0.0, (9, 2): 0.0, (9, 3): 0.0, (9, 4): 0.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 0.0, (9, 8): 0.0}, 'travel': 298.0, 'overtime': 0.0})\n",
"19 ([6, 67, 83, 106], {'route': {(0, 1): 0.0, (0, 2): 0.0, (0, 3): 0.0, (0, 4): 0.0, (0, 5): 0.0, (0, 6): 0.0, (0, 7): 1.0, (0, 8): 0.0, (0, 9): 0.0, (1, 0): 0.0, (1, 2): 0.0, (1, 3): 0.0, (1, 4): 0.0, (1, 5): 0.0, (1, 6): 0.0, (1, 7): 0.0, (1, 8): 0.0, (1, 9): 0.0, (2, 0): 0.0, (2, 1): 0.0, (2, 3): 0.0, (2, 4): 0.0, (2, 5): 0.0, (2, 6): 0.0, (2, 7): 0.0, (2, 8): 0.0, (2, 9): 0.0, (3, 0): 0.0, (3, 1): 0.0, (3, 2): 0.0, (3, 4): 0.0, (3, 5): 0.0, (3, 6): 0.0, (3, 7): 0.0, (3, 8): 0.0, (3, 9): 0.0, (4, 0): 0.0, (4, 1): 0.0, (4, 2): 0.0, (4, 3): 0.0, (4, 5): 0.0, (4, 6): 0.0, (4, 7): 0.0, (4, 8): 0.0, (4, 9): 0.0, (5, 0): 0.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 0.0, (5, 4): 0.0, (5, 6): 0.0, (5, 7): 0.0, (5, 8): 0.0, (5, 9): 0.0, (6, 0): 0.0, (6, 1): 0.0, (6, 2): 0.0, (6, 3): 0.0, (6, 4): 0.0, (6, 5): 0.0, (6, 7): 0.0, (6, 8): 0.0, (6, 9): 0.0, (7, 0): 0.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 0.0, (7, 6): 0.0, (7, 8): 0.0, (7, 9): 1.0, (8, 0): 0.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 0.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 0.0, (8, 9): 0.0, (9, 0): 1.0, (9, 1): 0.0, (9, 2): 0.0, (9, 3): 0.0, (9, 4): 0.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 0.0, (9, 8): 0.0}, 'travel': 430.0, 'overtime': 0.0})\n",
"20 ([7, 15, 25], {'route': {(0, 1): 0.0, (0, 2): 0.0, (0, 3): 0.0, (0, 4): 0.0, (0, 5): 1.0, (0, 6): 0.0, (0, 7): 0.0, (0, 8): 0.0, (0, 9): 0.0, (1, 0): 0.0, (1, 2): 0.0, (1, 3): 0.0, (1, 4): 0.0, (1, 5): 0.0, (1, 6): 0.0, (1, 7): 0.0, (1, 8): 0.0, (1, 9): 0.0, (2, 0): 0.0, (2, 1): 0.0, (2, 3): 0.0, (2, 4): 0.0, (2, 5): 0.0, (2, 6): 0.0, (2, 7): 0.0, (2, 8): 0.0, (2, 9): 0.0, (3, 0): 1.0, (3, 1): 0.0, (3, 2): 0.0, (3, 4): 0.0, (3, 5): 0.0, (3, 6): 0.0, (3, 7): 0.0, (3, 8): 0.0, (3, 9): 0.0, (4, 0): 0.0, (4, 1): 0.0, (4, 2): 0.0, (4, 3): 0.0, (4, 5): 0.0, (4, 6): 0.0, (4, 7): 0.0, (4, 8): 0.0, (4, 9): 0.0, (5, 0): 0.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 1.0, (5, 4): 0.0, (5, 6): 0.0, (5, 7): 0.0, (5, 8): 0.0, (5, 9): 0.0, (6, 0): 0.0, (6, 1): 0.0, (6, 2): 0.0, (6, 3): 0.0, (6, 4): 0.0, (6, 5): 0.0, (6, 7): 0.0, (6, 8): 0.0, (6, 9): 0.0, (7, 0): 0.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 0.0, (7, 6): 0.0, (7, 8): 0.0, (7, 9): 0.0, (8, 0): 0.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 0.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 0.0, (8, 9): 0.0, (9, 0): 0.0, (9, 1): 0.0, (9, 2): 0.0, (9, 3): 0.0, (9, 4): 0.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 0.0, (9, 8): 0.0}, 'travel': 265.0, 'overtime': 0.0})\n",
"21 ([71, 84, 94], {'route': {(0, 1): 1.0, (0, 2): 0.0, (0, 3): 0.0, (0, 4): 0.0, (0, 5): 0.0, (0, 6): 0.0, (0, 7): 0.0, (0, 8): 0.0, (0, 9): 0.0, (1, 0): 0.0, (1, 2): 1.0, (1, 3): 0.0, (1, 4): 0.0, (1, 5): 0.0, (1, 6): 0.0, (1, 7): 0.0, (1, 8): 0.0, (1, 9): 0.0, (2, 0): 0.0, (2, 1): 0.0, (2, 3): 0.0, (2, 4): 1.0, (2, 5): 0.0, (2, 6): 0.0, (2, 7): 0.0, (2, 8): 0.0, (2, 9): 0.0, (3, 0): 0.0, (3, 1): 0.0, (3, 2): 0.0, (3, 4): 0.0, (3, 5): 0.0, (3, 6): 0.0, (3, 7): 0.0, (3, 8): 0.0, (3, 9): 0.0, (4, 0): 1.0, (4, 1): 0.0, (4, 2): 0.0, (4, 3): 0.0, (4, 5): 0.0, (4, 6): 0.0, (4, 7): 0.0, (4, 8): 0.0, (4, 9): 0.0, (5, 0): 0.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 0.0, (5, 4): 0.0, (5, 6): 0.0, (5, 7): 0.0, (5, 8): 0.0, (5, 9): 0.0, (6, 0): 0.0, (6, 1): 0.0, (6, 2): 0.0, (6, 3): 0.0, (6, 4): 0.0, (6, 5): 0.0, (6, 7): 0.0, (6, 8): 0.0, (6, 9): 0.0, (7, 0): 0.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 0.0, (7, 6): 0.0, (7, 8): 0.0, (7, 9): 0.0, (8, 0): 0.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 0.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 0.0, (8, 9): 0.0, (9, 0): 0.0, (9, 1): 0.0, (9, 2): 0.0, (9, 3): 0.0, (9, 4): 0.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 0.0, (9, 8): 0.0}, 'travel': 481.0, 'overtime': 1.0})\n",
"22 ([42, 72, 82, 119], {'route': {(0, 1): 0.0, (0, 2): 0.0, (0, 3): 1.0, (0, 4): 0.0, (0, 5): 0.0, (0, 6): 0.0, (0, 7): 0.0, (0, 8): 0.0, (0, 9): 0.0, (1, 0): 1.0, (1, 2): 0.0, (1, 3): 0.0, (1, 4): 0.0, (1, 5): 0.0, (1, 6): 0.0, (1, 7): 0.0, (1, 8): 0.0, (1, 9): 0.0, (2, 0): 0.0, (2, 1): 0.0, (2, 3): 0.0, (2, 4): 1.0, (2, 5): 0.0, (2, 6): 0.0, (2, 7): 0.0, (2, 8): 0.0, (2, 9): 0.0, (3, 0): 0.0, (3, 1): 0.0, (3, 2): 1.0, (3, 4): 0.0, (3, 5): 0.0, (3, 6): 0.0, (3, 7): 0.0, (3, 8): 0.0, (3, 9): 0.0, (4, 0): 0.0, (4, 1): 1.0, (4, 2): 0.0, (4, 3): 0.0, (4, 5): 0.0, (4, 6): 0.0, (4, 7): 0.0, (4, 8): 0.0, (4, 9): 0.0, (5, 0): 0.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 0.0, (5, 4): 0.0, (5, 6): 0.0, (5, 7): 0.0, (5, 8): 0.0, (5, 9): 0.0, (6, 0): 0.0, (6, 1): 0.0, (6, 2): 0.0, (6, 3): 0.0, (6, 4): 0.0, (6, 5): 0.0, (6, 7): 0.0, (6, 8): 0.0, (6, 9): 0.0, (7, 0): 0.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 0.0, (7, 6): 0.0, (7, 8): 0.0, (7, 9): 0.0, (8, 0): 0.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 0.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 0.0, (8, 9): 0.0, (9, 0): 0.0, (9, 1): 0.0, (9, 2): 0.0, (9, 3): 0.0, (9, 4): 0.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 0.0, (9, 8): 0.0}, 'travel': 509.0, 'overtime': 29.0})\n",
"23 ([21, 31, 57, 102], {'route': {(0, 1): 0.0, (0, 2): 0.0, (0, 3): 0.0, (0, 4): 1.0, (0, 5): 0.0, (0, 6): 0.0, (0, 7): 0.0, (0, 8): 0.0, (0, 9): 0.0, (1, 0): 0.0, (1, 2): 0.0, (1, 3): 0.0, (1, 4): 0.0, (1, 5): 0.0, (1, 6): 0.0, (1, 7): 0.0, (1, 8): 0.0, (1, 9): 0.0, (2, 0): 0.0, (2, 1): 0.0, (2, 3): 0.0, (2, 4): 0.0, (2, 5): 0.0, (2, 6): 0.0, (2, 7): 0.0, (2, 8): 0.0, (2, 9): 1.0, (3, 0): 0.0, (3, 1): 0.0, (3, 2): 0.0, (3, 4): 0.0, (3, 5): 0.0, (3, 6): 0.0, (3, 7): 0.0, (3, 8): 0.0, (3, 9): 0.0, (4, 0): 0.0, (4, 1): 0.0, (4, 2): 1.0, (4, 3): 0.0, (4, 5): 0.0, (4, 6): 0.0, (4, 7): 0.0, (4, 8): 0.0, (4, 9): 0.0, (5, 0): 0.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 0.0, (5, 4): 0.0, (5, 6): 0.0, (5, 7): 0.0, (5, 8): 0.0, (5, 9): 0.0, (6, 0): 0.0, (6, 1): 0.0, (6, 2): 0.0, (6, 3): 0.0, (6, 4): 0.0, (6, 5): 0.0, (6, 7): 0.0, (6, 8): 0.0, (6, 9): 0.0, (7, 0): 1.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 0.0, (7, 6): 0.0, (7, 8): 0.0, (7, 9): 0.0, (8, 0): 0.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 0.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 0.0, (8, 9): 0.0, (9, 0): 0.0, (9, 1): 0.0, (9, 2): 0.0, (9, 3): 0.0, (9, 4): 0.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 1.0, (9, 8): 0.0}, 'travel': 439.0, 'overtime': 0.0})\n",
"24 ([1, 92, 110], {'route': {(0, 1): 0.0, (0, 2): 1.0, (0, 3): 0.0, (0, 4): 0.0, (0, 5): 0.0, (0, 6): 0.0, (0, 7): 0.0, (0, 8): 0.0, (0, 9): 0.0, (1, 0): 0.0, (1, 2): 0.0, (1, 3): 0.0, (1, 4): 0.0, (1, 5): 0.0, (1, 6): 0.0, (1, 7): 0.0, (1, 8): 0.0, (1, 9): 0.0, (2, 0): 0.0, (2, 1): 0.0, (2, 3): 0.0, (2, 4): 0.0, (2, 5): 1.0, (2, 6): 0.0, (2, 7): 0.0, (2, 8): 0.0, (2, 9): 0.0, (3, 0): 0.0, (3, 1): 0.0, (3, 2): 0.0, (3, 4): 0.0, (3, 5): 0.0, (3, 6): 0.0, (3, 7): 0.0, (3, 8): 0.0, (3, 9): 0.0, (4, 0): 0.0, (4, 1): 0.0, (4, 2): 0.0, (4, 3): 0.0, (4, 5): 0.0, (4, 6): 0.0, (4, 7): 0.0, (4, 8): 0.0, (4, 9): 0.0, (5, 0): 1.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 0.0, (5, 4): 0.0, (5, 6): 0.0, (5, 7): 0.0, (5, 8): 0.0, (5, 9): 0.0, (6, 0): 0.0, (6, 1): 0.0, (6, 2): 0.0, (6, 3): 0.0, (6, 4): 0.0, (6, 5): 0.0, (6, 7): 0.0, (6, 8): 0.0, (6, 9): 0.0, (7, 0): 0.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 0.0, (7, 6): 0.0, (7, 8): 0.0, (7, 9): 0.0, (8, 0): 0.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 0.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 0.0, (8, 9): 0.0, (9, 0): 0.0, (9, 1): 0.0, (9, 2): 0.0, (9, 3): 0.0, (9, 4): 0.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 0.0, (9, 8): 0.0}, 'travel': 415.0, 'overtime': 0.0})\n",
"25 ([0, 66, 74], {'route': {(0, 1): 0.0, (0, 2): 1.0, (0, 3): 0.0, (0, 4): 0.0, (0, 5): 0.0, (0, 6): 0.0, (0, 7): 0.0, (0, 8): 0.0, (0, 9): 0.0, (1, 0): 0.0, (1, 2): 0.0, (1, 3): 0.0, (1, 4): 0.0, (1, 5): 0.0, (1, 6): 0.0, (1, 7): 0.0, (1, 8): 0.0, (1, 9): 0.0, (2, 0): 0.0, (2, 1): 0.0, (2, 3): 0.0, (2, 4): 0.0, (2, 5): 1.0, (2, 6): 0.0, (2, 7): 0.0, (2, 8): 0.0, (2, 9): 0.0, (3, 0): 0.0, (3, 1): 0.0, (3, 2): 0.0, (3, 4): 0.0, (3, 5): 0.0, (3, 6): 0.0, (3, 7): 0.0, (3, 8): 0.0, (3, 9): 0.0, (4, 0): 0.0, (4, 1): 0.0, (4, 2): 0.0, (4, 3): 0.0, (4, 5): 0.0, (4, 6): 0.0, (4, 7): 0.0, (4, 8): 0.0, (4, 9): 0.0, (5, 0): 0.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 0.0, (5, 4): 0.0, (5, 6): 0.0, (5, 7): 1.0, (5, 8): 0.0, (5, 9): 0.0, (6, 0): 0.0, (6, 1): 0.0, (6, 2): 0.0, (6, 3): 0.0, (6, 4): 0.0, (6, 5): 0.0, (6, 7): 0.0, (6, 8): 0.0, (6, 9): 0.0, (7, 0): 1.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 0.0, (7, 6): 0.0, (7, 8): 0.0, (7, 9): 0.0, (8, 0): 0.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 0.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 0.0, (8, 9): 0.0, (9, 0): 0.0, (9, 1): 0.0, (9, 2): 0.0, (9, 3): 0.0, (9, 4): 0.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 0.0, (9, 8): 0.0}, 'travel': 416.0, 'overtime': 0.0})\n",
"26 ([2, 4, 18, 87], {'route': {(0, 1): 0.0, (0, 2): 0.0, (0, 3): 1.0, (0, 4): 0.0, (0, 5): 0.0, (0, 6): 0.0, (0, 7): 0.0, (0, 8): 0.0, (0, 9): 0.0, (1, 0): 0.0, (1, 2): 0.0, (1, 3): 0.0, (1, 4): 0.0, (1, 5): 0.0, (1, 6): 0.0, (1, 7): 0.0, (1, 8): 0.0, (1, 9): 0.0, (2, 0): 0.0, (2, 1): 0.0, (2, 3): 0.0, (2, 4): 0.0, (2, 5): 0.0, (2, 6): 0.0, (2, 7): 0.0, (2, 8): 0.0, (2, 9): 0.0, (3, 0): 0.0, (3, 1): 0.0, (3, 2): 0.0, (3, 4): 0.0, (3, 5): 0.0, (3, 6): 1.0, (3, 7): 0.0, (3, 8): 0.0, (3, 9): 0.0, (4, 0): 0.0, (4, 1): 0.0, (4, 2): 0.0, (4, 3): 0.0, (4, 5): 0.0, (4, 6): 0.0, (4, 7): 0.0, (4, 8): 0.0, (4, 9): 0.0, (5, 0): 0.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 0.0, (5, 4): 0.0, (5, 6): 0.0, (5, 7): 0.0, (5, 8): 0.0, (5, 9): 0.0, (6, 0): 0.0, (6, 1): 0.0, (6, 2): 0.0, (6, 3): 0.0, (6, 4): 0.0, (6, 5): 0.0, (6, 7): 0.0, (6, 8): 1.0, (6, 9): 0.0, (7, 0): 0.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 0.0, (7, 6): 0.0, (7, 8): 0.0, (7, 9): 0.0, (8, 0): 1.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 0.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 0.0, (8, 9): 0.0, (9, 0): 0.0, (9, 1): 0.0, (9, 2): 0.0, (9, 3): 0.0, (9, 4): 0.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 0.0, (9, 8): 0.0}, 'travel': 385.0, 'overtime': 0.0})\n",
"27 ([14, 38, 40, 61], {'route': {(0, 1): 0.0, (0, 2): 0.0, (0, 3): 0.0, (0, 4): 0.0, (0, 5): 0.0, (0, 6): 1.0, (0, 7): 0.0, (0, 8): 0.0, (0, 9): 0.0, (1, 0): 0.0, (1, 2): 0.0, (1, 3): 0.0, (1, 4): 0.0, (1, 5): 0.0, (1, 6): 0.0, (1, 7): 0.0, (1, 8): 0.0, (1, 9): 0.0, (2, 0): 1.0, (2, 1): 0.0, (2, 3): 0.0, (2, 4): 0.0, (2, 5): 0.0, (2, 6): 0.0, (2, 7): 0.0, (2, 8): 0.0, (2, 9): 0.0, (3, 0): 0.0, (3, 1): 0.0, (3, 2): 1.0, (3, 4): 0.0, (3, 5): 0.0, (3, 6): 0.0, (3, 7): 0.0, (3, 8): 0.0, (3, 9): 0.0, (4, 0): 0.0, (4, 1): 0.0, (4, 2): 0.0, (4, 3): 0.0, (4, 5): 0.0, (4, 6): 0.0, (4, 7): 0.0, (4, 8): 0.0, (4, 9): 0.0, (5, 0): 0.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 0.0, (5, 4): 0.0, (5, 6): 0.0, (5, 7): 0.0, (5, 8): 0.0, (5, 9): 0.0, (6, 0): 0.0, (6, 1): 0.0, (6, 2): 0.0, (6, 3): 1.0, (6, 4): 0.0, (6, 5): 0.0, (6, 7): 0.0, (6, 8): 0.0, (6, 9): 0.0, (7, 0): 0.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 0.0, (7, 6): 0.0, (7, 8): 0.0, (7, 9): 0.0, (8, 0): 0.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 0.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 0.0, (8, 9): 0.0, (9, 0): 0.0, (9, 1): 0.0, (9, 2): 0.0, (9, 3): 0.0, (9, 4): 0.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 0.0, (9, 8): 0.0}, 'travel': 479.0, 'overtime': 0.0})\n",
"28 ([48, 60, 101], {'route': {(0, 1): 1.0, (0, 2): 0.0, (0, 3): 0.0, (0, 4): 0.0, (0, 5): 0.0, (0, 6): 0.0, (0, 7): 0.0, (0, 8): 0.0, (0, 9): 0.0, (1, 0): 0.0, (1, 2): 1.0, (1, 3): 0.0, (1, 4): 0.0, (1, 5): 0.0, (1, 6): 0.0, (1, 7): 0.0, (1, 8): 0.0, (1, 9): 0.0, (2, 0): 1.0, (2, 1): 0.0, (2, 3): 0.0, (2, 4): 0.0, (2, 5): 0.0, (2, 6): 0.0, (2, 7): 0.0, (2, 8): 0.0, (2, 9): 0.0, (3, 0): 0.0, (3, 1): 0.0, (3, 2): 0.0, (3, 4): 0.0, (3, 5): 0.0, (3, 6): 0.0, (3, 7): 0.0, (3, 8): 0.0, (3, 9): 0.0, (4, 0): 0.0, (4, 1): 0.0, (4, 2): 0.0, (4, 3): 0.0, (4, 5): 0.0, (4, 6): 0.0, (4, 7): 0.0, (4, 8): 0.0, (4, 9): 0.0, (5, 0): 0.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 0.0, (5, 4): 0.0, (5, 6): 0.0, (5, 7): 0.0, (5, 8): 0.0, (5, 9): 0.0, (6, 0): 0.0, (6, 1): 0.0, (6, 2): 0.0, (6, 3): 0.0, (6, 4): 0.0, (6, 5): 0.0, (6, 7): 0.0, (6, 8): 0.0, (6, 9): 0.0, (7, 0): 0.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 0.0, (7, 6): 0.0, (7, 8): 0.0, (7, 9): 0.0, (8, 0): 0.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 0.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 0.0, (8, 9): 0.0, (9, 0): 0.0, (9, 1): 0.0, (9, 2): 0.0, (9, 3): 0.0, (9, 4): 0.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 0.0, (9, 8): 0.0}, 'travel': 477.0, 'overtime': 0.0})\n",
"29 ([68, 107, 111, 117], {'route': {(0, 1): 0.0, (0, 2): 0.0, (0, 3): 1.0, (0, 4): 0.0, (0, 5): 0.0, (0, 6): 0.0, (0, 7): 0.0, (0, 8): 0.0, (0, 9): 0.0, (1, 0): 0.0, (1, 2): 0.0, (1, 3): 0.0, (1, 4): 0.0, (1, 5): 0.0, (1, 6): 0.0, (1, 7): 0.0, (1, 8): 0.0, (1, 9): 0.0, (2, 0): 0.0, (2, 1): 0.0, (2, 3): 0.0, (2, 4): 0.0, (2, 5): 0.0, (2, 6): 0.0, (2, 7): 0.0, (2, 8): 0.0, (2, 9): 0.0, (3, 0): 0.0, (3, 1): 0.0, (3, 2): 0.0, (3, 4): 0.0, (3, 5): 1.0, (3, 6): 0.0, (3, 7): 0.0, (3, 8): 0.0, (3, 9): 0.0, (4, 0): 0.0, (4, 1): 0.0, (4, 2): 0.0, (4, 3): 0.0, (4, 5): 0.0, (4, 6): 0.0, (4, 7): 0.0, (4, 8): 0.0, (4, 9): 0.0, (5, 0): 0.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 0.0, (5, 4): 0.0, (5, 6): 0.0, (5, 7): 1.0, (5, 8): 0.0, (5, 9): 0.0, (6, 0): 0.0, (6, 1): 0.0, (6, 2): 0.0, (6, 3): 0.0, (6, 4): 0.0, (6, 5): 0.0, (6, 7): 0.0, (6, 8): 0.0, (6, 9): 0.0, (7, 0): 1.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 0.0, (7, 6): 0.0, (7, 8): 0.0, (7, 9): 0.0, (8, 0): 0.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 0.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 0.0, (8, 9): 0.0, (9, 0): 0.0, (9, 1): 0.0, (9, 2): 0.0, (9, 3): 0.0, (9, 4): 0.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 0.0, (9, 8): 0.0}, 'travel': 266.0, 'overtime': 0.0})\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"show_route(optimal_schedule[0]['route'])"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 412
},
"id": "Seii9Kivy4KE",
"outputId": "8eb8ae85-bf5b-4d38-9903-5acff8a801cd"
},
"execution_count": 17,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"dist 0 -> 4: 17.0\n",
"dist 4 -> 9: 173.0\n",
"dist 7 -> 0: 50.0\n",
"dist 9 -> 7: 197.0\n",
"total length: 437.0\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 360x360 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"source": [
"requests_summary_df = pd.DataFrame(\n",
" [{\n",
" 'outsourced': y[r].value(),\n",
" 'weight': w[r],\n",
" 'freight': f[r],\n",
" 'location': k[r],\n",
" 'distance_from_o': t[k[r], o]\n",
" } for r in R]\n",
")\n",
"requests_summary_df"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 424
},
"id": "Sf8tC5Zci7d5",
"outputId": "fd9ae3c3-ea56-498c-fde1-b555ebd4e62a"
},
"execution_count": 18,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" outsourced weight freight location distance_from_o\n",
"0 0.0 1147.0 55200.0 2 95.0\n",
"1 0.0 1166.0 55200.0 5 127.0\n",
"2 0.0 588.0 27600.0 3 28.0\n",
"3 0.0 770.0 36800.0 7 50.0\n",
"4 0.0 1836.0 87400.0 8 114.0\n",
".. ... ... ... ... ...\n",
"115 0.0 1250.0 59800.0 5 127.0\n",
"116 0.0 1222.0 59800.0 1 154.0\n",
"117 0.0 956.0 46000.0 3 28.0\n",
"118 0.0 1088.0 50600.0 9 183.0\n",
"119 0.0 940.0 46000.0 1 154.0\n",
"\n",
"[120 rows x 5 columns]"
],
"text/html": [
"\n",
" <div id=\"df-cfe357e6-004f-4c93-8a4d-d2a3b90e53bf\">\n",
" <div class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>outsourced</th>\n",
" <th>weight</th>\n",
" <th>freight</th>\n",
" <th>location</th>\n",
" <th>distance_from_o</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0.0</td>\n",
" <td>1147.0</td>\n",
" <td>55200.0</td>\n",
" <td>2</td>\n",
" <td>95.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0.0</td>\n",
" <td>1166.0</td>\n",
" <td>55200.0</td>\n",
" <td>5</td>\n",
" <td>127.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0.0</td>\n",
" <td>588.0</td>\n",
" <td>27600.0</td>\n",
" <td>3</td>\n",
" <td>28.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0.0</td>\n",
" <td>770.0</td>\n",
" <td>36800.0</td>\n",
" <td>7</td>\n",
" <td>50.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0.0</td>\n",
" <td>1836.0</td>\n",
" <td>87400.0</td>\n",
" <td>8</td>\n",
" <td>114.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>115</th>\n",
" <td>0.0</td>\n",
" <td>1250.0</td>\n",
" <td>59800.0</td>\n",
" <td>5</td>\n",
" <td>127.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>116</th>\n",
" <td>0.0</td>\n",
" <td>1222.0</td>\n",
" <td>59800.0</td>\n",
" <td>1</td>\n",
" <td>154.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>117</th>\n",
" <td>0.0</td>\n",
" <td>956.0</td>\n",
" <td>46000.0</td>\n",
" <td>3</td>\n",
" <td>28.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>118</th>\n",
" <td>0.0</td>\n",
" <td>1088.0</td>\n",
" <td>50600.0</td>\n",
" <td>9</td>\n",
" <td>183.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>119</th>\n",
" <td>0.0</td>\n",
" <td>940.0</td>\n",
" <td>46000.0</td>\n",
" <td>1</td>\n",
" <td>154.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>120 rows × 5 columns</p>\n",
"</div>\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-cfe357e6-004f-4c93-8a4d-d2a3b90e53bf')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
" \n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
" <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
" </svg>\n",
" </button>\n",
" \n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" flex-wrap:wrap;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-cfe357e6-004f-4c93-8a4d-d2a3b90e53bf button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-cfe357e6-004f-4c93-8a4d-d2a3b90e53bf');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
" </div>\n",
" "
]
},
"metadata": {},
"execution_count": 18
}
]
},
{
"cell_type": "code",
"source": [
"requests_summary_df.groupby('outsourced')[['weight', 'freight', 'distance_from_o']].agg('mean')"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 143
},
"id": "MMNF7kN6jmf-",
"outputId": "dacd0bac-d24b-4ebe-d0bb-ca9eb5719965"
},
"execution_count": 19,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" weight freight distance_from_o\n",
"outsourced \n",
"0.0 1013.518182 48718.181818 106.827273\n",
"1.0 947.800000 45080.000000 119.300000"
],
"text/html": [
"\n",
" <div id=\"df-52d9eb54-9d81-4896-b5df-2c4abd53a02d\">\n",
" <div class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>weight</th>\n",
" <th>freight</th>\n",
" <th>distance_from_o</th>\n",
" </tr>\n",
" <tr>\n",
" <th>outsourced</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0.0</th>\n",
" <td>1013.518182</td>\n",
" <td>48718.181818</td>\n",
" <td>106.827273</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1.0</th>\n",
" <td>947.800000</td>\n",
" <td>45080.000000</td>\n",
" <td>119.300000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-52d9eb54-9d81-4896-b5df-2c4abd53a02d')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
" \n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
" <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
" </svg>\n",
" </button>\n",
" \n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" flex-wrap:wrap;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-52d9eb54-9d81-4896-b5df-2c4abd53a02d button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-52d9eb54-9d81-4896-b5df-2c4abd53a02d');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
" </div>\n",
" "
]
},
"metadata": {},
"execution_count": 19
}
]
},
{
"cell_type": "code",
"source": [
"requests_summary_df.plot.scatter(x='distance_from_o', y='freight', c='outsourced', cmap='cool')\n",
"plt.show()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 258
},
"id": "3XQCXqVa1M03",
"outputId": "b0bb4f12-531e-4482-a479-f73c2382b99b"
},
"execution_count": 20,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"source": [
"## 距離の丸め誤差について"
],
"metadata": {
"id": "ElUK4_Yw8vo9"
}
},
{
"cell_type": "markdown",
"source": [
"2 地点間の距離を計算する際に、`np.floor` で小数点以下を切り捨てているため、三角不等式が成り立たない場合が発生している。\n",
"\n",
"```\n",
"t = np.array([[np.floor(np.linalg.norm(_K[k] - _K[l])) for k in K] for l in K]) # 各地点間の移動時間行列(分)\n",
"```\n",
"\n",
"下記の例では、4 - 5 よりも 4 - 7 - 5 の方が移動時間が短くなっている"
],
"metadata": {
"id": "YisRyVU-9h1g"
}
},
{
"cell_type": "code",
"source": [
"destinations = (1, 0, 0, 0, 1, 1, 0, 0, 0, 0)\n",
"route = simulate_route(destinations)['route']\n",
"show_route(route)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 393
},
"id": "VbN9f0vy9NbH",
"outputId": "05400efd-e51a-4816-9d12-6b2ae6efd655"
},
"execution_count": 21,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"dist 0 -> 5: 127.0\n",
"dist 4 -> 0: 17.0\n",
"dist 5 -> 4: 144.0\n",
"total length: 288.0\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 360x360 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"source": [
"destinations = (1, 0, 0, 0, 1, 1, 0, 1, 0, 0)\n",
"route = simulate_route(destinations)['route']\n",
"show_route(route)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 412
},
"id": "7sSFlp-r9LP8",
"outputId": "a1126dc9-5f28-463c-b648-f402cc62099e"
},
"execution_count": 22,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"dist 0 -> 4: 17.0\n",
"dist 4 -> 7: 65.0\n",
"dist 5 -> 0: 127.0\n",
"dist 7 -> 5: 78.0\n",
"total length: 287.0\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 360x360 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment