Skip to content
Merged
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

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,8 @@ public Scenario assembleScenario(Config matsimConfig, int year, TravelTimes trav

PopulationFactory pf = matsimPopulation.getFactory();

final int noHHAUtos = (int) household.getVehicles().stream().filter( vv -> vv.getType().equals( VehicleType.CAR ) ).count();
org.matsim.api.core.v01.population.Person matsimAlterEgo = SiloMatsimUtils.createMatsimAlterEgo(pf, person, noHHAUtos );
final int nHhCars = (int) household.getVehicles().stream().filter( vv -> vv.getType().equals( VehicleType.CAR ) ).count();
org.matsim.api.core.v01.population.Person matsimAlterEgo = SiloMatsimUtils.createMatsimAlterEgo(pf, person, nHhCars );
matsimPopulation.addPerson(matsimAlterEgo);

Dwelling dwelling = realEstateDataManager.getDwelling(household.getDwellingId());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@

import java.util.*;

import static org.matsim.api.core.v01.TransportMode.*;

/**
* Copy of SimpleCommuteModeChoice, but with person in argument of travel time request
*/
Expand All @@ -32,8 +34,7 @@ public class SimpleMatsimCommuteModeChoice implements CommuteModeChoice {
private final GeoData geoData;
private final Random random;

public SimpleMatsimCommuteModeChoice(DataContainer dataContainer,
Properties properties, Random random) {
public SimpleMatsimCommuteModeChoice(DataContainer dataContainer, Properties properties, Random random) {
this.properties = properties;
this.commutingTimeProbability = dataContainer.getCommutingTimeProbability();
this.jobDataManager = dataContainer.getJobDataManager();
Expand All @@ -50,25 +51,27 @@ public CommuteModeChoiceMapping assignCommuteModeChoice(Location from, TravelTim
Map<Integer, Map<String, Double>> commuteModesByPerson = new LinkedHashMap<>();
TreeMap<Double, Person> personByProbability = new TreeMap<>();

// I think that the following assigns, for each member of the hh, logit probabilities based on travel time for pt and, if available, car.
for (Person pp : household.getPersons().values()) {
if (pp.getOccupation() == Occupation.EMPLOYED && pp.getJobId() != -2) {
// (yy what is encoded by "-2"?)

Job job = jobDataManager.getJobFromId(pp.getJobId());

// TODO clean up the following line
int ptMinutes = (int) ((MatsimTravelTimesAndCosts) travelTimes).getTravelTime(from, job, job.getStartTimeInSeconds().orElse((int) properties.transportModel.peakHour_s), TransportMode.pt, pp);
double ptUtility = commutingTimeProbability.getCommutingTimeProbability(ptMinutes, TransportMode.pt);
int ptMinutes = (int) ((MatsimTravelTimesAndCosts) travelTimes).getTravelTime(from, job, job.getStartTimeInSeconds().orElse((int) properties.transportModel.peakHour_s), pt, pp);
double ptUtility = commutingTimeProbability.getCommutingTimeProbability(ptMinutes, pt);

if (!pp.hasDriverLicense() || (int) household.getVehicles().stream().filter(vv -> vv.getType().equals(VehicleType.CAR)).count() == 0) {
CommuteModeChoiceMapping.CommuteMode ptCommuteMode = new CommuteModeChoiceMapping.CommuteMode(TransportMode.pt, ptUtility);
CommuteModeChoiceMapping.CommuteMode ptCommuteMode = new CommuteModeChoiceMapping.CommuteMode( pt, ptUtility);
commuteModeChoiceMapping.assignMode(ptCommuteMode, pp);
} else {
// TODO clean up the following line
int carMinutes = (int) ((MatsimTravelTimesAndCosts) travelTimes).getTravelTime(from, job, job.getStartTimeInSeconds().orElse((int) properties.transportModel.peakHour_s), TransportMode.car, pp);
double carUtility = commutingTimeProbability.getCommutingTimeProbability(carMinutes, TransportMode.car);
int carMinutes = (int) ((MatsimTravelTimesAndCosts) travelTimes).getTravelTime(from, job, job.getStartTimeInSeconds().orElse((int) properties.transportModel.peakHour_s), car, pp);
double carUtility = commutingTimeProbability.getCommutingTimeProbability(carMinutes, car);
Map<String, Double> utilityByMode = new LinkedHashMap<>();
utilityByMode.put(TransportMode.car, carUtility);
utilityByMode.put(TransportMode.pt, ptUtility);
utilityByMode.put( car, carUtility );
utilityByMode.put( pt, ptUtility );
commuteModesByPerson.put(pp.getId(), utilityByMode);
double probabilityAsKey;
if (carUtility == 0 && ptUtility == 0) {
Expand All @@ -78,6 +81,8 @@ public CommuteModeChoiceMapping assignCommuteModeChoice(Location from, TravelTim
}
while (personByProbability.containsKey(probabilityAsKey)) {
//more than one hh member has exactly the same probability, so it would be replaced in the treemap
// (forcing the carMinutes to (int) much increases the risk that this happens!! kai, apr'26)
// (random.nextDouble() is quite large to alleviate this problem. kai, apr'26)
probabilityAsKey += random.nextDouble();
}
personByProbability.put(probabilityAsKey, pp);
Expand All @@ -87,17 +92,18 @@ public CommuteModeChoiceMapping assignCommuteModeChoice(Location from, TravelTim

int counter = (int) household.getVehicles().stream().filter(vv -> vv.getType().equals(VehicleType.CAR)).count();

// The following goes through the hh members in decreasing proba, and assigns car with the logit proba as long as cars are available in the HH:
for (Map.Entry<Double, Person> personForProbability : personByProbability.descendingMap().entrySet()) {
Person person = personForProbability.getValue();
CommuteModeChoiceMapping.CommuteMode commuteMode;
if (counter == 0) {
commuteMode = new CommuteModeChoiceMapping.CommuteMode(TransportMode.pt, commuteModesByPerson.get(person.getId()).get(TransportMode.pt));
commuteMode = new CommuteModeChoiceMapping.CommuteMode( pt, commuteModesByPerson.get(person.getId() ).get( pt ));
} else {
if (random.nextDouble() < personForProbability.getKey()) {
commuteMode = new CommuteModeChoiceMapping.CommuteMode(TransportMode.car, commuteModesByPerson.get(person.getId()).get(TransportMode.car));
commuteMode = new CommuteModeChoiceMapping.CommuteMode( car, commuteModesByPerson.get(person.getId() ).get( car ));
counter--;
} else {
commuteMode = new CommuteModeChoiceMapping.CommuteMode(TransportMode.pt, commuteModesByPerson.get(person.getId()).get(TransportMode.pt));
commuteMode = new CommuteModeChoiceMapping.CommuteMode( pt, commuteModesByPerson.get(person.getId() ).get( pt ));
}
}
commuteModeChoiceMapping.assignMode(commuteMode, person);
Expand All @@ -122,18 +128,18 @@ public CommuteModeChoiceMapping assignRegionalCommuteModeChoice(Region region, T
Zone jobZone = geoData.getZones().get(job.getZoneId());


int ptMinutes = (int) travelTimes.getTravelTimeFromRegion(region, jobZone, job.getStartTimeInSeconds().orElse((int) properties.transportModel.peakHour_s), TransportMode.pt);
double ptUtility = commutingTimeProbability.getCommutingTimeProbability(ptMinutes, TransportMode.pt);
int ptMinutes = (int) travelTimes.getTravelTimeFromRegion(region, jobZone, job.getStartTimeInSeconds().orElse((int) properties.transportModel.peakHour_s), pt);
double ptUtility = commutingTimeProbability.getCommutingTimeProbability(ptMinutes, pt);

if (!pp.hasDriverLicense() || (int) household.getVehicles().stream().filter(vv -> vv.getType().equals(VehicleType.CAR)).count() == 0) {
CommuteModeChoiceMapping.CommuteMode ptCommuteMode = new CommuteModeChoiceMapping.CommuteMode(TransportMode.pt, ptUtility);
CommuteModeChoiceMapping.CommuteMode ptCommuteMode = new CommuteModeChoiceMapping.CommuteMode( pt, ptUtility);
commuteModeChoiceMapping.assignMode(ptCommuteMode, pp);
} else {
int carMinutes = (int) travelTimes.getTravelTimeFromRegion(region, jobZone, job.getStartTimeInSeconds().orElse((int) properties.transportModel.peakHour_s), TransportMode.car);
double carUtility = commutingTimeProbability.getCommutingTimeProbability(carMinutes, TransportMode.car);
int carMinutes = (int) travelTimes.getTravelTimeFromRegion(region, jobZone, job.getStartTimeInSeconds().orElse((int) properties.transportModel.peakHour_s), car);
double carUtility = commutingTimeProbability.getCommutingTimeProbability(carMinutes, car);
Map<String, Double> utilityByMode = new LinkedHashMap<>();
utilityByMode.put(TransportMode.car, carUtility);
utilityByMode.put(TransportMode.pt, ptUtility);
utilityByMode.put( car, carUtility );
utilityByMode.put( pt, ptUtility );
commuteModesByPerson.put(pp.getId(), utilityByMode);
double probabilityAsKey;
if (carUtility == 0 && ptUtility == 0) {
Expand All @@ -156,13 +162,13 @@ public CommuteModeChoiceMapping assignRegionalCommuteModeChoice(Region region, T
Person person = personForProbability.getValue();
CommuteModeChoiceMapping.CommuteMode commuteMode;
if (counter == 0) {
commuteMode = new CommuteModeChoiceMapping.CommuteMode(TransportMode.pt, commuteModesByPerson.get(person.getId()).get(TransportMode.pt));
commuteMode = new CommuteModeChoiceMapping.CommuteMode( pt, commuteModesByPerson.get(person.getId() ).get( pt ));
} else {
if (random.nextDouble() < personForProbability.getKey()) {
commuteMode = new CommuteModeChoiceMapping.CommuteMode(TransportMode.car, commuteModesByPerson.get(person.getId()).get(TransportMode.car));
commuteMode = new CommuteModeChoiceMapping.CommuteMode( car, commuteModesByPerson.get(person.getId() ).get( car ));
counter--;
} else {
commuteMode = new CommuteModeChoiceMapping.CommuteMode(TransportMode.pt, commuteModesByPerson.get(person.getId()).get(TransportMode.pt));
commuteMode = new CommuteModeChoiceMapping.CommuteMode( pt, commuteModesByPerson.get(person.getId() ).get( pt ));
}
}
commuteModeChoiceMapping.assignMode(commuteMode, person);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,10 @@
import de.tum.bgu.msm.models.ModelUpdateListener;

public interface CommutingTimeProbability extends ModelUpdateListener {
/**
* @param minutes
* @param mode
* @return Presumably, this returns a (non-normalized) weight and not a (normalized) probability.
*/
float getCommutingTimeProbability(int minutes, String mode);
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import de.tum.bgu.msm.events.impls.realEstate.DemolitionEvent;
import de.tum.bgu.msm.models.AbstractModel;
import de.tum.bgu.msm.models.relocation.migration.InOutMigration;
import de.tum.bgu.msm.models.relocation.moves.MovesModel;
import de.tum.bgu.msm.models.relocation.moves.MovesModelImpl;
import de.tum.bgu.msm.properties.Properties;
import de.tum.bgu.msm.utils.SiloUtil;
Expand All @@ -28,14 +29,14 @@ public class DemolitionModelImpl extends AbstractModel implements DemolitionMode

private final static Logger logger = LogManager.getLogger(DemolitionModelImpl.class);

private final MovesModelImpl moves;
private final MovesModel moves;
private final InOutMigration inOutMigration;
private final DemolitionStrategy strategy;

private int currentYear = -1;
private int forcedOutmigrationByDemolition;

public DemolitionModelImpl(DataContainer dataContainer, MovesModelImpl moves,
public DemolitionModelImpl(DataContainer dataContainer, MovesModel moves,
InOutMigration inOutMigration, Properties properties,
DemolitionStrategy strategy, Random rnd) {
super(dataContainer, properties, rnd);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,10 @@

import static de.tum.bgu.msm.data.dwelling.RealEstateUtils.RENT_CATEGORIES;

public class SimpleCommuteModeChoiceHousingStrategyImpl implements HousingStrategy {
public class SimpleCommuteModeChoiceHousingStrategyImpl implements HousingStrategy<Dwelling> {
// this used to be without <Dwelling>. Which, in consequence, violated the generics contract. The only place where this is
// used is isHouseholdEligibleToLiveHere(Household household, Dwelling dd) below, which means that the present implementation
// used the hardcoded "Dwelling" type. So we can as well specify it. kai, jun'26

private final static Logger logger = LogManager.getLogger(SimpleCommuteModeChoiceHousingStrategyImpl.class);

Expand Down
2 changes: 2 additions & 0 deletions useCases/fabiland/src/main/java/run/DataBuilderFabiland.java
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,11 @@ public static DataContainer buildDataContainer(Properties properties, Config con
}

CommutingTimeProbability commutingTimeProbability = new OnTheFlyCommutingTimeProbability();
// (This returns Math.exp(beta * minutes)).

//TODO: revise this!
new JobType(properties.jobData.jobTypes);
// (this is indeed quite odd ... uses a constructor to initialize some static variables.)

RealEstateDataManager realEstateManager = new RealEstateDataManagerImpl(
new SandboxDwellingTypes(),
Expand Down
Loading
Loading