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

停車地の最小数を設定する

HERE Tour Planning APIでは、旅程内の各車両の停車地の最小数を設定できます。これにより、最適化アルゴリズムは、車両の積載量を満たすために各ルートに少なくとも一定数の停車地を含めるようにします。物流シナリオでは、これによりツアーの効率が向上し、車両の積載量が最大限活用される可能性があります。たとえば、停車地の最小数を設定すると、同じ数の停車地を処理するために必要な車両台数が減り、時間や燃料の節約につながるほか、車両の摩耗を軽減できる可能性があります。

📘

これはアルファ機能 (新規またはテスト段階であり、現在開発中) です。アルファ機能は、テストおよびフィードバックの目的で提供されています。これらは大幅に変更されたり、一般に入手できなくなったりする可能性があります。

詳細については、「テスト段階の機能の詳細」を参照してください。

最小停車地の構成を理解する

HERE Tour Planning APIでは、fleet.types.limits.stops problem構成内でminCountオブジェクトを使用して、特定のフリートの車両に必要なツアー内の最小停車地数を定義できます。

最小停車地機能のケースでは、ツアーの「停車地」は、1つ以上の集荷または配達アクティビティが行われる場所を示します。最適化アルゴリズムがアクティビティのグループを単一の停車地として考慮するには、その中で指定された各アクティビティが同じ場所に対して構成されている必要があります。それ以外の場合、アルゴリズムはそのようなアクティビティを最小停車地機能のパラメーター内の別の停車地として扱う可能性があります。

📘

これは開発中のテスト段階の機能です。この機能を有効にするには、問題仕様でminStopsexperimentalFeatures配列に追加します。

詳細については、以下を参照してください。

次のスニペットは、limitsオブジェクト内の10の停車地の最小数のサンプル構成を示しています。

// JSON shortened for brevity, showcasing the limits object.
"limits": {
    "stops": {
    "minCount": {
        "value": 10
    }
  }
}

ユースケース:さまざまな種類の車両を使用したフリートのコスト効率の高い輸送

フリートが1台の大型トラックと5台の小型バンで構成されており、トラックに比べて小型バンの方がコスト効率が高いユースケースを考えてみましょう。コスト効率を最大限に高めるために、トラックの最小停車地上限は10となっています。したがって、注文が少なく、停車地の上限に達していない場合は、トラックの代わりにバンを利用できます。

問題

サンプルユースケースを反映した次の問題JSONを参照してください。

Click to expand/collapse the sample JSON
{
  "configuration": {
    "experimentalFeatures": [
      "minStops"
    ]
  },
  "fleet": {
    "types": [
      {
        "id": "van",
        "profile": "car",
        "costs": {
          "fixed": 10,
          "distance": 0.005,
          "time": 0.005
        },
        "shifts": [
          {
            "start": {
              "time": "2023-05-28T05:30:00Z",
              "location": {
                "lat": 53.586203,
                "lng": 14.821028
              }
            },
            "end": {
              "time": "2023-05-28T18:00:00Z",
              "location": {
                "lat": 53.586203,
                "lng": 14.821028
              }
            }
          }
        ],
        "capacity": [
          300
        ],
        "amount": 5
      },
      {
        "id": "truck",
        "profile": "truck",
        "costs": {
          "fixed": 40,
          "distance": 0.007,
          "time": 0.007
        },
        "shifts": [
          {
            "start": {
              "time": "2023-05-28T05:30:00Z",
              "location": {
                "lat": 53.586203,
                "lng": 14.821028
              }
            },
            "end": {
              "time": "2023-05-28T18:00:00Z",
              "location": {
                "lat": 53.586203,
                "lng": 14.821028
              }
            }
          }
        ],
        "capacity": [
          600
        ],
        "amount": 1,
        "limits": {
          "stops": {
            "minCount": {
              "value": 10
            }
          }
        }
      }
    ],
    "profiles": [
      {
        "type": "car",
        "name": "car"
      },
      {
        "type": "truck",
        "name": "truck"
      }
    ]
  },
  "plan": {
    "jobs": [
      {
        "id": "Job_1_pickup",
        "tasks": {
          "pickups": [
            {
              "places": [
                {
                  "location": {
                    "lat": 53.653166,
                    "lng": 14.629095
                  },
                  "duration": 600
                }
              ],
              "demand": [
                100
              ]
            }
          ]
        }
      },
      {
        "id": "Job_2_pickup",
        "tasks": {
          "pickups": [
            {
              "places": [
                {
                  "location": {
                    "lat": 53.819048,
                    "lng": 14.755096
                  },
                  "duration": 600
                }
              ],
              "demand": [
                100
              ]
            }
          ]
        }
      },
      {
        "id": "Job_3_pickup",
        "tasks": {
          "pickups": [
            {
              "places": [
                {
                  "location": {
                    "lat": 53.830118,
                    "lng": 14.629969
                  },
                  "duration": 600
                }
              ],
              "demand": [
                100
              ]
            }
          ]
        }
      },
      {
        "id": "Job_4_pickup",
        "tasks": {
          "pickups": [
            {
              "places": [
                {
                  "location": {
                    "lat": 53.383915,
                    "lng": 14.710449
                  },
                  "duration": 600
                }
              ],
              "demand": [
                100
              ]
            }
          ]
        }
      },
      {
        "id": "Job_5_pickup",
        "tasks": {
          "pickups": [
            {
              "places": [
                {
                  "location": {
                    "lat": 53.35405,
                    "lng": 14.799069
                  },
                  "duration": 600
                }
              ],
              "demand": [
                100
              ]
            }
          ]
        }
      },
      {
        "id": "Job_6_pickup",
        "tasks": {
          "pickups": [
            {
              "places": [
                {
                  "location": {
                    "lat": 53.367761,
                    "lng": 15.066569
                  },
                  "duration": 600
                }
              ],
              "demand": [
                100
              ]
            }
          ]
        }
      }
    ]
  }
}

