制約と誓約: ラストワンマイルにおける制約（誓約）とその代償 時間枠指定編

# あらすじ

前回、制約のない配送設定（TSP）から始まり、現実世界のシナリオでも戦えるように、出発時間・到着時間制約（VRP）と容量制約（CVRP）を導入しました。さらに、小型な車両を使用することで容量制約をより厳しくした（CVR-HALF）シナリオの影響を紹介しました。

Nagoya問題例では、基礎値である13,591円から帰着時間を考慮することで14,472円（6.5%）まで上昇し、容量50個の制約を導入することで14,507円（6.8%）に増加しました。さらに厳しい容量制約を設定することで16,547円（21.8%）まで増加しました。
<table>
  <tr>
    <th>Nagoya</th>
    <th>台数</th>
    <th>時給(総移動時間)</th>
    <th>燃料費(総移動距離)</th>
    <th>合計</th>
    <th>基準との差分</th>
  </tr>
  <tr>
    <td>TSP</td>
    <td>1</td>
    <td>10303(34343)</td>
    <td>3288(134694)</td>
    <td>13591(169037)</td>
    <td>-</td>
  </tr>
  <tr>
    <td>VRP</td>
    <td>4</td>
    <td>10986(36619)</td>
    <td>3486(142828)</td>
    <td>14472(179447)</td>
    <td>+3台 +6.5%</td>
  </tr>
  <tr>
    <td>CVRP</td>
    <td>4</td>
    <td>10996(36654)</td>
    <td>3511(143851)</td>
    <td>14507(180505)</td>
    <td>+3台 +6.7%</td>
  </tr>
  <tr>
    <td>CVRP-HALF</td>
    <td>8</td>
    <td>12421(41403)</td>
    <td>4126(169042)</td>
    <td>16547(210445)</td>
    <td>+7台 +21.7%</td>
  </tr>
  <tfoot>
<tr><th colspan=14>$\hspace{38em}$</th></tr>
</tfoot>
</table>


Optimindの問題例では、基礎値である4,447円から帰着時間を考慮することで4,564円（2.6%）まで上昇し、容量50個の制約を導入することで4,709円（5.9%）に増加しました。さらに厳しい容量制約を設定することで5,238円（17.8%）まで増加しました。

<table>
  <tr>
    <th>Optimind</th>
    <th>台数</th>
    <th>時給(総移動時間)</th>
    <th>燃料費(総移動距離)</th>
    <th>合計</th>
    <th>基準との差分</th>
  </tr>
  <tr>
    <td>TSP</td>
    <td>1</td>
    <td>3513(11709)</td>
    <td>935(38292)</td>
    <td>4448(50001)</td>
    <td>-</td>
  </tr>
  <tr>
    <td>VRP</td>
    <td>3</td>
    <td>3624(12081)</td>
    <td>940(38512)</td>
    <td>4564(50593)</td>
    <td>+2台 +2.6%</td>
  </tr>
  <tr>
    <td>CVRP</td>
    <td>4</td>
    <td>3749(12495)</td>
    <td>961(39349)</td>
    <td>4710(51844)</td>
    <td>+3台 +5.9%</td>
  </tr>
  <tr>
    <td>CVRP-HALF</td>
    <td>8</td>
    <td>4124(13746)</td>
    <td>1114(45635)</td>
    <td>5238(59381)</td>
    <td>+7台 +17.8%</td>
  </tr>
  <tfoot>
    <tr><th colspan=14>$\hspace{38em}$</th></tr>
  </tfoot>
</table>

台数と費用増加を許容したことで、より現実世界に近づきましたが、それでもまだまだ現実とは遠いです。今回は、よりお客様の利便性を高めるために、時間枠指定制約の導入に伴う代償を紹介します。

# Vehicle Routing Problem with Time Windows: 時間枠指定

お客様が限られた時間帯でしか対応できない場合、特定の時間帯内での訪問が必要となります。この制約を加えた配送問題は、「(Capacitated) Vehicle Routing Problem with Time Windows（CVRP-TW）」として知られています。他にも、複数な時間帯を考慮する問題は「(Capacitated) Vehicle Routing Problem with Multiple Time Windows（CVRP-MTW）」であり、時間枠に対して遅れをある程度許容できる問題は「(Capacitated) Vehicle Routing Problem with Soft Time Windows（CVRP-STW）」も存在します。今回は、CVRP-TWのみを扱います。

## 待機時間

時間枠の開始時間前に到着する場合、以下の二つの行動が考えられます：

1. 時間枠を無視して指定された時間前に荷物を届ける。
2. 時間枠の開始時間まで待つ。

