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

旅程計画の料金を管理する

Tour Planning製品には高度な機能が用意されており、他のHEREサービスと異なる独自の課金体系があります。料金は、このドキュメントの以降のセクションで詳しく説明するように、トランザクション数に基づいて計算されます。料金の詳細については、Tour Planningセクションの料金ページを参照してください。

Tour Planningの利用料金は、旅程計画問題で指定された場所数に応じて計算されたトランザクション数に基づいて請求されます。車両のシフトの開始場所と終了場所、車両の休憩場所 (指定されている場合)、ジョブの集荷/配達場所など、各場所が請求対象のトランザクションとしてカウントされます。車両ルート検索問題が適切に作成された場合にのみ請求対象のトランザクションが生成されます。誤って問題を作成し、エラーレスポンスが返された場合、トランザクションは請求対象となりません。

非同期エンドポイントでは、利用可能になった後に問題のソリューションをリクエストしなかった場合でも、トランザクションは蓄積されます。次の例は、トランザクション数に基づいて問題が請求される方法を示しています。

場所ベースのトランザクションの計算を理解する

正確なトランザクションカウントを判断するには、車両ルート検索問題に関係するすべての場所オブジェクトをカウントすることが不可欠です。次のセクションでは、問題のfleetおよびplanオブジェクト内で場所がどのようにカウントされるかを詳しく説明します。

運行管理

運行管理制約を正確に考慮するには、車両シフトの開始点と終了点、すべてのシフト場所 (複数のシフトが使用されている場合)、再積載場所、休憩場所の4つの場所のキーセットの計算を検討する必要があります。これらの計算はトランザクションとして扱われます。

計画

問題のplanの側面に関しては、単一ジョブの場所と複数ジョブの場所という2種類のジョブの場所も計算します。ツアーを再計画する場合は、ジョブの場所の合計数もこの計算に追加され、結果として得られるすべての値がトランザクションと見なされます。

リレーション

次の例は、4つのジョブを完了することを意図した車両を示しています。車両のシフトの開始場所と終了場所は2トランザクションとして計算されます。 各ジョブには1つの場所があるため、4つの追加トランザクションが発生します。特定のジョブを特定の順序で完了するように、車両に関係が設定されていました。ただし、問題の場所を追加したり削除したりすることはないため、これはトランザクションの総数には影響しません。最終的に、この例は6つのトランザクションに対応する6つの場所からなるツアーに最適化されます。

Click to expand/collapse the sample JSON
{
  "fleet": {
    "types": [
      {
        "id": "Vehicle_1",
        "profile": "car_1",
        "costs": {
          "fixed": 9,
          "distance": 0.004,
          "time": 0.005
        },
        "shifts": [
          {
            "start": {
              "time": "2021-08-27T08:03:00Z",
              "location": {
                "lat": 52.530971,
                "lng": 13.384915
              }
            },
            "end": {
              "time": "2021-08-27T18:03:00Z",
              "location": {
                "lat": 52.530971,
                "lng": 13.384915
              }
            }
          }
        ],
        "capacity": [
          10
        ],
        "limits": {
          "maxDistance": 300000,
          "shiftTime": 43200
        },
        "amount": 1
      }
    ],
    "profiles": [
      {
        "type": "car",
        "name": "car_1"
      }
    ]
  },
  "plan": {
    "jobs": [
      {
        "id": "job_1",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "times": [
                    [
                      "2021-08-27T09:03:00Z",
                      "2021-08-27T18:03:00Z"
                    ]
                  ],
                  "location": {
                    "lat": 52.59175589353722,
                    "lng": 13.350747750372257
                  },
                  "duration": 360
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      },
      {
        "id": "job_2",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "times": [
                    [
                      "2021-08-27T11:03:00Z",
                      "2021-08-27T20:03:00Z"
                    ]
                  ],
                  "location": {
                    "lat": 52.43363386232821,
                    "lng": 13.403232562191313
                  },
                  "duration": 540
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      },
      {
        "id": "job_3",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "times": [
                    [
                      "2021-08-27T10:03:00Z",
                      "2021-08-27T16:03:00Z"
                    ]
                  ],
                  "location": {
                    "lat": 52.473321658918245,
                    "lng": 13.28972099097991
                  },
                  "duration": 660
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      },
      {
        "id": "job_4",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "times": [
                    [
                      "2021-08-27T09:03:00Z",
                      "2021-08-27T17:03:00Z"
                    ]
                  ],
                  "location": {
                    "lat": 52.54165532725351,
                    "lng": 13.365047170290309
                  },
                  "duration": 1140
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      }
    ],
    "relations": [
      {
        "type": "sequence",
        "jobs": [
          "job_1",
          "job_4"
        ],
        "vehicleId": "Vehicle_1_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

これらのシフトの開始場所と終了場所は同じです。通常、ドライバーは同じ集配センターでシフトを開始して終了します。それにもかかわらず、アルゴリズムでは各場所が別々のトランザクションとして扱われます。その結果、fleetセクション内に合計8件のトランザクションが表示されることが予想されます。

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"
      }
    ]
  },
  // Remaining problem components omitted for brevity
}

