21 package tutorial.programming.simpleAdaptiveSignalEngine;
23 import java.io.IOException;
24 import java.io.Writer;
25 import java.util.ArrayList;
26 import java.util.LinkedList;
27 import java.util.List;
28 import java.util.Queue;
30 import javax.inject.Inject;
32 import org.apache.log4j.Logger;
64 class SimpleAdaptiveSignal
implements MobsimBeforeSimStepListener, MobsimInitializedListener, BasicEventHandler {
66 @Inject Scenario scenario;
68 private Queue<Double> vehicleExitTimesOnLink5 =
new LinkedList<>() ;
69 private long cnt4 = 0 ;
70 private long cnt5 = 0 ;
71 private OutputDirectoryHierarchy controlerIO;
74 private SignalizeableItem signalLink4;
75 private SignalizeableItem signalLink5;
83 private List<Result> results =
new ArrayList<>() ;
86 public SimpleAdaptiveSignal(OutputDirectoryHierarchy controlerIO) {
87 this.controlerIO = controlerIO ;
92 Netsim mobsim = (Netsim) e.getQueueSimulation() ;
93 signalLink4 = (SignalizeableItem) mobsim.getNetsimNetwork().getNetsimLink(Id.createLinkId(
"4")) ;
94 signalLink5 = (SignalizeableItem) mobsim.getNetsimNetwork().getNetsimLink(Id.createLinkId(
"5")) ;
95 signalLink4.setSignalized(
true);
96 signalLink5.setSignalized(
true);
101 double now = e.getSimulationTime();
104 final Double dpTime = this.vehicleExitTimesOnLink5.peek();
105 if ( dpTime !=null && dpTime < now ) {
106 signalLink4.setSignalStateAllTurningMoves(SignalGroupState.RED) ;
107 signalLink5.setSignalStateAllTurningMoves(SignalGroupState.GREEN) ;
109 signalLink4.setSignalStateAllTurningMoves(SignalGroupState.GREEN) ;
110 signalLink5.setSignalStateAllTurningMoves(SignalGroupState.RED) ;
125 public void handleEvent(Event event) {
126 switch (event.getEventType()){
129 case VehicleEntersTrafficEvent.EVENT_TYPE:
131 storeDesiredExitTimeAndCountVehiclesOnLink(((HasLinkId) event).getLinkId(), event.getTime() + 1.);
133 case LinkEnterEvent.EVENT_TYPE:
135 Link link5 = scenario.getNetwork().getLinks().get(Id.createLinkId(5));
136 double freespeedTt = link5.getLength() / link5.getFreespeed();
138 double matsimFreespeedTT = Math.floor(freespeedTt + 1);
139 storeDesiredExitTimeAndCountVehiclesOnLink(((HasLinkId) event).getLinkId(), event.getTime() + matsimFreespeedTT);
143 case LinkLeaveEvent.EVENT_TYPE:
144 case VehicleLeavesTrafficEvent.EVENT_TYPE:
145 if ( ((HasLinkId) event).getLinkId().equals(Id.create(
"5", Link.class)) ) {
146 this.vehicleExitTimesOnLink5.remove() ;
154 private void storeDesiredExitTimeAndCountVehiclesOnLink(Id<Link> linkId,
double desiredExitTime) {
155 if ( linkId.equals(Id.createLinkId(
"5")) ) {
157 this.vehicleExitTimesOnLink5.add( desiredExitTime ) ;
160 }
else if ( linkId.equals(Id.createLinkId(
"4")) ) {
168 public void reset(
int iteration) {
169 double sum = cnt4 + cnt5 ;
170 Logger.getLogger(this.getClass()).warn(
"iteration: " + iteration +
" cnt4: " + (cnt4/sum) +
" cnt5: " + (cnt5/sum) ) ;
172 Result result =
new Result() ;
173 result.iteration = iteration ;
174 result.shareUp = cnt5/sum ;
175 result.shareDown = cnt4/sum ;
176 results.add(result) ;
182 out = IOUtils.getBufferedWriter(controlerIO.getOutputFilename(
"split.txt")) ;
186 out.write( result.iteration +
"\t" + result.shareUp +
"\t" + result.shareDown +
"\n" ) ;
188 }
catch (IOException e) {
193 static public void main( String[] args ) {
194 RunSimpleAdaptiveSignalExample.main( args ) ;
void notifyMobsimInitialized(final MobsimInitializedEvent e)
void notifyMobsimBeforeSimStep(final MobsimBeforeSimStepEvent e)