事前の連絡やお客様に迷惑がかかる上で1は現実のシナリオでも発生することがありますが、基本的には2で計画を組むことが望ましいと考えられます。

### **待機時間による不自然な計画**

例えば、配送する車両が自社ではなく、燃料費が自社の負担ではなく、時給だけを支払えばいい設定を考えると、距離に対して費用がかからないため、開始時間と到着時間が同じ場合、下記の両方の計画が同じ費用になってしまいます。現実世界では非常に不自然に見えるかもしれませんが、最適化問題の観点では設定上、コストが同じなので同じく「良い」計画として出力されることがあります。

![%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2023-12-14_19.48.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467420/e327913f-f6a1-0040-290c-92742700ff83.png)
![%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2023-12-14_19.48.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467420/93bbfac4-7171-8e84-7598-f41a697e0fae.png)

この問題を解決するために、待機時間にかかる費用（待機時間料）を時給費よりも小さい値に設定することで、待機時間が長い計画が費用が安いと認識されるようにできます。距離に対する費用があれば、余計な行き戻りが悪いと判定され、より現実的かつ効率的な計画が作られます。

## 計算実験1

日本では基本的に以下の時間枠が選択可能となっています。

1. 9:00-12:00
2. 12:00-14:00
3. 14:00-16:00
4. 16:00-18:00
5. 18:00-20:00
6. 指定なし

前回に紹介したCVRPの設定に加え、各配達先に対して、上記の６通りの時間枠の中からランダムに一つを付与しました。この問題例をCVRP-TWと呼びます。

<table>
  <tr>
    <th>CVRP-TW</th>
    <th>Nagoya</th>
    <th></th>
    <th></th>
    <th></th>
    <th></th>
    <th></th>
    <th></th>
  </tr>
  <tr>
    <th>Driver</th>
    <th>配達件数</th>
    <th>開始時間</th>
    <th>到着時間</th>
    <th>時給(総移動時間)</th>
    <th>時給(待ち時間)</th>
    <th>燃料費(総移動距離)</th>
    <th>時給+燃料費</th>
  </tr>
  <tr>
    <td>Alice</td>
    <td>22</td>
    <td>06月1日08:00:00</td>
    <td>06月1日16:36:15</td>
    <td>2279(7597)</td>
    <td>3053(10178)</td>
    <td>790(32349)</td>
    <td>6122</td>
  </tr>
  <tr>
    <td>Bob</td>
    <td>45</td>
    <td>06月1日08:00:00</td>
    <td>06月1日20:16:59</td>
    <td>4254(14181)</td>
    <td>911(3038)</td>
    <td>1418(58098)</td>
    <td>6584</td>
  </tr>
  <tr>
    <td>Charles</td>
    <td>43</td>
    <td>06月1日08:00:00</td>
    <td>06月1日20:11:10</td>
    <td>4374(14581)</td>
    <td>1047(3489)</td>
    <td>1496(61266)</td>
    <td>6917</td>
  </tr>
  <tr>
    <td>David</td>
    <td>44</td>
    <td>06月1日08:00:00</td>
    <td>06月1日20:11:07</td>
    <td>3962(13205)</td>
    <td>1279(4262)</td>
    <td>1245(51013)</td>
    <td>6485</td>
  </tr>
  <tr>
    <td>Eve</td>
    <td>46</td>
    <td>06月1日08:00:00</td>
    <td>06月1日20:14:20</td>
    <td>3835(12782)</td>
    <td>1103(3678)</td>
    <td>1361(55758)</td>
    <td>6299</td>
  </tr>
  <tr>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td>18704(62346)</td>
    <td>7394(24645)</td>
    <td>6310(258484)</td>
    <td>32407</td>
  </tr>
  <tfoot>
    <tr><th colspan=14>$\hspace{55em}$</th></tr>
  </tfoot>
</table>

![%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2023-12-14_21.10.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467420/90c7ca82-7b36-8daf-52ab-e2a2af955ead.png)

