Skip to content

Commit

Permalink
add person money event for stuck agents, in order to punish them and …
Browse files Browse the repository at this point in the history
…find better plans
  • Loading branch information
GregorRyb committed Jul 11, 2023
1 parent 9b503b7 commit 5b950a6
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 4 deletions.
70 changes: 70 additions & 0 deletions src/main/java/org/matsim/analysis/StuckEventHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package org.matsim.analysis;

import org.matsim.api.core.v01.Coord;
import org.matsim.api.core.v01.Id;
import org.matsim.api.core.v01.events.PersonStuckEvent;
import org.matsim.api.core.v01.events.handler.PersonStuckEventHandler;
import org.matsim.api.core.v01.network.Link;
import org.matsim.api.core.v01.network.Network;
import org.matsim.api.core.v01.population.Person;
import org.matsim.core.api.experimental.events.EventsManager;
import org.matsim.core.events.EventsUtils;
import org.matsim.core.events.MatsimEventsReader;
import org.matsim.core.network.NetworkUtils;
import org.matsim.core.utils.io.IOUtils;

import java.io.BufferedWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class StuckEventHandler implements PersonStuckEventHandler {

private final List<StuckEventsData> stuckEventsData;

public StuckEventHandler(List<StuckEventsData> stuckEventsData) {
this.stuckEventsData = stuckEventsData;
}

public static void main (String args []) throws IOException {

EventsManager manager = EventsUtils.createEventsManager();
List<StuckEventsData> listOfStuckEvents = new ArrayList<>();
manager.addHandler(new StuckEventHandler(listOfStuckEvents));
manager.initProcessing();
MatsimEventsReader matsimEventsReader = new MatsimEventsReader(manager);
matsimEventsReader.readFile("/Users/gregorr/Desktop/Test/TryToWriteAPaper/KlimaTaler/KlimaTaler1000/KlimaTaler1000.output_events.xml.gz");
manager.finishProcessing();
writeResults("/Users/gregorr/Desktop/Test/TryToWriteAPaper/KlimaTaler/KlimaTaler1000/", listOfStuckEvents);
}


@Override
public void handleEvent(PersonStuckEvent personStuckEvent) {
StuckEventsData stuckEvent = new StuckEventsData(personStuckEvent.getPersonId(), personStuckEvent.getLinkId());
stuckEventsData.add(stuckEvent);
}

@Override
public void reset(int iteration) {
PersonStuckEventHandler.super.reset(iteration);
}


record StuckEventsData (Id<Person> personId, Id<Link> linkId) {}


private static void writeResults(String output, List<StuckEventsData> stuckEventsData) throws IOException {
BufferedWriter writer = IOUtils.getBufferedWriter(output + "/stuckEvents.tsv");
writer.write("personId"+ "\t" +"linkId" );
writer.newLine();
for (int i = 0; i < stuckEventsData.size(); i++) {
StuckEventsData se = stuckEventsData.get(i);
writer.write(se.personId + "\t" + se.linkId);
writer.newLine();
}
writer.close();
System.out.println("Nr of stuck Agents: " + stuckEventsData.size());
}

}
22 changes: 20 additions & 2 deletions src/main/java/org/matsim/policies/MobilityBudgetEventHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,25 @@
import org.matsim.api.core.v01.TransportMode;
import org.matsim.api.core.v01.events.PersonDepartureEvent;
import org.matsim.api.core.v01.events.PersonMoneyEvent;
import org.matsim.api.core.v01.events.PersonStuckEvent;
import org.matsim.api.core.v01.events.handler.PersonDepartureEventHandler;
import org.matsim.api.core.v01.events.handler.PersonStuckEventHandler;
import org.matsim.api.core.v01.population.Person;
import org.matsim.core.controler.events.AfterMobsimEvent;
import org.matsim.core.controler.listener.AfterMobsimListener;
import org.matsim.core.utils.misc.Time;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MobilityBudgetEventHandler implements PersonDepartureEventHandler, AfterMobsimListener {
public class MobilityBudgetEventHandler implements PersonDepartureEventHandler, AfterMobsimListener, PersonStuckEventHandler {


private final Map<Id<Person>, Double> person2MobilityBudget;
private final Map<Id<Person>, Double> currentIterationMobilityBudget = new HashMap<>();
private final List<Id<Person>> personWhoAreStuck= new ArrayList<>();

public MobilityBudgetEventHandler(Map<Id<Person>, Double> personsEligibleForMobilityBudget2MoneyValue) {
this.person2MobilityBudget = personsEligibleForMobilityBudget2MoneyValue;
Expand All @@ -28,6 +33,7 @@ public MobilityBudgetEventHandler(Map<Id<Person>, Double> personsEligibleForMobi
public void reset(int iteration) {
currentIterationMobilityBudget.clear();
currentIterationMobilityBudget.putAll(person2MobilityBudget);
personWhoAreStuck.clear();
}

@Override
Expand All @@ -47,7 +53,19 @@ public void notifyAfterMobsim(AfterMobsimEvent event) {
Double mobilityBudget = idDoubleEntry.getValue();
event.getServices().getEvents().processEvent(new PersonMoneyEvent(Time.MIDNIGHT, person, mobilityBudget, "mobilityBudget", null));
totalSumMobilityBudget = totalSumMobilityBudget + mobilityBudget;
//}
}

for (Id<Person> personId: personWhoAreStuck) {
event.getServices().getEvents().processEvent(new PersonMoneyEvent(Time.MIDNIGHT, personId, 10000, "punishmentForBeingStuck", null));
}
}

/*
This is here to add an extra punishment to people who get stuck and benefit from getting the mob budget and thus obtaining a high score
*/
@Override
public void handleEvent(PersonStuckEvent personStuckEvent) {
personWhoAreStuck.add(personStuckEvent.getPersonId());

}
}
2 changes: 0 additions & 2 deletions src/main/java/org/matsim/run/RunBerlinWithMobBudget.java
Original file line number Diff line number Diff line change
Expand Up @@ -86,9 +86,7 @@ public static void main(String[] args) {
DistanceBasedMoneyReward klimaTaler = new DistanceBasedMoneyReward(controler.getScenario().getConfig().plansCalcRoute().getBeelineDistanceFactors().get(TransportMode.walk), controler.getScenario().getNetwork(), distanceBasedMoneyReward);
addKlimaTaler(controler, klimaTaler);
}

controler.run();

}


Expand Down

0 comments on commit 5b950a6

Please sign in to comment.