Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 22 additions & 14 deletions src/main/scala/edu/ie3/mobsim/MobilitySimulator.scala
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,15 @@ import edu.ie3.mobsim.exceptions.{
InitializationException,
UninitializedException
}
import edu.ie3.mobsim.io.geodata.PoiEnums.CategoricalLocationDictionary
import edu.ie3.mobsim.io.geodata.PoiEnums.{
CategoricalLocationDictionary,
PoiTypeDictionary
}
import edu.ie3.mobsim.io.geodata.{PoiUtils, PointOfInterest}
import edu.ie3.mobsim.io.probabilities._
import edu.ie3.mobsim.model.ChargingBehavior.chooseChargingStation
import edu.ie3.mobsim.model.TripSimulation.simulateNextTrip
import edu.ie3.mobsim.model.{
ChargingStation,
ElectricVehicle,
EvMovement,
EvType
}
import edu.ie3.mobsim.model._
import edu.ie3.mobsim.utils.{IoUtils, PathsAndSources}
import edu.ie3.simona.api.data.ExtDataSimulation
import edu.ie3.simona.api.data.ev.{ExtEvData, ExtEvSimulation}
Expand All @@ -38,7 +36,6 @@ import java.time.temporal.ChronoUnit
import java.time.{ZoneId, ZonedDateTime}
import java.util.UUID
import javax.measure.quantity.Length
import scala.collection.immutable.{SortedSet, TreeSet}
import scala.collection.parallel.CollectionConverters._
import scala.jdk.CollectionConverters._
import scala.util.Random
Expand Down Expand Up @@ -103,8 +100,8 @@ final class MobilitySimulator(
)

/* Get time until next event for one of the EVs and return corresponding tick to SIMONA */
val timeUntilNextEvent =
getTimeUntilNextEvent(electricVehicles, currentTime)
val nextEvent =
tick + getTimeUntilNextEvent(electricVehicles, currentTime)

/* Save occupancy of charging stations for csv output */
chargingStations.foreach(cs =>
Expand All @@ -116,7 +113,7 @@ final class MobilitySimulator(
)

val newTicks = new java.util.ArrayList[java.lang.Long](1)
newTicks.add(tick + timeUntilNextEvent)
newTicks.add(nextEvent)
newTicks
}

Expand Down Expand Up @@ -165,7 +162,7 @@ final class MobilitySimulator(
s"Got unexpected EvModel type ${unexpected.getClass}"
)
}
.to(SortedSet)
.toSet

/* Add EVs that start parking to movements and assign to Evcs UUID */
val arrivals = handleParkingEvs(
Expand Down Expand Up @@ -428,7 +425,7 @@ final class MobilitySimulator(
} else {
logger.debug(
s"${ev.getId} could not be charged at destination ${ev.destinationPoi} " +
s"(${ev.getDestinationPoiType}) because all charging points " +
s"(${ev.destinationPoiType}) because all charging points " +
s"at $cs were taken."
)
None
Expand Down Expand Up @@ -481,7 +478,7 @@ final class MobilitySimulator(
}
.getOrElse(ev)

simulateNextTrip(
val updatedEv = simulateNextTrip(
currentTime,
targetEv,
poisWithSizes,
Expand All @@ -492,6 +489,17 @@ final class MobilitySimulator(
tripProbabilities,
thresholdChargingHubDistance
)

if (
updatedEv.departureTime.getDayOfWeek != currentTime.getDayOfWeek && updatedEv.destinationPoiType != PoiTypeDictionary.HOME
) {
TripSimulation.simulateLastDailyTripToHome(
currentTime,
ev,
tripProbabilities
)
} else updatedEv

} else ev
})

Expand Down
22 changes: 0 additions & 22 deletions src/main/scala/edu/ie3/mobsim/io/geodata/PoiEnums.scala
Original file line number Diff line number Diff line change
Expand Up @@ -26,28 +26,6 @@ object PoiEnums {
throw new RuntimeException(s"PoiType '$malformed' not known")
}
}

def apply(
categoricalLocation: CategoricalLocationDictionary.Value
): Value = {
categoricalLocation match {
case CategoricalLocationDictionary.HOME => HOME
case CategoricalLocationDictionary.WORK => WORK
case CategoricalLocationDictionary.SUPERMARKET => SHOPPING
case CategoricalLocationDictionary.SERVICES => SHOPPING
case CategoricalLocationDictionary.OTHER_SHOP => SHOPPING
case CategoricalLocationDictionary.RESTAURANT => LEISURE
case CategoricalLocationDictionary.CULTURE => LEISURE
case CategoricalLocationDictionary.SPORTS => LEISURE
case CategoricalLocationDictionary.RELIGIOUS => LEISURE
case CategoricalLocationDictionary.MEDICINAL => OTHER
case CategoricalLocationDictionary.BBPG => OTHER
case CategoricalLocationDictionary.CHARGING_HUB_TOWN =>
CHARGING_HUB_TOWN
case CategoricalLocationDictionary.CHARGING_HUB_HIGHWAY =>
CHARGING_HUB_HIGHWAY
}
}
}