休憩

車両で休憩を使用する場合、休憩はその場所が指定されている場合にのみトランザクションとみなされます。休憩の場所が指定されていない場合、ジョブの場所の1つで休憩が発生し、追加のトランザクションは発生しません。

次の例は前のシナリオを示したものです。この問題では、車両に固定シフトと休憩があり、シフトの開始場所と終了場所がトランザクションと一致しており、休憩には特定の場所がありません。結果として、この例ではfleet制約に2つのトランザクションが存在します。

Click to expand/collapse the sample JSON
{
  "fleet": {
    "types": [
      {
        "id": "92d3cd5cca04",
        "profile": "car_1",
        "costs": {
          "fixed": 10,
          "distance": 0.004,
          "time": 0.009
        },
        "shifts": [
          {
            "start": {
              "time": "2021-08-27T08:03:00Z",
              "location": {
                "lat": 52.530971,
                "lng": 13.384915
              }
            },
            "end": {
              "time": "2021-08-27T17:03:00Z",
              "location": {
                "lat": 52.530971,
                "lng": 13.384915
              }
            },
            "breaks": [
              {
                "duration": 1800,
                "times": [
                  [
                    "2021-08-27T12:03:00Z",
                    "2021-08-27T13:03:00Z"
                  ]
                ]
              }
            ]
          }
        ],
        "capacity": [
          2
        ],
        "limits": {
          "maxDistance": 300000
        },
        "amount": 1
      }
    ],
    "profiles": [
      {
        "type": "car",
        "name": "car_1"
      }
    ]
  }
  // Remaining problem components omitted for brevity
}

マルチジョブ

複数の集荷と配達を伴うマルチジョブを使用する場合、それらの場所のそれぞれが別々のトランザクションとして計算されます。たとえば、次の例に示すように、3件の集荷があり、すべての集荷を1か所に届ける必要がある配達で構成されたマルチジョブを検討してみましょう。このシナリオでは、計算によって合計4件のトランザクションが生成されます。

Click to expand/collapse the sample JSON
{ 
  // Previous problem components omitted for brevity.
  "plan": {
    "jobs": [
      {
        "id": "job_1",
        "tasks": {
          "pickups": [
            {
              "places": [
                {
                  "location": {
                    "lat": 52.47706593757918,
                    "lng": 13.390815701172201
                  },
                  "duration": 660
                }
              ],
              "demand": [
                1
              ]
            },
            {
              "places": [
                {
                  "location": {
                    "lat": 52.473571009931106,
                    "lng": 13.389035169086807
                  },
                  "duration": 1140
                }
              ],
              "demand": [
                1
              ]
            },
            {
              "places": [
                {
                  "location": {
                    "lat": 52.53090538774364,
                    "lng": 13.384692097156309
                  },
                  "duration": 840
                }
              ],
              "demand": [
                1
              ]
            }
          ],
          "deliveries": [
            {
              "places": [
                {
                  "location": {
                    "lat": 52.58919138279804,
                    "lng": 13.462161100698735
                  },
                  "duration": 1020
                }
              ],
              "demand": [
                3
              ]
            }
          ]
        }
      }
    ]
  }
}

代替場所

代替場所を使用する場合、ソリューション生成後に車両がすべての場所に訪れるかどうかに関係なく、問題制約で指定されたすべての場所がトランザクションとして扱われます。これは、代替場所はジョブに対して設定され、各場所に特定の時間枠が設定されるためです。ソリューションが計算された後、車両は最適化アルゴリズムによって決定された最適な場所にのみ訪れます。

問題を定式化するとき、制約内に追加されたすべての場所がトランザクションとして扱われます。以下の例では、2つの場所が"Home""Work"としてタグ付けされており、異なる時間枠が設定されているジョブがあります。ソリューションには、ツアー内のこれらの場所の1つだけが含まれていますが、トランザクションの総数は2つのままです。