<table>
  <tr>
    <th>CVRP-TW</th>
    <th>Optimind</th>
    <th></th>
    <th></th>
    <th></th>
    <th></th>
    <th></th>
    <th></th>
  </tr>
  <tr>
    <th>Driver</th>
    <th>配達件数</th>
    <th>開始時間</th>
    <th>到着時間</th>
    <th>時給(総移動時間)</th>
    <th>時給(待ち時間)</th>
    <th>燃料費(総移動距離)</th>
    <th>時給+燃料費</th>
  </tr>
  <tr>
    <td>Alice</td>
    <td>50</td>
    <td>06月1日08:00:00</td>
    <td>06月1日20:11:42</td>
    <td>1701(5670)</td>
    <td>2470(8232)</td>
    <td>485(19889)</td>
    <td>4656</td>
  </tr>
  <tr>
    <td>Bob</td>
    <td>50</td>
    <td>06月1日08:00:00</td>
    <td>06月1日19:29:18</td>
    <td>1365(4551)</td>
    <td>2042(6807)</td>
    <td>392(16076)</td>
    <td>3800</td>
  </tr>
  <tr>
    <td>Charles</td>
    <td>50</td>
    <td>06月1日08:00:00</td>
    <td>06月1日19:59:17</td>
    <td>1535(5116)</td>
    <td>2412(8041)</td>
    <td>438(17942)</td>
    <td>4385</td>
  </tr>
  <tr>
    <td>David</td>
    <td>50</td>
    <td>06月1日08:00:00</td>
    <td>06月1日19:46:25</td>
    <td>1450(4833)</td>
    <td>2266(7552)</td>
    <td>398(16320)</td>
    <td>4114</td>
  </tr>
  <tr>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td>6051(20170)</td>
    <td>9190(30632)</td>
    <td>1714(70227)</td>
    <td>16955</td>
  </tr>
  <tfoot>
    <tr><th colspan=14>$\hspace{55em}$</th></tr>
  </tfoot>
</table>

![%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2023-12-14_21.11.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467420/1240f510-f288-2c49-1d75-f75ffbda50ac.png)

訪問したい時に訪問できないため、その場で数分待たなければならず、時間効率が低下します。

すぐ近くに配達先があっても（例: 12(左)/40(右), 14(左)/41(右)）、時間枠内でなければ訪問できないため、後で再び同じエリアに戻らなければなりません。そのため、移動が多くなり、移動効率が低下します。

CVRP    |CVRP-TW
:------:|:-------:
![%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2023-12-14_21.14.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467420/c7d830b2-5fbb-c834-63db-d9f91aefa9a7.png)|![%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2023-12-14_21.14.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467420/3666b998-a8ba-0b1e-19c3-b30355eb009c.png)

CVRPと比較して、Nagoya問題例では1台増加して32407-14507 = 17900（123.4%）の費用が増加し、待ち時間を無視しても17900-7394 = 10506（72.4%）が追加でかかりました。Optimind問題例では台数は増加していませんが、費用の増加は16955-4710 = 12245（260%）であり、待ち時間を除いて12245-9190 = 3055（64.9%）の費用が追加されました。

容量制約に比べて、時間枠指定制約の方が影響が大きいことが明らかになりました。

## 計算実験2

会社がより便利なサービスを提供するために、時間枠を2時間毎ではなく1時間毎、つまり選択可能な時間枠を倍にする場合、どれぐらいの費用が負担されるかを検証しました。この新しい設定をCVRP-TW-DOUBLEと呼びます。

<table>
  <tr>
    <th>CVRP-TW-DOUBLE</th>
    <th>Nagoya</th>
    <th></th>
    <th></th>
    <th></th>
    <th></th>
    <th></th>
    <th></th>
  </tr>
  <tr>
    <th>Driver</th>
    <th>配達件数</th>
    <th>開始時間</th>
    <th>到着時間</th>
    <th>時給(総移動時間)</th>
    <th>時給(待ち時間)</th>
    <th>燃料費(総移動距離)</th>
    <th>時給+燃料費</th>
  </tr>
  <tr>
    <td>Alice</td>
    <td>7</td>
    <td>06月1日08:00:00</td>
    <td>06月1日11:14:09</td>
    <td>1115(3716)</td>
    <td>1120(3733)</td>
    <td>398(16316)</td>
    <td>2633</td>
  </tr>
  <tr>
    <td>Bob</td>
    <td>40</td>
    <td>06月1日08:00:00</td>
    <td>06月1日19:44:35</td>
    <td>4452(14839)</td>
    <td>1031(3436)</td>
    <td>1496(61300)</td>
    <td>6979</td>
  </tr>
  <tr>
    <td>Charles</td>
    <td>25</td>
    <td>06月1日08:00:00</td>
    <td>06月1日16:35:58</td>
    <td>3179(10596)</td>
    <td>1609(5362)</td>
    <td>1114(45621)</td>
    <td>5901</td>
  </tr>
  <tr>
    <td>David</td>
    <td>42</td>
    <td>06月1日08:00:00</td>
    <td>06月1日20:15:35</td>
    <td>4466(14886)</td>
    <td>1215(4049)</td>
    <td>1508(61785)</td>
    <td>7189</td>
  </tr>
  <tr>
    <td>Eve</td>
    <td>8</td>
    <td>06月1日08:00:00</td>
    <td>06月1日11:39:12</td>
    <td>1303(4342)</td>
    <td>1203(4010)</td>
    <td>408(16731)</td>
    <td>2914</td>
  </tr>
  <tr>
    <td>Frank</td>
    <td>40</td>
    <td>06月1日08:00:00</td>
    <td>06月1日20:03:17</td>
    <td>4424(14747)</td>
    <td>1395(4650)</td>
    <td>1571(64372)</td>
    <td>7390</td>
  </tr>
  <tr>
    <td>George</td>
    <td>38</td>
    <td>06月1日08:00:00</td>
    <td>06月1日19:37:33</td>
    <td>4110(13701)</td>
    <td>1606(5352)</td>
    <td>1505(61656)</td>
    <td>7221</td>
  </tr>
  <tr>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td>23048(76827)</td>
    <td>9178(30592)</td>
    <td>8001(327781)</td>
    <td>40227</td>
  </tr>
  <tfoot>
    <tr><th colspan=14>$\hspace{57em}$</th></tr>
  </tfoot>
