<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>R | appareto</title>
    <link>/category/r/</link>
      <atom:link href="/category/r/index.xml" rel="self" type="application/rss+xml" />
    <description>R</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>nl-nl</language><copyright>appareto by bridges It</copyright><lastBuildDate>Fri, 16 Apr 2021 00:00:00 +0000</lastBuildDate>
    <image>
      <url>/images/icon_hu0dd4792f4cd0cbf7f048c96fd32a1834_4301_512x512_fill_lanczos_center_2.png</url>
      <title>R</title>
      <link>/category/r/</link>
    </image>
    
    <item>
      <title>Gebruik CBS Open Data in R</title>
      <link>/2021/04/16/gebruik-cbs-open-data-in-r/</link>
      <pubDate>Fri, 16 Apr 2021 00:00:00 +0000</pubDate>
      <guid>/2021/04/16/gebruik-cbs-open-data-in-r/</guid>
      <description>
&lt;script src=&#34;/2021/04/16/gebruik-cbs-open-data-in-r/
index.nl_files/header-attrs/header-attrs.js&#34;&gt;&lt;/script&gt;


&lt;div id=&#34;inleiding&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Inleiding&lt;/h1&gt;
&lt;p&gt;In deze post een eenvoudig voorbeeld hoe je makkelijk open data van het CBS kunt downloaden m.b.v. &lt;a href=&#34;https://cran.r-project.org/web/packages/cbsodataR/&#34;&gt;cbsodataR&lt;/a&gt; om er daarna een analyse op te doen in R, bv om een tree te bouwen m.b.v. recursive partitioning (party)&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;de-cbs-data-api&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;De CBS data API&lt;/h1&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;library(tidyverse)
library(cbsodataR)
library(party)
library(knitr)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Om informatie over alle datasets te krijgen kun je ‘cbs_get_datasets’ gebruiken&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;ds &amp;lt;- cbs_get_datasets(&amp;quot;Language&amp;quot; = &amp;quot;en&amp;quot;)
print(paste(nrow(ds), &amp;quot;datasets&amp;quot;))&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;844 datasets&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dan krijg je 844 records met de volgende informatie per dataset:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;names(ds)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;##  [1] &amp;quot;Updated&amp;quot;             &amp;quot;Identifier&amp;quot;          &amp;quot;Title&amp;quot;              
##  [4] &amp;quot;ShortTitle&amp;quot;          &amp;quot;ShortDescription&amp;quot;    &amp;quot;Summary&amp;quot;            
##  [7] &amp;quot;Modified&amp;quot;            &amp;quot;MetaDataModified&amp;quot;    &amp;quot;ReasonDelivery&amp;quot;     
## [10] &amp;quot;ExplanatoryText&amp;quot;     &amp;quot;OutputStatus&amp;quot;        &amp;quot;Source&amp;quot;             
## [13] &amp;quot;Language&amp;quot;            &amp;quot;Catalog&amp;quot;             &amp;quot;Frequency&amp;quot;          
## [16] &amp;quot;Period&amp;quot;              &amp;quot;SummaryAndLinks&amp;quot;     &amp;quot;ApiUrl&amp;quot;             
## [19] &amp;quot;FeedUrl&amp;quot;             &amp;quot;DefaultPresentation&amp;quot; &amp;quot;DefaultSelection&amp;quot;   
## [22] &amp;quot;GraphTypes&amp;quot;          &amp;quot;RecordCount&amp;quot;         &amp;quot;ColumnCount&amp;quot;        
## [25] &amp;quot;SearchPriority&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&#34;kerncijfers-buurten-en-wijken&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Kerncijfers Buurten en Wijken&lt;/h1&gt;
&lt;p&gt;Ook kun je via de API zoeken in de beschrijvingen van de datasets en ben voor nu geinteresseerd in de Kerncijfers wijken en buurten. De resultaten zijn gesorteerd op basis van een query score, de eerste 5 zijn:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;res &amp;lt;- cbs_search(c(&amp;quot;Kerncijfers,wijken,buurten&amp;quot;), 
                  language=&amp;quot;nl&amp;quot;, 
                  format=&amp;quot;raw&amp;quot;, 
                  verbose = FALSE)
kable(res$response$docs %&amp;gt;% select(1:2) %&amp;gt;% head(5))&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr class=&#34;header&#34;&gt;
&lt;th align=&#34;left&#34;&gt;PublicationKey&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;PublicationTitle&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class=&#34;odd&#34;&gt;
&lt;td align=&#34;left&#34;&gt;84799NED&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Kerncijfers wijken en buurten 2020&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;even&#34;&gt;
&lt;td align=&#34;left&#34;&gt;84583NED&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Kerncijfers wijken en buurten 2019&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;odd&#34;&gt;
&lt;td align=&#34;left&#34;&gt;84286NED&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Kerncijfers wijken en buurten 2018&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;even&#34;&gt;
&lt;td align=&#34;left&#34;&gt;83765NED&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Kerncijfers wijken en buurten 2017&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;odd&#34;&gt;
&lt;td align=&#34;left&#34;&gt;83487NED&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Kerncijfers wijken en buurten 2016&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Na download lijkt de dataset van 2020 op moment van schrijven niet compleet vandaar verder met de versie van 2019 met ID &lt;strong&gt;84583NED&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;metadata &amp;lt;- cbs_get_meta(&amp;quot;84583NED&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dat zijn 157 variabelen, in deze post gebruik ik een beperkt aantal variabelen op gemeenteniveau gerelateerd aan stedelijkheid en type bedrijven in de gemeente. We halen wel de hele dataset op en filteren dan lokaal om optimale controle te hebben. Het is ook mogelijk via de API te filteren, maar dat geeft soms onverwachte resultaten omdat er bijvoorbeeld extra spaties achter een waarde staan.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;data_all &amp;lt;- cbs_get_data(&amp;quot;84583NED&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Van de opgehaalde data wil ik met de volgende variabelen verder werken.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;mycols &amp;lt;- c(&amp;quot;Gemeentenaam_1&amp;quot;,
            &amp;quot;MateVanStedelijkheid_115&amp;quot;,  
            &amp;quot;BedrijfsvestigingenTotaal_91&amp;quot;, 
            &amp;quot;ALandbouwBosbouwEnVisserij_92&amp;quot;,
            &amp;quot;BFNijverheidEnEnergie_93&amp;quot;, 
            &amp;quot;GIHandelEnHoreca_94&amp;quot;,
            &amp;quot;HJVervoerInformatieEnCommunicatie_95&amp;quot;,
            &amp;quot;KLFinancieleDienstenOnroerendGoed_96&amp;quot;,
            &amp;quot;MNZakelijkeDienstverlening_97&amp;quot;,       
            &amp;quot;RUCultuurRecreatieOverigeDiensten_98&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;En alleen op gemeente niveau, niet voor bv buurten of wijken en ‘versimpeling’ van de namen van de variabelen.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;data_gemeentes &amp;lt;- data_all %&amp;gt;% 
  filter(str_detect(SoortRegio_2, &amp;quot;Gemeente&amp;quot;)) %&amp;gt;%
  select(all_of(mycols)) 

data_gemeentes &amp;lt;- data_gemeentes %&amp;gt;% 
    rename_with(str_replace, pattern = &amp;quot;_\\d+$&amp;quot;, replacement = &amp;quot;&amp;quot;)

names(data_gemeentes)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;##  [1] &amp;quot;Gemeentenaam&amp;quot;                      &amp;quot;MateVanStedelijkheid&amp;quot;             
##  [3] &amp;quot;BedrijfsvestigingenTotaal&amp;quot;         &amp;quot;ALandbouwBosbouwEnVisserij&amp;quot;       
##  [5] &amp;quot;BFNijverheidEnEnergie&amp;quot;             &amp;quot;GIHandelEnHoreca&amp;quot;                 
##  [7] &amp;quot;HJVervoerInformatieEnCommunicatie&amp;quot; &amp;quot;KLFinancieleDienstenOnroerendGoed&amp;quot;
##  [9] &amp;quot;MNZakelijkeDienstverlening&amp;quot;        &amp;quot;RUCultuurRecreatieOverigeDiensten&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ik bewerk de data om deze geschikt te maken voor de analyse in gedachte, o.a. type bedrijven als percentage van het totaal aantal bedrijven en mate van stedelijkheid als factor.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;frac &amp;lt;- function(deel, totaal) {
  deel/totaal*100
  }

data_gemeentes_analyse &amp;lt;- data_gemeentes %&amp;gt;% 
  as_tibble() %&amp;gt;%
  dplyr::mutate(ALandbouwBosbouwEnVisserijF = frac(ALandbouwBosbouwEnVisserij, BedrijfsvestigingenTotaal),
                BFNijverheidEnEnergieF = frac(BFNijverheidEnEnergie, BedrijfsvestigingenTotaal),
                GIHandelEnHorecaF = frac(GIHandelEnHoreca, BedrijfsvestigingenTotaal),
                HJVervoerInformatieEnCommunicatieF = frac(HJVervoerInformatieEnCommunicatie, BedrijfsvestigingenTotaal),
                KLFinancieleDienstenOnroerendGoedF = frac(KLFinancieleDienstenOnroerendGoed, BedrijfsvestigingenTotaal),
                MNZakelijkeDienstverleningF = frac(MNZakelijkeDienstverlening, BedrijfsvestigingenTotaal),
                RUCultuurRecreatieOverigeDienstenF = frac(RUCultuurRecreatieOverigeDiensten,BedrijfsvestigingenTotaal)
                ) %&amp;gt;%
  mutate(MateVanStedelijkheid = as_factor(MateVanStedelijkheid))&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&#34;mate-van-stedelijkheid-a.d.h.v.-percentage-landbouw&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Mate van stedelijkheid a.d.h.v. percentage landbouw&lt;/h1&gt;
&lt;p&gt;Om een idee te krijgen van bv het percentage landbouw, bosbouw en visserij verdeeld over de gemeentes:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;qplot(data_gemeentes_analyse$ALandbouwBosbouwEnVisserijF, geom = &amp;quot;histogram&amp;quot;, bins=30)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;staticunnamed-chunk-9-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;landbouwtree &amp;lt;- ctree(MateVanStedelijkheid ~ ALandbouwBosbouwEnVisserijF, data = data_gemeentes_analyse)
plot(landbouwtree, 
     main=&amp;quot;Mate van stedelijkheid a.d.h.v. het % bedrijven landbouw, bosbouw en visserij&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;staticunnamed-chunk-10-1.png&#34; width=&#34;1440&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;voorspel_stedelijkheid &amp;lt;- function(ptree, data, gemeente) {
  gemeente_sample &amp;lt;- data %&amp;gt;% 
    filter(stringr::str_detect(Gemeentenaam, gemeente)) %&amp;gt;% 
    select(ALandbouwBosbouwEnVisserijF)
  pred &amp;lt;- -1
  if (nrow(gemeente_sample &amp;gt; 0)) {
    pred &amp;lt;- Predict(ptree, as.list(gemeente_sample))    
  } else {
    print(paste(&amp;quot;Geen data voor&amp;quot;, gemeente))
  }

  pred
}

voorspel_stedelijkheid_ok &amp;lt;- function(ptree, data, gemeente) {
  gemeente_sample &amp;lt;- data %&amp;gt;% filter(stringr::str_detect(Gemeentenaam, gemeente)) 
  pred &amp;lt;- voorspel_stedelijkheid(ptree, data, gemeente)
  pred == gemeente_sample$MateVanStedelijkheid[1]
}

voorspel_stedelijkheid_ok(landbouwtree, data_gemeentes_analyse, &amp;quot;Oss&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] TRUE&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;voorspel_stedelijkheid_ok(landbouwtree, data_gemeentes_analyse, &amp;quot;Waalwijk&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] FALSE&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;voorspel_stedelijkheid_ok(landbouwtree, data_gemeentes_analyse, &amp;quot;Eindhoven&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] TRUE&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Een overzicht maken van de voorspellingen t.o.v. echte waarde:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;voorspelling_ok &amp;lt;- map(data_gemeentes_analyse$Gemeentenaam, 
               function(x) { 
                 as.integer(
                   voorspel_stedelijkheid_ok(landbouwtree, 
                                         data_gemeentes_analyse, 
                                         x)) }) %&amp;gt;% flatten_int()&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;Geen data voor Bergen (L.)                             &amp;quot;
## [1] &amp;quot;Geen data voor Bergen (NH.)                            &amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hoe vaak is deze voorspelling goed?&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;barplot(table(voorspelling_ok), names.arg = c(&amp;quot;fout&amp;quot;, &amp;quot;goed&amp;quot;))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;staticunnamed-chunk-13-1.png&#34; width=&#34;672&#34; /&gt;
Is niet meteen indrukwekkend. Om het effect te zien van het gebruik van de de classificatie tree hieronder het verhaal als er random ‘voorspeld’ zou zijn.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;voorspel_stedelijkheid_random &amp;lt;- function(ptree, data, gemeente) {
  pred &amp;lt;- sample(1:5, 1)
}

voorspel_stedelijkheid_random_ok &amp;lt;- function(ptree, data, gemeente) {
  gemeente_sample &amp;lt;- data %&amp;gt;% dplyr::filter(stringr::str_detect(Gemeentenaam, gemeente)) 
  pred &amp;lt;- voorspel_stedelijkheid_random(ptree, data, gemeente)
  pred == gemeente_sample$MateVanStedelijkheid[1]
}

voorspelling_random &amp;lt;- map(data_gemeentes_analyse$Gemeentenaam, function(x) { 
  as.integer(voorspel_stedelijkheid_random_ok(NULL, data_gemeentes_analyse, x)) }) %&amp;gt;% 
  flatten_int()

par(mfrow = c(1:2))
barplot(table(voorspelling_random), names.arg = c(&amp;quot;fout&amp;quot;, &amp;quot;goed&amp;quot;))
barplot(table(voorspelling_ok), names.arg = c(&amp;quot;fout&amp;quot;, &amp;quot;goed&amp;quot;))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;staticunnamed-chunk-14-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;mate-van-stedelijkheid-a.d.h.v.-percentage-type-bedrijven&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Mate van stedelijkheid a.d.h.v. percentage type bedrijven&lt;/h1&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;partybedrijven &amp;lt;- ctree(MateVanStedelijkheid ~ ., 
                        data = data_gemeentes_analyse %&amp;gt;% select(-Gemeentenaam))
plot(partybedrijven, 
     main=&amp;quot;Mate van stedelijkheid a.d.h.v. % verschillende types bedrijven&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;staticblah-1.png&#34; width=&#34;1440&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;voorspel_stedelijkheid2 &amp;lt;- function(ptree, data, gemeente) {
  gemeente_sample &amp;lt;- data %&amp;gt;% filter(stringr::str_detect(Gemeentenaam, gemeente)) %&amp;gt;% 
    select(-Gemeentenaam, -MateVanStedelijkheid)
  pred &amp;lt;- -1
  if (nrow(gemeente_sample &amp;gt; 0)) {
    pred &amp;lt;- Predict(ptree, as.list(gemeente_sample))    
  } else {
    print(paste(&amp;quot;Geen data voor&amp;quot;, gemeente))
  }

  pred
}