Click to expand/collapse the sample JSON
{ 
  // Previous problem components omitted for brevity.
  "plan": {
    "jobs": [
      {
        "id": "Job_1",
        "tasks": {
          "pickups": [
            {
              "places": [
                {
                  "times": [
                    [
                      "2021-10-23T08:30:00Z",
                      "2021-10-23T09:00:00Z"
                    ]
                  ],
                  "location": {
                    "lat": 52.5154509,
                    "lng": 13.42167
                  },
                  "duration": 1150,
                  "tag": "Home"
                },
                {
                  "times": [
                    [
                      "2021-10-23T10:00:00Z",
                      "2021-10-23T19:00:00Z"
                    ]
                  ],
                  "location": {
                    "lat": 52.6834366,
                    "lng": 13.2781471
                  },
                  "duration": 1150,
                  "tag": "Work"
                }
              ],
              "demand": [
                1
              ]
            }
          ]
        }
      }
    ]
  }
}

再積載

再積載を使用する場合、問題で再積載として指定された各場所がトランザクションの総数にカウントされます。

次の例は、2つの異なる場所での2つの再積載を示しています。結果として得られるソリューションには、ゼロ、1、または2のさまざまな再積載数が含まれる場合があります。ただし、すべての場合において、再積載として指定された場所が別々のトランザクションとしてカウントされます。

Click to expand/collapse the sample JSON
{
  "fleet": {
    "types": [
      {
        "id": "92d3cd5cca04",
        "profile": "car_1",
        "costs": {
          "fixed": 10,
          "distance": 0.004,
          "time": 0.009
        },
        "shifts": [
          {
            "start": {
              "time": "2021-08-27T08:03:00Z",
              "location": {
                "lat": 52.530971,
                "lng": 13.384915
              }
            },
            "end": {
              "time": "2021-08-27T17:03:00Z",
              "location": {
                "lat": 52.530971,
                "lng": 13.384915
              }
            },
            "reloads": [
              {
                "location": {
                  "lat": 52.540881,
                  "lng": 13.379915
                },
                "duration": 180
              },
              {
                "location": {
                  "lat": 52.530971,
                  "lng": 13.384915
                },
                "duration": 180
              }
            ]
          }
        ],
        "capacity": [
          2
        ],
        "amount": 1
      }
    ],
    "profiles": [
      {
        "type": "car",
        "name": "car_1"
      }
    ]
  }
  // Remaining problem components omitted for brevity
}

billingTagを使用してAPIの使用状況とコストを分類する

リクエストにカスタムbillingTag識別子を添付することで、特定のプロジェクト、フィーチャー、またはクライアントにまたがってHERE Tour Planning APIの使用状況とコストを分類して追跡できます。

次のスニペットは、HERE Tour Planning APIリクエストに課金タグを追加する方法の例を示しています。

curl --location 'https://tourplanning.hereapi.com/v3/problems?billingTag=YOUR_BILLING_TAG' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <TOKEN>' \
--data '<PROBLEM.json>'

前のリクエストの内容は次のとおりです。

  • billingTagは、リクエストの一部として行われたトランザクションを割り当てるカテゴリーを表す文字列値を含むパラメーターです。
  • <TOKEN>はOAuth 2.0ベアラートークンです。
  • <PROBLEM.json>は解決する車両ルート検索問題のJSONボディを表しています。

使用量レポートを取得する

次の手順に従って、課金タグごとにコストの内訳がわかる使用量レポートをHEREプラットフォームからダウンロードします。

  1. HEREプラットフォームの[Usage report](使用量レポート) ランディングページに移動します。

  2. 使用量レポートのプロジェクトと時間範囲を指定します。

  3. [Download CSV](CSVをダウンロード) をクリックします。

    📘

    • **Usage details** セクションには、課金タグの詳細は含まれていません。詳細については、CSVファイルをダウンロードする必要があります。
    • 選択した時間範囲によっては、レポートの生成に時間がかかる場合があります。

次の図を参照してください。 詳細なAPI使用量レポートの生成

課金タグごとにAPI使用量レポートを取得する方法については、コスト管理の開発者ガイドを参照してください。

CSVファイルには、指定された期間中にリクエストで使用された各課金タグのAPI使用量を示すBillingTag列が含まれています。

次のステップ

HERE Tour Planning APIリクエストを構築して送信する方法の詳細については、以下を参照してください。