0

ハード制約により、同じルートで 2 つまたは複数の出荷を行うことは可能ですか?

そうでない場合、そのような種類の制限を処理できる他の Java ライブラリを知っていますか?

ありがとうございました!

4

1 に答える 1

1

貨物が同じルートにあることを確認する最も簡単な方法は、これらの貨物にスキルをタグ付けすることです

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 つのことを知っておく必要があります。

  • insertContext.getJob() の関連付けられた出荷、つまり、insertionContext.getJob() と同じルートにある必要がある出荷
  • これらの関連付けられたジョブのいずれかがすでにルートに割り当てられているかどうか、割り当てられている場合は、このルートが insertContext.getRoute() と同じかどうか

後者の情報については、ジョブルートの割り当てを提供する状態を定義する必要があります。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 に追加すれば完了です。

于 2014-09-05T09:54:31.427 に答える