私はルート最適化の初心者であり、jsprit を使用して次のビジネス要件を解決するための助けをいただければ幸いです。jsprit の基本を学ぶのに役立つ Stefan Schröder からフィードバックをもらいました。最初にビジネス要件を説明し、その後いくつか質問をします。
目的は、1 か月で完了する必要があるメンテナンス ジョブのリストをスケジュールすることです。1 か月分の毎日のスケジュールを作成する必要があります。ここでの目的は、1 日あたり最大数のジョブを実行することです。
- リージョンごとに 4 つのデポがあります
- 各地域には約 70 の倉庫があり、合計で 300 の倉庫があります。
- その地域内の各デポと倉庫の間の距離がわかっている
- 地域ごとに異なるタイプの車両が 3 ~ 4 台、合計 12 台あります。
- 地域内の車両は、その地域内の倉庫にのみサービスを提供できます
- 地域内の車両には、たまたま終点となる同じ始点があります
- 車両には、容量、集荷、または配送の要件はありません
- 車両は、保守作業を行う作業員の輸送にのみ使用されます
- 各車両の平均速度がわかります
- 約80のメンテナンスジョブタイプがあります
- 各ジョブ タイプの既知の所要時間 (分単位)
- メンテナンス ジョブは特定の時間に開始する必要はありません
- 毎月、実行する必要がある約 200 のメンテナンス ジョブがあります。
- これらのジョブは、どの倉庫でも可能です
- 同じ日または別の日に同じ倉庫で複数のジョブが発生する可能性があります
- 1 日 8 時間のシフトが 3 回あります。午前6時~午後2時、午後2時~午後10時、午後10時~午前6時
- 車両は、シフトの開始時にデポ倉庫を出発し、8 時間のシフト内でできるだけ多くの倉庫を訪問します。
- 次の倉庫に移動するか、デポ倉庫に戻る前に、ジョブが実行されている間、車両は倉庫で待機する必要があります。
私の基本的な理解は、保守作業は jsprit でサービスとして定義でき、車両ごとに開始/返却時間を設定できるということです。また、コスト マトリックスを使用して、車両と倉庫の関係に時間と距離を追加することもできます。私が持っている質問は次のとおりです。
- 各メンテナンス ジョブはサービスとして定義する必要があります。その結果、VRP ソルバーに渡されるサービス オブジェクトが 200 になりますよね?
- VehicleTypeImpl には、addCapacityDimension()、setCostPerDistance()、および setCostPerTime() メソッドがあります。これらは正確には何であり、上記のケースをどのように適用しますか?
- Service.Builder には addSizeDimension() メソッドがあります。それは何をするためのものか?
- costMatrixBuilder には、TransportDistance と TransportTime を追加するメソッドがあります。これらのメソッドで使用される単位と、それらをどのように使用できますか?
- デポごとに Coordinate を定義し、VehicleImpl ごとに setStartLocationCoordinate() メソッドに渡す必要があります。これは正しいですか?
- vehicleBuilder には setLatestArrival( double maxDuration); があります。ここで使われているユニットは?
上記のケースを解決するための助けに感謝します。
ありがとう、アダム
EDIT1:
いくつかの質問
A. setEarliestStart() および setLatestArrival() メソッドは double 値を受け入れますが、これらのメソッドに実際の日付として最も早い出発と最も遅い到着を指定するにはどうすればよいですか? たとえば、開始時刻は 2014 年 11 月 28 日の午後 2 時で、終了時刻は同日の午後 10 時です。
B. サービス時間を分単位で指定する方法はありますか?
C. VehicleTypeImpl.Builder.setMaxVelocity(double inMeterPerSeconds) メソッドは最大速度を想定していますが、車両の平均速度を指定する方法はありますか?
D. すべての車両は 3 シフトで作業する必要があります。これは、同じ車両を 3 回定義する必要があるということですか? シフトごとに 1 つずつ、さまざまな最早出発時刻と最遅到着時刻を指定します。
E. ジョブは月のいつでも実行できるため、各ジョブの時間枠は月の始まりと終わりとして Service.Builder.setTimeWindow() メソッドに渡されますか?