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

特定の最適化目標に合わせて目的関数を使用する

目的とは最適化問題における目標です。問題の制約を満たすすべての実行可能なソリューションで最小化または最大化される値です。目的が使用されると、objectivesプロパティを使用して配列として一緒に指定されます。すべての目的を毎回指定する必要はありません。目的の有/absenceと、リスト表示されている順序が重要です。リストの先頭に表示される目的は下位に表示されるものよりも重要になります。ソフト制約は他の設定を考慮しますが、ハード制約は必須です。シーケンスを使用すると、複数の目的のソリューションを実現できます。

📘

minimizeUnassignedminimizeCostの目的は必須です。省略するとAPIエラーが生じます。

これらの目的の効果を理解するために、ドライバーが働いた時間に基づいて報酬を受け取るシナリオを考えてみましょう。このような場合、ディスパッチャはできるだけ短時間でルートを構成して運営コストの削減と効率化の向上を図ります。目的関数を使用すると、ソリューションにこのロジックを適用できます。

目的minimizeDurationを使用すると、ルートの時間を短縮できます。問題に追加する目的配列の例を次に示します。


"objectives": [
    {
      "type": "minimizeUnassigned"
    },
    {
      "type": "minimizeDuration"
    },
    {
      "type": "minimizeCost"
    }
]

目的を指定しない場合、デフォルトではソルバーはこのロジックに従います。

  • 重要度を最高に設定すると、割り当てられていないジョブの量が最小限に抑えられます。
  • 重要度を中に設定すると、ルート数が最小限に抑えられます。
  • 重要度を最低に設定すると、総コストを最小限に抑えられます。

これは次の定義と同等です。


"objectives": [
    {
      "type": "minimizeUnassigned"
    },
    {
      "type": "optimizeTourCount"
      "action": "minimize"
    },
    {
      "type": "minimizeCost"
    }
]

すべての目的リストを含む詳細については、「目的」を参照してください。

タスクシーケンスのユースケースを最適化する

このセクションでは、目的optimizeTaskOrderを使用してルートのジョブタスクアクティビティの順序を制御する方法を説明します。タスクの順序はハード制約またはソフト制約のいずれかとして使用できます。optimizeTaskOrderがソフト制約の場合、順序プロパティ値に従うよう試みます。ただし、ジョブが割り当てられなくなる可能性がある場合は、順序制約に違反してジョブが割り当てられるようにします。

問題の定式化は3つあり、ジョブタイプはpickupです。

  • まず、時間枠の競合など、何らかの理由でタスクの順序を実現できないという簡単な問題があります。
  • 次に、目的がなければルートが作成されず、目的があればルートが作成されることを示す問題があります。
  • 3番目の問題では、時間枠が削除され、その場合にはジョブの順序が守られていることが示されています。この例ではシフト終了が指定されていないため、最短ルートはオープンVRPを使用して、1つのジョブを集配センターの近くに、もう1つのジョブを集配センターの遠くに配置することです。ソルバーはデフォルトで、まず集配センターの近くでジョブを実行しようとします。これにより、全体的なルートが短縮されるためです。

問題:optimizeTaskOrder仕様がない

以下のような基本的な問題があります。

  • シフトを伴うVRP (開始と終了の集配センターの場所が異なる)
  • 遂行するのは次の3つのジョブ
    • Job_1(指定された時間枠を使用)
    • Job_2
    • Job_3はシフトの開始地点から順次、道路で快適に遂行される
    問題がルート順序なしで指定されている場合、ジョブはルートに従って訪問されます。つまり、Job_1、Job_2、Job_3の順に訪問されます。車両がシフトの最終場所に到着します。

ソリューションを参照してください。

{
    "plan": {
        "jobs": [
            {
                "id": "Job_1_1h_driving",
                "tasks": {
                    "pickups": [
                        {
                            "places": [
                                {
                                    "location": {
                                        "lat": 49.066063,
                                        "lng": 11.917153
                                    },
                                    "times": [
                                        [
                                            "2023-09-20T08:00:00Z",
                                            "2023-09-20T10:00:00Z"
                                        ]
                                    ],
                                    "duration": 3600
                                }
                            ],
                            "demand": [
                                1
                            ]
                        }
                    ]
                }
            },
            {
                "id": "Job_2_2h_driving",
                "tasks": {
                    "pickups": [
                        {
                            "places": [
                                {
                                    "location": {
                                        "lat": 49.526849,
                                        "lng": 11.066198
                                    },
                                    "duration": 3600
                                }
                            ],
                            "demand": [
                                1
                            ]
                        }
                    ]
                }
            },
            {
                "id": "Job_3_3h_driving",
                "tasks": {
                    "pickups": [
                        {
                            "places": [
                                {
                                    "location": {
                                        "lat": 49.785296,
                                        "lng": 10.129362
                                    },
                                    "duration": 3600
                                }
                            ],
                            "demand": [
                                1
                            ]
                        }
                    ]
                }
            }
        ]
    },
    "fleet": {
        "types": [
            {
                "id": "vehicle_1",
                "profile": "normal_car",
                "costs": {
                    "fixed": 22,
                    "distance": 0.0002,
                    "time": 0.0048
                },
                "shifts": [
                    {
                        "start": {
                            "time": "2023-09-20T08:00:00Z",
                            "location": {
                                "lat": 48.821421,
                                "lng": 12.931591
                            }
                        },
                        "end": {
                            "time": "2023-09-22T23:00:00Z",
                            "location": {
                                "lat": 50.912724,
                                "lng": 7.1055
                            }
                        }
                    }
                ],
                "capacity": [
                    10
                ],
                "amount": 1
            }
        ],
        "profiles": [
            {
                "name": "normal_car",
                "type": "car",
                "traffic": {
                    "mode": "disabled"
                }
            }
        ]
    }
}

