Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Using vehicles from vehicles data #361

Open
ZhiweiUSF opened this issue Jun 22, 2020 · 1 comment
Open

Using vehicles from vehicles data #361

ZhiweiUSF opened this issue Jun 22, 2020 · 1 comment

Comments

@ZhiweiUSF
Copy link

Hi all,

Following the example config-with-all-vehicles-from-file.xml in https://github.com/matsim-org/matsim-code-examples/tree/12.x/scenarios/equil-mixedTraffic, I was trying to figure out how to create a vehicle fleet for the simulation. Yet, I ran into an exception when running the model using this configuration file (see below for the exception below). It seems that coding is needed to reach what I want to do. Is there a way to do this by adding another input xml file? Did anyone know how I should address this issue? Also, I am wondering why we need to assign a vehicle for each mode for each person? What if some people that do not have cars?

Exception in thread "main" java.lang.RuntimeException: Could not retrieve vehicle id from person: 1 for mode: car.
If you are not using config.qsim().getVehicleSource() with 'defaultVehicle' or 'modeVehicleTypesFromVehiclesData' you have to provide a vehicle for each mode for each person. Attach a map of mode:String -> id:Id with key 'vehicles' as person attribute to each person.
VehicleUtils.insertVehicleIdIntoAttributes does this for you.
at org.matsim.vehicles.VehicleUtils.getVehicleId(VehicleUtils.java:143)
at org.matsim.core.mobsim.qsim.agents.PopulationAgentSource.insertVehicles(PopulationAgentSource.java:95)
at org.matsim.core.mobsim.qsim.agents.PopulationAgentSource.insertAgentsIntoMobsim(PopulationAgentSource.java:72)
at org.matsim.core.mobsim.qsim.QSim.createAgents(QSim.java:306)
at org.matsim.core.mobsim.qsim.QSim.prepareSim(QSim.java:291)
at org.matsim.core.mobsim.qsim.QSim.run(QSim.java:250)
at org.matsim.core.controler.NewControler.runMobSim(NewControler.java:124)
at org.matsim.core.controler.AbstractController$8.run(AbstractController.java:198)
at org.matsim.core.controler.AbstractController.iterationStep(AbstractController.java:230)
at org.matsim.core.controler.AbstractController.mobsim(AbstractController.java:194)
at org.matsim.core.controler.AbstractController.iteration(AbstractController.java:145)
at org.matsim.core.controler.AbstractController.doIterations(AbstractController.java:113)
at org.matsim.core.controler.AbstractController$1.run(AbstractController.java:80)
at org.matsim.core.controler.MatsimRuntimeModifications.run(MatsimRuntimeModifications.java:69)
at org.matsim.core.controler.MatsimRuntimeModifications.run(MatsimRuntimeModifications.java:52)
at org.matsim.core.controler.AbstractController.run(AbstractController.java:88)
at org.matsim.core.controler.NewControler.run(NewControler.java:82)
at org.matsim.core.controler.Controler.run(Controler.java:249)
at org.matsim.run.Controler.run(Controler.java:54)
at org.matsim.run.Controler.main(Controler.java:58)

@Janekdererste
Copy link
Member

If you want to use vehicles from a vehicles file you actually have to assign those vehicles to agents. This can only be done in code.

// iterate over all persons
for (Person person : scenario.getPopulation().getPersons().values()) {

    // retreive vehicleIds which were previously read in from vehicles.xml. -- insert your own logic here
    var carFromFile= scenario.getVehicles().getVehicleTypes().get(Id.create("some-car-id", VehicleType.class));
    var bikeFromFile= scenario.getVehicles().getVehicleTypes().get(Id.create("some-bike-id", VehicleType.class));

    // link vehicles to different modes
    var modeToVehicle = Map.of("car", carFromFile, "bike", bikeFromFile);

    // assign vehicles to agent
    VehicleUtils.insertVehicleIdsIntoAttributes(person, modeToVehicle);
}

If you simply define whicle types for certain modes, the start up logic will assign a vehicle to each agent for each mode.

Persons only need vehicles for modes they are allowed to choose. So, if you have agents who can't drive a car, you don't have to assign one. Though I do know that this is possible I have never used this feature and therefore don't know how to achieve this.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants