Anylogic - Measuring time through multiple layers of a model - anylogic

I'm simulating a train system and want to measure the time a passenger spends from entering the system to boarding. Entering the system happens on a higher, boarding on a lower level of the model. The problem is that the TimeMeasureEnd block doesn't see the TimeMeasureStart blocks on a different level. Does anyone have experience with this problem or an idea for a solution?
Edit:
I call set_startObjects(TimeMeasureStart[]) in an event occuring once at the creation of the agent in the lower level and set either the start blocks of the one or the other parent, depending on what the parent is. The data is being collected in all child agents separately and displayed in separate histograms in each child agent. How can I accumulate all of them in one single histogram to display in main which is two layers above the child agent where the data is being collected?

you can always define the 'TimeMeasureStart' block dynamically in your 'TimeMeasureEnd' block. Just switch the entry mode for defining it to "static value" as below:
Now you can call on any 'TimeMeasureStart' object anywhere in the model, similar to below where it sits in 'Main':

Related

agent cannot be resolved to a variable when timing segments of AnyLogic model

In the model, I need to time segments in which some agents go through, but not all, rendering the use of timeMeasureStart and End blocks ineffective as any agents who go through a certain End block MUST go through it's corresponding Start block, but not all agents that will encounter the End block will have gone through it's corresponding Start block.
I have done the following and receive the error that 'agent cannot be resolved to a variable' in the Histogram
Defined the variables startTime endTime cycleTime in the agent class Patient which is being pushed through the model.
Put agent.cycleTime=agent.endTime-agent.startTime; in the On enter slot of the block in which I want the timing to end.
Defined a Histogram Data called myDataSet with the Value agent.cycleTime in Main
Made a histogram in Main which takes myDataSet in it's Histogram slot.
First, you can still use TimeMeasureStart/end blocks. Just let some agents bypass them with a SelectOutput block upstream of the TimeMeasureStart block. The condition would be determined by who should be measured.
Ok, then to your details:
Put agent.cycleTime=agent.endTime-agent.startTime; in the On enter slot of the block in which I want the timing to end.
This is not how you would measure time. The variables are a good start, though. Do this instead:
Wherever timing should start, you write agent.startTime = time() (logs curr model time)
Wherever timing should end, you write agent.cycleTime = time() - agent.startTime, essentially measuring how much time has passed since the start.
Now you do what you want with agent.cycletime
Defined a Histogram Data called myDataSet with the Value agent.cycleTime in Main
this is not how you use Histogram Data. You need to use the API calls on it properly, for example myHistogramData.add(someValue):
Also, always check example models and the help, many issues can be solved by checking those first :)

How can I create a finite calling population model?

I am trying to simulate a finite calling population model in AnyLogic. My population consists of 10 agents and I want them to come back to the Source node after they have been served.
I thought about making conditioning with the SelectOutput node but the Source node does not have any input. The best thing that I came up with is to just limit the number of customers arrivals to 10. However, in this case, the model stops running after 10 arrivals which is not an appropriate result.
What can I do to be able to simulate such a type of model in AnyLogic?
EDIT: I thought that making agents come back to the Source node could be a solution to building the finite calling population model. The main purpose of my question is to understand how can I build such type of model in AnyLogic. Here is the description of the concept of the model.
You cannot send them back to a Source element, as it only acts to create agents.
However, you can send them back to blocks that come after the source as below:
Here, all agents created by the Source block will infinitely loop through the Queue and Delay blocks.

Is there a way to record when (and how often) Transporters get within a certain distance of each other?

I have an AnyLogic simulation model using trucks and forklifts as agents (Transporter type), and among other things would like to identify each time one of them becomes within a certain distance of another one (example within 5 meters). I will record this count as a variable within the main space of the model. I am using path-guided navigation.
I have seen a method "agentsInRange" which will probably be able to do the trick, but am not sure where to call this from. I assume I should be able to use the AL functionality of "Min distance to obstacle" (TransporterFleet) and "Collision detection timeout" (TransporterControl)?
Thanks in advance!
Since there don't seem to be pre-built functions for this, afaik, the easiest way is to:
add an int variable to your transporter agent type counter
add an event to your transporter type checkCollision that triggers every second or so
in the event, loop across the entire population of transporters and count the number that are closer than X meters (use distanceTo(otherTransporter) and write your own custom code)
add that number to counter
Note that this might be very inefficient computationally as it is quite brute-force. But might be good enough :)

multiple step function for a single flow system

For Matlab simulink, how does one go about generating multiple step function at different conditions for a system
I am trying to simulate a simple flow through a tank and controlling the temperature within. At various interval say time at 10ses and 20secs i intend to draw out different flowrate/flow amount of water.
With the system designed, how do I show on a single scope how Flow in changes with the different amount of flow out drawn.
Appreciate any kind advises
There are many different ways of doing this, for example defining the data in MATLAB and using a From Workspace block or using multiple Step blocks summed together appropriately. But to start I'd suggest you look at the Signal Builder block.
To view multiple signals at once in the same Scope, either set the scope up to have multiple inports, or Mux the signals together and feed them in in the usual way.

Set NetLogo Display rate Constant

I have a NetLogo model where the number of agents changes/reduces with time. I notice the model runs faster as the agents are less(ticks increment quickly).
How can keep it constant, probably set to upperlimit.
There are two ways of doing that. One is to lower the speed using the speed slider at the top of model view. This essentially sets an upper limit.
Another, programmatic, way is to use the every (click for link) keyword. That gives you more exact control over how your model executes, but keep in mind there is a CPU overhead using that.