Let’s confirm that par is better than seq with a well-undestood example:

weights <- c(2, 3, 7)
proba <- c(0.4, 0.15, 0.45)
B <- 6 # max budget
p1 <- proba[1]
p2 <- proba[2]
near(3 * p1, DP_par(weights, proba, B, 1))
## [1] TRUE
near(-p1^3 + 2 * p1^2 + 2 * p1 - 2 * p1 * p2 + 2 * p2,
     DP_par(weights, proba, B))
## [1] TRUE

There exists a smaller example for this case:

weights <- c(1, 2, 4)
proba <- c(0.35, 0.45, 0.2)
B <- 5
DP_par(weights, proba, B, 1)
## [1] 2.338458
DP_par(weights, proba, B)
## [1] 2.343883

Now, to show that preempt is sometimes better than par:

# weights <- c(1, 2, 3, 8)
# proba <- c(0.05, 0.35, 0.15, 0.45)
# B <- 7
# DP_par(weights, proba, B)
# DP_preempt(weights, proba, B)

And with a smaller example:

weights <- c(1, 2, 3, 5)
# proba <- c(0.13, 0.62, 0.14, 0.11)
proba <- c(0.15, 0.6, 0.15, 0.1)
B <- 6
DP_par(weights, proba, B)
## [1] 2.437181
DP_preempt(weights, proba, B)
## [1] 2.449681

OK, we have our hierarchy!

## R version 3.4.4 (2018-03-15)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 16.04.4 LTS
## 
## Matrix products: default
## BLAS: /usr/lib/openblas-base/libblas.so.3
## LAPACK: /usr/lib/libopenblasp-r0.2.18.so
## 
## locale:
##  [1] LC_CTYPE=fr_FR.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=fr_FR.UTF-8        LC_COLLATE=fr_FR.UTF-8    
##  [5] LC_MONETARY=fr_FR.UTF-8    LC_MESSAGES=fr_FR.UTF-8   
##  [7] LC_PAPER=fr_FR.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=fr_FR.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] forcats_0.3.0   stringr_1.3.0   dplyr_0.7.4     purrr_0.2.4    
## [5] readr_1.1.1     tidyr_0.8.0     tibble_1.4.2    ggplot2_2.2.1  
## [9] tidyverse_1.2.1
## 
## loaded via a namespace (and not attached):
##  [1] Rcpp_0.12.16     cellranger_1.1.0 pillar_1.2.1     compiler_3.4.4  
##  [5] plyr_1.8.4       bindr_0.1.1      tools_3.4.4      digest_0.6.15   
##  [9] lubridate_1.7.3  jsonlite_1.5     evaluate_0.10.1  nlme_3.1-137    
## [13] gtable_0.2.0     lattice_0.20-35  pkgconfig_2.0.1  rlang_0.2.0     
## [17] psych_1.7.8      cli_1.0.0        rstudioapi_0.7   yaml_2.1.18     
## [21] parallel_3.4.4   haven_1.1.1      bindrcpp_0.2     xml2_1.2.0      
## [25] httr_1.3.1       knitr_1.20       hms_0.4.2        rprojroot_1.3-2 
## [29] grid_3.4.4       glue_1.2.0       R6_2.2.2         readxl_1.0.0    
## [33] foreign_0.8-69   rmarkdown_1.9    modelr_0.1.1     reshape2_1.4.3  
## [37] magrittr_1.5     backports_1.1.2  scales_0.5.0     htmltools_0.3.6 
## [41] rvest_0.3.2      assertthat_0.2.0 mnormt_1.5-5     colorspace_1.3-2
## [45] stringi_1.1.7    lazyeval_0.2.1   munsell_0.4.3    broom_0.4.3     
## [49] crayon_1.3.4