voorspel_stedelijkheid_ok2 &amp;lt;- function(ptree, data, gemeente) {
  gemeente_sample &amp;lt;- data %&amp;gt;% 
    dplyr::filter(stringr::str_detect(Gemeentenaam, gemeente)) 
  pred &amp;lt;- voorspel_stedelijkheid2(ptree, data, gemeente)
  pred == gemeente_sample$MateVanStedelijkheid[1]
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;voorspelling_ok2 &amp;lt;- map(data_gemeentes_analyse$Gemeentenaam, function(x) { 
  as.integer(voorspel_stedelijkheid_ok2(partybedrijven, data_gemeentes_analyse, x)) }) %&amp;gt;% 
  flatten_int()&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;Geen data voor Bergen (L.)                             &amp;quot;
## [1] &amp;quot;Geen data voor Bergen (NH.)                            &amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;par(mfrow = c(1:2))
barplot(table(voorspelling_ok), names.arg = c(&amp;quot;fout&amp;quot;, &amp;quot;goed&amp;quot;))
barplot(table(voorspelling_ok2), names.arg = c(&amp;quot;fout&amp;quot;, &amp;quot;goed&amp;quot;))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;staticunnamed-chunk-17-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Dat is maar een kleine verbetering, maar genoeg voor hier en nu, qua analyse meer in de toekomst. Het ging vooral om snel wat te laten zien m.b.t. cbsodataR.&lt;/p&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Discrete Event Simulation van teststraat modellen</title>
      <link>/2021/03/12/discrete-event-simulation-van-teststraat-modellen/</link>
      <pubDate>Fri, 12 Mar 2021 00:00:00 +0000</pubDate>
      <guid>/2021/03/12/discrete-event-simulation-van-teststraat-modellen/</guid>
      <description>
&lt;script src=&#34;/2021/03/12/discrete-event-simulation-van-teststraat-modellen/
index.nl_files/header-attrs/header-attrs.js&#34;&gt;&lt;/script&gt;


&lt;div id=&#34;inleiding&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Inleiding&lt;/h1&gt;
&lt;p&gt;De &lt;em&gt;Toolkit inrichten testlocatie voor antigeentesten&lt;/em&gt;&lt;a href=&#34;#fn1&#34; class=&#34;footnote-ref&#34; id=&#34;fnref1&#34;&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt; is een uitgebreid document om bedrijven te helpen met het opzetten van een (snel)testlocatie. Daar worden onder andere een aantal praktische modellen beschreven qua opzet en bemanning. In deze post een introductie hoe &lt;em&gt;Discrete Event Simulatie&lt;/em&gt;&lt;a href=&#34;#fn2&#34; class=&#34;footnote-ref&#34; id=&#34;fnref2&#34;&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt; kan helpen bij het inzicht krijgen en eventueel optimaliseren van een model.&lt;/p&gt;
&lt;p&gt;Hieronder gebruik ik de naamgeving uit het hierboven genoemde document voor zover ze hier relevant zijn: &lt;em&gt;inchecker&lt;/em&gt;, &lt;em&gt;testafnemer&lt;/em&gt; en &lt;em&gt;testverwerker&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;We veronderstellen voor de rest van deze simulatie de volgende tijden in minuten.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;inchecktijd &amp;lt;- 1
testafneemtijd &amp;lt;- 3
testverwerktijd &amp;lt;- 1
geopendtijd &amp;lt;- 8 * 60&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hierbij gaan we er vanuit dat er 1 &lt;em&gt;inchecker&lt;/em&gt; fulltime beschikbaar is en dat de checkin 1 minuut kost. Daarna gaat de client door naar de &lt;em&gt;testafnemer&lt;/em&gt; en dat neemt ongeveer 3 minuten in beslag en daarna wordt de test verwerkt door de &lt;em&gt;testverwerker&lt;/em&gt;. De client hoeft daarna niet te wachten op de uitslag, maar krijgt deze digitaal binnen 1 uur toegestuurd. De testlocatie is gedurende 8 uur open.&lt;/p&gt;
&lt;p&gt;Voor de simulatie worden de &lt;em&gt;simmer R packages&lt;/em&gt;&lt;a href=&#34;#fn3&#34; class=&#34;footnote-ref&#34; id=&#34;fnref3&#34;&gt;&lt;sup&gt;3&lt;/sup&gt;&lt;/a&gt; gebruikt.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;library(simmer)
library(simmer.plot)
library(simmer.bricks)
library(parallel)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&#34;simulatie-teststraat-model-2-variaties&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Simulatie teststraat model 2 variaties&lt;/h1&gt;
&lt;p&gt;Model 2 is bedoeld als een kleine teststraat met maximale bezetting. We veronderstellen het volgende m.b.t. hoe frequent er een nieuwe test client arriveert.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;clientfrequentie_model2 &amp;lt;- 1/5 # 1 per 5 minuten&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Om een indruk te krijgen van de daarbij behorende distributie die in de simulaties hieronder gebruikt wordt een histogram:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;qplot(rexp(1000, clientfrequentie_model2), geom = &amp;quot;histogram&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;staticunnamed-chunk-2-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;div id=&#34;model-2-basis-teststraat&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Model 2 basis teststraat&lt;/h2&gt;
&lt;p&gt;We starten met een basisversie van model 2, onderstaand de definitie van een teststraat traject voor een client.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;set.seed(123)
teststraat_model2_traject &amp;lt;- trajectory(&amp;quot;Teststraat model2 traject&amp;quot;) %&amp;gt;%
    visit(resource =&amp;quot;inchecker&amp;quot;, 
          task = function() rexp(1, 1/inchecktijd)) %&amp;gt;%
    visit(resource =&amp;quot;testafnemer&amp;quot;, 
          task = function() rexp(1, 1/testafneemtijd)) %&amp;gt;%
    visit(resource =&amp;quot;testverwerker&amp;quot;, 
          task = function() rexp(1, 1)/testverwerktijd)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hieronder definieren een testlocatie simulator met 1 instantie van ieder van de eerder genoemde resources. Zoals gezegd komen de clienten volgens een bepaald random proces aan. We berpek het in eerste instantie tot 10 clienten.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;testlocatie &amp;lt;- simmer(&amp;quot;teststraatsimulator&amp;quot;) %&amp;gt;%
  add_resource(&amp;quot;inchecker&amp;quot;, 1) %&amp;gt;%
  add_resource(&amp;quot;testafnemer&amp;quot;, 1) %&amp;gt;%
  add_resource(&amp;quot;testverwerker&amp;quot;, 1) %&amp;gt;%
  add_generator(&amp;quot;ts_m2_a&amp;quot;, teststraat_model2_traject, 
                function() {c(0, rexp(9, clientfrequentie_model2), -1)})&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nu de definitie van de simulatie compleet is kunnen we deze uitvoeren, omdat er maar 10 clienten zijn zal de simulatie eerder stoppen dan de geconfigureerde 8 uren.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;testlocatie %&amp;gt;%
  run(until = geopendtijd ) %&amp;gt;%
  now()&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] 40.49252&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Na ongeveer 40 minuten uur hebben alle clienten het testtraject doorlopen. Hieronder nog een overzicht van de clienten gesorteerd naar aflopende wachttijd.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;testlocatie %&amp;gt;%
  get_mon_arrivals() %&amp;gt;%
  transform(waiting_time = 
              round(end_time - start_time - activity_time, digits = 2)) %&amp;gt;%
  dplyr::arrange(desc(waiting_time)) %&amp;gt;% 
  knitr::kable(&amp;quot;html&amp;quot;, digits = 2)&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:left;&#34;&gt;
