All Downloads are FREE. Search and download functionalities are using the official Maven repository.

rinde.sim.examples.fabrirecht.gradientField.Truck Maven / Gradle / Ivy

package rinde.sim.examples.fabrirecht.gradientField;

import java.util.Map;

import rinde.sim.core.TimeLapse;
import rinde.sim.core.graph.Point;
import rinde.sim.core.model.pdp.PDPModel.ParcelState;
import rinde.sim.core.model.pdp.PDPModel.VehicleState;
import rinde.sim.core.model.pdp.Parcel;
import rinde.sim.core.model.road.RoadModels;
import rinde.sim.core.model.road.RoadUser;
import rinde.sim.problem.common.DefaultParcel;
import rinde.sim.problem.common.DefaultVehicle;
import rinde.sim.problem.common.VehicleDTO;

import com.google.common.base.Predicate;

class Truck extends DefaultVehicle implements FieldEmitter {
	private GradientModel gradientModel;

	public Truck(VehicleDTO pDto) {
		super(pDto);
	}

	@Override
	protected void tickImpl(TimeLapse time) {
		// Check if we can deliver nearby
		final Parcel delivery = getDelivery(time, 5);

		if (delivery != null) {
			if (delivery.getDestination().equals(getPosition()) && pdpModel.getVehicleState(this) == VehicleState.IDLE) {
				pdpModel.deliver(this, delivery, time);
			} else {
				roadModel.moveTo(this, delivery.getDestination(), time);
			}
			return;
		}

		// Otherwise, Check if we can pickup nearby
		final DefaultParcel closest = (DefaultParcel) RoadModels
				.findClosestObject(roadModel.getPosition(this), roadModel, new Predicate() {
					@Override
					public boolean apply(RoadUser input) {
						return input instanceof DefaultParcel
								&& pdpModel.getParcelState(((DefaultParcel) input)) == ParcelState.AVAILABLE;
					}
				});

		if (closest != null && Point.distance(pdpModel.getPosition(closest), getPosition()) < 10) {
			if (roadModel.equalPosition(closest, this)
					&& pdpModel.getTimeWindowPolicy()
							.canPickup(closest.getPickupTimeWindow(), time.getTime(), closest.getPickupDuration())) {
				final double newSize = getPDPModel().getContentsSize(this) + closest.getMagnitude();

				if (newSize <= getCapacity()) {
					pdpModel.pickup(this, closest, time);
				}
			} else {
				roadModel.moveTo(this, pdpModel.getPosition(closest), time);
			}
			return;
		}

		// If none of the above, let the gradient field guide us!
		roadModel.moveTo(this, gradientModel.getTargetFor(this), time);
	}

	public Parcel getDelivery(TimeLapse time, int distance) {
		Parcel target = null;
		double closest = distance;

		for (final Parcel p : pdpModel.getContents(this)) {

			final double dist = Point.distance(pdpModel.getPosition(this), p.getDestination());
			if (dist < closest
					&& pdpModel.getTimeWindowPolicy()
							.canDeliver(p.getDeliveryTimeWindow(), time.getTime(), p.getPickupDuration())) {
				closest = dist;
				target = p;
			}
		}

		return target;
	}

	@Override
	public void setModel(GradientModel model) {
		gradientModel = model;
	}

	@Override
	public Point getPosition() {
		return roadModel.getPosition(this);
	}

	@Override
	public float getStrength() {
		return -1;
	}

	public Map getFields() {
		return gradientModel.getFields(this);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy