2017-10-19 13 views
0

J'essayais de simuler un réseau de files d'attente en utilisant le paquet de R Simmer. Cependant, j'ai eu du mal à intégrer des boucles dans la trajectoire principale. Un simple code de file d'attente une de noeud est le suivant:Comment écrire une boucle dans la trajectoire du paquet Simmer

to_queue_1 <- trajectory() %>% 
for(i in 1:100){ 
    seize("nurse", 1) %>% 
    timeout(1) %>% 
    release("nurse", 1) 
} 

env <- simmer() 
add_resource("nurse",1) 
env %>% 
add_generator("arrival1_", to_queue_1, function() rexp(1, 1),mon=2) %>% 
run(200) 

Après runing la fonction de la trajectoire, me montre que "Error in for (en i.) 1: 100: 4 arguments transmis à 'pour' ce qui nécessite 3" .

Le réseau actuel est plus compliqué, ce qui nécessite une boucle où différents nœuds communiquent. Par exemple, je souhaite que le nœud 1 passe aux nœuds 2 et 3. Le nœud 2 passe aux nœuds 1 et 3. Le nœud 3 passe aux nœuds 1 et 2. La seule sortie possible est le nœud 3.

Merci d'avance.

Répondre

0

L'activité rollback sert à cette fin:

library(simmer) 

to_queue_1 <- trajectory() %>% 
    seize("nurse", 1) %>% 
    timeout(1) %>% 
    release("nurse", 1) %>% 
    rollback(3, 100) 

env <- simmer() %>% 
    add_resource("nurse",1) %>% 
    add_generator("arrival1_", to_queue_1, function() rexp(1, 1), mon=2) %>% 
    run(200) 

3 est le nombre d'activités à faire reculer, et 100 est le nombre de répétitions.

+0

Merci de répondre. Cependant, est-il possible d'avoir des arguments fonctionnels dans rollback()? Par exemple, après avoir libéré "infirmière", je saisis "médecin" et libère "docteur". Après cela, au lieu d'utiliser rollback (3,100), je peux vouloir annuler (1 ~ 3,1) avec la probabilité p, et rollback (4 ~ 6,1) avec la probabilité q, sortir avec la probabilité 1-p-q. Essentiellement, il s'agit d'une file d'attente tandem infirmière-médecin, tandis que le médecin peut renvoyer des patients infirmiers avec une certaine probabilité. –

+0

L'activité 'rollback' a un argument optionnel' check' qui remplace le deuxième argument 'times' si présent, de sorte que chaque fois que' rollback' est atteint, on vérifie s'il faut revenir en arrière ou non. Si vous avez besoin d'annuler un nombre différent d'activités en fonction de certaines probabilités, vous pouvez utiliser 'branch' et y placer plusieurs' rollback'. –

+0

Merci beaucoup, je vais vérifier ça! –