name
&lt;/th&gt;
&lt;th style=&#34;text-align:right;&#34;&gt;
start_time
&lt;/th&gt;
&lt;th style=&#34;text-align:right;&#34;&gt;
end_time
&lt;/th&gt;
&lt;th style=&#34;text-align:right;&#34;&gt;
activity_time
&lt;/th&gt;
&lt;th style=&#34;text-align:left;&#34;&gt;
finished
&lt;/th&gt;
&lt;th style=&#34;text-align:right;&#34;&gt;
replication
&lt;/th&gt;
&lt;th style=&#34;text-align:right;&#34;&gt;
waiting_time
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
ts_m2_a8
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
18.06
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
39.27
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
9.08
&lt;/td&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
TRUE
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
12.13
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
ts_m2_a6
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
15.77
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
29.34
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
3.22
&lt;/td&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
TRUE
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
10.35
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
ts_m2_a7
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
17.34
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
31.45
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
4.35
&lt;/td&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
TRUE
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
9.76
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
ts_m2_a5
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
14.18
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
29.08
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
8.14
&lt;/td&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
TRUE
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
6.75
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
ts_m2_a9
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
31.70
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
40.49
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
3.27
&lt;/td&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
TRUE
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
5.53
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
ts_m2_a4
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
13.90
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
23.99
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
9.66
&lt;/td&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
TRUE
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
0.43
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
ts_m2_a0
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
0.00
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
3.52
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
3.52
&lt;/td&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
TRUE
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
0.00
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
ts_m2_a1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
4.22
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
5.82
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1.60
&lt;/td&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
TRUE
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
0.00
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
ts_m2_a2
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
7.10
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
13.12
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
6.02
&lt;/td&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
TRUE
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
0.00
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
ts_m2_a3
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
13.75
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
17.83
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
4.09
&lt;/td&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
TRUE
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
0.00
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;We kunnen ook naar het gemiddelde gebruik van de resources kijken, zegt nu niet zoveel vanwege het beperkte aantal clienten.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;resources &amp;lt;- get_mon_resources(testlocatie)
plot(resources, metric = &amp;quot;utilization&amp;quot;) +
  ggtitle(&amp;quot;Resource bezetting&amp;quot;) +
  ylab(&amp;quot;bezetting&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;staticunnamed-chunk-7-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Verdeeld over de simulatietijd ziet het er als volgt uit.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;plot(resources, metric = &amp;quot;usage&amp;quot;,  items = &amp;quot;server&amp;quot;) +
  labs(title=&amp;quot;Resource gebruik gedurende de simulatie&amp;quot;) +
  xlab(&amp;quot;tijd in minuten&amp;quot;) +
  ylab(&amp;quot;in gebruik&amp;quot;) &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;staticunnamed-chunk-8-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;model-2-teststraat-met-2-testafnemers-en-gedeelde-wachtrij&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Model 2 teststraat met 2 testafnemers en gedeelde wachtrij&lt;/h2&gt;
&lt;p&gt;In deze variatie van de model 2 teststraat voegen we een extra testafnemer die wel de wachtrij deelt met de andere testafnemer. Het traject houden we hetzelfde als voor het basismodel en gaan weer uit van 10 clienten om diagrammen overzichtelijk te houden.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;set.seed(123)
testlocatie_model2_2verwerkers &amp;lt;- simmer(&amp;quot;teststraatsimulator2&amp;quot;) %&amp;gt;%
  add_resource(&amp;quot;inchecker&amp;quot;, 1) %&amp;gt;%
  add_resource(&amp;quot;testafnemer&amp;quot;, 2) %&amp;gt;%
  add_resource(&amp;quot;testverwerker&amp;quot;, 1) %&amp;gt;%
  add_generator(&amp;quot;ts_m2_b&amp;quot;, teststraat_model2_traject, 
                function() {c(0, rexp(9, 1/clientfrequentie_model2), -1)})&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nu de definitie van de simulatie weer compleet is kunnen we deze uitvoeren:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;testlocatie_model2_2verwerkers %&amp;gt;%
  run(until = geopendtijd ) %&amp;gt;%
  now()&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] 20.14837&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Verschillen zijn niet heel groot omdat het een beperkt&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;testlocatie_model2_2verwerkers %&amp;gt;%
  get_mon_arrivals() %&amp;gt;%
  transform(waiting_time = 
              round(end_time - start_time - activity_time, digits = 2)) %&amp;gt;%
  dplyr::arrange(desc(waiting_time)) %&amp;gt;%
  knitr::kable(&amp;quot;html&amp;quot;, digits = 2)&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:left;&#34;&gt;
