Hi Inaki,
I tried to simulate an operating room where a patient has to seize one bed, one doctor, and one nurse at the same time. If any resource is not available then the patient will have to wait until all resources are free.
For example there are 1 doctor, 2 nurses and 3 beds and patients are arriving at 1,2,3,4,5 and the operation time will be 3 minutes.
It can be done if the seize sequence is setup in the order which the least resource is seized first and so on:
library(simmer)
library(simmer.bricks)
library(simmer.plot)
env <- simmer()
get_available<-function(env,resources){
return(get_capacity(env,resources) - get_server_count(env,resources))
}
pat <- trajectory() %>%
log_(function() paste0(now(env),": arrived")) %>%
log_(function() paste0(now(env),": nurse serving = ",get_server_count(env,'nurse'),' bed serving = ', get_server_count(env,'bed'),' doctor serving = ',get_server_count(env,'doctor')))%>%
log_(function() paste0(now(env),": seizing bed")) %>%
log_(function() paste0(now(env),": seizing nurse")) %>%
log_(function() paste0(now(env),": seizing doc")) %>%
seize('doctor',1) %>% log_(function() paste0(now(env),": seized doctor")) %>%
seize('nurse',1) %>% log_(function() paste0(now(env),": seized nurse")) %>%
seize('bed',1) %>% log_(function() paste0(now(env),": seized bed")) %>%
timeout(3) %>% release('doctor',1) %>% log_(function() paste0(now(env),": released doc")) %>%
release('nurse',1) %>% log_(function() paste0(now(env),": released nurse")) %>%
release('bed',1) %>% log_(function() paste0(now(env),": released bed"))
env %>%
add_resource('doctor',1)%>%
add_resource('bed',3)%>%
add_resource('nurse',2)%>%
add_generator("patient", pat, at(seq(1,5)))
test<-env %>% run(until=50) %>% get_mon_arrivals()
However, is there any other way to make sure all resources have to be seized at the same time without using the seize order?
I tried with a rollback but it does not work properly:
library(simmer)
library(simmer.bricks)
library(simmer.plot)
env <- simmer()
get_available<-function(env,resources){
return(get_capacity(env,resources) - get_server_count(env,resources))
}
pat <- trajectory() %>%
log_(function() paste0(now(env),": arrived")) %>%
log_(function() paste0(now(env),": nurse serving = ",get_server_count(env,'nurse'),' bed serving = ', get_server_count(env,'bed'),' doctor serving = ',get_server_count(env,'doctor')))%>%
log_(function() paste0(now(env),": seizing bed")) %>%
log_(function() paste0(now(env),": seizing nurse")) %>%
log_(function() paste0(now(env),": seizing doc")) %>%
seize('bed',1) %>%
branch(option=function() ifelse(get_available(env,'doctor')==0 | get_available(env,'nurse')==0,1,0),
continue=TRUE,
trajectory() %>% log_(function() paste0(now(env),": Doctor and Nurse not available")) %>% release('bed',1) %>% timeout(1) %>% rollback(5,Inf)) %>%
log_(function() paste0(now(env),": seized bed")) %>%
seize('doctor',1) %>% log_(function() paste0(now(env),": seized doctor")) %>%
seize('nurse',1) %>% log_(function() paste0(now(env),": seized nurse")) %>%
timeout(3) %>% release('doctor',1) %>% log_(function() paste0(now(env),": released doc")) %>%
release('bed',1) %>% log_(function() paste0(now(env),": released bed")) %>%
release('nurse',1) %>% log_(function() paste0(now(env),": released nurse"))
env %>%
add_resource('doctor',1)%>%
add_resource('bed',3)%>%
add_resource('nurse',2)%>%
add_generator("patient", pat, at(seq(1,5)))
test<-env %>% run(until=50) %>% get_mon_arrivals()
Thank you!