package cz.agents.agentpolis.darptestbed.simmodel.agent.data.generator;
import java.util.List;
import java.util.Random;
import java.util.Set;
import cz.agents.agentpolis.darptestbed.global.GeneratorParams;
import org.joda.time.Duration;
import cz.agents.agentpolis.darptestbed.global.GlobalParams;
import cz.agents.agentpolis.darptestbed.global.Utils;
import cz.agents.agentpolis.darptestbed.simmodel.agent.data.Request;
import cz.agents.agentpolis.darptestbed.simmodel.agent.data.TimeWindow;
import cz.agents.agentpolis.darptestbed.simmodel.agent.passenger.PassengerProfile;
import cz.agents.agentpolis.simmodel.environment.model.query.AgentPositionQuery;
/**
* A simple generator, that doesn't care about the passenger's profile and just
* generates requests to any place on the map.
*
* @author Lukas Canda
*/
public class RandomRequestGenerator extends ARequestGenerator {
/**
* A set of useful methods for searching paths, distances etc.
*/
protected final Utils utils;
protected final Duration passengerStartLife;
private final List<Long> allNetworkNodes;
public RandomRequestGenerator(PassengerProfile passengerProfile, AgentPositionQuery positionQuery,
List<Long> allNetworkNodes, Utils utils, Duration passengerStartLife) {
super(passengerProfile, positionQuery);
this.utils = utils;
this.passengerStartLife = passengerStartLife;
this.allNetworkNodes = allNetworkNodes;
}
@Override
public void start(String passengerId, Set<String> additionalRequirements, RequestGeneratorCall requestGeneratorCall) {
Random random = GlobalParams.getRandom();
Long initialPosition = positionQuery.getCurrentPositionByNodeId(passengerId);
Long targetPosition = null;
// generate random target position
do {
targetPosition = allNetworkNodes.get(random.nextInt(allNetworkNodes.size()));
} while (initialPosition == targetPosition);
// prepare the request to be send
Request reqNew = null;
if (GeneratorParams.isTimeWindowsUsed()) {
int intPassengerStartLife = (int) passengerStartLife.getMillis();
long minDeparture = intPassengerStartLife + GeneratorParams.getEarliestDepartureShift() * 60000;
// an alternative - random earliest departure
// long minDeparture = intPassengerStartLife +
// GlobalParams.getRandom()
// .nextInt(GlobalParams.getEarliestDepartureShift() + 1);
long timeToDrive = utils
.computeDrivingTime(initialPosition, targetPosition, GlobalParams.getVelocityInKmph());
long timeWindowLength = (long) (timeToDrive * GeneratorParams.getTimeWinRelSize());
TimeWindow timeWindow = new TimeWindow(minDeparture, minDeparture + timeWindowLength - timeToDrive,
minDeparture + timeToDrive, minDeparture + timeWindowLength);
reqNew = new Request(passengerId, initialPosition, targetPosition, timeWindow, additionalRequirements);
} else {
reqNew = new Request(passengerId, initialPosition, targetPosition, additionalRequirements);
}
requestGeneratorCall.sendRequest(reqNew);
}
}