NullPointerException during Parameter Variation Experiment with agent statistics - anylogic

at the start of the experiment, I get the error message 'Error in the model during iteration 5 (numbers vary between 2, 3, and 5)' and it points to the agent-statistics Dataset from main that I try to add to a histogram dataset in my experiment. Is it possible that somewhere I try to collect agent statistics before the agents are initialized?
To be more precise about my setting: My root agent for the experiment is an agent called 'firms'. Within that agent, I have added the dataset 'DSUsers', which simply collects the agent statistics (item.inState(Firm....)) located in the main agent. The dataset DSUsers is what I try to add to the histogram dataset 'data' for the parameter variation experiment with the settings described below. (unfortunately, I can't add screenshots yet, I am too young a member...)
In the experiment, I use the following setup:
Before simulation run:
data.reset();
After simulation run:
data.add(root.DSUsers);
DSUsers being the dataset that I collect from the main agent-statistics. The top-level agent of my experiment is not the main agent (could that be a problem?).
So the process looks something like this:
Collecting agent statistics in main -> Using a dataset on the agent-level which collects the statistics from main and stores it -> importing this dataset to a histogram dataset in the experiment.
I get a large error message in the console, the first error pointing to
private double _DSPledgeUsers_YValue() {
return
get_Main().firms.NPledgeUsers()
;}

Found the problem-maker, however, I am not sure why it works:
Somehow the dataset I created in the agent caused all of the agents' states in the statechart to automatically update on every time step. This was a problem in my model because some states were supposed to update only occasionally. So I simply moved the dataset to main.
I do not want to speculate, but if you encounter the same problem, check the location of your datasets!

Related

How to communicate variables between agent populations in AnyLogic?

I have two populations of agents (only one of which I want to control) and I want to program one agent's actions based on the distance to the agents in the other population. I can get the location of each agent in their own population by using getX() and getY(). However, once these values are stored in a variable, they are not able to be communicated to a different population. Also, using distanceTo (agent other) does not seem to work for agents in a different population. Another issue I am having is how to call up location information for a specific agent (i.e., agent 1 in a population of X agents). When I print the agent names during a model simulation run, I see the agents listed as root.agent[0], etc., however, this syntax does not seem to work for calling up that specific agent when trying to code specific actions based on that agent (i.e., when this agent is so close, do something).
I tried storing locations using getX() and getY() into separate variables. Then using those variables to perform distance calculations. However, these variables, when stored in agent1 agent type, they cannot be communicated to agent2 agent type for variable use. I tried this for distanceTo() as well and got similar errors. I also try calling root.agents[0], root.agent[0] and agent[0] to use for distance calculations (both in and out of that agent's agent type) and get errors for "variable root not recognized" and "variable agent not recognized."
I understand this may be a beginning level programming question, but I cannot find literature on how to solve this problem in AnyLogic help sites online, nor have I been able to find a specific tutorial that works with this type of issue. Thank you for the help.

Parameters Variation not running model in AnyLogic

When I create a ParametersVariation simulation, the main model does not run. All I see is the default UI with iterations completed and replication. My end goal (as with most people) is to have a model go through a certain number of replications, but nothing is even running. There is limited documentation available on this. Please advise.
This is how Parameters Variation is intended to work. If you're running 1000 runs and multiple replications with parallel runs, how can you see what's happening in Main in each?
Typically, the best way to benefit from such an experiment is to track the results of each run using elements from the Analysis palette or even better to export results to Excel or similar.
To be able to collect data, you need to write your code in Java actions fields with root. to access elements in main (or top-level agent).
Check the example below, where after each run a variable from main is added to a dataset in the Parameters Variation experiment. At the end of 100 runs for example, the dataset will have 100 values of the main variable, with 1 value for each run.

Batching multiple agents based on location of agent

In my model I only want to batch agent which are at the same location. So my source block generates the agents according to a database to a specific node (which is sometimes different for agents), now I want the agents that occur at the same node to batch in sizes of 2 and the one that are left over need to be batched alone.
How can I model this, I know that I can use the selectoutput (which says for example if location=node1 use this output etc) option, but do I than have to add for example manually 100 outputs if I've 100 different locations where the agents start or is there a more simple solution for this problem?
Added later:
Or is there another way to model my idea:
So I'm simulating an hospital environment, where logistic employees (in this case the transporter) based on predefined times collects the thrash on certain areas for example the databaserow I show in the picture below:
At 9:50, the thrash at thrash collection point at LAB_Office_2_H_T_N can be collected by the logistic employee.
So in my model I create this 2 agents (which are 2 containers, last column) based on this time and seize a transporter to collect this thrash. Since a logistic employee is able to collect 2 thrash in one time I want to batch it and let the logistic employee collect 2 thrash containers at once.
After that he transports it to the thrash dump area and is released.
The colors changed after the added information. You can use pickup and dropoff blocks instead. You can define your node requirements in the condition cell. You can use local variables like container and agent to code whatever you want. Or use "Quantity (if available)" option. There you can programmatically define how many units will be picked up by using your own function.

access variables in "Main" from another agent (anylogic)

I have a model as shown below with two situations, I am running it for two situations.
In the first run (for situation1), I write traceln function as "traceln(productDemand)" in the "event-generateDemand" placed in "Main". At the end of simulation, I get the values in the first column below.
2)In the second run (for situation2), for once I write traceln function as "traceln(main.productDemand)" in the "event" placed in "Producer" agent.At the end of the second simulation, I get the values in the second column below.
Normally, these two values are always same , it expected that at the every simulation time they have to be same, but they are not same as shown in the Fig.1. what's the problem? Why the "productDemand" variable is different when we try to access from another agent at the same time?
I hope I was able to explain my problem.
Fig.1- The obtained results as table format
Fig.2- The screenshot of Event placed in Main
Fig.3- The screenshot of Event placed in Producer agent
Fig.4- The obtained results for both traceln functions on the running
Fig.5- Simulation experiment screenshot.
fig.1
fig.2
fig.3
fig.4
fig.5
There is no bug in the model it is just a simple case of timing. Not all events occur at exactly the same "time" although they all occur at the same timestep. One will always execute before the other.
See the simple example below:
I have eventA that increases the variable value and then traces the value (similar to your event on main)
Then I have another event that traces the variable as well, similar to yours in the agent.
Yet when I run the model at the same time the variable appears to be different from the different locations of tracing
If you click on the Events tab in the console you will see that event B is scheduled to run before event A
Even though both will run at the same timestep in the model they don't run "at the same time"
If you want to be in total control of what happens on a specific time step, it is advised to have one event that runs at the time interval you want, e.g daily, and have it sit on main and then call all the functions in the order you want them executed.
If you don't do this then AnyLogic will schedule the events as they get created, which most of the time is the order in which you placed them on the canvas.

How to combinate runs of two different agents with multiple runs each one

I need to create a methode (or similar) which reads the runs of two agents and combinate them into one run.
Each agent has data base which contains multible parameters and each paramter has multible values, a value for each parameter for each run.
so how can I let the project run all these different alternatives and get me the different outputs for the combinations?
Create a param-variation experiment and have 1 boolean parameter on Main "runFirstAgent". Setup your model to only load the first agent if runFirstAgent== true, otherwise let it run the second agent.
In the Param-variation experiment, setup the runs so it varies runFirstAgent accordingly.
Then, you can accumulate results from your runs in the experiment itself.
There are lots of example models that show you how to do it, check those out first ;-)