ソリューション:optimizeTaskOrder仕様がない

{
    "statistic": {
        "cost": 275.6742,
        "distance": 559867,
        "duration": 29521,
        "times": {
            "driving": 18721,
            "serving": 10800,
            "waiting": 0,
            "stopping": 0,
            "break": 0
        }
    },
    "tours": [
        {
            "vehicleId": "vehicle_1_1",
            "typeId": "vehicle_1",
            "stops": [
                {
                    "time": {
                        "arrival": "2023-09-20T08:00:00Z",
                        "departure": "2023-09-20T08:00:00Z"
                    },
                    "load": [
                        0
                    ],
                    "activities": [
                        {
                            "jobId": "departure",
                            "type": "departure",
                            "location": {
                                "lat": 48.821421,
                                "lng": 12.931591
                            },
                            "time": {
                                "start": "2023-09-20T08:00:00Z",
                                "end": "2023-09-20T08:00:00Z"
                            }
                        }
                    ],
                    "location": {
                        "lat": 48.821421,
                        "lng": 12.931591
                    },
                    "distance": 0
                },
                {
                    "time": {
                        "arrival": "2023-09-20T08:50:15Z",
                        "departure": "2023-09-20T09:50:15Z"
                    },
                    "load": [
                        1
                    ],
                    "activities": [
                        {
                            "jobId": "Job_1_1h_driving",
                            "type": "pickup",
                            "location": {
                                "lat": 49.066063,
                                "lng": 11.917153
                            },
                            "time": {
                                "start": "2023-09-20T08:50:15Z",
                                "end": "2023-09-20T09:50:15Z"
                            }
                        }
                    ],
                    "location": {
                        "lat": 49.066063,
                        "lng": 11.917153
                    },
                    "distance": 86277
                },
                {
                    "time": {
                        "arrival": "2023-09-20T10:38:58Z",
                        "departure": "2023-09-20T11:38:58Z"
                    },
                    "load": [
                        2
                    ],
                    "activities": [
                        {
                            "jobId": "Job_2_2h_driving",
                            "type": "pickup",
                            "location": {
                                "lat": 49.526849,
                                "lng": 11.066198
                            },
                            "time": {
                                "start": "2023-09-20T10:38:58Z",
                                "end": "2023-09-20T11:38:58Z"
                            }
                        }
                    ],
                    "location": {
                        "lat": 49.526849,
                        "lng": 11.066198
                    },
                    "distance": 174491
                },
                {
                    "time": {
                        "arrival": "2023-09-20T12:29:23Z",
                        "departure": "2023-09-20T13:29:23Z"
                    },
                    "load": [
                        3
                    ],
                    "activities": [
                        {
                            "jobId": "Job_3_3h_driving",
                            "type": "pickup",
                            "location": {
                                "lat": 49.785296,
                                "lng": 10.129362
                            },
                            "time": {
                                "start": "2023-09-20T12:29:23Z",
                                "end": "2023-09-20T13:29:23Z"
                            }
                        }
                    ],
                    "location": {
                        "lat": 49.785296,
                        "lng": 10.129362
                    },
                    "distance": 258526
                },
                {
                    "time": {
                        "arrival": "2023-09-20T16:12:01Z",
                        "departure": "2023-09-20T16:12:01Z"
                    },
                    "load": [
                        0
                    ],
                    "activities": [
                        {
                            "jobId": "arrival",
                            "type": "arrival",
                            "location": {
                                "lat": 50.912724,
                                "lng": 7.1055
                            },
                            "time": {
                                "start": "2023-09-20T16:12:01Z",
                                "end": "2023-09-20T16:12:01Z"
                            }
                        }
                    ],
                    "location": {
                        "lat": 50.912724,
                        "lng": 7.1055
                    },
                    "distance": 559867
                }
            ],
            "statistic": {
                "cost": 275.6742,
                "distance": 559867,
                "duration": 29521,
                "times": {
                    "driving": 18721,
                    "serving": 10800,
                    "waiting": 0,
                    "stopping": 0,
                    "break": 0
                }
            },
            "shiftIndex": 0
        }
    ]
}

問題:ハード制約としてのタスク順序

optimizeTaskOrderは指定されていないものの、orderプロパティが定義されている場合、違反できないハード制約と見なされます。

この例では、初期ファイルを変更して順序を変えます。Job_3、Job_2、Job_1の順に遂行する必要があるとします。同時にJob_1は8:00~9:00の時間枠内に遂行する必要があります。

ソリューションを参照してください。

{
    "plan": {
        "jobs": [
            {
                "id": "Job_1_1h_driving",
                "tasks": {
                    "pickups": [
                        {
                            "places": [
                                {
                                    "location": {
                                        "lat": 49.066063,
                                        "lng": 11.917153
                                    },
                                    "times": [
                                        [
                                            "2023-09-20T08:00:00Z",
                                            "2023-09-20T10:00:00Z"
                                        ]
                                    ],
                                    "duration": 3600
                                }
                            ],
                            "demand": [
                                1
                            ],
                            "order": 3
                        }
                    ]
                }
            },
            {
                "id": "Job_2_2h_driving",
                "tasks": {
                    "pickups": [
                        {
                            "places": [
                                {
                                    "location": {
                                        "lat": 49.526849,
                                        "lng": 11.066198
                                    },
                                    "duration": 3600
                                }
                            ],
                            "demand": [
                                1
                            ],
                            "order": 2
                        }
                    ]
                }
            },
            {
                "id": "Job_3_3h_driving",
                "tasks": {
                    "pickups": [
                        {
                            "places": [
                                {
                                    "location": {
                                        "lat": 49.785296,
                                        "lng": 10.129362
                                    },
                                    "duration": 3600
                                }
                            ],
                            "demand": [
                                1
                            ],
                            "order": 1
                        }
                    ]
                }
            }
        ]
    },
    "fleet": {
        "types": [
            {
                "id": "vehicle_1",
                "profile": "normal_car",
                "costs": {
                    "fixed": 22,
                    "distance": 0.0002,
                    "time": 0.0048
                },
                "shifts": [
                    {
                        "start": {
                            "time": "2023-09-20T08:00:00Z",
                            "location": {
                                "lat": 48.821421,
                                "lng": 12.931591
                            }
                        },
                        "end": {
                            "time": "2023-09-22T23:00:00Z",
                            "location": {
                                "lat": 50.912724,
                                "lng": 7.1055
                            }
                        }
                    }
                ],
                "capacity": [
                    10
                ],
                "amount": 1
            }
        ],
        "profiles": [
            {
                "name": "normal_car",
                "type": "car",
                "traffic": {
                    "mode": "disabled"
                }
            }
        ]
    }
}