name
&lt;/th&gt;
&lt;th style=&#34;text-align:right;&#34;&gt;
start_time
&lt;/th&gt;
&lt;th style=&#34;text-align:right;&#34;&gt;
end_time
&lt;/th&gt;
&lt;th style=&#34;text-align:right;&#34;&gt;
activity_time
&lt;/th&gt;
&lt;th style=&#34;text-align:left;&#34;&gt;
finished
&lt;/th&gt;
&lt;th style=&#34;text-align:right;&#34;&gt;
replication
&lt;/th&gt;
&lt;th style=&#34;text-align:right;&#34;&gt;
waiting_time
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
ts_m2_b8
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
0.72
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
16.05
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
3.60
&lt;/td&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
TRUE
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
11.72
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
ts_m2_b9
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1.27
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
20.15
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
8.41
&lt;/td&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
TRUE
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
10.47
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
ts_m2_b7
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
0.69
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
14.16
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
3.92
&lt;/td&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
TRUE
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
9.55
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
ts_m2_b6
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
0.63
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
14.79
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
6.46
&lt;/td&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
TRUE
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
7.70
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
ts_m2_b4
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
0.56
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
13.37
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
6.53
&lt;/td&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
TRUE
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
6.28
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
ts_m2_b5
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
0.57
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
12.14
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
6.26
&lt;/td&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
TRUE
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
5.31
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
ts_m2_b3
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
0.55
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
6.92
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
4.07
&lt;/td&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
TRUE
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
2.31
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
ts_m2_b2
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
0.28
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
8.42
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
6.47
&lt;/td&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
TRUE
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1.67
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
ts_m2_b1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
0.17
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
2.26
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
2.09
&lt;/td&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
TRUE
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
0.00
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
ts_m2_b0
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
0.00
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
4.01
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
4.01
&lt;/td&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
TRUE
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
0.00
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;resources &amp;lt;- get_mon_resources(testlocatie_model2_2verwerkers)
plot(resources, metric = &amp;quot;utilization&amp;quot;) +
  ggtitle(&amp;quot;Resource bezetting&amp;quot;) +
  ylab(&amp;quot;bezetting&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;staticunnamed-chunk-12-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;plot(resources, metric = &amp;quot;usage&amp;quot;,  items = &amp;quot;server&amp;quot;) +
  labs(title=&amp;quot;Resource gebruik&amp;quot;) +
  xlab(&amp;quot;tijd in minuten&amp;quot;) +
  ylab(&amp;quot;in gebruik&amp;quot;) &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;staticunnamed-chunk-13-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;model-2-met-2-testafnemer-rijen-en-kortste-rij-principe&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Model 2 met 2 testafnemer-rijen en kortste rij principe&lt;/h2&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;set.seed(123)
teststraat_model2_parallel  &amp;lt;- trajectory(&amp;quot;Teststraat model2 traject 2&amp;quot;) %&amp;gt;%    
  visit(resource =&amp;quot;inchecker&amp;quot;, task = function() rexp(1, 1/inchecktijd)) %&amp;gt;%
  select(c(&amp;quot;testafnemer1&amp;quot;, &amp;quot;testafnemer2&amp;quot;), policy = &amp;quot;shortest-queue&amp;quot;) %&amp;gt;%
  seize_selected() %&amp;gt;%
  timeout(function() {rexp(1, 1/testafneemtijd)}) %&amp;gt;%
  release_selected() %&amp;gt;%
  visit(resource =&amp;quot;testverwerker&amp;quot;, 
        task = function() rexp(1, 1/testverwerktijd))

testlocatie_model2_parallel &amp;lt;- simmer(&amp;quot;teststraatsimulator3&amp;quot;) %&amp;gt;%
  add_resource(&amp;quot;inchecker&amp;quot;, 1) %&amp;gt;%
  add_resource(&amp;quot;testafnemer1&amp;quot;, 1) %&amp;gt;%
  add_resource(&amp;quot;testafnemer2&amp;quot;, 1) %&amp;gt;%
  add_resource(&amp;quot;testverwerker&amp;quot;, 1) %&amp;gt;%
  add_generator(&amp;quot;ts_m2_c&amp;quot;, teststraat_model2_parallel, 
                function() {c(0, rexp(9, clientfrequentie_model2), -1)})&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;testlocatie_model2_parallel %&amp;gt;%
  run(until = geopendtijd ) %&amp;gt;%
  now()&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] 36.6776&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;testlocatie_model2_parallel %&amp;gt;%
  get_mon_arrivals() %&amp;gt;%
  transform(waiting_time = 
              round(end_time - start_time - activity_time, digits = 2)) %&amp;gt;%
  dplyr::arrange(desc(waiting_time)) %&amp;gt;% 
  knitr::kable(&amp;quot;html&amp;quot;, digits = 2)&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:left;&#34;&gt;