</table>

![%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2023-12-15_15.08.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467420/ebd942d2-aea7-00af-7485-9e14d6b5daac.png)

<table>
  <tr>
    <th>CVRP-TW-DOUBLE</th>
    <th>Optimind</th>
    <th></th>
    <th></th>
    <th></th>
    <th></th>
    <th></th>
    <th></th>
  </tr>
  <tr>
    <th>Driver</th>
    <th>配達件数</th>
    <th>開始時間</th>
    <th>到着時間</th>
    <th>時給(総移動時間)</th>
    <th>時給(待ち時間)</th>
    <th>燃料費(総移動距離)</th>
    <th>時給+燃料費</th>
  </tr>
  <tr>
    <td>Alice</td>
    <td>42</td>
    <td>06月1日08:00:00</td>
    <td>06月1日18:26:28</td>
    <td>1601(5336)</td>
    <td>2116(7052)</td>
    <td>489(20039)</td>
    <td>4206</td>
  </tr>
  <tr>
    <td>Bob</td>
    <td>50</td>
    <td>06月1日08:00:00</td>
    <td>06月1日19:56:08</td>
    <td>2237(7455)</td>
    <td>1654(5513)</td>
    <td>675(27664)</td>
    <td>4566</td>
  </tr>
  <tr>
    <td>Charles</td>
    <td>49</td>
    <td>06月1日08:00:00</td>
    <td>06月1日20:10:55</td>
    <td>1883(6277)</td>
    <td>2453(8178)</td>
    <td>570(23349)</td>
    <td>4906</td>
  </tr>
  <tr>
    <td>David</td>
    <td>48</td>
    <td>06月1日08:00:00</td>
    <td>06月1日20:13:15</td>
    <td>2159(7197)</td>
    <td>2399(7998)</td>
    <td>646(26482)</td>
    <td>5205</td>
  </tr>
  <tr>
    <td>Eve</td>
    <td>11</td>
    <td>06月1日08:00:00</td>
    <td>06月1日11:11:02</td>
    <td>305(1018)</td>
    <td>1153(3844)</td>
    <td>88(3623)</td>
    <td>1547</td>
  </tr>
  <tr>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td>8185(27283)</td>
    <td>9776(32585)</td>
    <td>2469(101157)</td>
    <td>20430</td>
  </tr>
  <tfoot>
    <tr><th colspan=14>$\hspace{58em}$</th></tr>
  </tfoot>
</table>

![%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2023-12-15_15.09.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467420/23647b99-2608-f8e9-c26f-ac34c70be975.png)

一つのエリアに小さい番号と大きい番号（つまり1日の中で違う時間帯で何回も訪問されている）や、何色も混ざっていることがコスト増加に大きな影響を与えています。

CVRP-TWと比較して、Nagoya問題例では2台増加して40227-32407 = 7820（24.1%）の費用が増加し、Optimindの問題例では1台増加して20430-16955 = 3475（20.5%）の費用が増加しました。

時間枠制約の導入自体と比較すると、差は大きくないですが、額としてはかなりの負担になります。そのため、時間枠の選択数を増やす前にはかなりな検討が必要になるでしょう。

# まとめ

時間枠指定制約の代償は大きく、待ち時間による時間効率低下や複数回同じエリア訪問による移動効率低下は容量制約よりも重いことが見れました。時間枠をより細かくすることでお客様は喜ぶかもしれませんが、その代償は高いことも分かりました。