ソリューション:ハード制約としてのタスク順序

この場合、ソリューションは次のように変わります。

  • リクエストにあるように、Job_3から始める
  • Job_2の場所を訪問する
  • リクエストされた時間枠内でJob_1を3番目に遂行することはできないため、ハード制約に違反するとJob_1は未割り当てになる
{
    "statistic": {
        "cost": 330.42359999999996,
        "distance": 751702,
        "duration": 32934,
        "times": {
            "driving": 25734,
            "serving": 7200,
            "waiting": 0,
            "stopping": 0,
            "break": 0
        }
    },
    "tours": [
        {
            "vehicleId": "vehicle_1_1",
            "typeId": "vehicle_1",
            "stops": [
                {
                    "time": {
                        "arrival": "2023-09-20T08:00:00Z",
                        "departure": "2023-09-20T08:00:00Z"
                    },
                    "load": [
                        0
                    ],
                    "activities": [
                        {
                            "jobId": "departure",
                            "type": "departure",
                            "location": {
                                "lat": 48.821421,
                                "lng": 12.931591
                            },
                            "time": {
                                "start": "2023-09-20T08:00:00Z",
                                "end": "2023-09-20T08:00:00Z"
                            }
                        }
                    ],
                    "location": {
                        "lat": 48.821421,
                        "lng": 12.931591
                    },
                    "distance": 0
                },
                {
                    "time": {
                        "arrival": "2023-09-20T10:29:23Z",
                        "departure": "2023-09-20T11:29:23Z"
                    },
                    "load": [
                        1
                    ],
                    "activities": [
                        {
                            "jobId": "Job_3_3h_driving",
                            "type": "pickup",
                            "location": {
                                "lat": 49.785296,
                                "lng": 10.129362
                            },
                            "time": {
                                "start": "2023-09-20T10:29:23Z",
                                "end": "2023-09-20T11:29:23Z"
                            }
                        }
                    ],
                    "location": {
                        "lat": 49.785296,
                        "lng": 10.129362
                    },
                    "distance": 258526
                },
                {
                    "time": {
                        "arrival": "2023-09-20T12:35:50Z",
                        "departure": "2023-09-20T13:35:50Z"
                    },
                    "load": [
                        2
                    ],
                    "activities": [
                        {
                            "jobId": "Job_2_2h_driving",
                            "type": "pickup",
                            "location": {
                                "lat": 49.526849,
                                "lng": 11.066198
                            },
                            "time": {
                                "start": "2023-09-20T12:35:50Z",
                                "end": "2023-09-20T13:35:50Z"
                            }
                        }
                    ],
                    "location": {
                        "lat": 49.526849,
                        "lng": 11.066198
                    },
                    "distance": 366326
                },
                {
                    "time": {
                        "arrival": "2023-09-20T17:08:54Z",
                        "departure": "2023-09-20T17:08:54Z"
                    },
                    "load": [
                        0
                    ],
                    "activities": [
                        {
                            "jobId": "arrival",
                            "type": "arrival",
                            "location": {
                                "lat": 50.912724,
                                "lng": 7.1055
                            },
                            "time": {
                                "start": "2023-09-20T17:08:54Z",
                                "end": "2023-09-20T17:08:54Z"
                            }
                        }
                    ],
                    "location": {
                        "lat": 50.912724,
                        "lng": 7.1055
                    },
                    "distance": 751702
                }
            ],
            "statistic": {
                "cost": 330.42359999999996,
                "distance": 751702,
                "duration": 32934,
                "times": {
                    "driving": 25734,
                    "serving": 7200,
                    "waiting": 0,
                    "stopping": 0,
                    "break": 0
                }
            },
            "shiftIndex": 0
        }
    ],
    "unassigned": [
        {
            "jobId": "Job_1_1h_driving",
            "reasons": [
                {
                    "code": "TIME_WINDOW_CONSTRAINT",
                    "description": "cannot be assigned due to violation of time window",
                    "details": [
                        {
                            "vehicleId": "vehicle_1_1",
                            "shiftIndex": 0
                        }
                    ]
                }
            ]
        }
    ]
}

問題:時間枠付きのソフト制約としてのタスク順序

指定されている場合、optimizeTaskOrderはソフト制約と見なされ、ソルバーは時間枠を使用して違反の数を最小限に抑えようと試みます。

ここでは、新しい順序を維持しようとするものの、未割り当てになるのではなく、制約に違反することになります。

  • 指定された順序に反するものの、指定された時間枠内でJob_1から開始します。
  • できる限り順序を維持するよう試みて、最初に遂行すべき3番目のジョブに進みます。
  • 最後に、Job_2を訪問します。これは妥協案です。順序はできる限り保持されますが、未割り当てのジョブが犠牲になることはありません。この目的の方が重要であると指定されているためです。

ソリューションを参照してください。

