<<<<<<< HEAD
package simulation;
import classes.TypeSelection;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Hashtable;
import java.util.List;
import roadnetwork.Edge;
import trafficdefinition.School;
import trafficdefinition.TrafficArea;
/**
* Represents a virtual house.
*/
public class House {
/**
* Adults living in the house
*/
private List<Adult> adults = new ArrayList<Adult>();
/**
* Children living in the house
*/
private List<Child> children = new ArrayList<Child>();
/**
* House address
*/
private Edge address;
/**
* The area in which the house is located
*/
private TrafficArea area;
/**
* The house ID
*/
private int id;
/**
* House coordinates
*/
private Point2D.Double location;
/**
* Class constructor
*
* @param area
* the area in which the house is located
* @param id
* the house's id
*/
public House(TrafficArea area, int id) {
super();
this.id = id;
this.area = area;
}
/**
* Assigns vehicles to the house's drivers based on the types of the
* vehicles of the area the house is in and the possibility that a driver
* has a car
*
* @param possibilityDriverHasCar
* @param areaVehicleTypes
*/
public void assignVehiclesToDrivers(float possibilityDriverHasCar, TypeSelection<VehicleType> areaVehicleTypes) {
// Vehicles belonging to house residents
List<VehicleType> vehicles = new ArrayList<VehicleType>();
// Calculate how many vehicles there are in the house
int numberOfVehicles = Math.round(possibilityDriverHasCar * getNumberOfDrivers());
// Create the vehicles
for (int i = 0; i < numberOfVehicles; i++) {
vehicles.add(areaVehicleTypes.getRandomType());
}
// Get available vehicles
List<VehicleType> availableVehicles = new ArrayList<VehicleType>();
availableVehicles.addAll(vehicles);
List<Adult> availableWorkingDriverAdults = getWorkingDrivers();
List<Adult> availableNonWorkingDriverAdults = getNonWorkingDrivers();
// Assign vehicles first to working drivers and then to non working
// drivers
while (!availableVehicles.isEmpty()) {
if (!availableWorkingDriverAdults.isEmpty()) {
availableWorkingDriverAdults.get(0).setVehicle(availableVehicles.get(0));
availableWorkingDriverAdults.remove(0);
} else {
availableNonWorkingDriverAdults.get(0).setVehicle(availableVehicles.get(0));
availableNonWorkingDriverAdults.remove(0);
}
availableVehicles.remove(0);
}
}
/**
* Creates activities for 24 hours for the residents of the virtual house
*
* @param tripsList
* the list in which to place the generated trips
* @param routesList
* the list in which to place the generated routes
* @throws Exception
* if anything goes wrong
*/
public void createActivities(SUMOInstructionList<Trip> tripsList, SUMOInstructionList<Route> routesList) throws Exception {
String color = new Float(area.getColor().getRed() / 255f).toString() + "," + new Float(area.getColor().getGreen() / 255f).toString() + "," + new Float(area.getColor().getBlue() / 255f).toString();
// Hashtable containing the house's children grouped by the school they
// are going
Hashtable<School, List<Child>> childrenBySchool = new Hashtable<School, List<Child>>();
// List containing a list of all the schools that the children of the house are going
List<School> schools = new ArrayList<School>();
// Group children by school
for (Child c : children) {
// If the child is going to a school
if (c.getSchool() != null) {
if (!childrenBySchool.containsKey(c.getSchool())) {
childrenBySchool.put(c.getSchool(), new ArrayList<Child>());
schools.add(c.getSchool());
}
childrenBySchool.get(c.getSchool()).add(c);
}
}
//Sort the schools list by priority
Collections.sort(schools, new School.SchoolPriorityComparator());
// Loop through all schools order by school priority
for (School school : schools) {
// Loop through the house's adults that own a vehicle order by employment status
// and assign children to those who can take them to school
for (Adult a : getAdultsWithVehicleOrderByEmploymentStatus()) {
if (a.canTakeChildToSchool(school, 10 * 60)) {
a.takeChildrenToSchool(childrenBySchool.get(school));
break;
}
}
// Loop through the house's adults that own a vehicle order by employment status
// and assign children to those who can pick them up from school
for (Adult a : getAdultsWithVehicleOrderByEmploymentStatus()) {
if (a.canPickupChildFromSchool(school)) {
a.pickupChildrenFromSchool(childrenBySchool.get(school));
break;
}
}
}
int adultCounter = 0;
// Create trips for all adults in the house
for (Adult a : adults) {
a.createTrips(color, tripsList, routesList, adultCounter++);
}
}
/**
* Creates the house's adults and assigns them properties
*
* @param numberOfAdults
* the number of adults to create
* @param possibilityAdultIsDriver
* the possibility that an adult is a driver
* @param possibilityAdultHasJob
* the possibility that an adult has a job
*/
public void createAdults(int numberOfAdults, float possibilityAdultIsDriver, float possibilityAdultHasJob) {
for (int i = 0; i < numberOfAdults; i++) {
adults.add(new Adult(this, possibilityAdultIsDriver, possibilityAdultHasJob));
}
}
/**
* Create's the house's children
*
* @param numberOfChildren
* the number of children to create
*/
public void createChildren(int numberOfChildren) {
for (int i = 0; i < numberOfChildren; i++) {
children.add(new Child());
}
}
/**
* @return the children
* @uml.property name="children"
*/
public List<Child> getChildren() {
return children;
}
/**
* @return the address
* @uml.property name="address"
*/
public Edge getAddress() {
return address;
}
/**
* @return the location
* @uml.property name="location"
*/
public Point2D.Double getLocation() {
return location;
}
/**
* Returns the total number of residents in the house
*
* @return
*/
public int getNumberOfResidents() {
return adults.size() + children.size();
}
/**
* Returns the working adults of the house
*
* @return
*/
public List<Adult> getWorkingAdults() {
List<Adult> result = new ArrayList<Adult>();
for (Adult a : adults) {
if (a.hasJob()) {
result.add(a);
}
}
return result;
}
/**
* @param address the address to set
* @uml.property name="address"
*/
public void setAddress(Edge closestEdge) {
this.address = closestEdge;
}
/**
* @param location the location to set
* @uml.property name="location"
*/
public void setLocation(Point2D.Double location) {
this.location = location;
}
/**
* Returns the non-working adults of the house
*
* @return
*/
private List<Adult> getNonWorkingDrivers() {
List<Adult> nonWorkingDrivers = new ArrayList<Adult>();
for (Adult a : adults) {
if (a.canDrive() && (!a.hasJob())) {
nonWorkingDrivers.add(a);
}
}
return nonWorkingDrivers;
}
/**
* Returns a list of all adults in the house that own a vehicle ordered
* by their employment status. Unemployed are first and employed follow.
* @return
*/
private List<Adult> getAdultsWithVehicleOrderByEmploymentStatus(){
List<Adult> result = new ArrayList<Adult>();
//Add first unemployed adults
for(Adult a:adults){
if(!a.hasJob()&&a.getVehicle()!=null)
result.add(a);
}
//Add employed adults
for(Adult a:adults){
if(a.hasJob()&&a.getVehicle()!=null)
result.add(a);
}
return result;
}
/**
* Returns the total number of drivers in the hosue
*
* @return
*/
private int getNumberOfDrivers() {
int drivers = 0;
for (Adult a : adults) {
if (a.canDrive()) {
drivers++;
}
}
return drivers;
}
/**
* Returns the working drivers in the house
*
* @return
*/
private List<Adult> getWorkingDrivers() {
List<Adult> workingDrivers = new ArrayList<Adult>();
for (Adult a : adults) {
if (a.canDrive() && a.hasJob()) {
workingDrivers.add(a);
}
}
return workingDrivers;
}
/**
* @return the id
* @uml.property name="id"
*/
public int getId() {
return id;
}
}
=======
package simulation;
import classes.TypeSelection;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Hashtable;
import java.util.List;
import roadnetwork.Edge;
import trafficdefinition.School;
import trafficdefinition.TrafficArea;
/**
* Represents a virtual house.
*/
public class House {
/**
* Adults living in the house
*/
private List<Adult> adults = new ArrayList<Adult>();
/**
* Children living in the house
*/
private List<Child> children = new ArrayList<Child>();
/**
* House address
*/
private Edge address;
/**
* The area in which the house is located
*/
private TrafficArea area;
/**
* The house ID
*/
private int id;
/**
* House coordinates
*/
private Point2D.Double location;
/**
* Class constructor
*
* @param area
* the area in which the house is located
* @param id
* the house's id
*/
public House(TrafficArea area, int id) {
super();
this.id = id;
this.area = area;
}
/**
* Assigns vehicles to the house's drivers based on the types of the
* vehicles of the area the house is in and the possibility that a driver
* has a car
*
* @param possibilityDriverHasCar
* @param areaVehicleTypes
*/
public void assignVehiclesToDrivers(float possibilityDriverHasCar, TypeSelection<VehicleType> areaVehicleTypes) {
// Vehicles belonging to house residents
List<VehicleType> vehicles = new ArrayList<VehicleType>();
// Calculate how many vehicles there are in the house
int numberOfVehicles = Math.round(possibilityDriverHasCar * getNumberOfDrivers());
// Create the vehicles
for (int i = 0; i < numberOfVehicles; i++) {
vehicles.add(areaVehicleTypes.getRandomType());
}
// Get available vehicles
List<VehicleType> availableVehicles = new ArrayList<VehicleType>();
availableVehicles.addAll(vehicles);
List<Adult> availableWorkingDriverAdults = getWorkingDrivers();
List<Adult> availableNonWorkingDriverAdults = getNonWorkingDrivers();
// Assign vehicles first to working drivers and then to non working
// drivers
while (!availableVehicles.isEmpty()) {
if (!availableWorkingDriverAdults.isEmpty()) {
availableWorkingDriverAdults.get(0).setVehicle(availableVehicles.get(0));
availableWorkingDriverAdults.remove(0);
} else {
availableNonWorkingDriverAdults.get(0).setVehicle(availableVehicles.get(0));
availableNonWorkingDriverAdults.remove(0);
}
availableVehicles.remove(0);
}
}
/**
* Creates activities for 24 hours for the residents of the virtual house
*
* @param tripsList
* the list in which to place the generated trips
* @param routesList
* the list in which to place the generated routes
* @throws Exception
* if anything goes wrong
*/
public void createActivities(SUMOInstructionList<Trip> tripsList, SUMOInstructionList<Route> routesList) throws Exception {
String color = new Float(area.getColor().getRed() / 255f).toString() + "," + new Float(area.getColor().getGreen() / 255f).toString() + "," + new Float(area.getColor().getBlue() / 255f).toString();
// Hashtable containing the house's children grouped by the school they
// are going
Hashtable<School, List<Child>> childrenBySchool = new Hashtable<School, List<Child>>();
// List containing a list of all the schools that the children of the house are going
List<School> schools = new ArrayList<School>();
// Group children by school
for (Child c : children) {
// If the child is going to a school
if (c.getSchool() != null) {
if (!childrenBySchool.containsKey(c.getSchool())) {
childrenBySchool.put(c.getSchool(), new ArrayList<Child>());
schools.add(c.getSchool());
}
childrenBySchool.get(c.getSchool()).add(c);
}
}
//Sort the schools list by priority
Collections.sort(schools, new School.SchoolPriorityComparator());
// Loop through all schools order by school priority
for (School school : schools) {
// Loop through the house's adults that own a vehicle order by employment status
// and assign children to those who can take them to school
for (Adult a : getAdultsWithVehicleOrderByEmploymentStatus()) {
if (a.canTakeChildToSchool(school, 10 * 60)) {
a.takeChildrenToSchool(childrenBySchool.get(school));
break;
}
}
// Loop through the house's adults that own a vehicle order by employment status
// and assign children to those who can pick them up from school
for (Adult a : getAdultsWithVehicleOrderByEmploymentStatus()) {
if (a.canPickupChildFromSchool(school)) {
a.pickupChildrenFromSchool(childrenBySchool.get(school));
break;
}
}
}
int adultCounter = 0;
// Create trips for all adults in the house
for (Adult a : adults) {
a.createTrips(color, tripsList, routesList, adultCounter++);
}
}
/**
* Creates the house's adults and assigns them properties
*
* @param numberOfAdults
* the number of adults to create
* @param possibilityAdultIsDriver
* the possibility that an adult is a driver
* @param possibilityAdultHasJob
* the possibility that an adult has a job
*/
public void createAdults(int numberOfAdults, float possibilityAdultIsDriver, float possibilityAdultHasJob) {
for (int i = 0; i < numberOfAdults; i++) {
adults.add(new Adult(this, possibilityAdultIsDriver, possibilityAdultHasJob));
}
}
/**
* Create's the house's children
*
* @param numberOfChildren
* the number of children to create
*/
public void createChildren(int numberOfChildren) {
for (int i = 0; i < numberOfChildren; i++) {
children.add(new Child());
}
}
/**
* @return the children
* @uml.property name="children"
*/
public List<Child> getChildren() {
return children;
}
/**
* @return the address
* @uml.property name="address"
*/
public Edge getAddress() {
return address;
}
/**
* @return the location
* @uml.property name="location"
*/
public Point2D.Double getLocation() {
return location;
}
/**
* Returns the total number of residents in the house
*
* @return
*/
public int getNumberOfResidents() {
return adults.size() + children.size();
}
/**
* Returns the working adults of the house
*
* @return
*/
public List<Adult> getWorkingAdults() {
List<Adult> result = new ArrayList<Adult>();
for (Adult a : adults) {
if (a.hasJob()) {
result.add(a);
}
}
return result;
}
/**
* @param address the address to set
* @uml.property name="address"
*/
public void setAddress(Edge closestEdge) {
this.address = closestEdge;
}
/**
* @param location the location to set
* @uml.property name="location"
*/
public void setLocation(Point2D.Double location) {
this.location = location;
}
/**
* Returns the non-working adults of the house
*
* @return
*/
private List<Adult> getNonWorkingDrivers() {
List<Adult> nonWorkingDrivers = new ArrayList<Adult>();
for (Adult a : adults) {
if (a.canDrive() && (!a.hasJob())) {
nonWorkingDrivers.add(a);
}
}
return nonWorkingDrivers;
}
/**
* Returns a list of all adults in the house that own a vehicle ordered
* by their employment status. Unemployed are first and employed follow.
* @return
*/
private List<Adult> getAdultsWithVehicleOrderByEmploymentStatus(){
List<Adult> result = new ArrayList<Adult>();
//Add first unemployed adults
for(Adult a:adults){
if(!a.hasJob()&&a.getVehicle()!=null)
result.add(a);
}
//Add employed adults
for(Adult a:adults){
if(a.hasJob()&&a.getVehicle()!=null)
result.add(a);
}
return result;
}
/**
* Returns the total number of drivers in the hosue
*
* @return
*/
private int getNumberOfDrivers() {
int drivers = 0;
for (Adult a : adults) {
if (a.canDrive()) {
drivers++;
}
}
return drivers;
}
/**
* Returns the working drivers in the house
*
* @return
*/
private List<Adult> getWorkingDrivers() {
List<Adult> workingDrivers = new ArrayList<Adult>();
for (Adult a : adults) {
if (a.canDrive() && a.hasJob()) {
workingDrivers.add(a);
}
}
return workingDrivers;
}
/**
* @return the id
* @uml.property name="id"
*/
public int getId() {
return id;
}
}
>>>>>>> origin/abdalla