name
&lt;/th&gt;
&lt;th style=&#34;text-align:right;&#34;&gt;
start_time
&lt;/th&gt;
&lt;th style=&#34;text-align:right;&#34;&gt;
end_time
&lt;/th&gt;
&lt;th style=&#34;text-align:right;&#34;&gt;
activity_time
&lt;/th&gt;
&lt;th style=&#34;text-align:left;&#34;&gt;
finished
&lt;/th&gt;
&lt;th style=&#34;text-align:right;&#34;&gt;
replication
&lt;/th&gt;
&lt;th style=&#34;text-align:right;&#34;&gt;
waiting_time
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
ts_m2_c7
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
17.34
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
30.96
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
3.50
&lt;/td&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
TRUE
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
10.12
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
ts_m2_c8
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
18.06
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
31.97
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
7.89
&lt;/td&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
TRUE
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
6.02
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
ts_m2_c6
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
15.77
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
29.73
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
8.48
&lt;/td&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
TRUE
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
5.49
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
ts_m2_c5
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
14.18
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
25.19
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
6.81
&lt;/td&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
TRUE
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
4.19
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
ts_m2_c4
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
13.90
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
22.45
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
8.12
&lt;/td&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
TRUE
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
0.43
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
ts_m2_c0
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
0.00
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
3.52
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
3.52
&lt;/td&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
TRUE
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
0.00
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
ts_m2_c1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
4.22
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
5.82
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1.60
&lt;/td&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
TRUE
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
0.00
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
ts_m2_c2
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
7.10
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
13.12
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
6.02
&lt;/td&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
TRUE
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
0.00
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
ts_m2_c3
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
13.75
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
17.83
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
4.09
&lt;/td&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
TRUE
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
0.00
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
ts_m2_c9
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
31.70
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
36.68
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
4.98
&lt;/td&gt;
&lt;td style=&#34;text-align:left;&#34;&gt;
TRUE
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
1
&lt;/td&gt;
&lt;td style=&#34;text-align:right;&#34;&gt;
0.00
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;resources &amp;lt;- get_mon_resources(testlocatie_model2_parallel)
plot(resources, metric = &amp;quot;utilization&amp;quot;, )&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;staticunnamed-chunk-17-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;plot(resources, metric = &amp;quot;usage&amp;quot;,  items = &amp;quot;server&amp;quot;) +
  labs(title=&amp;quot;Resource gebruik&amp;quot;) +
  xlab(&amp;quot;tijd in minuten&amp;quot;) +
  ylab(&amp;quot;in gebruik&amp;quot;) &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;staticunnamed-chunk-18-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;p&gt;We gaan nu naar wat grotere simulaties van een model 3 testlocatie kijken om een wat betere indruk van het gedrag als geheel te krijgen.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;model-3-testlocatie-simulatie&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Model 3 testlocatie simulatie&lt;/h1&gt;