{  "objectives": [
    {
      "type": "minimizeUnassigned"
    },
    {
      "type": "optimizeTaskOrder"
    },
    {
      "type": "minimizeCost"
    }
  ],
    "plan": {
        "jobs": [
            {
                "id": "Job_1_1h_driving",
                "tasks": {
                    "pickups": [
                        {
                            "places": [
                                {
                                    "location": {
                                        "lat": 49.066063,
                                        "lng": 11.917153
                                    },
                                    "times": [
                                        [
                                            "2023-09-20T08:00:00Z",
                                            "2023-09-20T10:00:00Z"
                                        ]
                                    ],
                                    "duration": 3600
                                }
                            ],
                            "demand": [
                                1
                            ],
                            "order": 3
                        }
                    ]
                }
            },
            {
                "id": "Job_2_2h_driving",
                "tasks": {
                    "pickups": [
                        {
                            "places": [
                                {
                                    "location": {
                                        "lat": 49.526849,
                                        "lng": 11.066198
                                    },
                                    "duration": 3600
                                }
                            ],
                            "demand": [
                                1
                            ],
                            "order": 2
                        }
                    ]
                }
            },
            {
                "id": "Job_3_3h_driving",
                "tasks": {
                    "pickups": [
                        {
                            "places": [
                                {
                                    "location": {
                                        "lat": 49.785296,
                                        "lng": 10.129362
                                    },
                                    "duration": 3600
                                }
                            ],
                            "demand": [
                                1
                            ],
                            "order":1
                        }
                    ]
                }
            }
        ]
    },
    "fleet": {
        "types": [
            {
                "id": "vehicle_1",
                "profile": "normal_car",
                "costs": {
                    "fixed": 22,
                    "distance": 0.0002,
                    "time": 0.0048
                },
                "shifts": [
                    {
                        "start": {
                            "time": "2023-09-20T08:00:00Z",
                            "location": {
                                "lat": 48.821421,
                                "lng": 12.931591
                            }
                        },
                        "end": {
                            "time": "2023-09-22T23:00:00Z",
                            "location": {
                                "lat": 50.912724,
                                "lng": 7.1055
                            }
                        }
                    }
                ],
                "capacity": [
                    10
                ],
                "amount": 1
            }
        ],
        "profiles": [
            {
                "name": "normal_car",
                "type": "car",
                "traffic": {
                    "mode": "disabled"
                }
      
            }
        ]
    }
}

ソリューション:時間枠付きのソフト制約としてのタスク順序

{
    "statistic": {
        "cost": 347.7036,
        "distance": 751702,
        "duration": 36534,
        "times": {
            "driving": 25734,
            "serving": 10800,
            "waiting": 0,
            "stopping": 0,
            "break": 0
        }
    },
    "tours": [
        {
            "vehicleId": "vehicle_1_1",
            "typeId": "vehicle_1",
            "stops": [
                {
                    "time": {
                        "arrival": "2023-09-20T08:00:00Z",
                        "departure": "2023-09-20T08:00:00Z"
                    },
                    "load": [
                        0
                    ],
                    "activities": [
                        {
                            "jobId": "departure",
                            "type": "departure",
                            "location": {
                                "lat": 48.821421,
                                "lng": 12.931591
                            },
                            "time": {
                                "start": "2023-09-20T08:00:00Z",
                                "end": "2023-09-20T08:00:00Z"
                            }
                        }
                    ],
                    "location": {
                        "lat": 48.821421,
                        "lng": 12.931591
                    },
                    "distance": 0
                },
                {
                    "time": {
                        "arrival": "2023-09-20T08:50:15Z",
                        "departure": "2023-09-20T09:50:15Z"
                    },
                    "load": [
                        1
                    ],
                    "activities": [
                        {
                            "jobId": "Job_1_1h_driving",
                            "type": "pickup",
                            "location": {
                                "lat": 49.066063,
                                "lng": 11.917153
                            },
                            "time": {
                                "start": "2023-09-20T08:50:15Z",
                                "end": "2023-09-20T09:50:15Z"
                            }
                        }
                    ],
                    "location": {
                        "lat": 49.066063,
                        "lng": 11.917153
                    },
                    "distance": 86277
                },
                {
                    "time": {
                        "arrival": "2023-09-20T11:29:23Z",
                        "departure": "2023-09-20T12:29:23Z"
                    },
                    "load": [
                        2
                    ],
                    "activities": [
                        {
                            "jobId": "Job_3_3h_driving",
                            "type": "pickup",
                            "location": {
                                "lat": 49.785296,
                                "lng": 10.129362
                            },
                            "time": {
                                "start": "2023-09-20T11:29:23Z",
                                "end": "2023-09-20T12:29:23Z"
                            }
                        }
                    ],
                    "location": {
                        "lat": 49.785296,
                        "lng": 10.129362
                    },
                    "distance": 258526
                },
                {
                    "time": {
                        "arrival": "2023-09-20T13:35:50Z",
                        "departure": "2023-09-20T14:35:50Z"
                    },
                    "load": [
                        3
                    ],
                    "activities": [
                        {
                            "jobId": "Job_2_2h_driving",
                            "type": "pickup",
                            "location": {
                                "lat": 49.526849,
                                "lng": 11.066198
                            },
                            "time": {
                                "start": "2023-09-20T13:35:50Z",
                                "end": "2023-09-20T14:35:50Z"
                            }
                        }
                    ],
                    "location": {
                        "lat": 49.526849,
                        "lng": 11.066198
                    },
                    "distance": 366326
                },
                {
                    "time": {
                        "arrival": "2023-09-20T18:08:54Z",
                        "departure": "2023-09-20T18:08:54Z"
                    },
                    "load": [
                        0
                    ],
                    "activities": [
                        {
                            "jobId": "arrival",
                            "type": "arrival",
                            "location": {
                                "lat": 50.912724,
                                "lng": 7.1055
                            },
                            "time": {
                                "start": "2023-09-20T18:08:54Z",
                                "end": "2023-09-20T18:08:54Z"
                            }
                        }
                    ],
                    "location": {
                        "lat": 50.912724,
                        "lng": 7.1055
                    },
                    "distance": 751702
                }
            ],
            "statistic": {
                "cost": 347.7036,
                "distance": 751702,
                "duration": 36534,
                "times": {
                    "driving": 25734,
                    "serving": 10800,
                    "waiting": 0,
                    "stopping": 0,
                    "break": 0
                }
            },
            "shiftIndex": 0
        }
    ]
}