Nagoyaの問題例では、基礎値である13,591円から時間枠を考慮することで32,407円（138.4%）まで上昇し、時間枠をより細かくすることで40,227円（196.0%）に上昇しました。

Optimindの問題例では、基礎値である4,447円から時間枠を考慮することで16,955円（281.2%）まで上昇し、時間枠をより細かくすることで20,430円（359.3%）に上昇しました。

<table>
  <tr>
    <th>Nagoya</th>
    <th>台数</th>
    <th>時給(総移動時間)</th>
    <th>待ち時間費(待ち時間)</th>
    <th>燃料費(総移動距離)</th>
    <th>合計</th>
    <th>基準との差分</th>
  </tr>
  <tr>
    <td>TSP</td>
    <td>1</td>
    <td>10303(34343)</td>
    <td>0</td>
    <td>3288(134694)</td>
    <td>13591(169037)</td>
    <td>-</td>
  </tr>
  <tr>
    <td>VRP</td>
    <td>4</td>
    <td>10986(36619)</td>
    <td>0</td>
    <td>3486(142828)</td>
    <td>14472(179447)</td>
    <td>+3台+6.5%</td>
  </tr>
  <tr>
    <td>CVRP</td>
    <td>4</td>
    <td>10996(36654)</td>
    <td>0</td>
    <td>3511(143851)</td>
    <td>14507(180505)</td>
    <td>+3台+6.7%</td>
  </tr>
  <tr>
    <td>CVRP-HALF</td>
    <td>8</td>
    <td>12421(41403)</td>
    <td>0</td>
    <td>4126(169042)</td>
    <td>16547(210445)</td>
    <td>+7台+21.7%</td>
  </tr>
  <tr>
    <td>CVRP-TW</td>
    <td>5</td>
    <td>18704(62346)</td>
    <td>7394(24645)</td>
    <td>6310(258484)</td>
    <td>32407(345475)</td>
    <td>+4台+138.4%</td>
  </tr>
  <tr>
    <td>CVRP-TW-DOUBLE</td>
    <td>7</td>
    <td>23048(76827)</td>
    <td>9178(30592)</td>
    <td>8001(327781)</td>
    <td>40227(435200)</td>
    <td>+6台+196.0%</td>
  </tr>
  <tfoot>
    <tr><th colspan=14>$\hspace{50em}$</th></tr>
  </tfoot>
</table>


<table>
  <tr>
    <th>Optimind</th>
    <th>台数</th>
    <th>時給(総移動時間)</th>
    <th>待ち時間費(待ち時間)</th>
    <th>燃料費(総移動距離)</th>
    <th>合計</th>
    <th>基準との差分</th>
  </tr>
  <tr>
    <td>TSP</td>
    <td>1</td>
    <td>3513(11709)</td>
    <td>0</td>
    <td>935(38292)</td>
    <td>4448(50001)</td>
    <td>-</td>
  </tr>
  <tr>
    <td>VRP</td>
    <td>3</td>
    <td>3624(12081)</td>
    <td>0</td>
    <td>940(38512)</td>
    <td>4564(50593)</td>
    <td>+3台+2.6%</td>
  </tr>
  <tr>
    <td>CVRP</td>
    <td>4</td>
    <td>3749(12495)</td>
    <td>0</td>
    <td>961(39349)</td>
    <td>4710(51844)</td>
    <td>+3台+5.9%</td>
  </tr>
  <tr>
    <td>CVRP-HALF</td>
    <td>8</td>
    <td>4124(13746)</td>
    <td>0</td>
    <td>1114(45635)</td>
    <td>5238(59381)</td>
    <td>+7台+17.8%</td>
  </tr>
  <tr>
    <td>CVRP-TW</td>
    <td>4</td>
    <td>6051(20170)</td>
    <td>9190(30632)</td>
    <td>1714(70227)</td>
    <td>16955(121029)</td>
    <td>+3台+281.2%</td>
  </tr>
  <tr>
    <td>CVRP-TW-DOUBLE</td>
    <td>5</td>
    <td>8185(27283)</td>
    <td>9776(32585)</td>
    <td>2469(101157)</td>
    <td>20430(161025)</td>
    <td>+4台+359.3%</td>
  </tr>
    <tfoot>
    <tr><th colspan=14>$\hspace{50em}$</th></tr>
  </tfoot>
</table>

# 次回予告

次回は、現在の課題である休憩なしで毎日08:00から20:00の12時間以上働くといった労働時間の過酷さに対処するために、最大勤務時間と休憩制約を追加する予定です。