{"data":{"markdownRemark":{"html":"<h2 id=\"connecting-groups-of-agents\"><a href=\"#connecting-groups-of-agents\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Connecting Groups of Agents</h2>\n<p>Agents within models can be arranged in groups where each group of agents represents a larger entity, such as a pool of investors. These groups can be connected together by creating links between agents that span the groups. When two groups are being connected together, one group is considered the \"source\", while the other is the \"target\". When two groups are connected together, the usual layout of those connections is to link every agent in the source group with every agent in the target group.</p>\n<p>If the number of agents in the source group is represented by <em>M</em>, and the number of agents in the target group is represented by <em>N</em>, it takes <em>M x N</em> links to connect the two groups completely. This works well for small models, where there are less than one million agents in total, but the number of connections can skyrocket as the number of agents increases. The large number of connections can cause major slowdowns in model execution.</p>\n<h2 id=\"creating-a-coordinator-group\"><a href=\"#creating-a-coordinator-group\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Creating a Coordinator Group</h2>\n<p>It is possible to dramatically reduce the number of links between the source and target groups. This reduction can be accomplished with a third group of agents called a coordinator group. The agents in a coordinator group are dedicated to transferring messages between the source and target groups. They are able to reduce the number of links because they often have the ability to aggregate messages together.</p>\n<p>The size of the coordinators group should be a logarithmic expression related to the number of agents in the source and target groups. Simudyne recommends using <em>log(M x N)</em> for the number of agents in the coordinators group. This is a good balance between keeping the number of links low and preventing a bottleneck in the coordinators.</p>\n<p>If <em>P</em> represents the size of the coordinators group, the number of agents in the source group is represented by <em>M</em>, and the number of agents in the target group is represented by <em>N</em>, the total number of links needed to link the source and target groups is equal to <em>P x (M + N)</em>.</p>\n<p>Coordinator groups can reduce the number of links a model must maintain by more than 99%.</p>\n<h2 id=\"adding-coordinators-to-an-existing-model\"><a href=\"#adding-coordinators-to-an-existing-model\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Adding Coordinators to an Existing Model</h2>\n<p>Defining a model with two groups, and a specific number of agents in those groups, is simple with the Simudyne SDK. In this example, the source agents have a minimal class definition, while the target agents also contain a single function, so they have specific behavior. A coordinator message class handles messages sent between the source and target groups. At each model time step, each source agent sends a transfer message to all the target agents. Once a target agent receives a transfer message, that agent can then use its specific functionality to handle the message.</p>\n<p>The source and target groups are linked together using the 'fullyConnected' function, which connects every agent in the source group to every agent in the target group.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token comment\">// Agent-based model class with a source and target group.</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">CoordinatorPatternExample</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">AgentBasedModel</span><span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>GlobalState<span class=\"token punctuation\">></span></span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token comment\">// Number of agents for each group.</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">int</span> n <span class=\"token operator\">=</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">int</span> m <span class=\"token operator\">=</span> <span class=\"token number\">10000</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">setup</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n        <span class=\"token comment\">// Create the source and target groups.</span>\n        Group<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>SourceAgent<span class=\"token punctuation\">></span></span> sourceGroup <span class=\"token operator\">=</span> <span class=\"token function\">generateGroup</span><span class=\"token punctuation\">(</span>SourceAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        Group<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>TargetAgent<span class=\"token punctuation\">></span></span> targetGroup <span class=\"token operator\">=</span> <span class=\"token function\">generateGroup</span><span class=\"token punctuation\">(</span>TargetAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> m<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">// Create connections between the agents, then set everything up.</span>\n        sourceGroup<span class=\"token punctuation\">.</span><span class=\"token function\">fullyConnected</span><span class=\"token punctuation\">(</span>targetGroup<span class=\"token punctuation\">,</span> Links<span class=\"token punctuation\">.</span>CoordinatorLink<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">super</span><span class=\"token punctuation\">.</span><span class=\"token function\">setup</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">step</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">run</span><span class=\"token punctuation\">(</span>\n\n            <span class=\"token comment\">// Create the action that sends a message from the source agent.</span>\n            Action<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>SourceAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> sAgent <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n                sAgent<span class=\"token punctuation\">.</span><span class=\"token function\">getLinks</span><span class=\"token punctuation\">(</span>Links<span class=\"token punctuation\">.</span>CoordinatorLink<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span>Messages<span class=\"token punctuation\">.</span>CoordinatorMessage<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n\n            <span class=\"token comment\">// Create the action that receives a message from the source agent and does something with it.</span>\n            Action<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>TargetAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> tAgent <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n                List<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>CoordinatorMessage<span class=\"token punctuation\">></span></span> transfers <span class=\"token operator\">=</span> tAgent<span class=\"token punctuation\">.</span><span class=\"token function\">getMessagesOfType</span><span class=\"token punctuation\">(</span>Messages<span class=\"token punctuation\">.</span>CoordinatorMessage<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n                List<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Long<span class=\"token punctuation\">></span></span> sourceAgentIDs <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ArrayList</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                <span class=\"token keyword\">int</span> totalAmount <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\n                <span class=\"token keyword\">for</span><span class=\"token punctuation\">(</span>CoordinatorMessage message<span class=\"token operator\">:</span> transfers<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                    sourceAgentIDs<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span>message<span class=\"token punctuation\">.</span><span class=\"token function\">getSender</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                    totalAmount <span class=\"token operator\">+=</span> message<span class=\"token punctuation\">.</span><span class=\"token function\">getBody</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                <span class=\"token punctuation\">}</span>\n\n                tAgent<span class=\"token punctuation\">.</span><span class=\"token function\">doSomething</span><span class=\"token punctuation\">(</span>totalAmount<span class=\"token punctuation\">,</span> sourceAgentIDs<span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Source agent class.</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">SourceAgent</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Agent</span><span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>GlobalState<span class=\"token punctuation\">></span></span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Target agent class.</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">TargetAgent</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Agent</span><span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>GlobalState<span class=\"token punctuation\">></span></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">doSomething</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> totalAmount<span class=\"token punctuation\">,</span> List<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Long<span class=\"token punctuation\">></span></span> sourceAgentIDs<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Coordinator message class.</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">CoordinatorMessage</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Message<span class=\"token punctuation\">.</span>Integer</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span></code></pre></div>\n<p>Adding a coordinator group to the model requires the modeller to include a coordinator agent class. A type of message which will handle information about groups of source agents is also needed. This updated model creates a coordinator group in the <code class=\"language-text\">setup</code> function, and inserts an extra action in the <code class=\"language-text\">step</code> function to handle communcation with the coordinator group. The action used to send messages from source agents is the same, but the functionality of the target group is changed slightly. Since the target group now receives messages from the coordinator group, it uses the new type of message about groups of source agents, and counts the total number of agents differently.</p>\n<p>The source and coordinator groups are linked together using the 'partitionConnected' function, which aggregates many messages from source agents into a single coordinator agent. The coordinator and target groups are linked together using the 'fullyConnected' function, which connects every agent in the coordinator group to every agent in the target group.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">import</span> java<span class=\"token punctuation\">.</span>util<span class=\"token punctuation\">.</span>ArrayList<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> java<span class=\"token punctuation\">.</span>util<span class=\"token punctuation\">.</span>List<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Agent-based model class with a source group, target group, and coordinator group.</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">CoordinatorPatternExample</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">AgentBasedModel</span><span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>GlobalState<span class=\"token punctuation\">></span></span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token comment\">// Number of agents for each group.</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">int</span> n <span class=\"token operator\">=</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">int</span> m <span class=\"token operator\">=</span> <span class=\"token number\">10000</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">int</span> p <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>n <span class=\"token operator\">*</span> m<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">setup</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n        <span class=\"token comment\">// Create the source and target groups.</span>\n        Group<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>SourceAgent<span class=\"token punctuation\">></span></span> sourceGroup <span class=\"token operator\">=</span> <span class=\"token function\">generateGroup</span><span class=\"token punctuation\">(</span>SourceAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        Group<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>TargetAgent<span class=\"token punctuation\">></span></span> targetGroup <span class=\"token operator\">=</span> <span class=\"token function\">generateGroup</span><span class=\"token punctuation\">(</span>TargetAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> m<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">// Create the coordinator group and connect it to the source and target groups.</span>\n        Group<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Coordinator<span class=\"token punctuation\">></span></span> coordinatorGroup <span class=\"token operator\">=</span> <span class=\"token function\">generateGroup</span><span class=\"token punctuation\">(</span>Coordinator<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> p<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        sourceGroup<span class=\"token punctuation\">.</span><span class=\"token function\">partitionConnected</span><span class=\"token punctuation\">(</span>coordinatorGroup<span class=\"token punctuation\">,</span> Links<span class=\"token punctuation\">.</span>CoordinatorLink<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        coordinatorGroup<span class=\"token punctuation\">.</span><span class=\"token function\">fullyConnected</span><span class=\"token punctuation\">(</span>targetGroup<span class=\"token punctuation\">,</span> Links<span class=\"token punctuation\">.</span>CoordinatorLink<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">// Set everything up.</span>\n        <span class=\"token keyword\">super</span><span class=\"token punctuation\">.</span><span class=\"token function\">setup</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">step</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">run</span><span class=\"token punctuation\">(</span>\n\n            <span class=\"token comment\">// Create the action that sends a message from the source agent.</span>\n            Action<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>SourceAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> sAgent <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n                sAgent<span class=\"token punctuation\">.</span><span class=\"token function\">getLinks</span><span class=\"token punctuation\">(</span>Links<span class=\"token punctuation\">.</span>CoordinatorLink<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span>Messages<span class=\"token punctuation\">.</span>CoordinatorMessage<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n\n            <span class=\"token comment\">// Create the action that aggregates messages from source agents into a coordinator agent.</span>\n            Action<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>Coordinator<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> coordinator <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n                List<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>AggregatedTransferMessage<span class=\"token punctuation\">></span></span> transfers <span class=\"token operator\">=</span>\n                    coordinator<span class=\"token punctuation\">.</span><span class=\"token function\">getMessagesOfType</span><span class=\"token punctuation\">(</span>AggregatedTransferMessage<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n                List<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Long<span class=\"token punctuation\">></span></span> sourceAgentIDs <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ArrayList</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                <span class=\"token keyword\">int</span> totalAmount <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\n                <span class=\"token keyword\">for</span><span class=\"token punctuation\">(</span>AggregatedTransferMessage message<span class=\"token operator\">:</span> transfers<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                    sourceAgentIDs<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span>message<span class=\"token punctuation\">.</span><span class=\"token function\">getSender</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                    totalAmount <span class=\"token operator\">+=</span> message<span class=\"token punctuation\">.</span>amount<span class=\"token punctuation\">;</span>\n                <span class=\"token punctuation\">}</span>\n\n                <span class=\"token keyword\">int</span> finalTotalAmount <span class=\"token operator\">=</span> totalAmount<span class=\"token punctuation\">;</span>\n                coordinator<span class=\"token punctuation\">.</span><span class=\"token function\">getLinks</span><span class=\"token punctuation\">(</span>Links<span class=\"token punctuation\">.</span>CoordinatorLink<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span>\n                    AggregatedTransferMessage<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span>\n                    message <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n                        message<span class=\"token punctuation\">.</span>amount <span class=\"token operator\">=</span> finalTotalAmount<span class=\"token punctuation\">;</span>\n                        message<span class=\"token punctuation\">.</span>sourceAgents <span class=\"token operator\">=</span> sourceAgentIDs<span class=\"token punctuation\">;</span>\n                    <span class=\"token punctuation\">}</span>\n                <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n\n            <span class=\"token comment\">// Create the action that receives a message from the coordinator agent and does something with it.</span>\n            Action<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>TargetAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> tAgent <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n                List<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>AggregatedTransferMessage<span class=\"token punctuation\">></span></span> aggregatedTransfers <span class=\"token operator\">=</span>\n                    tAgent<span class=\"token punctuation\">.</span><span class=\"token function\">getMessagesOfType</span><span class=\"token punctuation\">(</span>AggregatedTransferMessage<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n                List<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Long<span class=\"token punctuation\">></span></span> sourceAgentIDs <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ArrayList</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                <span class=\"token keyword\">int</span> totalAmount <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\n                <span class=\"token keyword\">for</span><span class=\"token punctuation\">(</span>AggregatedTransferMessage message<span class=\"token operator\">:</span> aggregatedTransfers<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                    sourceAgentIDs<span class=\"token punctuation\">.</span><span class=\"token function\">addAll</span><span class=\"token punctuation\">(</span>message<span class=\"token punctuation\">.</span>sourceAgents<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                    totalAmount <span class=\"token operator\">+=</span> message<span class=\"token punctuation\">.</span>amount<span class=\"token punctuation\">;</span>\n                <span class=\"token punctuation\">}</span>\n\n                tAgent<span class=\"token punctuation\">.</span><span class=\"token function\">doSomething</span><span class=\"token punctuation\">(</span>totalAmount<span class=\"token punctuation\">,</span> sourceAgentIDs<span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Source agent class.</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">SourceAgent</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Agent</span><span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>GlobalState<span class=\"token punctuation\">></span></span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Target agent class.</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">TargetAgent</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Agent</span><span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>GlobalState<span class=\"token punctuation\">></span></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">doSomething</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> totalAmount<span class=\"token punctuation\">,</span> List<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Long<span class=\"token punctuation\">></span></span> sourceAgentIDs<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Coordinator agent class.</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">Coordinator</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Agent</span><span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>GlobalState<span class=\"token punctuation\">></span></span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Coordinator message class.</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">CoordinatorMessage</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Message<span class=\"token punctuation\">.</span>Integer</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Coordinator aggregated message class.</span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">AggregatedTransferMessage</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Message</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">int</span> amount<span class=\"token punctuation\">;</span>\n    List<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Long<span class=\"token punctuation\">></span></span> sourceAgentIDs<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>","headings":[{"value":"Connecting Groups of Agents","depth":2},{"value":"Creating a Coordinator Group","depth":2},{"value":"Adding Coordinators to an Existing Model","depth":2}],"frontmatter":{"title":"Coordinator Pattern","toc":true,"experimental":null}},"site":{"siteMetadata":{"title":"Simudyne Docs","latestVersion":"2.6"}}},"pageContext":{"absolutePath":"/home/vsts/work/1/s/content/2.3/docs/practices/coordinator-pattern.md","versioned":true,"version":"2.3","kind":"docs","pagePath":"/practices/coordinator-pattern","chronology":{"prev":{"name":"Iterative Model Building","path":"/practices/iterative-model-building"},"next":{"name":"Repeatable Models","path":"/practices/repeatable-models"}},"lastUpdated":"2026-04-21T13:56:54.840Z"}}