問題:時間枠なしのソフト要件としてのタスク順序

この問題ではタスクの順序がソフト制約と見なされます。ソリューションでは時間枠を使用せずに違反の数を最小限に抑えようと試みます。

ここで、指定された時間枠内にJob_1を配達する必要はないと仮定します。この状況ではすべてのジョブを希望の順序で遂行できます。未割り当てになることはありません。したがって、タスクの順序をハード制約とソフト制約のどちらとして使用する場合でも、ジョブの順序は同じ、Job_3Job_2Job_1になります。

ソリューションを参照してください。

{  "objectives": [
    {
      "type": "minimizeUnassigned"
    },
    {
      "type": "optimizeTaskOrder"
    },
    {
      "type": "minimizeCost"
    }
  ],
    "plan": {
        "jobs": [
            {
                "id": "Job_1_1h_driving",
                "tasks": {
                    "pickups": [
                        {
                            "places": [
                                {
                                    "location": {
                                        "lat": 49.066063,
                                        "lng": 11.917153
                                    },
                                    "duration": 3600
                                }
                            ],
                            "demand": [
                                1
                            ],
                            "order": 3
                        }
                    ]
                }
            },
            {
                "id": "Job_2_2h_driving",
                "tasks": {
                    "pickups": [
                        {
                            "places": [
                                {
                                    "location": {
                                        "lat": 49.526849,
                                        "lng": 11.066198
                                    },
                                    "duration": 3600
                                }
                            ],
                            "demand": [
                                1
                            ],
                            "order": 2
                        }
                    ]
                }
            },
            {
                "id": "Job_3_3h_driving",
                "tasks": {
                    "pickups": [
                        {
                            "places": [
                                {
                                    "location": {
                                        "lat": 49.785296,
                                        "lng": 10.129362
                                    },
                                    "duration": 3600
                                }
                            ],
                            "demand": [
                                1
                            ],
                            "order":1
                        }
                    ]
                }
            }
        ]
    },
    "fleet": {
        "types": [
            {
                "id": "vehicle_1",
                "profile": "normal_car",
                "costs": {
                    "fixed": 22,
                    "distance": 0.0002,
                    "time": 0.0048
                },
                "shifts": [
                    {
                        "start": {
                            "time": "2023-09-20T08:00:00Z",
                            "location": {
                                "lat": 48.821421,
                                "lng": 12.931591
                            }
                        },
                        "end": {
                            "time": "2023-09-22T23:00:00Z",
                            "location": {
                                "lat": 50.912724,
                                "lng": 7.1055
                            }
                        }
                    }
                ],
                "capacity": [
                    10
                ],
                "amount": 1
            }
        ],
        "profiles": [
            {
                "name": "normal_car",
                "type": "car",
                "traffic": {
                    "mode": "disabled"
                }
      
            }
        ]
    }
}

ソリューション:時間枠なしのソフト要件としてのタスク順序

{
    "statistic": {
        "cost": 418.1166,
        "distance": 945823,
        "duration": 43115,
        "times": {
            "driving": 32315,
            "serving": 10800,
            "waiting": 0,
            "stopping": 0,
            "break": 0
        }
    },
    "tours": [
        {
            "vehicleId": "vehicle_1_1",
            "typeId": "vehicle_1",
            "stops": [
                {
                    "time": {
                        "arrival": "2023-09-20T08:00:00Z",
                        "departure": "2023-09-20T08:00:00Z"
                    },
                    "load": [
                        0
                    ],
                    "activities": [
                        {
                            "jobId": "departure",
                            "type": "departure",
                            "location": {
                                "lat": 48.821421,
                                "lng": 12.931591
                            },
                            "time": {
                                "start": "2023-09-20T08:00:00Z",
                                "end": "2023-09-20T08:00:00Z"
                            }
                        }
                    ],
                    "location": {
                        "lat": 48.821421,
                        "lng": 12.931591
                    },
                    "distance": 0
                },
                {
                    "time": {
                        "arrival": "2023-09-20T10:29:23Z",
                        "departure": "2023-09-20T11:29:23Z"
                    },
                    "load": [
                        1
                    ],
                    "activities": [
                        {
                            "jobId": "Job_3_3h_driving",
                            "type": "pickup",
                            "location": {
                                "lat": 49.785296,
                                "lng": 10.129362
                            },
                            "time": {
                                "start": "2023-09-20T10:29:23Z",
                                "end": "2023-09-20T11:29:23Z"
                            }
                        }
                    ],
                    "location": {
                        "lat": 49.785296,
                        "lng": 10.129362
                    },
                    "distance": 258526
                },
                {
                    "time": {
                        "arrival": "2023-09-20T12:35:50Z",
                        "departure": "2023-09-20T13:35:50Z"
                    },
                    "load": [
                        2
                    ],
                    "activities": [
                        {
                            "jobId": "Job_2_2h_driving",
                            "type": "pickup",
                            "location": {
                                "lat": 49.526849,
                                "lng": 11.066198
                            },
                            "time": {
                                "start": "2023-09-20T12:35:50Z",
                                "end": "2023-09-20T13:35:50Z"
                            }
                        }
                    ],
                    "location": {
                        "lat": 49.526849,
                        "lng": 11.066198
                    },
                    "distance": 366326
                },
                {
                    "time": {
                        "arrival": "2023-09-20T14:36:48Z",
                        "departure": "2023-09-20T15:36:48Z"
                    },
                    "load": [
                        3
                    ],
                    "activities": [
                        {
                            "jobId": "Job_1_1h_driving",
                            "type": "pickup",
                            "location": {
                                "lat": 49.066063,
                                "lng": 11.917153
                            },
                            "time": {
                                "start": "2023-09-20T14:36:48Z",
                                "end": "2023-09-20T15:36:48Z"
                            }
                        }
                    ],
                    "location": {
                        "lat": 49.066063,
                        "lng": 11.917153
                    },
                    "distance": 472233
                },
                {
                    "time": {
                        "arrival": "2023-09-20T19:58:35Z",
                        "departure": "2023-09-20T19:58:35Z"
                    },
                    "load": [
                        0
                    ],
                    "activities": [
                        {
                            "jobId": "arrival",
                            "type": "arrival",
                            "location": {
                                "lat": 50.912724,
                                "lng": 7.1055
                            },
                            "time": {
                                "start": "2023-09-20T19:58:35Z",
                                "end": "2023-09-20T19:58:35Z"
                            }
                        }
                    ],
                    "location": {
                        "lat": 50.912724,
                        "lng": 7.1055
                    },
                    "distance": 945823
                }
            ],
            "statistic": {
                "cost": 418.1166,
                "distance": 945823,
                "duration": 43115,
                "times": {
                    "driving": 32315,
                    "serving": 10800,
                    "waiting": 0,
                    "stopping": 0,
                    "break": 0
                }
            },
            "shiftIndex": 0
        }
    ]
}

