Hospital Simulation with SimPy: Modelling Patient Flow
<p>Hospitals are complex systems. Patients arrive unpredictably. Resources are constrained. Lives depend on getting it right. Simulation helps.</p> <h2 id="the-hospital-model">The Hospital Model</h2> <p>Key elements: - <strong>Patients</strong> - Arrive with varying urgency - <strong>Staff</strong> - Doctors, nurses, technicians - <strong>Beds</strong> - Limited and precious - <strong>Departments</strong> - A&E, wards, theatres - <strong>Pathways</strong> - Patient journeys through the system</p> <h2 id="emergency-department-simulation">Emergency Department Simulation</h2> <div class="code-block"><pre><span></span><code><span class="kn">import</span><span class="w"> </span><span class="nn">simpy</span> <span class="kn">import</span><span class="w"> </span><span class="nn">random</span> <span class="k">class</span><span class="w"> </span><span class="nc">EmergencyDepartment</span><span class="p">:</span> <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">env</span><span class="p">,</span> <span class="n">config</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span> <span class="o">=</span> <span class="n">env</span> <span class="bp">self</span><span class="o">.</span><span class="n">triage_nurses</span> <span class="o">=</span> <span class="n">simpy</span><span class="o">.</span><span class="n">Resource</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="n">config</span><span class="p">[</span><span class="s1">'triage_nurses'</span><span class="p">])</span> <span class="bp">self</span><span class="o">.</span><span class="n">doctors</span> <span class="o">=</span> <span class="n">simpy</span><span class="o">.</span><span class="n">PriorityResource</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="n">config</span><span class="p">[</span><span class="s1">'doctors'</span><span class="p">])</span> <span class="bp">self</span><span class="o">.</span><span class="n">beds</span> <span class="o">=</span> <span class="n">simpy</span><span class="o">.</span><span class="n">Resource</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="n">config</span><span class="p">[</span><span class="s1">'beds'</span><span class="p">])</span> <span class="bp">self</span><span class="o">.</span><span class="n">stats</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'patients'</span><span class="p">:</span> <span class="p">[],</span> <span class="s1">'wait_times'</span><span class="p">:</span> <span class="p">[],</span> <span class="s1">'length_of_stay'</span><span class="p">:</span> <span class="p">[]</span> <span class="p">}</span> <span class="k">def</span><span class="w"> </span><span class="nf">patient_pathway</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">patient_id</span><span class="p">,</span> <span class="n">severity</span><span class="p">):</span> <span class="n">arrival</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">now</span> <span class="c1"># Priority: 1 = critical, 5 = minor</span> <span class="n">priority_map</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'critical'</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">'urgent'</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="s1">'standard'</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="s1">'minor'</span><span class="p">:</span> <span class="mi">4</span><span class="p">}</span> <span class="n">priority</span> <span class="o">=</span> <span class="n">priority_map</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">severity</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="c1"># Triage</span> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">triage_nurses</span><span class="o">.</span><span class="n">request</span><span class="p">()</span> <span class="k">as</span> <span class="n">req</span><span class="p">:</span> <span class="k">yield</span> <span class="n">req</span> <span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">timeout</span><span class="p">(</span><span class="n">random</span><span class="o">.</span><span class="n">uniform</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">8</span><span class="p">))</span> <span class="n">triage_complete</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">now</span> <span class="c1"># Wait for doctor (priority queue)</span> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">doctors</span><span class="o">.</span><span class="n">request</span><span class="p">(</span><span class="n">priority</span><span class="o">=</span><span class="n">priority</span><span class="p">)</span> <span class="k">as</span> <span class="n">req</span><span class="p">:</span> <span class="k">yield</span> <span class="n">req</span> <span class="n">wait_for_doctor</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">now</span> <span class="o">-</span> <span class="n">triage_complete</span> <span class="bp">self</span><span class="o">.</span><span class="n">stats</span><span class="p">[</span><span class="s1">'wait_times'</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">({</span> <span class="s1">'patient'</span><span class="p">:</span> <span class="n">patient_id</span><span class="p">,</span> <span class="s1">'severity'</span><span class="p">:</span> <span class="n">severity</span><span class="p">,</span> <span class="s1">'wait'</span><span class="p">:</span> <span class="n">wait_for_doctor</span> <span class="p">})</span> <span class="c1"># Treatment time varies by severity</span> <span class="n">treatment_times</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'critical'</span><span class="p">:</span> <span class="p">(</span><span class="mi">30</span><span class="p">,</span> <span class="mi">60</span><span class="p">),</span> <span class="s1">'urgent'</span><span class="p">:</span> <span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="mi">45</span><span class="p">),</span> <span class="s1">'standard'</span><span class="p">:</span> <span class="p">(</span><span class="mi">15</span><span class="p">,</span> <span class="mi">30</span><span class="p">),</span> <span class="s1">'minor'</span><span class="p">:</span> <span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">)</span> <span class="p">}</span> <span class="n">min_t</span><span class="p">,</span> <span class="n">max_t</span> <span class="o">=</span> <span class="n">treatment_times</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">severity</span><span class="p">,</span> <span class="p">(</span><span class="mi">15</span><span class="p">,</span> <span class="mi">30</span><span class="p">))</span> <span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">timeout</span><span class="p">(</span><span class="n">random</span><span class="o">.</span><span class="n">uniform</span><span class="p">(</span><span class="n">min_t</span><span class="p">,</span> <span class="n">max_t</span><span class="p">))</span> <span class="c1"># Some patients need admission</span> <span class="n">admission_rates</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'critical'</span><span class="p">:</span> <span class="mf">0.8</span><span class="p">,</span> <span class="s1">'urgent'</span><span class="p">:</span> <span class="mf">0.5</span><span class="p">,</span> <span class="s1">'standard'</span><span class="p">:</span> <span class="mf">0.2</span><span class="p">,</span> <span class="s1">'minor'</span><span class="p">:</span> <span class="mf">0.05</span><span class="p">}</span> <span class="k">if</span> <span class="n">random</span><span class="o">.</span><span class="n">random</span><span class="p">()</span> <span class="o"><</span> <span class="n">admission_rates</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">severity</span><span class="p">,</span> <span class="mf">0.2</span><span class="p">):</span> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">beds</span><span class="o">.</span><span class="n">request</span><span class="p">()</span> <span class="k">as</span> <span class="n">req</span><span class="p">:</span> <span class="k">yield</span> <span class="n">req</span> <span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">timeout</span><span class="p">(</span><span class="n">random</span><span class="o">.</span><span class="n">uniform</span><span class="p">(</span><span class="mi">60</span><span class="p">,</span> <span class="mi">240</span><span class="p">))</span> <span class="c1"># Ward stay</span> <span class="n">departure</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">now</span> <span class="bp">self</span><span class="o">.</span><span class="n">stats</span><span class="p">[</span><span class="s1">'length_of_stay'</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">departure</span> <span class="o">-</span> <span class="n">arrival</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">stats</span><span class="p">[</span><span class="s1">'patients'</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">({</span> <span class="s1">'id'</span><span class="p">:</span> <span class="n">patient_id</span><span class="p">,</span> <span class="s1">'severity'</span><span class="p">:</span> <span class="n">severity</span><span class="p">,</span> <span class="s1">'arrival'</span><span class="p">:</span> <span class="n">arrival</span><span class="p">,</span> <span class="s1">'departure'</span><span class="p">:</span> <span class="n">departure</span><span class="p">,</span> <span class="s1">'los'</span><span class="p">:</span> <span class="n">departure</span> <span class="o">-</span> <span class="n">arrival</span> <span class="p">})</span> <span class="k">def</span><span class="w"> </span><span class="nf">patient_arrivals</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="n">ed</span><span class="p">,</span> <span class="n">arrival_rate</span><span class="p">):</span> <span class="n">patient_id</span> <span class="o">=</span> <span class="mi">0</span> <span class="n">severity_probs</span> <span class="o">=</span> <span class="p">[</span><span class="mf">0.05</span><span class="p">,</span> <span class="mf">0.15</span><span class="p">,</span> <span class="mf">0.40</span><span class="p">,</span> <span class="mf">0.40</span><span class="p">]</span> <span class="c1"># critical, urgent, standard, minor</span> <span class="n">severities</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'critical'</span><span class="p">,</span> <span class="s1">'urgent'</span><span class="p">,</span> <span class="s1">'standard'</span><span class="p">,</span> <span class="s1">'minor'</span><span class="p">]</span> <span class="k">while</span> <span class="kc">True</span><span class="p">:</span> <span class="k">yield</span> <span class="n">env</span><span class="o">.</span><span class="n">timeout</span><span class="p">(</span><span class="n">random</span><span class="o">.</span><span class="n">expovariate</span><span class="p">(</span><span class="n">arrival_rate</span><span class="p">))</span> <span class="n">severity</span> <span class="o">=</span> <span class="n">random</span><span class="o">.</span><span class="n">choices</span><span class="p">(</span><span class="n">severities</span><span class="p">,</span> <span class="n">weights</span><span class="o">=</span><span class="n">severity_probs</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="n">env</span><span class="o">.</span><span class="n">process</span><span class="p">(</span><span class="n">ed</span><span class="o">.</span><span class="n">patient_pathway</span><span class="p">(</span><span class="n">patient_id</span><span class="p">,</span> <span class="n">severity</span><span class="p">))</span> <span class="n">patient_id</span> <span class="o">+=</span> <span class="mi">1</span> <span class="c1"># Run simulation</span> <span class="n">env</span> <span class="o">=</span> <span class="n">simpy</span><span class="o">.</span><span class="n">Environment</span><span class="p">()</span> <span class="n">ed</span> <span class="o">=</span> <span class="n">EmergencyDepartment</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="p">{</span> <span class="s1">'triage_nurses'</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="s1">'doctors'</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="s1">'beds'</span><span class="p">:</span> <span class="mi">20</span> <span class="p">})</span> <span class="n">env</span><span class="o">.</span><span class="n">process</span><span class="p">(</span><span class="n">patient_arrivals</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="n">ed</span><span class="p">,</span> <span class="n">arrival_rate</span><span class="o">=</span><span class="mi">1</span><span class="o">/</span><span class="mi">10</span><span class="p">))</span> <span class="c1"># ~6 per hour</span> <span class="n">env</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">until</span><span class="o">=</span><span class="mi">480</span><span class="p">)</span> <span class="c1"># 8-hour shift</span> </code></pre></div> <h2 id="ward-model">Ward Model</h2> <div class="code-block"><pre><span></span><code><span class="k">class</span><span class="w"> </span><span class="nc">HospitalWard</span><span class="p">:</span> <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">env</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">beds</span><span class="p">,</span> <span class="n">nurses_per_shift</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span> <span class="o">=</span> <span class="n">env</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span> <span class="bp">self</span><span class="o">.</span><span class="n">beds</span> <span class="o">=</span> <span class="n">simpy</span><span class="o">.</span><span class="n">Resource</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="n">capacity</span><span class="o">=</span><span class="n">beds</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">nurses</span> <span class="o">=</span> <span class="n">simpy</span><span class="o">.</span><span class="n">Resource</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="n">capacity</span><span class="o">=</span><span class="n">nurses_per_shift</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">patients_discharged</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">def</span><span class="w"> </span><span class="nf">admit_patient</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">patient_id</span><span class="p">,</span> <span class="n">expected_los</span><span class="p">):</span> <span class="w"> </span><span class="sd">"""Admit patient, occupy bed for length of stay."""</span> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">beds</span><span class="o">.</span><span class="n">request</span><span class="p">()</span> <span class="k">as</span> <span class="n">bed</span><span class="p">:</span> <span class="k">yield</span> <span class="n">bed</span> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Patient </span><span class="si">{</span><span class="n">patient_id</span><span class="si">}</span><span class="s2"> admitted to </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2"> at </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">now</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span> <span class="c1"># Daily care rounds</span> <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">now</span> <span class="o"><</span> <span class="n">expected_los</span><span class="p">:</span> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">nurses</span><span class="o">.</span><span class="n">request</span><span class="p">()</span> <span class="k">as</span> <span class="n">nurse</span><span class="p">:</span> <span class="k">yield</span> <span class="n">nurse</span> <span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">timeout</span><span class="p">(</span><span class="n">random</span><span class="o">.</span><span class="n">uniform</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">30</span><span class="p">))</span> <span class="c1"># Care time</span> <span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">timeout</span><span class="p">(</span><span class="n">random</span><span class="o">.</span><span class="n">uniform</span><span class="p">(</span><span class="mi">60</span><span class="p">,</span> <span class="mi">120</span><span class="p">))</span> <span class="c1"># Time between rounds</span> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Patient </span><span class="si">{</span><span class="n">patient_id</span><span class="si">}</span><span class="s2"> discharged from </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2"> at </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">now</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">patients_discharged</span> <span class="o">+=</span> <span class="mi">1</span> </code></pre></div> <h2 id="operating-theatre">Operating Theatre</h2> <div class="code-block"><pre><span></span><code><span class="k">class</span><span class="w"> </span><span class="nc">OperatingTheatre</span><span class="p">:</span> <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">env</span><span class="p">,</span> <span class="n">num_theatres</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span> <span class="o">=</span> <span class="n">env</span> <span class="bp">self</span><span class="o">.</span><span class="n">theatres</span> <span class="o">=</span> <span class="n">simpy</span><span class="o">.</span><span class="n">Resource</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="n">capacity</span><span class="o">=</span><span class="n">num_theatres</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">surgeons</span> <span class="o">=</span> <span class="n">simpy</span><span class="o">.</span><span class="n">Resource</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="n">capacity</span><span class="o">=</span><span class="n">num_theatres</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">anaesthetists</span> <span class="o">=</span> <span class="n">simpy</span><span class="o">.</span><span class="n">Resource</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="n">capacity</span><span class="o">=</span><span class="n">num_theatres</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">surgeries_completed</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">def</span><span class="w"> </span><span class="nf">surgery</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">patient_id</span><span class="p">,</span> <span class="n">surgery_type</span><span class="p">):</span> <span class="w"> </span><span class="sd">"""Perform surgery requiring theatre, surgeon, and anaesthetist."""</span> <span class="n">surgery_times</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'minor'</span><span class="p">:</span> <span class="p">(</span><span class="mi">30</span><span class="p">,</span> <span class="mi">60</span><span class="p">),</span> <span class="s1">'major'</span><span class="p">:</span> <span class="p">(</span><span class="mi">120</span><span class="p">,</span> <span class="mi">240</span><span class="p">),</span> <span class="s1">'emergency'</span><span class="p">:</span> <span class="p">(</span><span class="mi">60</span><span class="p">,</span> <span class="mi">180</span><span class="p">)</span> <span class="p">}</span> <span class="n">min_t</span><span class="p">,</span> <span class="n">max_t</span> <span class="o">=</span> <span class="n">surgery_times</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">surgery_type</span><span class="p">,</span> <span class="p">(</span><span class="mi">60</span><span class="p">,</span> <span class="mi">120</span><span class="p">))</span> <span class="c1"># Need all three resources</span> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">theatres</span><span class="o">.</span><span class="n">request</span><span class="p">()</span> <span class="k">as</span> <span class="n">theatre</span><span class="p">:</span> <span class="k">yield</span> <span class="n">theatre</span> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">surgeons</span><span class="o">.</span><span class="n">request</span><span class="p">()</span> <span class="k">as</span> <span class="n">surgeon</span><span class="p">:</span> <span class="k">yield</span> <span class="n">surgeon</span> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">anaesthetists</span><span class="o">.</span><span class="n">request</span><span class="p">()</span> <span class="k">as</span> <span class="n">anaes</span><span class="p">:</span> <span class="k">yield</span> <span class="n">anaes</span> <span class="c1"># Pre-op</span> <span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">timeout</span><span class="p">(</span><span class="mi">15</span><span class="p">)</span> <span class="c1"># Surgery</span> <span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">timeout</span><span class="p">(</span><span class="n">random</span><span class="o">.</span><span class="n">uniform</span><span class="p">(</span><span class="n">min_t</span><span class="p">,</span> <span class="n">max_t</span><span class="p">))</span> <span class="c1"># Recovery (still in theatre)</span> <span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">timeout</span><span class="p">(</span><span class="mi">30</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">surgeries_completed</span> <span class="o">+=</span> <span class="mi">1</span> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Surgery for patient </span><span class="si">{</span><span class="n">patient_id</span><span class="si">}</span><span class="s2"> completed at </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">now</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span> </code></pre></div> <h2 id="clinic-appointments">Clinic Appointments</h2> <div class="code-block"><pre><span></span><code><span class="k">class</span><span class="w"> </span><span class="nc">OutpatientClinic</span><span class="p">:</span> <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">env</span><span class="p">,</span> <span class="n">num_consultants</span><span class="p">,</span> <span class="n">appointment_slots_per_hour</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span> <span class="o">=</span> <span class="n">env</span> <span class="bp">self</span><span class="o">.</span><span class="n">consultants</span> <span class="o">=</span> <span class="n">simpy</span><span class="o">.</span><span class="n">Resource</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="n">capacity</span><span class="o">=</span><span class="n">num_consultants</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">scheduled_appointments</span> <span class="o">=</span> <span class="n">simpy</span><span class="o">.</span><span class="n">Store</span><span class="p">(</span><span class="n">env</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">patients_seen</span> <span class="o">=</span> <span class="mi">0</span> <span class="bp">self</span><span class="o">.</span><span class="n">no_shows</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">def</span><span class="w"> </span><span class="nf">schedule_appointment</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">patient_id</span><span class="p">,</span> <span class="n">appointment_time</span><span class="p">):</span> <span class="w"> </span><span class="sd">"""Schedule an appointment."""</span> <span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">scheduled_appointments</span><span class="o">.</span><span class="n">put</span><span class="p">({</span> <span class="s1">'patient_id'</span><span class="p">:</span> <span class="n">patient_id</span><span class="p">,</span> <span class="s1">'time'</span><span class="p">:</span> <span class="n">appointment_time</span> <span class="p">})</span> <span class="k">def</span><span class="w"> </span><span class="nf">run_clinic</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">start_time</span><span class="p">,</span> <span class="n">end_time</span><span class="p">):</span> <span class="w"> </span><span class="sd">"""Run clinic for a session."""</span> <span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">timeout</span><span class="p">(</span><span class="n">start_time</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">now</span><span class="p">)</span> <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">now</span> <span class="o"><</span> <span class="n">end_time</span><span class="p">:</span> <span class="k">try</span><span class="p">:</span> <span class="n">appt</span> <span class="o">=</span> <span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">scheduled_appointments</span><span class="o">.</span><span class="n">get</span><span class="p">()</span> <span class="c1"># No-show probability</span> <span class="k">if</span> <span class="n">random</span><span class="o">.</span><span class="n">random</span><span class="p">()</span> <span class="o"><</span> <span class="mf">0.1</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">no_shows</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">continue</span> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">consultants</span><span class="o">.</span><span class="n">request</span><span class="p">()</span> <span class="k">as</span> <span class="n">req</span><span class="p">:</span> <span class="k">yield</span> <span class="n">req</span> <span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">timeout</span><span class="p">(</span><span class="n">random</span><span class="o">.</span><span class="n">uniform</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">25</span><span class="p">))</span> <span class="bp">self</span><span class="o">.</span><span class="n">patients_seen</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">except</span> <span class="n">simpy</span><span class="o">.</span><span class="n">Interrupt</span><span class="p">:</span> <span class="k">break</span> </code></pre></div> <h2 id="ambulance-and-ae-integration">Ambulance and A&E Integration</h2> <div class="code-block"><pre><span></span><code><span class="k">class</span><span class="w"> </span><span class="nc">AmbulanceService</span><span class="p">:</span> <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">env</span><span class="p">,</span> <span class="n">num_ambulances</span><span class="p">,</span> <span class="n">hospital_ed</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span> <span class="o">=</span> <span class="n">env</span> <span class="bp">self</span><span class="o">.</span><span class="n">ambulances</span> <span class="o">=</span> <span class="n">simpy</span><span class="o">.</span><span class="n">Resource</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="n">capacity</span><span class="o">=</span><span class="n">num_ambulances</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">hospital_ed</span> <span class="o">=</span> <span class="n">hospital_ed</span> <span class="bp">self</span><span class="o">.</span><span class="n">calls_responded</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">def</span><span class="w"> </span><span class="nf">respond_to_call</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">call_id</span><span class="p">,</span> <span class="n">location_distance</span><span class="p">):</span> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">ambulances</span><span class="o">.</span><span class="n">request</span><span class="p">()</span> <span class="k">as</span> <span class="n">req</span><span class="p">:</span> <span class="k">yield</span> <span class="n">req</span> <span class="c1"># Travel to scene</span> <span class="n">travel_time</span> <span class="o">=</span> <span class="n">location_distance</span> <span class="o">/</span> <span class="mi">30</span> <span class="c1"># 30 km/h average</span> <span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">timeout</span><span class="p">(</span><span class="n">travel_time</span><span class="p">)</span> <span class="c1"># On-scene time</span> <span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">timeout</span><span class="p">(</span><span class="n">random</span><span class="o">.</span><span class="n">uniform</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">30</span><span class="p">))</span> <span class="c1"># Travel to hospital</span> <span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">timeout</span><span class="p">(</span><span class="n">travel_time</span><span class="p">)</span> <span class="c1"># Handover to ED</span> <span class="n">severity</span> <span class="o">=</span> <span class="n">random</span><span class="o">.</span><span class="n">choice</span><span class="p">([</span><span class="s1">'critical'</span><span class="p">,</span> <span class="s1">'urgent'</span><span class="p">,</span> <span class="s1">'standard'</span><span class="p">])</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">process</span><span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">hospital_ed</span><span class="o">.</span><span class="n">patient_pathway</span><span class="p">(</span><span class="sa">f</span><span class="s2">"amb_</span><span class="si">{</span><span class="n">call_id</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span> <span class="n">severity</span><span class="p">)</span> <span class="p">)</span> <span class="c1"># Turnaround time</span> <span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">timeout</span><span class="p">(</span><span class="mi">15</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">calls_responded</span> <span class="o">+=</span> <span class="mi">1</span> </code></pre></div> <h2 id="complete-hospital-simulation">Complete Hospital Simulation</h2> <div class="code-block"><pre><span></span><code><span class="kn">import</span><span class="w"> </span><span class="nn">simpy</span> <span class="kn">import</span><span class="w"> </span><span class="nn">random</span> <span class="kn">import</span><span class="w"> </span><span class="nn">pandas</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">pd</span> <span class="k">class</span><span class="w"> </span><span class="nc">Hospital</span><span class="p">:</span> <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">env</span><span class="p">,</span> <span class="n">config</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span> <span class="o">=</span> <span class="n">env</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span> <span class="o">=</span> <span class="n">config</span> <span class="c1"># Resources</span> <span class="bp">self</span><span class="o">.</span><span class="n">ed_doctors</span> <span class="o">=</span> <span class="n">simpy</span><span class="o">.</span><span class="n">PriorityResource</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="n">config</span><span class="p">[</span><span class="s1">'ed_doctors'</span><span class="p">])</span> <span class="bp">self</span><span class="o">.</span><span class="n">ed_nurses</span> <span class="o">=</span> <span class="n">simpy</span><span class="o">.</span><span class="n">Resource</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="n">config</span><span class="p">[</span><span class="s1">'ed_nurses'</span><span class="p">])</span> <span class="bp">self</span><span class="o">.</span><span class="n">ed_beds</span> <span class="o">=</span> <span class="n">simpy</span><span class="o">.</span><span class="n">Resource</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="n">config</span><span class="p">[</span><span class="s1">'ed_beds'</span><span class="p">])</span> <span class="bp">self</span><span class="o">.</span><span class="n">ward_beds</span> <span class="o">=</span> <span class="n">simpy</span><span class="o">.</span><span class="n">Resource</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="n">config</span><span class="p">[</span><span class="s1">'ward_beds'</span><span class="p">])</span> <span class="c1"># Statistics</span> <span class="bp">self</span><span class="o">.</span><span class="n">patient_records</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">def</span><span class="w"> </span><span class="nf">ed_patient</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">patient_id</span><span class="p">,</span> <span class="n">severity</span><span class="p">,</span> <span class="n">arrival_time</span><span class="p">):</span> <span class="n">record</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'id'</span><span class="p">:</span> <span class="n">patient_id</span><span class="p">,</span> <span class="s1">'severity'</span><span class="p">:</span> <span class="n">severity</span><span class="p">,</span> <span class="s1">'arrival'</span><span class="p">:</span> <span class="n">arrival_time</span> <span class="p">}</span> <span class="c1"># Triage</span> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">ed_nurses</span><span class="o">.</span><span class="n">request</span><span class="p">()</span> <span class="k">as</span> <span class="n">req</span><span class="p">:</span> <span class="k">yield</span> <span class="n">req</span> <span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">timeout</span><span class="p">(</span><span class="n">random</span><span class="o">.</span><span class="n">uniform</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">10</span><span class="p">))</span> <span class="n">record</span><span class="p">[</span><span class="s1">'triage_complete'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">now</span> <span class="c1"># Doctor</span> <span class="n">priority</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'critical'</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">'urgent'</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="s1">'standard'</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="s1">'minor'</span><span class="p">:</span> <span class="mi">4</span><span class="p">}[</span><span class="n">severity</span><span class="p">]</span> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">ed_doctors</span><span class="o">.</span><span class="n">request</span><span class="p">(</span><span class="n">priority</span><span class="o">=</span><span class="n">priority</span><span class="p">)</span> <span class="k">as</span> <span class="n">req</span><span class="p">:</span> <span class="k">yield</span> <span class="n">req</span> <span class="n">treatment</span> <span class="o">=</span> <span class="n">random</span><span class="o">.</span><span class="n">uniform</span><span class="p">(</span><span class="mi">15</span><span class="p">,</span> <span class="mi">60</span><span class="p">)</span> <span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">timeout</span><span class="p">(</span><span class="n">treatment</span><span class="p">)</span> <span class="n">record</span><span class="p">[</span><span class="s1">'treatment_complete'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">now</span> <span class="c1"># Admission decision</span> <span class="n">admission_prob</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'critical'</span><span class="p">:</span> <span class="mf">0.7</span><span class="p">,</span> <span class="s1">'urgent'</span><span class="p">:</span> <span class="mf">0.4</span><span class="p">,</span> <span class="s1">'standard'</span><span class="p">:</span> <span class="mf">0.15</span><span class="p">,</span> <span class="s1">'minor'</span><span class="p">:</span> <span class="mf">0.05</span><span class="p">}</span> <span class="k">if</span> <span class="n">random</span><span class="o">.</span><span class="n">random</span><span class="p">()</span> <span class="o"><</span> <span class="n">admission_prob</span><span class="p">[</span><span class="n">severity</span><span class="p">]:</span> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">ward_beds</span><span class="o">.</span><span class="n">request</span><span class="p">()</span> <span class="k">as</span> <span class="n">req</span><span class="p">:</span> <span class="k">yield</span> <span class="n">req</span> <span class="n">los</span> <span class="o">=</span> <span class="n">random</span><span class="o">.</span><span class="n">uniform</span><span class="p">(</span><span class="mi">24</span><span class="o">*</span><span class="mi">60</span><span class="p">,</span> <span class="mi">72</span><span class="o">*</span><span class="mi">60</span><span class="p">)</span> <span class="c1"># 1-3 days in minutes</span> <span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">timeout</span><span class="p">(</span><span class="n">los</span><span class="p">)</span> <span class="n">record</span><span class="p">[</span><span class="s1">'admitted'</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span> <span class="n">record</span><span class="p">[</span><span class="s1">'ward_discharge'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">now</span> <span class="k">else</span><span class="p">:</span> <span class="n">record</span><span class="p">[</span><span class="s1">'admitted'</span><span class="p">]</span> <span class="o">=</span> <span class="kc">False</span> <span class="n">record</span><span class="p">[</span><span class="s1">'departure'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">now</span> <span class="bp">self</span><span class="o">.</span><span class="n">patient_records</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">record</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">arrivals</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">patient_id</span> <span class="o">=</span> <span class="mi">0</span> <span class="n">severities</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'critical'</span><span class="p">,</span> <span class="s1">'urgent'</span><span class="p">,</span> <span class="s1">'standard'</span><span class="p">,</span> <span class="s1">'minor'</span><span class="p">]</span> <span class="n">probs</span> <span class="o">=</span> <span class="p">[</span><span class="mf">0.05</span><span class="p">,</span> <span class="mf">0.20</span><span class="p">,</span> <span class="mf">0.35</span><span class="p">,</span> <span class="mf">0.40</span><span class="p">]</span> <span class="k">while</span> <span class="kc">True</span><span class="p">:</span> <span class="c1"># Time-varying arrival rate</span> <span class="n">hour</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">now</span> <span class="o">/</span> <span class="mi">60</span><span class="p">)</span> <span class="o">%</span> <span class="mi">24</span> <span class="k">if</span> <span class="mi">8</span> <span class="o"><=</span> <span class="n">hour</span> <span class="o"><=</span> <span class="mi">20</span><span class="p">:</span> <span class="n">rate</span> <span class="o">=</span> <span class="mi">1</span><span class="o">/</span><span class="mi">8</span> <span class="c1"># Busier during day</span> <span class="k">else</span><span class="p">:</span> <span class="n">rate</span> <span class="o">=</span> <span class="mi">1</span><span class="o">/</span><span class="mi">15</span> <span class="c1"># Quieter at night</span> <span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">timeout</span><span class="p">(</span><span class="n">random</span><span class="o">.</span><span class="n">expovariate</span><span class="p">(</span><span class="n">rate</span><span class="p">))</span> <span class="n">severity</span> <span class="o">=</span> <span class="n">random</span><span class="o">.</span><span class="n">choices</span><span class="p">(</span><span class="n">severities</span><span class="p">,</span> <span class="n">weights</span><span class="o">=</span><span class="n">probs</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">process</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ed_patient</span><span class="p">(</span><span class="n">patient_id</span><span class="p">,</span> <span class="n">severity</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">now</span><span class="p">))</span> <span class="n">patient_id</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">def</span><span class="w"> </span><span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">duration</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">process</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">arrivals</span><span class="p">())</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">until</span><span class="o">=</span><span class="n">duration</span><span class="p">)</span> <span class="k">def</span><span class="w"> </span><span class="nf">analyse</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">patient_records</span><span class="p">)</span> <span class="n">df</span><span class="p">[</span><span class="s1">'wait_for_doctor'</span><span class="p">]</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="s1">'treatment_complete'</span><span class="p">]</span> <span class="o">-</span> <span class="n">df</span><span class="p">[</span><span class="s1">'triage_complete'</span><span class="p">]</span> <span class="n">df</span><span class="p">[</span><span class="s1">'ed_los'</span><span class="p">]</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="s1">'treatment_complete'</span><span class="p">]</span> <span class="o">-</span> <span class="n">df</span><span class="p">[</span><span class="s1">'arrival'</span><span class="p">]</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">=== Hospital Simulation Results ==="</span><span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Total patients: </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">df</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Admissions: </span><span class="si">{</span><span class="n">df</span><span class="p">[</span><span class="s1">'admitted'</span><span class="p">]</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">Wait for doctor (minutes):"</span><span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="n">df</span><span class="o">.</span><span class="n">groupby</span><span class="p">(</span><span class="s1">'severity'</span><span class="p">)[</span><span class="s1">'wait_for_doctor'</span><span class="p">]</span><span class="o">.</span><span class="n">describe</span><span class="p">())</span> <span class="k">return</span> <span class="n">df</span> <span class="c1"># Run</span> <span class="n">random</span><span class="o">.</span><span class="n">seed</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span> <span class="n">env</span> <span class="o">=</span> <span class="n">simpy</span><span class="o">.</span><span class="n">Environment</span><span class="p">()</span> <span class="n">hospital</span> <span class="o">=</span> <span class="n">Hospital</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="p">{</span> <span class="s1">'ed_doctors'</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="s1">'ed_nurses'</span><span class="p">:</span> <span class="mi">4</span><span class="p">,</span> <span class="s1">'ed_beds'</span><span class="p">:</span> <span class="mi">15</span><span class="p">,</span> <span class="s1">'ward_beds'</span><span class="p">:</span> <span class="mi">50</span> <span class="p">})</span> <span class="n">hospital</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">duration</span><span class="o">=</span><span class="mi">24</span><span class="o">*</span><span class="mi">60</span><span class="p">)</span> <span class="c1"># 24 hours</span> <span class="n">results</span> <span class="o">=</span> <span class="n">hospital</span><span class="o">.</span><span class="n">analyse</span><span class="p">()</span> </code></pre></div> <h2 id="summary">Summary</h2> <p>Hospital simulation models: - Patient pathways through departments - Resource constraints (staff, beds, equipment) - Priority-based treatment (triage) - Admission and discharge dynamics - Time-varying demand patterns</p> <p>Simulate to save lives. Optimise to save more.</p> <h2 id="next-steps">Next Steps</h2> <ul> <li><a href="/blog_posts/simpy-call-center-simulation.html">Call Centre Simulation</a></li> <li><a href="/blog_posts/simpy-priorityresource-explained.html">SimPy PriorityResource</a></li> <li><a href="/blog_posts/simpy-queue-model.html">Queue Modelling</a></li> </ul>Build Professional Simulations
Break free from commercial software and learn how to build powerful, industry-standard simulations in Python. The Complete Simulation in Python with SimPy Bootcamp gives you everything you need.
Explore the Bootcamp