ガイドAPIリファレンス
ガイド

複数シフトを含める

複雑なシナリオに対応する際には、運行管理に複数のシフト時間を組み合わせることで、車両ルートの管理と最適化をより効率的に行うことができます。

この機能により、1つの問題の中で日ごとに異なる車両のシフトやジョブの時間枠を個別に指定できます。たとえば、週を通じて配達や集荷を管理する必要があり、かつ運行管理には日ごとに異なるシフト時間を持つ車両が含まれる場合、これらの制約を1つの問題として指定できます。このアプローチは、日ごとに個別の問題を作成する手間を省けるだけでなく、車両の稼働率を最大化することで最適なツアー計画を立てることもできます。このアプローチは、異なる時間枠やシフトに柔軟にスケジューリングできるジョブに特に有効であり、リソースを効率的かつ効果的に活用できます。

問題に複数シフトを定義する

複数のシフトを使用する一般的なシナリオとしては、時間制限のない多数のジョブがあり、それらを担当する車両が限られているという状況が挙げられます。そのような場合、車両は1回のシフト内にすべてのジョブを完了できません。車両に複数のシフトを設定することで、ジョブを複数のシフトにわたって最も効率的にこなせるようになります。

📘

  • 各車両のシフトには、互いに重ならない開始時刻と終了時刻を設定する必要があります。
  • 車両の異なるシフトは、ツアー内でshiftIndexプロパティによって識別されます。車両IDは車両のすべてのシフトで同じままです。詳細については、「APIリファレンス」を参照してください。

シナリオ:時間制限のないジョブを処理する

時間制約のないジョブが15件、容量が10の車両が1台、1日のシフトはわずか3時間という状況を考えてみましょう。車両は1シフトですべてのジョブを完了できません。この問題に対処するには、車両に複数のシフトを指定します。これにより、その車両は数日をかけてジョブを完了できるようになります。

この場合、以下に示すように、車両のシフト時間に日付を追加し、必要なジョブをカバーするために4つのシフトを作成します。

  • シフト1:2021-10-23T09:00:00Z - 2021-10-23T12:00:00Z
  • シフト2:2021-10-24T09:00:00Z - 2021-10-24T12:00:00Z
  • シフト3:2021-10-25T09:00:00Z - 2021-10-25T12:00:00Z
  • シフト4:2021-10-26T09:00:00Z - 2021-10-26T12:00:00Z

問題

次の問題は、先ほどのサンプルシナリオに基づいて、車両に複数のシフトを指定する方法を示しています。