車両のユースケースを最適化する

目的optimizeTourCountではソリューションのルートの数を最適化するために、車の使用を制御します。

この場合、集配センターは配達される2つのジョブの間にあります。

  • この例では積載量が2で固定コストのない同一の車両が2台あります。このため、配達に1台の車両を使用するか2台を使用するかに関係なく、時間と距離のみが考慮されます。

  • 1台の車両を使用する場合、時間と所要時間の両方が長くなります。これは、最初のジョブを訪問し、次に2番目のジョブを訪問してから集配センターに戻る必要があるためです。

これはアクション属性optimizeTourCountmaximizeを使用して、目的minimizeで実行できます。

  • action=maximizeの場合、両方の車両が使用されます。
  • action=minimizeの場合は、両方のジョブに1台の車両のみが使用されます。

問題:optimizeTourCountを省略する

この問題は目的optimizeTourCountを使用せずに表現されます。

前述のように、特定の目的がない場合、optimizeTourCountminimizeCostよりも高くなります。つまりデフォルトでは、コストが高くなるとしても、使用する車両は可能な限り少なくなります。

ソリューションを参照してください。

{
    "fleet": {
        "types": [
            {
                "profile": "vehicle",
                "amount": 2,
                "capacity": [
                    2
                ],
                "costs": {
                    "distance": 5,
                    "time": 5,
                    "fixed": 0
                },
                "id": "vehicle_1",
                "shifts": [
                    {
                        "start": {
                            "location": {
                                "lat": 52.55364,
                                "lng": 13.41467
                            },
                            "time": "2023-11-30T08:00:00+01:00"
                        }
                    }
                ]
            }
        ],
        "profiles": [
            {
                "name": "vehicle",
                "type": "car"
            }
        ]
    },
    "plan": {
        "jobs": [
            {
                "id": "Job_1",
                "tasks": {
                    "deliveries": [
                        {
                            "places": [
                                {
                                    "duration": 300,
                                    "location": {
                                        "lat": 52.55635,
                                        "lng": 13.38465
                                    }
                                }
                            ],
                            "demand": [
                                1
                            ]
                        }
                    ]
                }
            },
            {
                "id": "Job_2",
                "tasks": {
                    "deliveries": [
                        {
                            "places": [
                                {
                                    "duration": 300,
                                    "location": {
                                        "lat": 52.55162,
                                        "lng": 13.43017
                                    }
                                }
                            ],
                            "demand": [
                                1
                            ]
                        }
                    ]
                }
            }
        ]
    }
}

ソリューション:optimizeTourCountを省略する

{
    "statistic": {
        "cost": 28475,
        "distance": 4521,
        "duration": 1174,
        "times": {
            "driving": 574,
            "serving": 600,
            "waiting": 0,
            "stopping": 0,
            "break": 0
        }
    },
    "tours": [
        {
            "vehicleId": "vehicle_1_2",
            "typeId": "vehicle_1",
            "stops": [
                {
                    "location": {
                        "lat": 52.55364,
                        "lng": 13.41467
                    },
                    "time": {
                        "arrival": "2023-11-30T07:00:00Z",
                        "departure": "2023-11-30T07:00:00Z"
                    },
                    "load": [
                        2
                    ],
                    "activities": [
                        {
                            "jobId": "departure",
                            "type": "departure",
                            "location": {
                                "lat": 52.55364,
                                "lng": 13.41467
                            },
                            "time": {
                                "start": "2023-11-30T07:00:00Z",
                                "end": "2023-11-30T07:00:00Z"
                            }
                        }
                    ],
                    "distance": 0
                },
                {
                    "location": {
                        "lat": 52.55162,
                        "lng": 13.43017
                    },
                    "time": {
                        "arrival": "2023-11-30T07:03:06Z",
                        "departure": "2023-11-30T07:08:06Z"
                    },
                    "load": [
                        1
                    ],
                    "activities": [
                        {
                            "jobId": "Job_2",
                            "type": "delivery",
                            "location": {
                                "lat": 52.55162,
                                "lng": 13.43017
                            },
                            "time": {
                                "start": "2023-11-30T07:03:06Z",
                                "end": "2023-11-30T07:08:06Z"
                            }
                        }
                    ],
                    "distance": 1280
                },
                {
                    "location": {
                        "lat": 52.55635,
                        "lng": 13.38465
                    },
                    "time": {
                        "arrival": "2023-11-30T07:14:34Z",
                        "departure": "2023-11-30T07:19:34Z"
                    },
                    "load": [
                        0
                    ],
                    "activities": [
                        {
                            "jobId": "Job_1",
                            "type": "delivery",
                            "location": {
                                "lat": 52.55635,
                                "lng": 13.38465
                            },
                            "time": {
                                "start": "2023-11-30T07:14:34Z",
                                "end": "2023-11-30T07:19:34Z"
                            }
                        }
                    ],
                    "distance": 4521
                }
            ],
            "statistic": {
                "cost": 28475,
                "distance": 4521,
                "duration": 1174,
                "times": {
                    "driving": 574,
                    "serving": 600,
                    "waiting": 0,
                    "stopping": 0,
                    "break": 0
                }
            },
            "shiftIndex": 0
        }
    ]
}