object CategoricalLocationDictionary extends Enumeration {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,6 @@ final case class PointOfInterest(
else -1
}

def getPoiType: PoiTypeDictionary.Value =
PoiTypeDictionary.apply(categoricalLocation)
}

case object PointOfInterest {
Expand Down
4 changes: 2 additions & 2 deletions src/main/scala/edu/ie3/mobsim/model/ChargingBehavior.scala
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,8 @@ object ChargingBehavior extends LazyLogging {
if (ev.destinationPoi.nearestChargingStations.nonEmpty) {
/* Always charge if the EV makes charging stop at charging hub */
if (
ev.getDestinationPoiType == PoiEnums.PoiTypeDictionary.CHARGING_HUB_TOWN
|| ev.getDestinationPoiType == PoiEnums.PoiTypeDictionary.CHARGING_HUB_HIGHWAY
ev.destinationPoiType == PoiEnums.PoiTypeDictionary.CHARGING_HUB_TOWN
|| ev.destinationPoiType == PoiEnums.PoiTypeDictionary.CHARGING_HUB_HIGHWAY
) {
logger.debug(
s"${ev.getId} arrives at charging hub and wants to start charging."
Expand Down
25 changes: 17 additions & 8 deletions src/main/scala/edu/ie3/mobsim/model/ElectricVehicle.scala
Original file line number Diff line number Diff line change
Expand Up @@ -72,12 +72,14 @@ final case class ElectricVehicle(
workPoi: PointOfInterest,
storedEnergy: ComparableQuantity[Energy],
destinationPoi: PointOfInterest,
destinationPoiType: PoiTypeDictionary.Value,
parkingTimeStart: ZonedDateTime,
departureTime: ZonedDateTime,
chargingAtHomePossible: Boolean,
chosenChargingStation: Option[UUID],
chargingAtSimona: Boolean,
finalDestinationPoi: Option[PointOfInterest],
finalDestinationPoiType: Option[PoiTypeDictionary.Value],
remainingDistanceAfterChargingHub: Option[
ComparableQuantity[Length]
],
Expand All @@ -97,11 +99,6 @@ final case class ElectricVehicle(

def getStoredEnergy: ComparableQuantity[Energy] = storedEnergy

def getDestinationPoiType: PoiTypeDictionary.Value = destinationPoi.getPoiType

def getFinalDestinationPoiType: Option[PoiTypeDictionary.Value] =
finalDestinationPoi.map(_.getPoiType)

def getDepartureTick: java.lang.Long = toTick(simulationStart, departureTime)

/** @param storedEnergy
Expand All @@ -120,12 +117,14 @@ final case class ElectricVehicle(
def copyWith(
storedEnergy: ComparableQuantity[Energy],
destinationPoi: PointOfInterest,
destinationPoiType: PoiTypeDictionary.Value,
parkingTimeStart: ZonedDateTime,
departureTime: ZonedDateTime
): ElectricVehicle =
copy(
storedEnergy = storedEnergy,
destinationPoi = destinationPoi,
destinationPoiType = destinationPoiType,
parkingTimeStart = parkingTimeStart,
departureTime = departureTime
)
Expand All @@ -144,10 +143,18 @@ final case class ElectricVehicle(
copy(chargingAtSimona = false)
}

def setFinalDestinationPoi(
destinationPoi: Option[PointOfInterest]
def resetFinalDestination(): ElectricVehicle = {
copy(finalDestinationPoi = None, finalDestinationPoiType = None)
}

def setFinalDestination(
destinationPoi: PointOfInterest,
destinationPoiType: PoiTypeDictionary.Value
): ElectricVehicle = {
copy(finalDestinationPoi = destinationPoi)
copy(
finalDestinationPoi = Some(destinationPoi),
finalDestinationPoiType = Some(destinationPoiType)
)
}

def setRemainingDistanceAfterChargingHub(
Expand Down Expand Up @@ -443,6 +450,7 @@ case object ElectricVehicle extends LazyLogging {
homePoi = homePoi,
workPoi = workPoi,
storedEnergy = evType.capacity,
destinationPoiType = PoiTypeDictionary.HOME,
destinationPoi = homePoi, // is updated when trip is sampled
parkingTimeStart = simulationStart, // EV starts parking at first tick
departureTime =
Expand All @@ -453,6 +461,7 @@ case object ElectricVehicle extends LazyLogging {
chosenChargingStation = None,
chargingAtSimona = false,
finalDestinationPoi = None,
finalDestinationPoiType = None,
remainingDistanceAfterChargingHub = None,
chargingPricesMemory = Queue[Double]()
)
Expand Down
Loading