/** * Calls the {@link Solver} to solve the problem as defined by the current * simulation state. * @param args {@link SolveArgs} specifying what information to include. * @return A list containing routes for each vehicle known to this solver. */ public ImmutableList<ImmutableList<Parcel>> solve(SolveArgs args) { return solve(convert(args)); }
@Override public SimSolver build(Solver s) { return new SimSolver(Optional.of(s), roadModel, pdpModel, clock, vehiclesList); } }
@Override public void solve(GlobalStateObject state) { currentState = state; currentSchedule = delegate.solve(state); isUpdated = true; eventDispatcher.dispatchEvent(new SolverEvent( RtSimSolver.EventType.NEW_SCHEDULE, Optional.of(currentSchedule), Optional.of(currentState))); eventDispatcher.dispatchEvent(new SolverEvent( RtSimSolver.EventType.DONE, Optional.of(currentSchedule), Optional.of(currentState))); }
@Override public GlobalStateObject getCurrentState(SolveArgs args) { return delegate.convert(args); }
@Override public GlobalStateObject convert(SolveArgs args) { final Collection<Vehicle> vs = vehicles.isEmpty() ? roadModel .getObjectsOfType(Vehicle.class) : vehicles; final Set<Parcel> ps = args.parcels.isPresent() ? args.parcels.get() : ImmutableSet.copyOf(pdpModel.getParcels(ANNOUNCED, AVAILABLE, PICKING_UP)); return Solvers.convert(roadModel, pdpModel, vs, ps, time(), args.currentRoutes, args.fixRoutes); }
@Override public void tick(TimeLapse timeLapse) { if (hasChanged) { hasChanged = false; // TODO check to see that this is called the first possible moment after // the add parcel event was dispatched // TODO it must be checked whether the calculated routes end up in the // correct vehicles final Set<RouteFollowingVehicle> vehicles = roadModel .getObjectsOfType(RouteFollowingVehicle.class); // gather current routes final ImmutableList.Builder<ImmutableList<Parcel>> currentRouteBuilder = ImmutableList .builder(); for (final RouteFollowingVehicle vehicle : vehicles) { final ImmutableList<Parcel> l = ImmutableList.copyOf(vehicle .getRoute()); currentRouteBuilder.add(l); } final Iterator<ImmutableList<Parcel>> routes = solverAdapter .solve( SolveArgs.create() .useAllParcels() .useCurrentRoutes(currentRouteBuilder.build())) .iterator(); for (final RouteFollowingVehicle vehicle : vehicles) { vehicle.setRoute(routes.next()); } } }
@Override public void solve(SolveArgs args) { solve(delegate.convert(args)); }
.setVehicles(new LinkedHashSet<>(trucks)) .build(negotiationSolver); final List<ImmutableList<Parcel>> routes = sol.solve(SolveArgs.create() .useCurrentRoutes(currentRoutes.build()) .useParcels(availableParcels));
return (T) new SimSolver(solver, rm, pm, c, vehicles);
.copyOf(((Truck) vehicle.get()).getRoute()); LOGGER.trace(" > currentRoute {}", currentRoute); final GlobalStateObject state = solverHandle.get().convert( SolveArgs.create().noCurrentRoutes().useParcels(parcels)); final double baseline = objectiveFunction.computeCost(Solvers.computeStats( .useCurrentRoutes(ImmutableList.of(currentRoute)); try { final GlobalStateObject gso = solverHandle.get().convert(args); SolverValidator.checkRoute(gso.getVehicles().get(0), 0); } catch (final IllegalArgumentException e) { solverHandle.get().solve(args).get(0); final double newCost = objectiveFunction.computeCost(Solvers.computeStats( state, ImmutableList.of(ImmutableList.copyOf(newRoute))));
@Override protected void preTick(TimeLapse time) { if (getRoute().isEmpty() && !getRoadModel().getObjectsOfType(Parcel.class).isEmpty()) { setRoute(solver.get().solve(SolveArgs.create() .useAllParcels()).get(0)); } } }
.with(clock) .build() .solve(state);