問題:optimizeTourCountを指定してすべての運行管理を使用する

目的を使用すると、この動作を変更できます。すべての運行管理を使用することを目的に設定すると、よりコストを抑えたソリューションを実現できます。両方の車両を使用し、それぞれの車両は集配センターを出発して1つのジョブのみを配達し、集配センターに戻ります。車両は最短の東西ルートを使用します。

📘

ルートの数が増えるとコストが高くなる傾向にあるため、"action": "maximize"に設定した目的optimizeTourCountを目的minimizeCostの上に配置して、効果が失われないようにします。

ソリューションを参照してください。


{
    "objectives": [
        {
            "type": "minimizeUnassigned"
        },
        {
            "type": "optimizeTourCount",
            "action": "maximize"
        },
        {
            "type": "minimizeCost"
        }
    ],
    "fleet": {
        "types": [
            {
                "profile": "vehicle",
                "amount": 2,
                "capacity": [
                    2
                ],
                "costs": {
                    "distance": 5,
                    "time": 5,
                    "fixed": 0
                },
                "id": "vehicle_1",
                "shifts": [
                    {
                        "start": {
                            "location": {
                                "lat": 52.55364,
                                "lng": 13.41467
                            },
                            "time": "2023-11-30T08:00:00+01:00"
                        }
                    }
                ]
            }
        ],
        "profiles": [
            {
                "name": "vehicle",
                "type": "car"
            }
        ]
    },
    "plan": {
        "jobs": [
            {
                "id": "Job_1",
                "tasks": {
                    "deliveries": [
                        {
                            "places": [
                                {
                                    "duration": 300,
                                    
                                    "location": {
                                        "lat": 52.55635,
                                        "lng": 13.38465
                                    }
                                }
                            ],
                            "demand": [
                                1
                            ]
                        }
                    ]
                }
            },
            {
                "id": "Job_2",
                "tasks": {
                    "deliveries": [
                        {
                            "places": [
                                {
                                    "duration": 300,
                                    "location": {
                                        "lat": 52.55162,
                                        "lng": 13.43017
                                    }
                                }
                            ],
                            "demand": [
                                1
                            ]
                        }
                    ]
                }
            }
        ]
    }
}

ソリューション:optimizeTourCountを指定してすべての運行管理を使用する

{
    "statistic": {
        "cost": 22315,
        "distance": 3421,
        "duration": 1042,
        "times": {
            "driving": 442,
            "serving": 600,
            "waiting": 0,
            "stopping": 0,
            "break": 0
        }
    },
    "tours": [
        {
            "vehicleId": "vehicle_1_2",
            "typeId": "vehicle_1",
            "stops": [
                {
                    "location": {
                        "lat": 52.55364,
                        "lng": 13.41467
                    },
                    "time": {
                        "arrival": "2023-11-30T07:00:00Z",
                        "departure": "2023-11-30T07:00:00Z"
                    },
                    "load": [
                        1
                    ],
                    "activities": [
                        {
                            "jobId": "departure",
                            "type": "departure",
                            "location": {
                                "lat": 52.55364,
                                "lng": 13.41467
                            },
                            "time": {
                                "start": "2023-11-30T07:00:00Z",
                                "end": "2023-11-30T07:00:00Z"
                            }
                        }
                    ],
                    "distance": 0
                },
                {
                    "location": {
                        "lat": 52.55162,
                        "lng": 13.43017
                    },
                    "time": {
                        "arrival": "2023-11-30T07:03:06Z",
                        "departure": "2023-11-30T07:08:06Z"
                    },
                    "load": [
                        0
                    ],
                    "activities": [
                        {
                            "jobId": "Job_2",
                            "type": "delivery",
                            "location": {
                                "lat": 52.55162,
                                "lng": 13.43017
                            },
                            "time": {
                                "start": "2023-11-30T07:03:06Z",
                                "end": "2023-11-30T07:08:06Z"
                            }
                        }
                    ],
                    "distance": 1280
                }
            ],
            "statistic": {
                "cost": 8830,
                "distance": 1280,
                "duration": 486,
                "times": {
                    "driving": 186,
                    "serving": 300,
                    "waiting": 0,
                    "stopping": 0,
                    "break": 0
                }
            },
            "shiftIndex": 0
        },
        {
            "vehicleId": "vehicle_1_1",
            "typeId": "vehicle_1",
            "stops": [
                {
                    "location": {
                        "lat": 52.55364,
                        "lng": 13.41467
                    },
                    "time": {
                        "arrival": "2023-11-30T07:00:00Z",
                        "departure": "2023-11-30T07:00:00Z"
                    },
                    "load": [
                        1
                    ],
                    "activities": [
                        {
                            "jobId": "departure",
                            "type": "departure",
                            "location": {
                                "lat": 52.55364,
                                "lng": 13.41467
                            },
                            "time": {
                                "start": "2023-11-30T07:00:00Z",
                                "end": "2023-11-30T07:00:00Z"
                            }
                        }
                    ],
                    "distance": 0
                },
                {
                    "location": {
                        "lat": 52.55635,
                        "lng": 13.38465
                    },
                    "time": {
                        "arrival": "2023-11-30T07:04:16Z",
                        "departure": "2023-11-30T07:09:16Z"
                    },
                    "load": [
                        0
                    ],
                    "activities": [
                        {
                            "jobId": "Job_1",
                            "type": "delivery",
                            "location": {
                                "lat": 52.55635,
                                "lng": 13.38465
                            },
                            "time": {
                                "start": "2023-11-30T07:04:16Z",
                                "end": "2023-11-30T07:09:16Z"
                            }
                        }
                    ],
                    "distance": 2141
                }
            ],
            "statistic": {
                "cost": 13485,
                "distance": 2141,
                "duration": 556,
                "times": {
                    "driving": 256,
                    "serving": 300,
                    "waiting": 0,
                    "stopping": 0,
                    "break": 0
                }
            },
            "shiftIndex": 0
        }
    ]
}

