{"data":{"markdownRemark":{"html":"<h2 id=\"overview\"><a href=\"#overview\" 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>Overview</h2>\n<p>The Supply Chain Simulator is a sample model provided and developed by Simudyne for the purpose of demonstrating how a modeller might use the <a href=\":version/supply_chain_toolkit/supply_toolkit_overview\">Supply Chain Toolkit</a> to develop a simulation of a supply chain. </p>\n<p>The following docs will be broken up into the below sections:</p>\n<ol>\n<li>Introduction to Model Concepts</li>\n<li>Model Components</li>\n<li>Scenario &#x26; Strategy Analysis</li>\n<li>Custom Dashboard</li>\n</ol>\n<p>Each section will reference the code available at the link below. Be aware that some environments might require installing Java and Python libraries to run the model, and the custom dashboard included in the package.</p>\n<a href=\"https://simudynecontent.blob.core.windows.net/$web/2.6.0-RC4/supply_simulator_2.6.0-RC4.zip\" class=\"ui button primary\" download>\n\tDownload Model Files\n</a>\n<h2 id=\"introduction-to-model-concepts\"><a href=\"#introduction-to-model-concepts\" 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>Introduction to Model Concepts</h2>\n<p>The supply chain model is an example of a pull system built with the <a href=\":version/supply_chain_toolkit/supply_toolkit_overview\">Supply Chain Toolkit</a> released in version 2.6. The purpose of this model is to demonstrate how a supply chain network model that contains customers, warehouses, and production facilities.</p>\n<p>This sample model contains many of the necessary components, communication loops, and mechanisms that would be found in a larger production-like system.</p>\n<p>An agent-based framework of this type provides the user with the means to explore a wide range of problems and optimizations to a supply chain network, such as facility placement, alternative transport mechanisms, fulfillment strategy design, inventory placement, automation, etc.</p>\n<p>In this particular model, the structure is initialized by ingesting some dummy data that includes facility information, like the geographical locations and names of those facilities, and the topographical information that is used to define how the facilities are connected to one another (routes between the facilities).</p>\n<p>This defines the distribution network. To connect the distribution network to the end customer, we introduce a <code class=\"language-text\">MarketPlace</code> agent where customers can send orders based on their own internal spending preferences and warehouses can share the current state of their inventory. This market mechanism acts as a centralized place where different kinds of prioritization or optimization algorithms could be applied.</p>\n<p>To summarize, the communication loop during a step of the simulation begins with customers sending orders and warehouses sharing inventory, orders are matched at the marketplace, which feeds into fulfillment at the warehouse, and the passing on of demand information to the production facilities. Customer orders drive demand at the production facility, in this respect we can define the system as a \"pull\" system.</p>\n<p>Below is a screenshot from the Network view in the Simudyne Console:</p>\n<p>\n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block; padding: 20px; max-width: 690px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 56.36904761904762%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB1klEQVQoz4VSy07bUBD1FqlChCZ+PxOa2HFRQpAKQmyR2PCwY+dBJBoBagR0166ADVRCAcEGIcQGCVZ00RVfwJ+dznV8adIXi6MzvjPn3LmeEUwnhuVE0OwGxHwbWr4Jw2jCNJuwCi3IlJOdEKLGEEPWY4gMWoScGiXMY4nOBVaUSw8lnkw4RkYlEzmE6m7DKn+CqISYJGMmlPQo5VEIw0kxPWRdvCVhyerivPqA67kfeFp8xtH0LSxjgy6sJxcyXdLIC6eG/EMaMpxQ19H1TnFSvUNQPMRn/xL9mXu0vROMa+vQzEZqOsB/DVkHhtHGrn+BleIBsoUYY4VVLOe/YGX2FMrcPipe6+VFrxoyZMm05/ZxXrlH0z/GkvsVO+U+Ot43ZMwIym/1/zTkcVYOYLg9bH24wk31O65qjzibecC8s48JZS35LVI6vD8MB0P5BTZlw4wxVd2E6vewYO9hjZ7u0pAmtQCjmtGJC3yn2E0cWdopK99CbbqDTC5AhkzeKKtkVqeuGiO1XMt3UtDtGJpF/8QIoJghMe0dsayH1GlAuTpNdACVwPK8hmmYXrcj2FMbcN51IBTdEJ7fQKkcwS3HCUopu/5Q/BckOdKyuFL7iPeVDn4Ck+JkPaXNbX0AAAAASUVORK5CYII='); background-size: cover; display: block;\"\n    >\n      <picture>\n        <source\n          srcset=\"/static/supply_chain_console_view-dc85f3d12a1f83dc531e47ab66c942bf-8e416.webp 173w,\n/static/supply_chain_console_view-dc85f3d12a1f83dc531e47ab66c942bf-0b506.webp 345w,\n/static/supply_chain_console_view-dc85f3d12a1f83dc531e47ab66c942bf-58be5.webp 690w,\n/static/supply_chain_console_view-dc85f3d12a1f83dc531e47ab66c942bf-59b8d.webp 1035w,\n/static/supply_chain_console_view-dc85f3d12a1f83dc531e47ab66c942bf-4a474.webp 1380w,\n/static/supply_chain_console_view-dc85f3d12a1f83dc531e47ab66c942bf-bc809.webp 2070w,\n/static/supply_chain_console_view-dc85f3d12a1f83dc531e47ab66c942bf-4524e.webp 3360w\"\n          sizes=\"(max-width: 690px) 100vw, 690px\"\n          type=\"image/webp\"\n        />\n        <source\n          srcset=\"/static/supply_chain_console_view-dc85f3d12a1f83dc531e47ab66c942bf-7e3fa.png 173w,\n/static/supply_chain_console_view-dc85f3d12a1f83dc531e47ab66c942bf-7f1d4.png 345w,\n/static/supply_chain_console_view-dc85f3d12a1f83dc531e47ab66c942bf-13856.png 690w,\n/static/supply_chain_console_view-dc85f3d12a1f83dc531e47ab66c942bf-045bb.png 1035w,\n/static/supply_chain_console_view-dc85f3d12a1f83dc531e47ab66c942bf-f46ab.png 1380w,\n/static/supply_chain_console_view-dc85f3d12a1f83dc531e47ab66c942bf-ea5f6.png 2070w,\n/static/supply_chain_console_view-dc85f3d12a1f83dc531e47ab66c942bf-1a3cb.png 3360w\"\n          sizes=\"(max-width: 690px) 100vw, 690px\"\n          type=\"image/png\"\n        />\n        <img\n          class=\"gatsby-resp-image-image\"\n          style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n          src=\"/static/supply_chain_console_view-dc85f3d12a1f83dc531e47ab66c942bf-13856.png\"\n          alt=\"supply chain console view\"\n          title=\"\"\n          src=\"/static/supply_chain_console_view-dc85f3d12a1f83dc531e47ab66c942bf-13856.png\"\n        />\n      </picture>\n      </span>\n  </span>\n  </p>\n<p>For the purposes of experimentation, the framework provided has been generated with limited production facilities and warehouses serving a geographically diverse group of customers located in the United States. This design is intentional and intended to provide the user with an opportunity to test various strategies or optimizations in the simulation environment.</p>\n<p>The next section will cover the core modelling components and interactions within the Supply Chain Simulator.</p>\n<h2 id=\"model-components\"><a href=\"#model-components\" 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>Model Components</h2>\n<p>The Supply Chain Simulator is designed to represent a \"pull\" system in which end customers (which could be individuals, organizations, businesses, etc) generate demand which impacts inventory and production at the production facilities.</p>\n<p>In this section the agent classes, functional classes, and interactions of the simulation are explained. It is recommended to dive into the code to best understand how everything operates.</p>\n<h3 id=\"model-setup\"><a href=\"#model-setup\" 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>Model Setup</h3>\n<p>During the <code class=\"language-text\">setup()</code> input data is pulled into the simulation to generate various agent classes, and to generate the topology between the agents. These data files are placeholders to demonstrate how real data might be used to generate the agents and their environment.</p>\n<p class=\"code-header\">SupplyChainModel.java</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">  <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 function\">getGlobals</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>rng <span class=\"token operator\">=</span> <span class=\"token function\">getContext</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getPrng</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">// Pull in available products and store in the Globals</span>\n        CSVSource products <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">CSVSource</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"data/products.csv\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        products<span class=\"token punctuation\">.</span><span class=\"token function\">getRows</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span>entry <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n            String productID <span class=\"token operator\">=</span> entry<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Product Code\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token keyword\">double</span> price <span class=\"token operator\">=</span> Double<span class=\"token punctuation\">.</span><span class=\"token function\">parseDouble</span><span class=\"token punctuation\">(</span>entry<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Price\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token keyword\">double</span> volume <span class=\"token operator\">=</span> Double<span class=\"token punctuation\">.</span><span class=\"token function\">parseDouble</span><span class=\"token punctuation\">(</span>entry<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Volume\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token keyword\">double</span> weight <span class=\"token operator\">=</span> Double<span class=\"token punctuation\">.</span><span class=\"token function\">parseDouble</span><span class=\"token punctuation\">(</span>entry<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Weight\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token function\">getGlobals</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>availableProducts<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span>productID<span class=\"token punctuation\">,</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ProductDetails</span><span class=\"token punctuation\">(</span>productID<span class=\"token punctuation\">,</span> price<span class=\"token punctuation\">,</span> volume<span class=\"token punctuation\">,</span> weight<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><span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">// Pull in customer information for regions and income distribution</span>\n        CSVSource customerRegions <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">CSVSource</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"data/zip1regions.csv\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">getGlobals</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>zipRegionData <span class=\"token operator\">=</span> customerRegions<span class=\"token punctuation\">.</span><span class=\"token function\">getRowsFromTable</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        EmpiricalDistribution incomeDist <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Distribution</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getIncomeDistribution</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">// Generate the marketplace agent</span>\n        Group<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>MarketPlace<span class=\"token punctuation\">></span></span> marketPlaceGroup <span class=\"token operator\">=</span> <span class=\"token function\">generateGroup</span><span class=\"token punctuation\">(</span>MarketPlace<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> m <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n            m<span class=\"token punctuation\">.</span>availableProducts <span class=\"token operator\">=</span> <span class=\"token function\">getGlobals</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>availableProducts<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\">// Generate a customer population</span>\n        Group<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Customer<span class=\"token punctuation\">></span></span> customerGroup <span class=\"token operator\">=</span> <span class=\"token function\">generateGroup</span><span class=\"token punctuation\">(</span>Customer<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> <span class=\"token function\">getGlobals</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>nbCustomers<span class=\"token punctuation\">,</span> customer <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n            customer<span class=\"token punctuation\">.</span>region <span class=\"token operator\">=</span> <span class=\"token function\">getGlobals</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">determineCustomerRegion</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            customer<span class=\"token punctuation\">.</span>income <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span> incomeDist<span class=\"token punctuation\">.</span><span class=\"token function\">sample</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n            customer<span class=\"token punctuation\">.</span>annualSalarySpend <span class=\"token operator\">=</span> customer<span class=\"token punctuation\">.</span><span class=\"token function\">getPrng</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">uniform</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token function\">getGlobals</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>annualSpending<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">sample</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            customer<span class=\"token punctuation\">.</span>availableProducts <span class=\"token operator\">=</span> <span class=\"token function\">getGlobals</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>availableProducts<span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        Map<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>String<span class=\"token punctuation\">,</span> Long<span class=\"token punctuation\">></span></span> destAddr <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">HashMap</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\n        <span class=\"token comment\">// Generate the production facilities based on synthetic data</span>\n        CSVSource factorySource <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">CSVSource</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"data/factory_source.csv\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        Group<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>ProductionFacility<span class=\"token punctuation\">></span></span> factoryGroup <span class=\"token operator\">=</span> <span class=\"token function\">loadGroup</span><span class=\"token punctuation\">(</span>ProductionFacility<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> factorySource<span class=\"token punctuation\">,</span> fA <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n            fA<span class=\"token punctuation\">.</span>outboundLoadingBay <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">LoadingBay</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            fA<span class=\"token punctuation\">.</span>HEADER <span class=\"token operator\">=</span> <span class=\"token string\">\"facility_name,productID,production,timeStep\"</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\">// Generate the warehouse agents based on synthetic data</span>\n        CSVSource warehouseSource <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">CSVSource</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"data/warehouse_source.csv\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        Group<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Warehouse<span class=\"token punctuation\">></span></span> warehouseGroup <span class=\"token operator\">=</span> <span class=\"token function\">loadGroup</span><span class=\"token punctuation\">(</span>Warehouse<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> warehouseSource<span class=\"token punctuation\">,</span> fB <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n            fB<span class=\"token punctuation\">.</span>inboundLoadingBay <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">LoadingBay</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            destAddr<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span>fB<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">,</span> fB<span class=\"token punctuation\">.</span><span class=\"token function\">getID</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            fB<span class=\"token punctuation\">.</span>HEADER <span class=\"token operator\">=</span> <span class=\"token string\">\"facility_name,productID,demand,inventory,timeStep\"</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 function\">getGlobals</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>warehouseLocations <span class=\"token operator\">=</span> destAddr<span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">// Connect the production facilities to the warehouses that they supply</span>\n        CSVSource distroTopology <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">CSVSource</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"data/distribution_topology.csv\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        factoryGroup<span class=\"token punctuation\">.</span><span class=\"token function\">loadConnections</span><span class=\"token punctuation\">(</span>warehouseGroup<span class=\"token punctuation\">,</span> Links<span class=\"token punctuation\">.</span>FactoryToWarehouseLink<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> distroTopology<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">// Connect the warehouses back to the production facilities so they can communicate their demand</span>\n        CSVSource demandTopology <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">CSVSource</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"data/demand_topology.csv\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        warehouseGroup<span class=\"token punctuation\">.</span><span class=\"token function\">loadConnections</span><span class=\"token punctuation\">(</span>factoryGroup<span class=\"token punctuation\">,</span> Links<span class=\"token punctuation\">.</span>WarehouseToFactoryLink<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> demandTopology<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">// Connect customers and warehouses to marketplace</span>\n        warehouseGroup<span class=\"token punctuation\">.</span><span class=\"token function\">fullyConnected</span><span class=\"token punctuation\">(</span>marketPlaceGroup<span class=\"token punctuation\">,</span> Links<span class=\"token punctuation\">.</span>WarehouseToMarketPlaceLink<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        customerGroup<span class=\"token punctuation\">.</span><span class=\"token function\">fullyConnected</span><span class=\"token punctuation\">(</span>marketPlaceGroup<span class=\"token punctuation\">,</span> Links<span class=\"token punctuation\">.</span>CustomerToMarketLink<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 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></code></pre></div>\n<p>The <code class=\"language-text\">setup()</code> generates all agents and establishes the links between the various facilities.</p>\n<h3 id=\"model-step\"><a href=\"#model-step\" 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>Model Step</h3>\n<p>The <code class=\"language-text\">step()</code> method contains the 3 messaging sections with run sequences for handling the communication and flow of products between the customers and the distribution facilities.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><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 keyword\">super</span><span class=\"token punctuation\">.</span><span class=\"token function\">step</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">// Generate initial state of inventory</span>\n        <span class=\"token function\">firstStep</span><span class=\"token punctuation\">(</span>ProductionFacility<span class=\"token punctuation\">.</span>sendInitialInventory<span class=\"token punctuation\">,</span> Warehouse<span class=\"token punctuation\">.</span>setInitialInventory<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">// MarketPlace functionality and generation of demand</span>\n        <span class=\"token function\">run</span><span class=\"token punctuation\">(</span>\n                Split<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>\n                        Customer<span class=\"token punctuation\">.</span>generateOrders<span class=\"token punctuation\">,</span>\n                        Warehouse<span class=\"token punctuation\">.</span>sendInventory<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n                MarketPlace<span class=\"token punctuation\">.</span>matchOrders<span class=\"token punctuation\">,</span>\n                Split<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>\n                        Warehouse<span class=\"token punctuation\">.</span>processOrders<span class=\"token punctuation\">,</span>\n                        Customer<span class=\"token punctuation\">.</span>receiveOutOfStockMessage<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n                Split<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>\n                        ProductionFacility<span class=\"token punctuation\">.</span>receiveDemand<span class=\"token punctuation\">,</span>\n                        Customer<span class=\"token punctuation\">.</span>receiveOrderUpdate<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">// Production of new products and distribution from production facilities to warehouses</span>\n        <span class=\"token function\">run</span><span class=\"token punctuation\">(</span>ProductionFacility<span class=\"token punctuation\">.</span>processOutboundLoadingBay<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">run</span><span class=\"token punctuation\">(</span>ProductionFacility<span class=\"token punctuation\">.</span>departOutboundTransport<span class=\"token punctuation\">,</span> Warehouse<span class=\"token punctuation\">.</span>receiveInboundTransport<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">run</span><span class=\"token punctuation\">(</span>Warehouse<span class=\"token punctuation\">.</span>processInboundLoadingBay<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token punctuation\">}</span></code></pre></div>\n<p>The intial <code class=\"language-text\">firstStep()</code> sequence establishes an initial state of inventory at the warehouses. This is controlled by a <code class=\"language-text\">GlobalState</code> parameter called <code class=\"language-text\">initialInventory</code>.</p>\n<p>The next sequence handles the communication of orders from customers and inventory from the warehouses. These are matched at the marketplace and anything out of stock is communicated to the customer and anything fulfilled is sent to the customer and, the demand is sent to the production facility. Lastly, customers receive their orders and production facilities receive the demand information.</p>\n<p>The final set of run sequences are standard in the Supply Chain Toolkit and handle the response to demand by generating products and shipping them to warehouses which store them in inventory.</p>\n<p>The next subsections dive deeper into the agents and their behaviors.</p>\n<h3 id=\"agents\"><a href=\"#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>Agents</h3>\n<p>The simulation has 4 different agent classes:</p>\n<ol>\n<li><strong>Customer Agent:</strong> Generates orders based on internal spending behavior and sends them to the <code class=\"language-text\">MarketPlace</code> agent.</li>\n<li><strong>MarketPlace Agent:</strong> Receives <code class=\"language-text\">OrderMessage</code> from the Customer and <code class=\"language-text\">InventoryMessage</code> from warehouse and matches orders.</li>\n<li><strong>Warehouse Agent:</strong> Receives <code class=\"language-text\">WarehouseOrder</code> messages from the <code class=\"language-text\">MarketPlace</code> and fulfills the orders. Additionally, receives incoming <code class=\"language-text\">TransportMessage</code> messages from the <code class=\"language-text\">ProductionFacility</code> and stores the new <code class=\"language-text\">Product</code> objects in inventory.</li>\n<li><strong>ProductionFacility Agent:</strong> Receives <code class=\"language-text\">DemandMessage</code> from the <code class=\"language-text\">Warehouse</code> agent and responds to demand by predicting future production and generating future inventory. Ships inventory to <code class=\"language-text\">Warehouse</code> agents once generated.</li>\n</ol>\n<p>These agent classes contain behaviors that are defined and serve as placeholders for how interactions in a real-world system may operate.</p>\n<p>In the following subsections the core behaviors of the agents are explained.</p>\n<h4 id=\"customer-agent\"><a href=\"#customer-agent\" 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>Customer Agent</h4>\n<p>The customer agent has 3 main Actions that are called in during the <code class=\"language-text\">step()</code> of the model:</p>\n<ol>\n<li><code class=\"language-text\">Customer.generateOrders</code> calls internal allocation functions within the agent that determine which products to purchase and how much to spend on those products. These orders are then sent to <code class=\"language-text\">MarketPlace</code> agent.</li>\n<li><code class=\"language-text\">Customer.receiveOutOfStockMessage</code> receives <code class=\"language-text\">OutOfStockMessage</code> from the <code class=\"language-text\">MarketPlace</code> and processes the refund.</li>\n<li><code class=\"language-text\">Customer.recieveOrderUpdate</code> handles incoming fulfilled orders and saves the information in the purchase history.</li>\n</ol>\n<h4 id=\"marketplace-agent\"><a href=\"#marketplace-agent\" 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>MarketPlace Agent</h4>\n<p><code class=\"language-text\">MarketPlace.matchOrders</code> takes in <code class=\"language-text\">OrderMessage</code> and <code class=\"language-text\">InventoryMessage</code> and matches available inventory with incoming orders. These are sent to the <code class=\"language-text\">Warehouse</code> where they are fulfilled and their demand is captured and where anything that is out of stock is sent back to the customer for a refund.</p>\n<h4 id=\"warehouse-agent\"><a href=\"#warehouse-agent\" 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>Warehouse Agent</h4>\n<ol>\n<li><code class=\"language-text\">Warehouse.setInitialInventory</code> takes in the initial inventory sent by the <code class=\"language-text\">ProductionFacility</code> and creates the initial state of the inventory.</li>\n<li><code class=\"language-text\">Warehouse.sendInventory</code> shares a <code class=\"language-text\">InventoryMessage</code> with the <code class=\"language-text\">MarketPlace</code> for providing the latest inventory for the matching process.</li>\n<li><code class=\"language-text\">Warehouse.processOrders</code> receives <code class=\"language-text\">WarehouseOrderMessage</code> and fulfills orders by sending to customers and updating inventory. In this behavior the demand for each <code class=\"language-text\">Product</code> is sent to the <code class=\"language-text\">ProductionFacility</code>.</li>\n<li><code class=\"language-text\">Warehouse.receiveInboundTransport</code> takes in <code class=\"language-text\">TransportMessage</code> with <code class=\"language-text\">Product</code> cargo and handles the incoming transport.</li>\n<li><code class=\"language-text\">Warehouse.processInboundLoadingBay</code> unloads arrived <code class=\"language-text\">TransportMessage</code> and places the <code class=\"language-text\">Product</code> objects in inventory.</li>\n</ol>\n<p>The <code class=\"language-text\">Warehouse</code> serves as the point of fulfillment and inventory storage.</p>\n<h4 id=\"production-facility-agent\"><a href=\"#production-facility-agent\" 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>Production Facility Agent</h4>\n<ol>\n<li><code class=\"language-text\">ProductionFacility.sendInitialInventory</code> creates an initial set of products, it is implemented as a constant number from the <code class=\"language-text\">GlobalState</code> for each facility and for each product. Once products are generated they are immediately sent to the respective <code class=\"language-text\">Warehouse</code></li>\n<li><code class=\"language-text\">ProductionFacility.receiveDemand</code> takes in <code class=\"language-text\">DemandMessage</code> from the <code class=\"language-text\">Warehouse</code> and stores this information in its historical demand so that it can use this to make predictions about production.</li>\n<li><code class=\"language-text\">ProductionFacility.processOutboundLoadingBay</code> looks at historical demand and generates <code class=\"language-text\">Product</code> object based on predicted production. Once products are ready to load onto trucks, the agent generates trucks and loads the contents headed to respective destinations.</li>\n<li><code class=\"language-text\">ProductionFacility.departOutboundTransport</code> departs <code class=\"language-text\">TransportMessage</code> that are ready to leave and head to their <code class=\"language-text\">Warehouse</code> destination.</li>\n</ol>\n<p>The <code class=\"language-text\">ProductionFacility</code> serves as the point of production and shipment as well as the location where production is predicted.</p>\n<h2 id=\"scenario--strategy-analysis\"><a href=\"#scenario--strategy-analysis\" 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>Scenario &#x26; Strategy Analysis</h2>\n<p>The purpose of this framework is to provide a sandbox environment for solving supply chain optimization challenges. By using a simulation environment that is a faithful representation of the mechanics of the real world, optimization challenges like inventory placement and facility placement can be explored.</p>\n<p>There may be objectives or goals involved in these optimization exercises, such as reducing cost of shipment or storage time that lead to real-world balance sheet implications. A robust simulation environment, coupled with the testing of optimization strategies can help identify potential cost-saving or profit-making outcomes.</p>\n<p>In this example a very simple optimization is used for predicting production. A simple linear regression is implemented that looks at the last 30 days of historical demand and predicts what the next 30 days of production should look like. This is just a placeholder for more complex algorithms and only addresses production forecasting. The <code class=\"language-text\">MarketPlace</code> agent is likely a better location to run optimizations should this model be adapted or extended for an inventory placement or facility location problem.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">calculateFutureProduction</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        Map<span class=\"token operator\">&lt;</span>Long<span class=\"token punctuation\">,</span> List<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>DemandHistory<span class=\"token punctuation\">></span></span><span class=\"token operator\">></span> last30DemandByWarehouse <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">HashMap</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\n        <span class=\"token comment\">//Collect the last 30 days of historical demand</span>\n        <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span>Long step <span class=\"token operator\">:</span> historicalDemand<span class=\"token punctuation\">.</span><span class=\"token function\">keySet</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span>DemandHistory demandHistory <span class=\"token operator\">:</span> historicalDemand<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>step<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token keyword\">long</span> warehouseID <span class=\"token operator\">=</span> demandHistory<span class=\"token punctuation\">.</span>warehouseID<span class=\"token punctuation\">;</span>\n                last30DemandByWarehouse<span class=\"token punctuation\">.</span><span class=\"token function\">putIfAbsent</span><span class=\"token punctuation\">(</span>warehouseID<span class=\"token punctuation\">,</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">LinkedList</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><span class=\"token punctuation\">;</span>\n                last30DemandByWarehouse<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>warehouseID<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span>demandHistory<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>last30DemandByWarehouse<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>warehouseID<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">size</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">></span> <span class=\"token number\">30</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                    last30DemandByWarehouse<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>warehouseID<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">remove</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                <span class=\"token punctuation\">}</span>\n            <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">}</span>\n\n        last30DemandByWarehouse<span class=\"token punctuation\">.</span><span class=\"token function\">entrySet</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">stream</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span>entry <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n            Map<span class=\"token operator\">&lt;</span>String<span class=\"token punctuation\">,</span> List<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Integer<span class=\"token punctuation\">></span></span><span class=\"token operator\">></span> last30Demands <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">HashMap</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\">for</span> <span class=\"token punctuation\">(</span>DemandHistory demandHistory <span class=\"token operator\">:</span> entry<span class=\"token punctuation\">.</span><span class=\"token function\">getValue</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                String productID <span class=\"token operator\">=</span> demandHistory<span class=\"token punctuation\">.</span>productID<span class=\"token punctuation\">;</span>\n                <span class=\"token keyword\">int</span> demand <span class=\"token operator\">=</span> demandHistory<span class=\"token punctuation\">.</span>demand<span class=\"token punctuation\">;</span>\n                last30Demands<span class=\"token punctuation\">.</span><span class=\"token function\">putIfAbsent</span><span class=\"token punctuation\">(</span>productID<span class=\"token punctuation\">,</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">LinkedList</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><span class=\"token punctuation\">;</span>\n                last30Demands<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>productID<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span>demand<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span>\n\n            Map<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>String<span class=\"token punctuation\">,</span> Double<span class=\"token punctuation\">></span></span> regressionCoefficients <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">HashMap</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            Map<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>String<span class=\"token punctuation\">,</span> Integer<span class=\"token punctuation\">></span></span> intercepts <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">HashMap</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\n            <span class=\"token comment\">//gather regression coefficients and intercepts</span>\n            <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span>String productID <span class=\"token operator\">:</span> last30Demands<span class=\"token punctuation\">.</span><span class=\"token function\">keySet</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                List<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Integer<span class=\"token punctuation\">></span></span> demands <span class=\"token operator\">=</span> last30Demands<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>productID<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                SimpleRegression regression <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">SimpleRegression</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n                <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> demands<span class=\"token punctuation\">.</span><span class=\"token function\">size</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                    regression<span class=\"token punctuation\">.</span><span class=\"token function\">addData</span><span class=\"token punctuation\">(</span>i<span class=\"token punctuation\">,</span> demands<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>i<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                <span class=\"token punctuation\">}</span>\n\n                regressionCoefficients<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span>productID<span class=\"token punctuation\">,</span> regression<span class=\"token punctuation\">.</span><span class=\"token function\">getSlope</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                intercepts<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span>productID<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span> regression<span class=\"token punctuation\">.</span><span class=\"token function\">getIntercept</span><span class=\"token punctuation\">(</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 keyword\">long</span> currentStep <span class=\"token operator\">=</span> <span class=\"token function\">getContext</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getTick</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n            <span class=\"token comment\">//store future production predictions</span>\n            <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span>String productID <span class=\"token operator\">:</span> regressionCoefficients<span class=\"token punctuation\">.</span><span class=\"token function\">keySet</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token keyword\">double</span> slope <span class=\"token operator\">=</span> regressionCoefficients<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>productID<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                <span class=\"token keyword\">int</span> intercept <span class=\"token operator\">=</span> intercepts<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>productID<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> i <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;=</span> <span class=\"token function\">getGlobals</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>prodPredictionTime<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                    <span class=\"token keyword\">long</span> futureStep <span class=\"token operator\">=</span> currentStep <span class=\"token operator\">+</span> i<span class=\"token punctuation\">;</span>\n                    <span class=\"token keyword\">int</span> predictedDemand <span class=\"token operator\">=</span> <span class=\"token function\">calculatePredictedDemand</span><span class=\"token punctuation\">(</span>slope<span class=\"token punctuation\">,</span> intercept<span class=\"token punctuation\">,</span> i<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                    productionPredictions<span class=\"token punctuation\">.</span><span class=\"token function\">computeIfAbsent</span><span class=\"token punctuation\">(</span>futureStep<span class=\"token punctuation\">,</span> k <span class=\"token operator\">-</span><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><span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Production</span><span class=\"token punctuation\">(</span>productID<span class=\"token punctuation\">,</span> predictedDemand<span class=\"token punctuation\">,</span> entry<span class=\"token punctuation\">.</span><span class=\"token function\">getKey</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                <span class=\"token punctuation\">}</span>\n            <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></code></pre></div>\n<h2 id=\"custom-dashboard\"><a href=\"#custom-dashboard\" 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>Custom Dashboard</h2>\n<p>In a production environment the Simudyne SDK is usually run in headless mode, this means that the Simudyne Console is usually bypassed for the purposes of speed and scale. </p>\n<p>Under these circumstances sometimes it can be helpful to display information with a visualization layer like a custom dashboard. This can also be a useful way to inspect outcomes and communicate business value.</p>\n<p>A sample dashboard, built in Python, has been provided for the purposes of demonstrating the art of the possible and how these simulation environments can be exposed to a more user-friendly interface for interacting with the simulation and viewing the results.</p>\n<p>The code for this dashboard is provided in the model files that can be downloaded above under the <code class=\"language-text\">python</code> directory.</p>\n<p>Below is a screenshot of the dashboard view:</p>\n<p>\n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block; padding: 20px; max-width: 690px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 61.011904761904766%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAABYlAAAWJQFJUiTwAAACr0lEQVQoz12S7W/bVBjF/T8hWLK2H6hIt/2Zm7YxBggk0DohkPal2qYmpE1f7LSJ7diOHb+/JPFLkubHkyAQ4krH995H95znPEdWTp6c8M3Tp5w8ecbxcYeDgyPajw8Eh7Tbgv39kFb7gNbjI74UfNFq8VWrTevRI6kdctw54ejrDp3OM5QPmsmZdo7rDPGdiexjZlOD0JvguxM8Y0gotbGl8/H6hot+l3PtBl1XuR4O+Lmv8tNA5fWf95yqJsr7OxvVMSlznzi2icMpeeIRRhOWRUji6MSeSRS7uK5B4DtMbZX+oMc71eC7K5O3gjdXBu/vHJR3msUf6h0j6w7TuSYIdLLIIwon5LFHlgT7JmFgkUQu3myMaV3x+7XKywudt4O/8e3lmNOhjfKbfHbq3cseoXQORSjwJ0SBTZ7OiK0RaeCQ7CIY3xKYGsa9xi/qRJwZfC/4QfBGRP91+KI/5mV3SFcb4rkWsb+DTSpjzszhPkt3amHbY2zH4MfLe573R7y6EN7FiNdyfiH4VROHXdPlzPD4bIf0LB83jFjmCfMskQxTMjlrrs+l5dFzfO49l3Pbl/cBn62AT8L5OPE5M2f0pK40dU1dVvCw4b9ru4WqaqibFf9f282GHW+379eOu31g1dQoaylGWUWQV4RFRTpfkc9LGhFaViuCtCTOG+KioVjU4njOar0WTkmU10RJQ1qsyIqFvBfBUlx4UYUezAUFblRS1ms2QsqXDU64wJyluElNLCLO1GfHmSUVpldiOCXTsMYPErIsR6mbBt1bcDvNGYcFZrCgWT/sBiMR0kCPBVNuhpn8pzXrzZqqlkb+gpGdiegcR8ws6hXzeoOylbCcdI4Z5jhJwaxYsto87KMpZfQbCf7KsNBvfQpp8E/AcV5iiXMnjKnKJeMcTifwF7weTebLTSMMAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n    >\n      <picture>\n        <source\n          srcset=\"/static/supply_chain_sim_python-381b5a395e873e0ab64211ab6539f608-8e416.webp 173w,\n/static/supply_chain_sim_python-381b5a395e873e0ab64211ab6539f608-0b506.webp 345w,\n/static/supply_chain_sim_python-381b5a395e873e0ab64211ab6539f608-58be5.webp 690w,\n/static/supply_chain_sim_python-381b5a395e873e0ab64211ab6539f608-59b8d.webp 1035w,\n/static/supply_chain_sim_python-381b5a395e873e0ab64211ab6539f608-4a474.webp 1380w,\n/static/supply_chain_sim_python-381b5a395e873e0ab64211ab6539f608-bc809.webp 2070w,\n/static/supply_chain_sim_python-381b5a395e873e0ab64211ab6539f608-4524e.webp 3360w\"\n          sizes=\"(max-width: 690px) 100vw, 690px\"\n          type=\"image/webp\"\n        />\n        <source\n          srcset=\"/static/supply_chain_sim_python-381b5a395e873e0ab64211ab6539f608-7e3fa.png 173w,\n/static/supply_chain_sim_python-381b5a395e873e0ab64211ab6539f608-7f1d4.png 345w,\n/static/supply_chain_sim_python-381b5a395e873e0ab64211ab6539f608-13856.png 690w,\n/static/supply_chain_sim_python-381b5a395e873e0ab64211ab6539f608-045bb.png 1035w,\n/static/supply_chain_sim_python-381b5a395e873e0ab64211ab6539f608-f46ab.png 1380w,\n/static/supply_chain_sim_python-381b5a395e873e0ab64211ab6539f608-ea5f6.png 2070w,\n/static/supply_chain_sim_python-381b5a395e873e0ab64211ab6539f608-1a3cb.png 3360w\"\n          sizes=\"(max-width: 690px) 100vw, 690px\"\n          type=\"image/png\"\n        />\n        <img\n          class=\"gatsby-resp-image-image\"\n          style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n          src=\"/static/supply_chain_sim_python-381b5a395e873e0ab64211ab6539f608-13856.png\"\n          alt=\"supply chain sim python\"\n          title=\"\"\n          src=\"/static/supply_chain_sim_python-381b5a395e873e0ab64211ab6539f608-13856.png\"\n        />\n      </picture>\n      </span>\n  </span>\n  </p>","headings":[{"value":"Overview","depth":2},{"value":"Introduction to Model Concepts","depth":2},{"value":"Model Components","depth":2},{"value":"Model Setup","depth":3},{"value":"Model Step","depth":3},{"value":"Agents","depth":3},{"value":"Customer Agent","depth":4},{"value":"MarketPlace Agent","depth":4},{"value":"Warehouse Agent","depth":4},{"value":"Production Facility Agent","depth":4},{"value":"Scenario & Strategy Analysis","depth":2},{"value":"Custom Dashboard","depth":2}],"frontmatter":{"title":"Supply Chain Simulator","toc":true,"experimental":null}},"site":{"siteMetadata":{"title":"Simudyne Docs","latestVersion":"2.6"}}},"pageContext":{"absolutePath":"/home/vsts/work/1/s/content/2.6/docs/models/supply_chain_simulator.md","versioned":false,"version":"2.6","kind":"docs","pagePath":"/models/supply_chain_simulator","chronology":{"prev":{"name":"Consultancy Model","path":"/models/consultancy_simulator"},"next":{"name":"Commercial Models","path":"/commercial_models"}},"lastUpdated":"2026-04-21T13:56:54.865Z"}}