Click to expand/collapse the sample JSON
{
  "fleet": {
    "types": [
      {
        "id": "Vehicle_1",
        "profile": "car",
        "costs": {
          "fixed": 10,
          "distance": 0.002,
          "time": 0.003
        },
        "shifts": [
          {
            "start": {
              "time": "2021-10-23T09:00:00Z",
              "location": {
                "lat": 51.059188,
                "lng": 13.540317
              }
            },
            "end": {
              "time": "2021-10-23T12:00:00Z",
              "location": {
                "lat": 51.059188,
                "lng": 13.540317
              }
            }
          },
          {
            "start": {
              "time": "2021-10-24T09:00:00Z",
              "location": {
                "lat": 51.059188,
                "lng": 13.540317
              }
            },
            "end": {
              "time": "2021-10-24T12:00:00Z",
              "location": {
                "lat": 51.059188,
                "lng": 13.540317
              }
            }
          },
          {
            "start": {
              "time": "2021-10-25T09:00:00Z",
              "location": {
                "lat": 51.059188,
                "lng": 13.540317
              }
            },
            "end": {
              "time": "2021-10-25T12:00:00Z",
              "location": {
                "lat": 51.059188,
                "lng": 13.540317
              }
            }
          },
          {
            "start": {
              "time": "2021-10-26T09:00:00Z",
              "location": {
                "lat": 51.059188,
                "lng": 13.540317
              }
            },
            "end": {
              "time": "2021-10-26T12:00:00Z",
              "location": {
                "lat": 51.059188,
                "lng": 13.540317
              }
            }
          }
        ],
        "capacity": [
          10
        ],
        "amount": 1
      }
    ],
    "profiles": [
      {
        "type": "car",
        "name": "car"
      }
    ]
  },
  "plan": {
    "jobs": [
      {
        "id": "Job_1",
        "tasks": {
          "pickups": [
            {
              "places": [
                {
                  "location": {
                    "lat": 51.05238,
                    "lng": 13.74114
                  },
                  "duration": 1350
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      },
      {
        "id": "Job_2",
        "tasks": {
          "pickups": [
            {
              "places": [
                {
                  "location": {
                    "lat": 51.06099,
                    "lng": 13.75245
                  },
                  "duration": 1350
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      },
      {
        "id": "Job_3",
        "tasks": {
          "pickups": [
            {
              "places": [
                {
                  "location": {
                    "lat": 51.08511,
                    "lng": 13.76875
                  },
                  "duration": 1350
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      },
      {
        "id": "Job_4",
        "tasks": {
          "pickups": [
            {
              "places": [
                {
                  "location": {
                    "lat": 51.1323847,
                    "lng": 13.7779515
                  },
                  "duration": 1350
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      },
      {
        "id": "Job_5",
        "tasks": {
          "pickups": [
            {
              "places": [
                {
                  "location": {
                    "lat": 51.11716,
                    "lng": 13.73054
                  },
                  "duration": 1350
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      },
      {
        "id": "Job_6",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "location": {
                    "lat": 51.12308,
                    "lng": 13.76406
                  },
                  "duration": 1350
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      },
      {
        "id": "Job_7",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "location": {
                    "lat": 51.08588,
                    "lng": 13.72637
                  },
                  "duration": 1350
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      },
      {
        "id": "Job_8",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "location": {
                    "lat": 51.08588,
                    "lng": 13.72637
                  },
                  "duration": 1350
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      },
      {
        "id": "Job_9",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "location": {
                    "lat": 51.08588,
                    "lng": 13.72637
                  },
                  "duration": 1350
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      },
      {
        "id": "Job_10",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "location": {
                    "lat": 51.18588,
                    "lng": 13.52637
                  },
                  "duration": 1350
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      },
      {
        "id": "Job_11",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "location": {
                    "lat": 51.10588,
                    "lng": 13.79637
                  },
                  "duration": 1350
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      },
      {
        "id": "Job_12",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "location": {
                    "lat": 51.01588,
                    "lng": 13.52637
                  },
                  "duration": 1350
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      },
      {
        "id": "Job_13",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "location": {
                    "lat": 51.08588,
                    "lng": 13.62637
                  },
                  "duration": 1350
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      },
      {
        "id": "Job_14",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "location": {
                    "lat": 51.00088,
                    "lng": 13.02637
                  },
                  "duration": 1350
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      },
      {
        "id": "Job_15",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "location": {
                    "lat": 51.06866,
                    "lng": 13.77273
                  },
                  "duration": 1350
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      }
    ]
  }
}

ソリューション

次の図は作成されるソリューションの内訳を視覚的に示したものです。

時間制限のない複数のシフト

ソリューションが示すように、最適化アルゴリズムはジョブを車両の4つのシフトにわたって次のように配分しました。

  • 10月23日、ジョブ5件
  • 10月24日、ジョブ5件
  • 10月25日、ジョブ1件
  • 10月26日、ジョブ4件

このようにして、その車両はシフト時間枠を逸脱することなく、割り当てられたすべてのジョブを効率的に完了できました。

次のセクションには完全なソリューションJSONが含まれています。

Click to expand/collapse the sample JSON
{
    "statistic": {
        "cost": 673.386,
        "distance": 262603,
        "duration": 36060,
        "times": {
            "driving": 15810,
            "serving": 20250,
            "waiting": 0,
            "break": 0
        }
    },
    "tours": [
        {
            "vehicleId": "Vehicle_1_1",
            "typeId": "Vehicle_1",
            "stops": [
                {
                    "location": {
                        "lat": 51.059188,
                        "lng": 13.540317
                    },
                    "time": {
                        "arrival": "2021-10-24T09:00:00Z",
                        "departure": "2021-10-24T09:00:00Z"
                    },
                    "load": [
                        2
                    ],
                    "activities": [
                        {
                            "jobId": "departure",
                            "type": "departure"
                        }
                    ],
                    "distance": 0
                },
                {
                    "location": {
                        "lat": 51.05238,
                        "lng": 13.74114
                    },
                    "time": {
                        "arrival": "2021-10-24T09:23:14Z",
                        "departure": "2021-10-24T09:45:44Z"
                    },
                    "load": [
                        3
                    ],
                    "activities": [
                        {
                            "jobId": "Job_1",
                            "type": "pickup"
                        }
                    ],
                    "distance": 22782
                },
                {
                    "location": {
                        "lat": 51.06099,
                        "lng": 13.75245
                    },
                    "time": {
                        "arrival": "2021-10-24T09:50:59Z",
                        "departure": "2021-10-24T10:13:29Z"
                    },
                    "load": [
                        4
                    ],
                    "activities": [
                        {
                            "jobId": "Job_2",
                            "type": "pickup"
                        }
                    ],
                    "distance": 24694
                },
                {
                    "location": {
                        "lat": 51.06866,
                        "lng": 13.77273
                    },
                    "time": {
                        "arrival": "2021-10-24T10:16:40Z",
                        "departure": "2021-10-24T10:39:10Z"
                    },
                    "load": [
                        3
                    ],
                    "activities": [
                        {
                            "jobId": "Job_15",
                            "type": "delivery"
                        }
                    ],
                    "distance": 27864
                },
                {
                    "location": {
                        "lat": 51.08511,
                        "lng": 13.76875
                    },
                    "time": {
                        "arrival": "2021-10-24T10:45:22Z",
                        "departure": "2021-10-24T11:07:52Z"
                    },
                    "load": [
                        4
                    ],
                    "activities": [
                        {
                            "jobId": "Job_3",
                            "type": "pickup"
                        }
                    ],
                    "distance": 31892
                },
                {
                    "location": {
                        "lat": 51.10588,
                        "lng": 13.79637
                    },
                    "time": {
                        "arrival": "2021-10-24T11:13:48Z",
                        "departure": "2021-10-24T11:36:18Z"
                    },
                    "load": [
                        3
                    ],
                    "activities": [
                        {
                            "jobId": "Job_11",
                            "type": "delivery"
                        }
                    ],
                    "distance": 35237
                },
                {
                    "location": {
                        "lat": 51.059188,
                        "lng": 13.540317
                    },
                    "time": {
                        "arrival": "2021-10-24T11:57:06Z",
                        "departure": "2021-10-24T11:57:06Z"
                    },
                    "load": [
                        0
                    ],
                    "activities": [
                        {
                            "jobId": "arrival",
                            "type": "arrival"
                        }
                    ],
                    "distance": 56742
                }
            ],
            "statistic": {
                "cost": 152.36999999999998,
                "distance": 55246,
                "duration": 10626,
                "times": {
                    "driving": 3876,
                    "serving": 6750,
                    "waiting": 0,
                    "break": 0
                }
            },
            "shiftIndex": 1
        },
        {
            "vehicleId": "Vehicle_1_1",
            "typeId": "Vehicle_1",
            "stops": [
                {
                    "location": {
                        "lat": 51.059188,
                        "lng": 13.540317
                    },
                    "time": {
                        "arrival": "2021-10-26T09:00:00Z",
                        "departure": "2021-10-26T09:00:00Z"
                    },
                    "load": [
                        2
                    ],
                    "activities": [
                        {
                            "jobId": "departure",
                            "type": "departure"
                        }
                    ],
                    "distance": 0
                },
                {
                    "location": {
                        "lat": 51.18588,
                        "lng": 13.52637
                    },
                    "time": {
                        "arrival": "2021-10-26T09:28:01Z",
                        "departure": "2021-10-26T09:50:31Z"
                    },
                    "load": [
                        1
                    ],
                    "activities": [
                        {
                            "jobId": "Job_10",
                            "type": "delivery"
                        }
                    ],
                    "distance": 9299
                },
                {
                    "location": {
                        "lat": 51.1323847,
                        "lng": 13.7779515
                    },
                    "time": {
                        "arrival": "2021-10-26T10:16:25Z",
                        "departure": "2021-10-26T10:38:55Z"
                    },
                    "load": [
                        2
                    ],
                    "activities": [
                        {
                            "jobId": "Job_4",
                            "type": "pickup"
                        }
                    ],
                    "distance": 22650
                },
                {
                    "location": {
                        "lat": 51.12308,
                        "lng": 13.76406
                    },
                    "time": {
                        "arrival": "2021-10-26T10:43:05Z",
                        "departure": "2021-10-26T11:05:35Z"
                    },
                    "load": [
                        1
                    ],
                    "activities": [
                        {
                            "jobId": "Job_6",
                            "type": "delivery"
                        }
                    ],
                    "distance": 27842
                },
                {
                    "location": {
                        "lat": 51.11716,
                        "lng": 13.73054
                    },
                    "time": {
                        "arrival": "2021-10-26T11:11:20Z",
                        "departure": "2021-10-26T11:33:50Z"
                    },
                    "load": [
                        2
                    ],
                    "activities": [
                        {
                            "jobId": "Job_5",
                            "type": "pickup"
                        }
                    ],
                    "distance": 48395
                },
                {
                    "location": {
                        "lat": 51.059188,
                        "lng": 13.540317
                    },
                    "time": {
                        "arrival": "2021-10-26T11:49:06Z",
                        "departure": "2021-10-26T11:49:06Z"
                    },
                    "load": [
                        0
                    ],
                    "activities": [
                        {
                            "jobId": "arrival",
                            "type": "arrival"
                        }
                    ],
                    "distance": 68746
                }
            ],
            "statistic": {
                "cost": 180.524,
                "distance": 70043,
                "duration": 10146,
                "times": {
                    "driving": 4746,
                    "serving": 5400,
                    "waiting": 0,
                    "break": 0
                }
            },
            "shiftIndex": 3
        },
        {
            "vehicleId": "Vehicle_1_1",
            "typeId": "Vehicle_1",
            "stops": [
                {
                    "location": {
                        "lat": 51.059188,
                        "lng": 13.540317
                    },
                    "time": {
                        "arrival": "2021-10-23T09:00:00Z",
                        "departure": "2021-10-23T09:00:00Z"
                    },
                    "load": [
                        5
                    ],
                    "activities": [
                        {
                            "jobId": "departure",
                            "type": "departure"
                        }
                    ],
                    "distance": 0
                },
                {
                    "location": {
                        "lat": 51.08588,
                        "lng": 13.62637
                    },
                    "time": {
                        "arrival": "2021-10-23T09:13:53Z",
                        "departure": "2021-10-23T09:36:23Z"
                    },
                    "load": [
                        4
                    ],
                    "activities": [
                        {
                            "jobId": "Job_13",
                            "type": "delivery"
                        }
                    ],
                    "distance": 18700
                },
                {
                    "location": {
                        "lat": 51.08588,
                        "lng": 13.72637
                    },
                    "time": {
                        "arrival": "2021-10-23T09:51:23Z",
                        "departure": "2021-10-23T10:58:53Z"
                    },
                    "load": [
                        1
                    ],
                    "activities": [
                        {
                            "jobId": "Job_9",
                            "type": "delivery",
                            "location": {
                                "lat": 51.08588,
                                "lng": 13.72637
                            },
                            "time": {
                                "start": "2021-10-23T09:51:23Z",
                                "end": "2021-10-23T10:13:53Z"
                            }
                        },
                        {
                            "jobId": "Job_7",
                            "type": "delivery",
                            "location": {
                                "lat": 51.08588,
                                "lng": 13.72637
                            },
                            "time": {
                                "start": "2021-10-23T10:13:53Z",
                                "end": "2021-10-23T10:36:23Z"
                            }
                        },
                        {
                            "jobId": "Job_8",
                            "type": "delivery",
                            "location": {
                                "lat": 51.08588,
                                "lng": 13.72637
                            },
                            "time": {
                                "start": "2021-10-23T10:36:23Z",
                                "end": "2021-10-23T10:58:53Z"
                            }
                        }
                    ],
                    "distance": 22771
                },
                {
                    "location": {
                        "lat": 51.01588,
                        "lng": 13.52637
                    },
                    "time": {
                        "arrival": "2021-10-23T11:20:08Z",
                        "departure": "2021-10-23T11:42:38Z"
                    },
                    "load": [
                        0
                    ],
                    "activities": [
                        {
                            "jobId": "Job_12",
                            "type": "delivery"
                        }
                    ],
                    "distance": 25067
                },
                {
                    "location": {
                        "lat": 51.059188,
                        "lng": 13.540317
                    },
                    "time": {
                        "arrival": "2021-10-23T11:55:00Z",
                        "departure": "2021-10-23T11:55:00Z"
                    },
                    "load": [
                        0
                    ],
                    "activities": [
                        {
                            "jobId": "arrival",
                            "type": "arrival"
                        }
                    ],
                  "distance": 44098
                }
            ],
            "statistic": {
                "cost": 148.944,
                "distance": 53722,
                "duration": 10500,
                "times": {
                    "driving": 3750,
                    "serving": 6750,
                    "waiting": 0,
                    "break": 0
                }
            },
            "shiftIndex": 0
        },
        {
            "vehicleId": "Vehicle_1_1",
            "typeId": "Vehicle_1",
            "stops": [
                {
                    "location": {
                        "lat": 51.059188,
                        "lng": 13.540317
                    },
                    "time": {
                        "arrival": "2021-10-25T09:00:00Z",
                        "departure": "2021-10-25T09:00:00Z"
                    },
                    "load": [
                        1
                    ],
                    "activities": [
                        {
                            "jobId": "departure",
                            "type": "departure"
                        }
                    ],
                    "distance": 0
                },
                {
                    "location": {
                        "lat": 51.00088,
                        "lng": 13.02637
                    },
                    "time": {
                        "arrival": "2021-10-25T09:28:45Z",
                        "departure": "2021-10-25T09:51:15Z"
                    },
                    "load": [
                        0
                    ],
                    "activities": [
                        {
                            "jobId": "Job_14",
                            "type": "delivery"
                        }
                    ],
                    "distance": 41711
                },
                {
                    "location": {
                        "lat": 51.059188,
                        "lng": 13.540317
                    },
                    "time": {
                        "arrival": "2021-10-25T10:19:48Z",
                        "departure": "2021-10-25T10:19:48Z"
                    },
                    "load": [
                        0
                    ],
                    "activities": [
                        {
                            "jobId": "arrival",
                            "type": "arrival"
                        }
                    ],
                    "distance": 83583
                }
            ],
            "statistic": {
                "cost": 191.548,
                "distance": 83592,
                "duration": 4788,
                "times": {
                    "driving": 3438,
                    "serving": 1350,
                    "waiting": 0,
                    "break": 0
                }
            },
            "shiftIndex": 2
        }
    ]
}

シナリオ:特定の時間制限があるジョブを処理する

特定の時間制限があるジョブに対しては、適切にスケジューリングされるように、時間枠を追加します。たとえば、あるジョブが10月23日にしか配達できない場合、その日の該当シフト時間内で、そのジョブに対して時間枠を設定することになります。

特定の時間制限がないジョブは、時間枠を指定せずに、どの日にでもスケジューリングできます。最適化アルゴリズムは、そのようなジョブを、全体のツアーにとって最も効率的な方法でスケジューリングします。

3日間にわたり、日ごとに異なるシフト時間で車両を使って10件のジョブに対応する必要があるという状況を考えてみましょう。これらのジョブのうち5件には特定の時間制限がありますが、残りの5件にはありません。

車両の稼働状況:

  • シフト1:10月23日の8時~14時
  • シフト2:10月24日の9時~15時
  • シフト3:10月25日の10時~21時

時間枠を伴うジョブ:

  • Job 1:10月23日9時~12時に開始する必要があります
  • Job 2:10月23日12時~14時に開始する必要があります
  • Job 3:10月24日10時~12時に開始する必要があります
  • Job 4:10月25日11時~13時に開始する必要があります
  • Job 5:10月25日15時~18時に開始する必要があります

時間枠を伴わないジョブ:

Job 6Job 10は任意の日に完了できます。

問題

次のセクションには、前述の制限を反映した問題JSONが含まれています。

Click to expand/collapse the sample JSON
{
  "fleet": {
    "types": [
      {
        "id": "Vehicle_1",
        "profile": "car",
        "costs": {
          "fixed": 10,
          "distance": 0.002,
          "time": 0.003
        },
        "shifts": [
          {
            "start": {
              "time": "2021-10-23T08:00:00Z",
              "location": {
                "lat": 51.059188,
                "lng": 13.540317
              }
            },
            "end": {
              "time": "2021-10-23T14:00:00Z",
              "location": {
                "lat": 51.059188,
                "lng": 13.540317
              }
            }
          },
          {
            "start": {
              "time": "2021-10-24T09:00:00Z",
              "location": {
                "lat": 51.059188,
                "lng": 13.540317
              }
            },
            "end": {
              "time": "2021-10-24T15:00:00Z",
              "location": {
                "lat": 51.059188,
                "lng": 13.540317
              }
            }
          },
          {
            "start": {
              "time": "2021-10-25T10:00:00Z",
              "location": {
                "lat": 51.059188,
                "lng": 13.540317
              }
            },
            "end": {
              "time": "2021-10-25T21:00:00Z",
              "location": {
                "lat": 51.059188,
                "lng": 13.540317
              }
            }
          }
        ],
        "capacity": [
          10
        ],
        "amount": 1
      }
    ],
    "profiles": [
      {
        "type": "car",
        "name": "car"
      }
    ]
  },
  "plan": {
    "jobs": [
      {
        "id": "Job_1",
        "tasks": {
          "pickups": [
            {
              "places": [
                {
                  "times": [
                    [
                      "2021-10-23T09:00:00Z",
                      "2021-10-23T12:00:00Z"
                    ]
                  ],
                  "location": {
                    "lat": 51.05238,
                    "lng": 13.74114
                  },
                  "duration": 1350
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      },
      {
        "id": "Job_2",
        "tasks": {
          "pickups": [
            {
              "places": [
                {
                  "times": [
                    [
                      "2021-10-23T12:00:00Z",
                      "2021-10-23T14:00:00Z"
                    ]
                  ],
                  "location": {
                    "lat": 51.06099,
                    "lng": 13.75245
                  },
                  "duration": 1350
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      },
      {
        "id": "Job_3",
        "tasks": {
          "pickups": [
            {
              "places": [
                {
                  "times": [
                    [
                      "2021-10-24T10:00:00Z",
                      "2021-10-24T12:00:00Z"
                    ]
                  ],
                  "location": {
                    "lat": 51.08511,
                    "lng": 13.76875
                  },
                  "duration": 1350
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      },
      {
        "id": "Job_4",
        "tasks": {
          "pickups": [
            {
              "places": [
                {
                  "times": [
                    [
                      "2021-10-25T11:00:00Z",
                      "2021-10-25T13:00:00Z"
                    ]
                  ],
                  "location": {
                    "lat": 51.1323847,
                    "lng": 13.7779515
                  },
                  "duration": 1350
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      },
      {
        "id": "Job_5",
        "tasks": {
          "pickups": [
            {
              "places": [
                {
                  "times": [
                    [
                      "2021-10-25T15:00:00Z",
                      "2021-10-25T18:00:00Z"
                    ]
                  ],
                  "location": {
                    "lat": 51.11716,
                    "lng": 13.73054
                  },
                  "duration": 1350
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      },
      {
        "id": "Job_6",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "location": {
                    "lat": 51.12308,
                    "lng": 13.76406
                  },
                  "duration": 1350
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      },
      {
        "id": "Job_7",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "location": {
                    "lat": 51.08588,
                    "lng": 13.72637
                  },
                  "duration": 1350
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      },
      {
        "id": "Job_8",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "location": {
                    "lat": 51.08588,
                    "lng": 13.72637
                  },
                  "duration": 1350
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      },
      {
        "id": "Job_9",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "location": {
                    "lat": 51.08588,
                    "lng": 13.72637
                  },
                  "duration": 1350
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      },
      {
        "id": "Job_10",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "location": {
                    "lat": 51.06866,
                    "lng": 13.77273
                  },
                  "duration": 1350
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      }
    ]
  }
}

ソリューション

次の図は、得られたソリューションの内容を視覚的に示しており、時間枠によって制約されているジョブが強調されています。

時間枠を伴う複数のシフト

最適化アルゴリズムは、時間制限のあるすべてのジョブを、それぞれ指定された時間枠内に適切にスケジューリングしました。時間枠が指定されていない残りのジョブは、ツアー全体の効率を最大化するために、シフト内で柔軟にスケジューリングされました。

次のセクションには、参照用としてソリューションのJSONが含まれています。

Click to expand/collapse the sample JSON
{
  "statistic": {
    "cost": 390.953,
    "distance": 141352,
    "duration": 26083,
    "times": {
      "driving": 8644,
      "serving": 13500,
      "waiting": 3939,
      "stopping": 0,
      "break": 0
    }
  },
  "tours": [
    {
      "vehicleId": "Vehicle_1_1",
      "typeId": "Vehicle_1",
      "stops": [
        {
          "time": {
            "arrival": "2021-10-24T09:00:00Z",
            "departure": "2021-10-24T09:00:00Z"
          },
          "load": [
            4
          ],
          "activities": [
            {
              "jobId": "departure",
              "type": "departure",
              "location": {
                "lat": 51.059188,
                "lng": 13.540317
              },
              "time": {
                "start": "2021-10-24T09:00:00Z",
                "end": "2021-10-24T09:00:00Z"
              }
            }
          ],
          "location": {
            "lat": 51.059188,
            "lng": 13.540317
          },
          "distance": 0
        },
        {
          "time": {
            "arrival": "2021-10-24T09:15:25Z",
            "departure": "2021-10-24T10:22:55Z"
          },
          "load": [
            1
          ],
          "activities": [
            {
              "jobId": "Job_8",
              "type": "delivery",
              "location": {
                "lat": 51.08588,
                "lng": 13.72637
              },
              "time": {
                "start": "2021-10-24T09:15:25Z",
                "end": "2021-10-24T09:37:55Z"
              }
            },
            {
              "jobId": "Job_9",
              "type": "delivery",
              "location": {
                "lat": 51.08588,
                "lng": 13.72637
              },
              "time": {
                "start": "2021-10-24T09:37:55Z",
                "end": "2021-10-24T10:00:25Z"
              }
            },
            {
              "jobId": "Job_7",
              "type": "delivery",
              "location": {
                "lat": 51.08588,
                "lng": 13.72637
              },
              "time": {
                "start": "2021-10-24T10:00:25Z",
                "end": "2021-10-24T10:22:55Z"
              }
            }
          ],
          "location": {
            "lat": 51.08588,
            "lng": 13.72637
          },
          "distance": 18695
        },
        {
          "time": {
            "arrival": "2021-10-24T10:31:12Z",
            "departure": "2021-10-24T10:53:42Z"
          },
          "load": [
            0
          ],
          "activities": [
            {
              "jobId": "Job_10",
              "type": "delivery",
              "location": {
                "lat": 51.06866,
                "lng": 13.77273
              },
              "time": {
                "start": "2021-10-24T10:31:12Z",
                "end": "2021-10-24T10:53:42Z"
              }
            }
          ],
          "location": {
            "lat": 51.06866,
            "lng": 13.77273
          },
          "distance": 23119
        },
        {
          "time": {
            "arrival": "2021-10-24T10:59:20Z",
            "departure": "2021-10-24T11:21:50Z"
          },
          "load": [
            1
          ],
          "activities": [
            {
              "jobId": "Job_3",
              "type": "pickup",
              "location": {
                "lat": 51.08511,
                "lng": 13.76875
              },
              "time": {
                "start": "2021-10-24T10:59:20Z",
                "end": "2021-10-24T11:21:50Z"
              }
            }
          ],
          "location": {
            "lat": 51.08511,
            "lng": 13.76875
          },
          "distance": 26548
        },
        {
          "time": {
            "arrival": "2021-10-24T11:44:40Z",
            "departure": "2021-10-24T11:44:40Z"
          },
          "load": [
            0
          ],
          "activities": [
            {
              "jobId": "arrival",
              "type": "arrival",
              "location": {
                "lat": 51.059188,
                "lng": 13.540317
              },
              "time": {
                "start": "2021-10-24T11:44:40Z",
                "end": "2021-10-24T11:44:40Z"
              }
            }
          ],
          "location": {
            "lat": 51.059188,
            "lng": 13.540317
          },
          "distance": 50767
        }
      ],
      "statistic": {
        "cost": 141.174,
        "distance": 50767,
        "duration": 9880,
        "times": {
          "driving": 3130,
          "serving": 6750,
          "waiting": 0,
          "stopping": 0,
          "break": 0
        }
      },
      "shiftIndex": 1
    },
    {
      "vehicleId": "Vehicle_1_1",
      "typeId": "Vehicle_1",
      "stops": [
        {
          "time": {
            "arrival": "2021-10-25T10:00:00Z",
            "departure": "2021-10-25T12:40:29Z"
          },
          "load": [
            1
          ],
          "activities": [
            {
              "jobId": "departure",
              "type": "departure",
              "location": {
                "lat": 51.059188,
                "lng": 13.540317
              },
              "time": {
                "start": "2021-10-25T10:00:00Z",
                "end": "2021-10-25T12:40:29Z"
              }
            }
          ],
          "location": {
            "lat": 51.059188,
            "lng": 13.540317
          },
          "distance": 0
        },
        {
          "time": {
            "arrival": "2021-10-25T13:00:00Z",
            "departure": "2021-10-25T13:22:30Z"
          },
          "load": [
            2
          ],
          "activities": [
            {
              "jobId": "Job_4",
              "type": "pickup",
              "location": {
                "lat": 51.1323847,
                "lng": 13.7779515
              },
              "time": {
                "start": "2021-10-25T13:00:00Z",
                "end": "2021-10-25T13:22:30Z"
              }
            }
          ],
          "location": {
            "lat": 51.1323847,
            "lng": 13.7779515
          },
          "distance": 23558
        },
        {
          "time": {
            "arrival": "2021-10-25T13:26:28Z",
            "departure": "2021-10-25T13:48:58Z"
          },
          "load": [
            1
          ],
          "activities": [
            {
              "jobId": "Job_6",
              "type": "delivery",
              "location": {
                "lat": 51.12308,
                "lng": 13.76406
              },
              "time": {
                "start": "2021-10-25T13:26:28Z",
                "end": "2021-10-25T13:48:58Z"
              }
            }
          ],
          "location": {
            "lat": 51.12308,
            "lng": 13.76406
          },
          "distance": 25366
        },
        {
          "time": {
            "arrival": "2021-10-25T13:54:21Z",
            "departure": "2021-10-25T15:22:30Z"
          },
          "load": [
            2
          ],
          "activities": [
            {
              "jobId": "Job_5",
              "type": "pickup",
              "location": {
                "lat": 51.11716,
                "lng": 13.73054
              },
              "time": {
                "start": "2021-10-25T15:00:00Z",
                "end": "2021-10-25T15:22:30Z"
              }
            }
          ],
          "location": {
            "lat": 51.11716,
            "lng": 13.73054
          },
          "distance": 29456
        },
        {
          "time": {
            "arrival": "2021-10-25T15:37:35Z",
            "departure": "2021-10-25T15:37:35Z"
          },
          "load": [
            0
          ],
          "activities": [
            {
              "jobId": "arrival",
              "type": "arrival",
              "location": {
                "lat": 51.059188,
                "lng": 13.540317
              },
              "time": {
                "start": "2021-10-25T15:37:35Z",
                "end": "2021-10-25T15:37:35Z"
              }
            }
          ],
          "location": {
            "lat": 51.059188,
            "lng": 13.540317
          },
          "distance": 49111
        }
      ],
      "statistic": {
        "cost": 140.10000000000002,
        "distance": 49111,
        "duration": 10626,
        "times": {
          "driving": 2637,
          "serving": 4050,
          "waiting": 3939,
          "stopping": 0,
          "break": 0
        }
      },
      "shiftIndex": 2
    },
    {
      "vehicleId": "Vehicle_1_1",
      "typeId": "Vehicle_1",
      "stops": [
        {
          "time": {
            "arrival": "2021-10-23T08:00:00Z",
            "departure": "2021-10-23T11:10:08Z"
          },
          "load": [
            0
          ],
          "activities": [
            {
              "jobId": "departure",
              "type": "departure",
              "location": {
                "lat": 51.059188,
                "lng": 13.540317
              },
              "time": {
                "start": "2021-10-23T08:00:00Z",
                "end": "2021-10-23T11:10:08Z"
              }
            }
          ],
          "location": {
            "lat": 51.059188,
            "lng": 13.540317
          },
          "distance": 0
        },
        {
          "time": {
            "arrival": "2021-10-23T11:31:57Z",
            "departure": "2021-10-23T11:54:27Z"
          },
          "load": [
            1
          ],
          "activities": [
            {
              "jobId": "Job_1",
              "type": "pickup",
              "location": {
                "lat": 51.05238,
                "lng": 13.74114
              },
              "time": {
                "start": "2021-10-23T11:31:57Z",
                "end": "2021-10-23T11:54:27Z"
              }
            }
          ],
          "location": {
            "lat": 51.05238,
            "lng": 13.74114
          },
          "distance": 19038
        },
        {
          "time": {
            "arrival": "2021-10-23T12:00:00Z",
            "departure": "2021-10-23T12:22:30Z"
          },
          "load": [
            2
          ],
          "activities": [
            {
              "jobId": "Job_2",
              "type": "pickup",
              "location": {
                "lat": 51.06099,
                "lng": 13.75245
              },
              "time": {
                "start": "2021-10-23T12:00:00Z",
                "end": "2021-10-23T12:22:30Z"
              }
            }
          ],
          "location": {
            "lat": 51.06099,
            "lng": 13.75245
          },
          "distance": 21408
        },
        {
          "time": {
            "arrival": "2021-10-23T12:43:05Z",
            "departure": "2021-10-23T12:43:05Z"
          },
          "load": [
            0
          ],
          "activities": [
            {
              "jobId": "arrival",
              "type": "arrival",
              "location": {
                "lat": 51.059188,
                "lng": 13.540317
              },
              "time": {
                "start": "2021-10-23T12:43:05Z",
                "end": "2021-10-23T12:43:05Z"
              }
            }
          ],
          "location": {
            "lat": 51.059188,
            "lng": 13.540317
          },
          "distance": 41474
        }
      ],
      "statistic": {
        "cost": 109.679,
        "distance": 41474,
        "duration": 5577,
        "times": {
          "driving": 2877,
          "serving": 2700,
          "waiting": 0,
          "stopping": 0,
          "break": 0
        }
      },
      "shiftIndex": 0
    }
  ]
}

次のステップ