ハード制約により、同じルートで 2 つまたは複数の出荷を行うことは可能ですか?
そうでない場合、そのような種類の制限を処理できる他の Java ライブラリを知っていますか?
ありがとうございました!
貨物が同じルートにあることを確認する最も簡単な方法は、これらの貨物にスキルをタグ付けすることです
shipmentBuilder.addRequiredSkill("tag")
ただし、特定の車両にもタグを付ける必要があります。
vehicleBuilder.addSkill("tag")
そして、アルゴリズムがスキル/これらのタグを考慮していることを確認してください ( https://github.com/jsprit/jsprit/blob/master/WHATS_NEW.mdを参照してください- 1.3.2-SNAPSHOT を使用する必要があります)。
特定の車両にタグを割り当てたくない場合は、基本的にこのメソッドである core.problem.constraint.HardRouteStateLevelConstraint を実装する必要があります
public boolean fulfilled(JobInsertionContext insertionContext)
insertContext.getJob() [挿入されるジョブ] が insertContext.getRoute() に挿入できることを確認します。この時点で、次の 2 つのことを知っておく必要があります。
後者の情報については、ジョブルートの割り当てを提供する状態を定義する必要があります。problemState とそれに応じた updater を次のように定義します。
static class UpdateJobRouteAssignment implements StateUpdater,JobInsertedListener,InsertionStartsListener {
StateManager stateManager;
UpdateJobRouteAssignment(StateManager stateManager) {
this.stateManager = stateManager;
}
@Override
public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) {
stateManager.putProblemState(stateManager.createStateId(job2insert.getId()), VehicleRoute.class, inRoute);
}
@Override
public void informInsertionStarts(Collection<VehicleRoute> vehicleRoutes, Collection<Job> unassignedJobs) {
for(VehicleRoute r : vehicleRoutes){
for(Job j : r.getTourActivities().getJobs()){
informJobInserted(j,r,0.,0.);
}
}
}
}
State アップデーターと制約を State/ConstraintManager に追加すれば完了です。