Changing properties of source block for different states in a statechart - anylogic

I have a model in Main that looks like this:
The source block is set to uniform(4,8) hours in interarrival time.
When the statechart goes from "normalWeather" to "storm" I want source to stop injection
When the statechart goes from "storm" to "normalWeather" I want the interarrival times to come back to uniform(4,8) hours.
What is a suitable solution for this problem?

Set the source block to inject instead of interarrival time. Then add a transition of type timeout from normalWeather state to itself. Set the timeout as:
uniform(4,8)
And set the action as:
source.inject();
That way, as long as your agent is in the state normal weather, agent injections will occur at your desired rate.

Related

logic and actions to my transporters fleet in the flow chart in anylogic

Iam trying to build a model represented as shown but the main problem is how to put my hands on transporters and can do sequence logic on them while been loaded and unloaded along the path among my flowchart sequence.assign queue and delay blocks to my transporter type.
error while doing that.
First, i wanted to make a queue and delay before reaching loading point but when i ran the model i had an error as i tried to cast the delay and the queue to my transporter agent (forklift) and not the material item type(agent) , and when i tried to cast it to my agent (material item type) it didn't respond or see the delay or the queue and the transporter didn't stop.
After loading i want to make a second stop (delay) and queue of transporters out side it but , the model only see the delay and (loaded transporters) ran through the queue and stop in the delay block and i want to investigate the queue but the transports didn't stop in it.
Not quite clear what you need but it sounds like you want to explore preparation flow charts as part of Seize and Release actions, see https://anylogic.help/library-reference-guides/process-modeling-library/resourcetaskstart.html.
With these, you can make your resources (forklifts) follow some flow chart logic before they are actually being seized by your agents. This also works with transporters afaik

Temporary adjustment of delay time

I have the following problem which I am unable to solve:
I have a situation where a security point (added as delay) holds every half an hour a 15 min break. After the break, the security guards increase their speed till the queue is shorter than 10pp.
I wanted to model this as follows: a state chart with delay.set_capacity(0) after 30 minutes and delay.set_capacity(1) again after the 15 min break. For the increased speed after the break, I added an additional state with condition: queue.size()>10 and now I want to set the action such that the delay function changes the delay time from exponential (1/10) to exponential (1/5) as long as queue.size()>10.
Anyone experience with which function in the action box to use? Or would you suggest a different function?
Since you are using, or at least want to use a statechart I would suggest the following design, where you have composite states inside the working state to indicate if the security agent is working fast or normal and a message transition to let it move from one state to the next.
It is advised to use a message transition and trigger it as needed instead of a conditional state which gets chected for every change inside the agent since this can be a computational expensive exercise.
I assume you already implemented the correct capacity settings for the different on enter actions for working and breaking
Now you simply need to send the message every time an agent enters the queue and every time it exits the delay block, and of course, see the delay time based on the state of the statechart.
Aee screenshot below.

How to stop or suspend and restart “service delay" or the "delay" blocks from the agent based diagram?

By following your advice I’m constructing small models to learn how to use AnyLogic and build my simulation.
I need discrete events diagram interacting with agent based, where the agent based will represent a “service process” based in a previous recommendation it was straight forward to trigger the agent based activity, but I cannot stop or suspend or delay the “delay” block, I tryed to use the “until stopDelay is called” function but I could not make it work, I decided to test with and cyclic event inside the discrete event agent and but was not possible. I am considering that maybe my approach is not correct, and I need to use a different strategy to stop the discrete events process while the agent-based process is running, however since agent based is attempting to simulate some human behaviour, I’m interested in the time variations this could cause to the discrete events process. So my question is how to stop or suspend the “service delay or the delay blocks and restart them from the agent based diagram?
If you just need to store an entity somewhere until Agent process is done then I would recommend using using a 'wait' block instead of a 'delay'. The whole point of a delay is to have a timed exit so suspending it doesn't align with the intended use-case. You can read more about 'wait' block here.
I found the the Job Shop model example, some blocks using stopDelayForAll(), with a "if" code block, so I noticed that it was using a parameter, so I made some changes and the code I'm using and worked is this:
if ( Inqueue >= queCap )
delay.stopDelayForAll();
"Inqueue" is a variable capturing data from the delay block and queCap is a parameter telling the queue block capacity.

seizeTransporter Block out port stop working

I am modelling earthmoving operation. Every trench agent seize two transporters, one excavator, and one truck. When truck is released it will do some other job before been seized again by the same trench. So this process repeat until the trench will be empty.
The process is occuring for two three times without any problem but after two three times the trench agent is not go out of the seizeTransporter block (the one that seize truck). I have a delay block after the seizeTransporter block and it use Maximum Capacity. So it should not be a problem and it should not prevent the seizeTransporter block out port to push the trench out.
I noticed this is hapenning when the truck stop to resolve a collision. It looks like the collision cannot be resolved and the truck stay where it is for ever. :))
I have tried so many things that could solve this problem but none of them works.
There is an option in the material-handling library TransporterControl element to override transporter conflicts after some time. Maybe reduce the default timeout of 10 model time units, see below:

How to store agents in a block untill a tronsporter can move them?

I'm a new AnyLogic user so hopefully this is a simple problem. I would like to use a block as to represent a storage area for items to be used in an assembly, I am using the delay block with delay time of 0, but maybe the queue block would be more appropriate? I have set up a model in which every X number of seconds a "truck" arrives and if the delay block contains less than a specified capacity of elements, the inject function is called to refill the block. This sort of works, but is seems that the agents are flowing through the delay block's out port and thus do not count toward its capacity (that makes sense to me...) resulting in my source blocks continuing to create agents when the system isn't ready for them. My delay block is followed by a "move by transporter" block which seems to be getting all of the delay blocks outputs immediately. There are only two transporters in my model and I am not sure why more than two agents can be accepted by the transporter block at a time. I set my transporter fleet to have a capacity of 2 but that did not solve the problem.
Any advice would be helpful! Perhaps a different approach is needed. My goal is to have an essentially unlimited pool of parts at the inlet of the factory, but only create agents when the downstream processes are able to pull them in. Thanks in advance!
Welcome to SOF :)
Best use a "Wait" block here:
Let your trucks dump stuff into "Wait" whenever they arrive. Your downstream block can now pull them when they are ready using myWaitBlock.free(someAgent for as many agents as they want to pull from it.
Similarly, you can use a Delay with infinite capacity and set its type to "Until stopDelay() is called". Then similarly as the "Wait" block, you call myDelayBlock.stopDelay(someAgent) when you want.
Another option: Use a hold-block in front of a normal (infinite) queue and unblock it when ready: myHoldBlock.unBlock(numToLetThrough) --> probably the easiest
PS: Please also check how to ask good questions here on SOF, yours is very long, much easier to understand with some screenshots :) --> https://stackoverflow.com/help/how-to-ask