このサンプル問題では、フリートは次の車両タイプで構成されています。

トラックバン
Profileトラック乗用車
Quantity1台5台
Fixed cost4010
Capacity600300
Min stops10制限なし

ツアー計画は6つの集荷ジョブで構成されており、それぞれの需要値は100に設定されています。

ソリューション

この問題のソリューションでは、停車地の最小数を設定することで費用対効果とツアーの効率がどのように優先されるかを示しています。

Click to expand/collapse the sample JSON
{
    "statistic": {
        "cost": 1127.48,
        "distance": 207835,
        "duration": 13661,
        "times": {
            "driving": 10061,
            "serving": 3600,
            "waiting": 0,
            "stopping": 0,
            "break": 0
        }
    },
    "tours": [
        {
            "vehicleId": "van_1",
            "typeId": "van",
            "stops": [
                {
                    "time": {
                        "arrival": "2023-05-28T05:30:00Z",
                        "departure": "2023-05-28T05:30:00Z"
                    },
                    "load": [
                        0
                    ],
                    "activities": [
                        {
                            "jobId": "departure",
                            "type": "departure",
                            "location": {
                                "lat": 53.586203,
                                "lng": 14.821028
                            },
                            "time": {
                                "start": "2023-05-28T05:30:00Z",
                                "end": "2023-05-28T05:30:00Z"
                            }
                        }
                    ],
                    "location": {
                        "lat": 53.586203,
                        "lng": 14.821028
                    },
                    "distance": 0
                },
                {
                    "time": {
                        "arrival": "2023-05-28T05:53:16Z",
                        "departure": "2023-05-28T06:03:16Z"
                    },
                    "load": [
                        100
                    ],
                    "activities": [
                        {
                            "jobId": "Job_2_pickup",
                            "type": "pickup",
                            "location": {
                                "lat": 53.819048,
                                "lng": 14.755096
                            },
                            "time": {
                                "start": "2023-05-28T05:53:16Z",
                                "end": "2023-05-28T06:03:16Z"
                            }
                        }
                    ],
                    "location": {
                        "lat": 53.819048,
                        "lng": 14.755096
                    },
                    "distance": 35175
                },
                {
                    "time": {
                        "arrival": "2023-05-28T06:17:09Z",
                        "departure": "2023-05-28T06:27:09Z"
                    },
                    "load": [
                        200
                    ],
                    "activities": [
                        {
                            "jobId": "Job_3_pickup",
                            "type": "pickup",
                            "location": {
                                "lat": 53.830118,
                                "lng": 14.629969
                            },
                            "time": {
                                "start": "2023-05-28T06:17:09Z",
                                "end": "2023-05-28T06:27:09Z"
                            }
                        }
                    ],
                    "location": {
                        "lat": 53.830118,
                        "lng": 14.629969
                    },
                    "distance": 48442
                },
                {
                    "time": {
                        "arrival": "2023-05-28T06:45:28Z",
                        "departure": "2023-05-28T06:55:28Z"
                    },
                    "load": [
                        300
                    ],
                    "activities": [
                        {
                            "jobId": "Job_1_pickup",
                            "type": "pickup",
                            "location": {
                                "lat": 53.653166,
                                "lng": 14.629095
                            },
                            "time": {
                                "start": "2023-05-28T06:45:28Z",
                                "end": "2023-05-28T06:55:28Z"
                            }
                        }
                    ],
                    "location": {
                        "lat": 53.653166,
                        "lng": 14.629095
                    },
                    "distance": 71410
                },
                {
                    "time": {
                        "arrival": "2023-05-28T07:13:06Z",
                        "departure": "2023-05-28T07:13:06Z"
                    },
                    "load": [
                        0
                    ],
                    "activities": [
                        {
                            "jobId": "arrival",
                            "type": "arrival",
                            "location": {
                                "lat": 53.586203,
                                "lng": 14.821028
                            },
                            "time": {
                                "start": "2023-05-28T07:13:06Z",
                                "end": "2023-05-28T07:13:06Z"
                            }
                        }
                    ],
                    "location": {
                        "lat": 53.586203,
                        "lng": 14.821028
                    },
                    "distance": 92386
                }
            ],
            "statistic": {
                "cost": 502.86,
                "distance": 92386,
                "duration": 6186,
                "times": {
                    "driving": 4386,
                    "serving": 1800,
                    "waiting": 0,
                    "stopping": 0,
                    "break": 0
                }
            },
            "shiftIndex": 0
        },
        {
            "vehicleId": "van_4",
            "typeId": "van",
            "stops": [
                {
                    "time": {
                        "arrival": "2023-05-28T05:30:00Z",
                        "departure": "2023-05-28T05:30:00Z"
                    },
                    "load": [
                        0
                    ],
                    "activities": [
                        {
                            "jobId": "departure",
                            "type": "departure",
                            "location": {
                                "lat": 53.586203,
                                "lng": 14.821028
                            },
                            "time": {
                                "start": "2023-05-28T05:30:00Z",
                                "end": "2023-05-28T05:30:00Z"
                            }
                        }
                    ],
                    "location": {
                        "lat": 53.586203,
                        "lng": 14.821028
                    },
                    "distance": 0
                },
                {
                    "time": {
                        "arrival": "2023-05-28T06:02:53Z",
                        "departure": "2023-05-28T06:12:53Z"
                    },
                    "load": [
                        100
                    ],
                    "activities": [
                        {
                            "jobId": "Job_6_pickup",
                            "type": "pickup",
                            "location": {
                                "lat": 53.367761,
                                "lng": 15.066569
                            },
                            "time": {
                                "start": "2023-05-28T06:02:53Z",
                                "end": "2023-05-28T06:12:53Z"
                            }
                        }
                    ],
                    "location": {
                        "lat": 53.367761,
                        "lng": 15.066569
                    },
                    "distance": 39176
                },
                {
                    "time": {
                        "arrival": "2023-05-28T06:39:46Z",
                        "departure": "2023-05-28T06:49:46Z"
                    },
                    "load": [
                        200
                    ],
                    "activities": [
                        {
                            "jobId": "Job_5_pickup",
                            "type": "pickup",
                            "location": {
                                "lat": 53.35405,
                                "lng": 14.799069
                            },
                            "time": {
                                "start": "2023-05-28T06:39:46Z",
                                "end": "2023-05-28T06:49:46Z"
                            }
                        }
                    ],
                    "location": {
                        "lat": 53.35405,
                        "lng": 14.799069
                    },
                    "distance": 68995
                },
                {
                    "time": {
                        "arrival": "2023-05-28T07:04:19Z",
                        "departure": "2023-05-28T07:14:19Z"
                    },
                    "load": [
                        300
                    ],
                    "activities": [
                        {
                            "jobId": "Job_4_pickup",
                            "type": "pickup",
                            "location": {
                                "lat": 53.383915,
                                "lng": 14.710449
                            },
                            "time": {
                                "start": "2023-05-28T07:04:19Z",
                                "end": "2023-05-28T07:14:19Z"
                            }
                        }
                    ],
                    "location": {
                        "lat": 53.383915,
                        "lng": 14.710449
                    },
                    "distance": 85519
                },
                {
                    "time": {
                        "arrival": "2023-05-28T07:34:35Z",
                        "departure": "2023-05-28T07:34:35Z"
                    },
                    "load": [
                        0
                    ],
                    "activities": [
                        {
                            "jobId": "arrival",
                            "type": "arrival",
                            "location": {
                                "lat": 53.586203,
                                "lng": 14.821028
                            },
                            "time": {
                                "start": "2023-05-28T07:34:35Z",
                                "end": "2023-05-28T07:34:35Z"
                            }
                        }
                    ],
                    "location": {
                        "lat": 53.586203,
                        "lng": 14.821028
                    },
                    "distance": 115449
                }
            ],
            "statistic": {
                "cost": 624.62,
                "distance": 115449,
                "duration": 7475,
                "times": {
                    "driving": 5675,
                    "serving": 1800,
                    "waiting": 0,
                    "stopping": 0,
                    "break": 0
                }
            },
            "shiftIndex": 0
        }
    ]
}

次の図はソリューションを図示したものです。

停車地の最小数を伴うVRPのソリューション

結論

特定のコンテキスト内で最小停車地数の機能を利用することで、最適化アルゴリズムが必ずコスト効率が高いことが判明した場合にのみtruck車両を選択するようになります。ただし、ソリューションから明らかなように、最適化アルゴリズムはtruck車両を選択しませんでした。代わりに、積載量を最大限に活用して、計画されたジョブをより効率的に遂行できる、より小型で安価なvan車両を選択しました。この構成によって車両の選択と積載量利用率が最適化され、最終的にはコスト削減とツアーの効率化が促進されます。

次のステップ

  • HERE Tour Planning APIで問題を作成する方法の詳細については、「問題」を参照してください。
  • HERE Tour Planning APIのメソッド、エンドポイント、パラメーターの詳細については、「APIリファレンス」を参照してください。
  • 他の制限タイプについて詳しくは、「ルート制限を設定する」を参照してください。