package vroom.common.modeling.dataModel;
import java.util.Arrays;
import vroom.common.modeling.dataModel.attributes.IVehicleAttribute;
import vroom.common.modeling.dataModel.attributes.VehicleAttributeKey;
import vroom.common.utilities.dataModel.IObjectWithID;
import vroom.common.utilities.dataModel.IObjectWithName;
/**
* The Class <code>Vehicle</code> is used to represent a generic vehicle, with multiple compartments and associated
* fixed and variable costs.
* <p>
* It extends {@link ObjectWithAttributes} and care therefore have additional attributes associated to it.
* </p>
*
* @author Victor Pillac, <a href="http://uniandes.edu.co">Universidad de Los Andes</a> - <a
* href="http://copa.uniandes.edu.co">Copa</a>, <a href="http://www.emn.fr">Ecole des Mines de Nantes</a>-<a
* href="http://www.irccyn.ec-nantes.fr/irccyn/d/en/equipes/Slp">SLP</a>
* @version 1.0 #updated 16-Feb-2010 10:07:25 a.m.
*/
public class Vehicle extends ObjectWithAttributes<IVehicleAttribute, VehicleAttributeKey<?>>
implements IObjectWithName, IObjectWithID {
/** An array containing the capacities of the different compartments. */
private final double[] mCapacities;
/** The fixed cost associated with this vehicle. */
private final double mFixedCost;
/**
* The variable cost associated with this vehicle.
*/
private final double mVariableCost;
/**
* The average speed of the vehicle
*/
private final double mSpeed;
/**
* Creates a new vehicle with the given characteristics, a fixed cost of 0 and a variable cost of 1.
*
* @param id
* the id
* @param description
* a description for this vehicle
* @param capacities
* an array containing the capacities of the compartments of this vehicle
* @see Vehicle#Vehicle(int, String, double, double, double...)
* @see Vehicle#getFixedCost()
* @see Vehicle#getVariableCost()
*/
public Vehicle(int id, String description, double... capacities) {
this(id, description, 0, 1, capacities);
}
/**
* Instantiates a new vehicle.
*
* @param id
* the id
* @param description
* a description for this vehicle
* @param fixedCost
* a fixed cost incurred when using this vehicle
* @param variableCost
* a variable cost per distance unit when using this vehicle
* @param capacities
* an array containing the capacities of the compartments of this vehicle
*/
public Vehicle(int id, String description, double fixedCost, double variableCost,
double... capacities) {
this(id, description, fixedCost, variableCost, 1, capacities);
}
/**
* Instantiates a new vehicle.
*
* @param id
* the id
* @param description
* a description for this vehicle
* @param fixedCost
* a fixed cost incurred when using this vehicle
* @param variableCost
* a variable cost per distance unit when using this vehicle
* @param speed
* the average speed of this vehicle
* @param capacities
* an array containing the capacities of the compartments of this vehicle
*/
public Vehicle(int id, String description, double fixedCost, double variableCost, double speed,
double... capacities) {
setName(description);
mID = id;
if (capacities == null)
capacities = new double[0];
mCapacities = Arrays.copyOf(capacities, capacities.length);
mFixedCost = fixedCost;
mVariableCost = variableCost;
mSpeed = speed;
}
/**
* Clone.
*
* @param cloneId
* the id for the cloned {@link Vehicle}
* @return a clone of this instance with the given as id
*/
public Vehicle clone(int cloneId) {
return new Vehicle(cloneId, getName(), mFixedCost, mVariableCost, mSpeed, mCapacities);
}
/**
* Getter for the vehicle capacity in the multiple compartment case.
*
* @param product
* the id of the considered product
* @return the capacity of the compartment of this vehicle for the given
*/
public double getCapacity(int product) {
return mCapacities[product];
}
/**
* Gets the compartment count.
*
* @return the number of compartments in this vehicle
*/
public int getCompartmentCount() {
return mCapacities.length;
}
/**
* Gets the fixed cost.
*
* @return the fixed cost associated with this vehicle. The default value is 0.
*/
public double getFixedCost() {
return mFixedCost;
}
/**
* Gets the variable cost.
*
* @return the variable cost associated with this vehicle per distance unit. The default value is 1
*/
public double getVariableCost() {
return mVariableCost;
}
/**
* Gets the vehicle's average speed
*
* @return the vehicle's average speed (default value is 1)
*/
public double getSpeed() {
return mSpeed;
}
/**
* Getter for the vehicle capacity in the single compartment case.
*
* @return the capacity of this vehicle
*/
public double getCapacity() {
return mCapacities[0];
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return String.format("[%s %s cap:%s cf:%s cv:%s s:%s %s]", getID(), getName(),
Arrays.toString(mCapacities), getFixedCost(), getVariableCost(), getSpeed(),
getAttributesAsString());
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
return mID;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Vehicle other = (Vehicle) obj;
if (!Arrays.equals(mCapacities, other.mCapacities)) {
return false;
}
if (Double.doubleToLongBits(mFixedCost) != Double.doubleToLongBits(other.mFixedCost)) {
return false;
}
if (mID != other.mID) {
return false;
}
if (mName == null) {
if (other.mName != null) {
return false;
}
} else if (!mName.equals(other.mName)) {
return false;
}
if (Double.doubleToLongBits(mVariableCost) != Double.doubleToLongBits(other.mVariableCost)) {
return false;
}
return true;
}
/* IObjectWithName interface implementation */
/** The name of this object. */
private String mName;
/*
* (non-Javadoc)
*
* @see edu.uniandes.copa.utils.IObjectWithName#getName()
*/
@Override
public String getName() {
return mName;
}
/**
* Setter for this object name.
*
* @param name
* the name to be set
*/
public void setName(String name) {
mName = name;
}
/* */
/* IObjectWithId interface implementation */
/** The m id. */
private final int mID;
/*
* (non-Javadoc)
*
* @see edu.uniandes.copa.utils.IObjectWithID#getID()
*/
@Override
public int getID() {
return mID;
}
/* */
}// end VRPVehicle