&lt;p&gt;Model 3 is voor een grotere lokatie met o.a. 3 &lt;em&gt;incheckers&lt;/em&gt; en &lt;em&gt;testafnemers&lt;/em&gt;. We veronderstellen het volgende m.b.t. hoe vaak er een nieuwe client arriveert.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;clientfrequentie_model3 &amp;lt;- 1/(5/3) # 3 per 5 minuten&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Om een beter inzicht in belasting van testlocatie te krijgen simuleren we deze 100 keer, we gebruiken mclapply om de simulatie te paralleliseren. We gaan uit van het splitsen in 3 wachtrijen na het inchecken. Voor keuze van de rij wordt een kortste wachtrij principe gehanteerd. De parameters voor de resources blijven hetzelfde als in model 2. Het traject voor een client kan dan als volgt gedefinieerd worden:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;teststraat_model3_traject  &amp;lt;- trajectory(&amp;quot;Teststraat model 3 traject&amp;quot;) %&amp;gt;%    
  visit(resource =&amp;quot;inchecker&amp;quot;, task = function() rexp(1, 1/inchecktijd)) %&amp;gt;%
  select(c(&amp;quot;testafnemer1&amp;quot;, &amp;quot;testafnemer2&amp;quot;, &amp;quot;testafnemer3&amp;quot;), 
         policy = &amp;quot;shortest-queue&amp;quot;) %&amp;gt;%
  seize_selected() %&amp;gt;%
  timeout(function() {rexp(1, 1/testafneemtijd)}) %&amp;gt;%
  release_selected() %&amp;gt;%
  visit(resource =&amp;quot;testverwerker&amp;quot;, task = function() rexp(1, testverwerktijd))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Uitgaande van bovenstaande definitie gaan we 100 keer een volledige dag van een testlocatie simuleren.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;simulaties_model3 &amp;lt;- mclapply(1:100, function(i) {
  simmer(&amp;quot;teststraatsimulator4&amp;quot;) %&amp;gt;%
    add_resource(&amp;quot;inchecker&amp;quot;, 3) %&amp;gt;%
    add_resource(&amp;quot;testafnemer1&amp;quot;, 1) %&amp;gt;%
    add_resource(&amp;quot;testafnemer2&amp;quot;, 1) %&amp;gt;%
    add_resource(&amp;quot;testafnemer3&amp;quot;, 1) %&amp;gt;%
    add_resource(&amp;quot;testverwerker&amp;quot;, 1) %&amp;gt;%
    add_generator(&amp;quot;Teststraat model3 traject&amp;quot;, teststraat_model3_traject, 
                  function() rexp(1, clientfrequentie_model3)) %&amp;gt;%
    run(until = geopendtijd) %&amp;gt;%
    wrap()
})&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hierna kunnen weer allerlei analyses op de performance gedaan worden. B.v. wat de bezetting van de verschillende soorten medewerkers op de testlocatie is. Daar zien we dat de testafnemer de bottleneck is, logisch want kost het meeste tijd.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;resources &amp;lt;- get_mon_resources(simulaties_model3)
plot(resources, metric = &amp;quot;utilization&amp;quot;) +
  labs(title = &amp;quot;Resource bezetting&amp;quot;,
         y = &amp;quot;bezetting&amp;quot;,
         x = &amp;quot;resource&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;staticunnamed-chunk-22-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;p&gt;We zien dat de resources goed gebruikt worden, maar nog ruimte hebben voor als er tegenvallers zijn, dat is goed.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;plot(resources, metric = &amp;quot;usage&amp;quot;,  items = &amp;quot;server&amp;quot;) +
    theme(axis.text.x = element_blank()) +
    labs(title = &amp;quot;Resource gebruik&amp;quot;,
         y = &amp;quot;in gebruik&amp;quot;,
         x = &amp;quot;simulatietijd in minuten&amp;quot;) &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;staticunnamed-chunk-23-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;arrivals &amp;lt;- get_mon_arrivals(simulaties_model3)
plot(arrivals, metric = &amp;quot;flow_time&amp;quot;)  +
  geom_smooth(color = &amp;quot;red3&amp;quot;) +
  ggtitle(&amp;quot;Verloop van doorlooptijd in testlocatie&amp;quot;) +
  ylab(&amp;quot;doorlooptijd&amp;quot;) +
  xlab(&amp;quot;simulatietijd in minuten&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;staticunnamed-chunk-24-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Dit systeem is stabiel gegeven de gekozen parameters. De doorlooptijden lopen niet op. Hieronder nog uitsplitsing in actieve tijd en wachttijd.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;plot(arrivals, metric = &amp;quot;activity_time&amp;quot;) +
  geom_smooth(color = &amp;quot;red3&amp;quot;) +
  ggtitle(&amp;quot;Verloop van de actief bestede tijd&amp;quot;) +
  ylab(&amp;quot;actieve bestede tijd&amp;quot;) +
  xlab(&amp;quot;simulatietijd in minuten&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;staticunnamed-chunk-25-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;arrivals &amp;lt;- get_mon_arrivals(simulaties_model3)
plot(arrivals, metric = &amp;quot;waiting_time&amp;quot;) +
  geom_smooth(color = &amp;quot;red3&amp;quot;) +
  ggtitle(&amp;quot;Verloop van de wachtijden&amp;quot;) +
  ylab(&amp;quot;wachttijd&amp;quot;) +
  xlab(&amp;quot;simulatietijd in minuten&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;staticunnamed-chunk-26-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;p&gt;In een volgende post zal ik meer aandacht besteden aan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stresstest testlocatie simuleren, denk o.a. aan praktische eigenschappen van de locatie die beperkingen aan de maximale lengte van wachtrijen.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Relatie met &lt;em&gt;Kendall’s notatie&lt;/em&gt;&lt;a href=&#34;#fn4&#34; class=&#34;footnote-ref&#34; id=&#34;fnref4&#34;&gt;&lt;sup&gt;4&lt;/sup&gt;&lt;/a&gt; voor wachtrij systemen, bv &lt;em&gt;M/M/1&lt;/em&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Geautomatiseerd visualiseren van het gedefinieerd traject.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&#34;footnotes&#34;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&#34;fn1&#34;&gt;&lt;p&gt;Toolkit inrichten testlocatie voor antigeentesten, VNO-NCW, &lt;a href=&#34;https://werkgeverstesten.prod.websites.vno-ncw.totalservices.io/app/uploads/sites/8/2021/02/20210201_Spoor-2_Toolkit-antigeen-versie-3.1-1.pdf&#34; class=&#34;uri&#34;&gt;https://werkgeverstesten.prod.websites.vno-ncw.totalservices.io/app/uploads/sites/8/2021/02/20210201_Spoor-2_Toolkit-antigeen-versie-3.1-1.pdf&lt;/a&gt;&lt;a href=&#34;#fnref1&#34; class=&#34;footnote-back&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li id=&#34;fn2&#34;&gt;&lt;p&gt;Discrete Event Simulation, &lt;a href=&#34;https://en.wikipedia.org/wiki/Discrete-event_simulation&#34; class=&#34;uri&#34;&gt;https://en.wikipedia.org/wiki/Discrete-event_simulation&lt;/a&gt;&lt;a href=&#34;#fnref2&#34; class=&#34;footnote-back&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li id=&#34;fn3&#34;&gt;&lt;p&gt;simmer R package, &lt;a href=&#34;https://​cloud.r-project.org/​package=simmer&#34; class=&#34;uri&#34;&gt;https://​cloud.r-project.org/​package=simmer&lt;/a&gt;&lt;a href=&#34;#fnref3&#34; class=&#34;footnote-back&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li id=&#34;fn4&#34;&gt;&lt;p&gt;Kendall’s notation, &lt;a href=&#34;https://en.wikipedia.org/wiki/Kendall%27s_notation&#34; class=&#34;uri&#34;&gt;https://en.wikipedia.org/wiki/Kendall%27s_notation&lt;/a&gt;&lt;a href=&#34;#fnref4&#34; class=&#34;footnote-back&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
  </channel>
</rss>