問題:optimizeTourCountを指定して使用する車両の数を最小限に抑える

このソリューションでは使用する車両の数が最も少なくなります。minimizeCostでは多くの場合、このソリューションが選択されます。

optimizeTourCountを"action": "minimize"と一緒に明示的に使用すると、デフォルトと同じソリューションを得られます。ほとんどの場合、移動回数が減るとコスト削減につながります。

{
    "objectives": [
        {
            "type": "minimizeUnassigned"
        },
        {
            "type": "optimizeTourCount",
            "action": "minimize"
        },
        {
            "type": "minimizeCost"
        }
    ],
    "fleet": {
        "types": [
            {
                "profile": "vehicle",
                "amount": 2,
                "capacity": [
                    2
                ],
                "costs": {
                    "distance": 5,
                    "time": 5,
                    "fixed": 0
                },
                "id": "vehicle_1",
                "shifts": [
                    {
                        "start": {
                            "location": {
                                "lat": 52.55364,
                                "lng": 13.41467
                            },
                            "time": "2023-11-30T08:00:00+01:00"
                        }
                    }
                ]
            }
        ],
        "profiles": [
            {
                "name": "vehicle",
                "type": "car"
            }
        ]
    },
    "plan": {
        "jobs": [
            {
                "id": "Job_1",
                "tasks": {
                    "deliveries": [
                        {
                            "places": [
                                {
                                    "duration": 300,
                                    "location": {
                                        "lat": 52.55635,
                                        "lng": 13.38465
                                    }
                                }
                            ],
                            "demand": [
                                1
                            ]
                        }
                    ]
                }
            },
            {
                "id": "Job_2",
                "tasks": {
                    "deliveries": [
                        {
                            "places": [
                                {
                                    "duration": 300,
                                    "location": {
                                        "lat": 52.55162,
                                        "lng": 13.43017
                                    }
                                }
                            ],
                            "demand": [
                                1
                            ]
                        }
                    ]
                }
            }
        ]
    }
}

ソリューション:optimizeTourCountを指定して使用する車両の数を最小限に抑える

{
    "statistic": {
        "cost": 28475,
        "distance": 4521,
        "duration": 1174,
        "times": {
            "driving": 574,
            "serving": 600,
            "waiting": 0,
            "stopping": 0,
            "break": 0
        }
    },
    "tours": [
        {
            "vehicleId": "vehicle_1_1",
            "typeId": "vehicle_1",
            "stops": [
                {
                    "location": {
                        "lat": 52.55364,
                        "lng": 13.41467
                    },
                    "time": {
                        "arrival": "2023-11-30T07:00:00Z",
                        "departure": "2023-11-30T07:00:00Z"
                    },
                    "load": [
                        2
                    ],
                    "activities": [
                        {
                            "jobId": "departure",
                            "type": "departure",
                            "location": {
                                "lat": 52.55364,
                                "lng": 13.41467
                            },
                            "time": {
                                "start": "2023-11-30T07:00:00Z",
                                "end": "2023-11-30T07:00:00Z"
                            }
                        }
                    ],
                    "distance": 0
                },
                {
                    "location": {
                        "lat": 52.55162,
                        "lng": 13.43017
                    },
                    "time": {
                        "arrival": "2023-11-30T07:03:06Z",
                        "departure": "2023-11-30T07:08:06Z"
                    },
                    "load": [
                        1
                    ],
                    "activities": [
                        {
                            "jobId": "Job_2",
                            "type": "delivery",
                            "location": {
                                "lat": 52.55162,
                                "lng": 13.43017
                            },
                            "time": {
                                "start": "2023-11-30T07:03:06Z",
                                "end": "2023-11-30T07:08:06Z"
                            }
                        }
                    ],
                    "distance": 1280
                },
                {
                    "location": {
                        "lat": 52.55635,
                        "lng": 13.38465
                    },
                    "time": {
                        "arrival": "2023-11-30T07:14:34Z",
                        "departure": "2023-11-30T07:19:34Z"
                    },
                    "load": [
                        0
                    ],
                    "activities": [
                        {
                            "jobId": "Job_1",
                            "type": "delivery",
                            "location": {
                                "lat": 52.55635,
                                "lng": 13.38465
                            },
                            "time": {
                                "start": "2023-11-30T07:14:34Z",
                                "end": "2023-11-30T07:19:34Z"
                            }
                        }
                    ],
                    "distance": 4521
                }
            ],
            "statistic": {
                "cost": 28475,
                "distance": 4521,
                "duration": 1174,
                "times": {
                    "driving": 574,
                    "serving": 600,
                    "waiting": 0,
                    "stopping": 0,
                    "break": 0
                }
            },
            "shiftIndex": 0
        }
    ]
}