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&amp;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">&#39;triage_nurses&#39;</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">&#39;doctors&#39;</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">&#39;beds&#39;</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">&#39;patients&#39;</span><span class="p">:</span> <span class="p">[],</span> <span class="s1">&#39;wait_times&#39;</span><span class="p">:</span> <span class="p">[],</span> <span class="s1">&#39;length_of_stay&#39;</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">&#39;critical&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">&#39;urgent&#39;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="s1">&#39;standard&#39;</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="s1">&#39;minor&#39;</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">&#39;wait_times&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">({</span> <span class="s1">&#39;patient&#39;</span><span class="p">:</span> <span class="n">patient_id</span><span class="p">,</span> <span class="s1">&#39;severity&#39;</span><span class="p">:</span> <span class="n">severity</span><span class="p">,</span> <span class="s1">&#39;wait&#39;</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">&#39;critical&#39;</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">&#39;urgent&#39;</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">&#39;standard&#39;</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">&#39;minor&#39;</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">&#39;critical&#39;</span><span class="p">:</span> <span class="mf">0.8</span><span class="p">,</span> <span class="s1">&#39;urgent&#39;</span><span class="p">:</span> <span class="mf">0.5</span><span class="p">,</span> <span class="s1">&#39;standard&#39;</span><span class="p">:</span> <span class="mf">0.2</span><span class="p">,</span> <span class="s1">&#39;minor&#39;</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">&lt;</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">&#39;length_of_stay&#39;</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">&#39;patients&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">({</span> <span class="s1">&#39;id&#39;</span><span class="p">:</span> <span class="n">patient_id</span><span class="p">,</span> <span class="s1">&#39;severity&#39;</span><span class="p">:</span> <span class="n">severity</span><span class="p">,</span> <span class="s1">&#39;arrival&#39;</span><span class="p">:</span> <span class="n">arrival</span><span class="p">,</span> <span class="s1">&#39;departure&#39;</span><span class="p">:</span> <span class="n">departure</span><span class="p">,</span> <span class="s1">&#39;los&#39;</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">&#39;critical&#39;</span><span class="p">,</span> <span class="s1">&#39;urgent&#39;</span><span class="p">,</span> <span class="s1">&#39;standard&#39;</span><span class="p">,</span> <span class="s1">&#39;minor&#39;</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">&#39;triage_nurses&#39;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="s1">&#39;doctors&#39;</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="s1">&#39;beds&#39;</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">&quot;&quot;&quot;Admit patient, occupy bed for length of stay.&quot;&quot;&quot;</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">&quot;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">&quot;</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">&lt;</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">&quot;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">&quot;</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">&quot;&quot;&quot;Perform surgery requiring theatre, surgeon, and anaesthetist.&quot;&quot;&quot;</span> <span class="n">surgery_times</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">&#39;minor&#39;</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">&#39;major&#39;</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">&#39;emergency&#39;</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">&quot;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">&quot;</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">&quot;&quot;&quot;Schedule an appointment.&quot;&quot;&quot;</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">&#39;patient_id&#39;</span><span class="p">:</span> <span class="n">patient_id</span><span class="p">,</span> <span class="s1">&#39;time&#39;</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">&quot;&quot;&quot;Run clinic for a session.&quot;&quot;&quot;</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">&lt;</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">&lt;</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&amp;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">&#39;critical&#39;</span><span class="p">,</span> <span class="s1">&#39;urgent&#39;</span><span class="p">,</span> <span class="s1">&#39;standard&#39;</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">&quot;amb_</span><span class="si">{</span><span class="n">call_id</span><span class="si">}</span><span class="s2">&quot;</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">&#39;ed_doctors&#39;</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">&#39;ed_nurses&#39;</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">&#39;ed_beds&#39;</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">&#39;ward_beds&#39;</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">&#39;id&#39;</span><span class="p">:</span> <span class="n">patient_id</span><span class="p">,</span> <span class="s1">&#39;severity&#39;</span><span class="p">:</span> <span class="n">severity</span><span class="p">,</span> <span class="s1">&#39;arrival&#39;</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">&#39;triage_complete&#39;</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">&#39;critical&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">&#39;urgent&#39;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="s1">&#39;standard&#39;</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="s1">&#39;minor&#39;</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">&#39;treatment_complete&#39;</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">&#39;critical&#39;</span><span class="p">:</span> <span class="mf">0.7</span><span class="p">,</span> <span class="s1">&#39;urgent&#39;</span><span class="p">:</span> <span class="mf">0.4</span><span class="p">,</span> <span class="s1">&#39;standard&#39;</span><span class="p">:</span> <span class="mf">0.15</span><span class="p">,</span> <span class="s1">&#39;minor&#39;</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">&lt;</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">&#39;admitted&#39;</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">&#39;ward_discharge&#39;</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">&#39;admitted&#39;</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">&#39;departure&#39;</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">&#39;critical&#39;</span><span class="p">,</span> <span class="s1">&#39;urgent&#39;</span><span class="p">,</span> <span class="s1">&#39;standard&#39;</span><span class="p">,</span> <span class="s1">&#39;minor&#39;</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">&lt;=</span> <span class="n">hour</span> <span class="o">&lt;=</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">&#39;wait_for_doctor&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="s1">&#39;treatment_complete&#39;</span><span class="p">]</span> <span class="o">-</span> <span class="n">df</span><span class="p">[</span><span class="s1">&#39;triage_complete&#39;</span><span class="p">]</span> <span class="n">df</span><span class="p">[</span><span class="s1">&#39;ed_los&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="s1">&#39;treatment_complete&#39;</span><span class="p">]</span> <span class="o">-</span> <span class="n">df</span><span class="p">[</span><span class="s1">&#39;arrival&#39;</span><span class="p">]</span> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">=== Hospital Simulation Results ===&quot;</span><span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;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">&quot;</span><span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Admissions: </span><span class="si">{</span><span class="n">df</span><span class="p">[</span><span class="s1">&#39;admitted&#39;</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">&quot;</span><span class="p">)</span> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Wait for doctor (minutes):&quot;</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">&#39;severity&#39;</span><span class="p">)[</span><span class="s1">&#39;wait_for_doctor&#39;</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">&#39;ed_doctors&#39;</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="s1">&#39;ed_nurses&#39;</span><span class="p">:</span> <span class="mi">4</span><span class="p">,</span> <span class="s1">&#39;ed_beds&#39;</span><span class="p">:</span> <span class="mi">15</span><span class="p">,</span> <span class="s1">&#39;ward_beds&#39;</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