1   package org.opentrafficsim.road.gtu.lane.perception.mental;
2   
3   import org.opentrafficsim.base.parameters.ParameterException;
4   import org.opentrafficsim.base.parameters.Parameters;
5   import org.opentrafficsim.core.gtu.GTUException;
6   import org.opentrafficsim.road.gtu.lane.LaneBasedGTU;
7   import org.opentrafficsim.road.gtu.lane.perception.LanePerception;
8   
9   import nl.tudelft.simulation.dsol.simulators.SimulatorInterface;
10  
11  
12  
13  
14  public class ExponentialTask extends AbstractTask
15  {
16      
17      private final double initialTaskDemand;
18  
19      
20      private final double additionalTaskDemand;
21  
22      
23      private final double tau;
24  
25      
26      private final double start;
27  
28      
29  
30  
31  
32  
33  
34  
35  
36      public ExponentialTask(final String id, final double initialTaskDemand, final double finalTaskDemand, final double tau,
37              final SimulatorInterface.TimeDoubleUnit simulator)
38      {
39          super(id);
40          this.initialTaskDemand = initialTaskDemand;
41          this.additionalTaskDemand = finalTaskDemand - initialTaskDemand;
42          this.tau = tau;
43          this.start = simulator.getSimulatorTime().si;
44      }
45  
46      
47      @Override
48      public double calculateTaskDemand(final LanePerception perception, final LaneBasedGTU gtu, final Parameters parameters)
49              throws ParameterException, GTUException
50      {
51          double t = gtu.getSimulator().getSimulatorTime().si - this.start;
52          return this.initialTaskDemand + this.additionalTaskDemand * (1.0 - Math.exp(-t / this.tau));
53      }
54  
55  }