This notebook shows how the summarized tables in the published paper can be reproduced from the detailed experimental data provided in this repository.

Table 2

t2 = read_csv(here("data/table2.csv"))
tb = t2 %>% mutate(epj = n*((1-d)*(1-d)+d*(1-d)*m)) %>% group_by(d, n, m) %>% summarise(across(epj, mean)) %>% pivot_wider(names_from = d, values_from = c(epj)) %>% ungroup()
tb=bind_cols(tb[1:12,],tb[13:24,])
tb %>% kable(caption = "Average number of pseudo jobs of all instance groups with a different number of jobs n and machines m. Each group has 30 instances.", col.names = rep(c("$n$", "$m/r$", "$0.2$", "$0.3$", "$0.4$"),2)) %>% kable_styling()
Average number of pseudo jobs of all instance groups with a different number of jobs n and machines m. Each group has 30 instances.
\(n\) \(m/r\) \(0.2\) \(0.3\) \(0.4\) \(n\) \(m/r\) \(0.2\) \(0.3\) \(0.4\)
5 5 7.2 7.70 7.8 30 5 43.2 46.2 46.8
5 10 11.2 12.95 13.8 30 10 67.2 77.7 82.8
5 20 19.2 23.45 25.8 30 20 115.2 140.7 154.8
5 30 27.2 33.95 37.8 30 30 163.2 203.7 226.8
10 5 14.4 15.40 15.6 50 5 72.0 77.0 78.0
10 10 22.4 25.90 27.6 50 10 112.0 129.5 138.0
10 20 38.4 46.90 51.6 50 20 192.0 234.5 258.0
10 30 54.4 67.90 75.6 50 30 272.0 339.5 378.0
20 5 28.8 30.80 31.2 100 5 144.0 154.0 156.0
20 10 44.8 51.80 55.2 100 10 224.0 259.0 276.0
20 20 76.8 93.80 103.2 100 20 384.0 469.0 516.0
20 30 108.8 135.80 151.2 100 30 544.0 679.0 756.0

Table 3

twosa = read_csv(here("data/table3-2sa.csv"))
iga = read_csv(here("data/table3-iga.csv"))
bkv = read_csv(here("data/table3-bkv.csv"))

t3 = twosa %>% inner_join(iga) %>% inner_join(bkv) %>% mutate(across(ends_with(".ft"),~rd(.x,bkv))) %>% group_by(d,n,m) %>% summarize(across(c(saf.ft:igapols.ft),mean)) %>% pivot_wider(names_from=n,values_from=c(ends_with(".ft")))
t3.sum = t3 %>% ungroup() %>% summarize(across(saf.ft_5:igapols.ft_100,function(x) { mean(x,na.rm=T) }))
t3 = t3 %>% bind_rows(t3.sum)
t3 %>% kable(caption = "Relative deviations from the best known values for 2SA and IGA.", col.names = c("$d$", "$m/n$", rep(n_names,2))) %>% kable_styling()
Relative deviations from the best known values for 2SA and IGA.
\(d\) \(m/n\) \(5\) \(10\) \(20\) \(30\) \(50\) \(100\) \(5\) \(10\) \(20\) \(30\) \(50\) \(100\)
0.2 5 1.726121 3.512638 4.357985 5.015002 5.183003 4.360220 0.4080138 1.1239401 0.2263065 0.2385006 0.4615649 0.6561463
0.2 10 2.120045 5.483899 7.200122 6.979743 7.566145 6.993746 1.2128091 1.3482768 0.6004957 0.7421203 0.4093554 0.5822443
0.2 20 3.013819 4.338034 5.380023 6.081486 8.219360 8.945355 1.3365476 1.6759262 0.7878071 0.4533018 0.3531739 0.6048166
0.2 30 2.533490 2.822079 3.821543 5.098611 7.009228 8.544460 1.3758731 0.7767523 0.4558227 0.1537049 0.3420794 0.4618979
0.3 5 2.851697 4.223859 5.385384 6.064897 5.604975 5.247194 0.2953785 0.7878551 0.2896956 0.2039162 0.5008429 0.8946899
0.3 10 3.096894 6.882653 7.958824 8.994927 9.875024 9.505288 0.8872764 2.7443426 0.9074361 0.7568197 0.5529001 0.8942025
0.3 20 3.645358 6.980749 7.788329 10.049266 9.918957 10.522901 1.9320175 3.2499263 1.8464685 1.7147311 0.3199730 0.6068782
0.3 30 3.067137 4.789573 6.329930 6.982851 8.082158 10.500921 1.5252819 2.2032137 1.1885068 0.2630965 0.2088513 0.6497083
0.4 5 1.952052 4.282964 6.226869 5.603633 6.483351 5.242922 0.5478636 0.5747031 0.2892935 0.2227427 0.4137148 0.8744657
0.4 10 3.544611 9.813007 9.332247 10.597881 11.159611 11.273527 0.6519699 3.1093264 1.2811939 1.1525659 0.6661116 1.1872471
0.4 20 4.708910 9.179408 10.675816 11.144665 11.671497 12.751839 2.2328952 4.2423903 2.2163385 1.6731473 0.2678301 0.8101383
0.4 30 5.175491 6.641822 8.122412 8.770061 10.419092 13.018519 2.7997097 3.4098283 2.6266178 0.3717541 0.5720255 0.9854718
NA NA 3.119635 5.745890 6.881624 7.615252 8.432700 8.908908 1.2671364 2.1038734 1.0596652 0.6622001 0.4223686 0.7673256

Table 4

twosa = read_csv(here("data/table4-2sa.csv"))
iga = read_csv(here("data/table4-iga.csv"))

t4 = twosa %>% inner_join(iga) %>% rename(time.t=time) %>% mutate(across(ends_with(".ft"),~rd(.x,bkv))) %>% group_by(n,m) %>% summarize(across(c(saf.t:time.t),mean)) %>% pivot_wider(names_from=n,values_from=c(ends_with(".t")))
t4.sum = t4 %>% summarize(across(saf.t_5:time.t_100,function(x) { mean(x,na.rm=T) }))
t4 = t4 %>% bind_rows(t4.sum)
t4 %>% kable(caption = "Computation times for 2SA and IGA.", col.names = c("$m/n$", rep(n_names,2))) %>% kable_styling()
Computation times for 2SA and IGA.
\(m/n\) \(5\) \(10\) \(20\) \(30\) \(50\) \(100\) \(5\) \(10\) \(20\) \(30\) \(50\) \(100\)
5 0.0053889 0.0184333 0.0498111 0.0878778 0.1989889 0.7632444 0.0121263 0.0439438 0.1075250 0.2002080 0.5590535 3.352731
10 0.0152667 0.0505556 0.1371444 0.2856222 0.6634556 2.6928889 0.0155121 0.0528932 0.1563554 0.3310191 1.0982759 6.999588
20 0.0501667 0.1599333 0.4964000 1.0918778 2.9755778 11.6776444 0.0233630 0.0849433 0.2723956 0.6215756 2.2634380 15.377203
30 0.1049222 0.2998444 1.1228333 2.3911667 6.1623889 25.7093000 0.0307071 0.1139564 0.4054798 1.0075630 3.7176310 26.855594
NA 0.0439361 0.1321917 0.4515472 0.9641361 2.5001028 10.2107694 0.0204271 0.0739342 0.2354390 0.5400914 1.9095996 13.146279

Table 5

mip = read_csv(here("data/table5-mip.csv"))
iga = read_csv(here("data/table3-iga.csv")) %>% rename(igapols.0.1.ft=igapols.ft)
igap = read_csv(here("data/table5-iga-plus.csv"))
bkv = read_csv(here("data/table3-bkv.csv"))

t5 = mip %>% inner_join(iga) %>% inner_join(igap) %>% inner_join(bkv) %>% mutate(across(ends_with(".ft"),~rd(.x,bkv))) %>% group_by(n,m,d) %>% summarize(across(ends_with(".ft"),mean)) %>% pivot_wider(names_from=n,values_from=c(ends_with(".ft")))
t5.sum = t5 %>% ungroup() %>% summarize(across(contains(".ft_"),function(x) { mean(x,na.rm=T) }))
t5 = t5 %>% bind_rows(t5.sum)
t5 %>% kable(caption = "Comparison of the solution of the MIP model with those of IGA and IGA running with a five times higher iteration limit (IGA+).", col.names = c("$m$", "$d/n$", rep(n_names[1:5],3))) %>% kable_styling()
Comparison of the solution of the MIP model with those of IGA and IGA running with a five times higher iteration limit (IGA+).
\(m\) \(d/n\) \(5\) \(10\) \(20\) \(30\) \(50\) \(5\) \(10\) \(20\) \(30\) \(50\) \(5\) \(10\) \(20\) \(30\) \(50\)
5 0.2 0 0.0000000 0.0483769 0.1552993 0.3212116 0.4080138 1.1239401 0.2263065 0.2385006 0.4615649 0.4080138 1.1239401 0.2195964 0.1133647 0.0500520
5 0.3 0 0.0220113 0.0281301 0.1625222 0.4698285 0.2953785 0.7878551 0.2896956 0.2039162 0.5008429 0.2953785 0.7878551 0.2653834 0.1188233 0.0273604
5 0.4 0 0.0000000 0.0802791 0.1591673 0.4700834 0.5478636 0.5747031 0.2892935 0.2227427 0.4137148 0.5478636 0.5747031 0.3448148 0.1181266 0.0882584
10 0.2 0 0.2285301 0.1135439 0.2063862 NA 1.2128091 1.3482768 0.6004957 0.7421203 NA 1.2128091 1.3482768 0.5395126 0.6060314 NA
10 0.3 0 0.0976192 0.2128451 0.1805732 NA 0.8872764 2.7443426 0.9074361 0.7568197 NA 0.8872764 2.7443426 0.8379877 0.6022140 NA
10 0.4 0 0.0000000 0.0535366 0.1273551 NA 0.6519699 3.1093264 1.2811939 1.1525659 NA 0.6519699 3.1093264 1.2649824 0.9826937 NA
20 0.2 0 0.2428741 0.1769180 0.3433348 NA 1.3365476 1.6759262 0.7878071 0.4533018 NA 1.3365476 1.6759262 0.7850568 0.3847941 NA
20 0.3 0 0.1456465 0.2270731 0.0678798 NA 1.9320175 3.2499263 1.8464685 1.7147311 NA 1.9320175 3.2499263 1.8309398 1.5570284 NA
20 0.4 0 0.0396868 0.0651127 0.1877192 NA 2.2328952 4.2423903 2.2163385 1.6731473 NA 2.2328952 4.2423903 2.2230832 1.4461293 NA
30 0.2 0 0.3642658 0.2786606 NA NA 1.3758731 0.7767523 0.4558227 NA NA 1.3758731 0.7767523 0.4095630 NA NA
30 0.3 0 0.2049126 0.1309136 NA NA 1.5252819 2.2032137 1.1885068 NA NA 1.5252819 2.2032137 1.1885068 NA NA
30 0.4 0 0.1592936 0.1335064 NA NA 2.7997097 3.4098283 2.6266178 NA NA 2.7997097 3.4098283 2.5868958 NA NA
NA NA 0 0.1254033 0.1290747 0.1766930 0.4203745 1.2671364 2.1038734 1.0596652 0.7953162 0.4587075 1.2671364 2.1038734 1.0413602 0.6588006 0.0552236

Figure 4

twosa = read_csv(here("data/table4-2sa.csv"))
iga = read_csv(here("data/table4-iga.csv"))
f4 = twosa %>% inner_join(iga) %>% rename(time.t=time)
scientific_10 <- function(x) {
  parse(text=gsub("e", " %*% 10^", scales::scientific_format()(x)))
}
ggplot(f4,aes(x=saf.t,y=time.t)) + geom_point() + geom_abline() + scale_x_log10(label=scientific_10) + scale_y_log10(label=scientific_10) + labs(title="Computation times (s)", x="2SA", y="IGA") + theme(legend.position="none")

Table 6

t6 = read_csv(here("data/table6.csv")) %>% inner_join(read_csv(here("data/table3-bkv.csv")))
t6 = t6 %>% mutate(across(ends_with(".ft"),~rd(.x,bkv))) %>% group_by(d,n,m) %>% summarize(across(c(ends_with(".ft")),mean)) %>% pivot_wider(names_from=n,values_from=c(ends_with(".ft")))
t6.sum = t6 %>% ungroup() %>% summarize(across(contains(".ft_"),function(x) { mean(x,na.rm=T) }))
t6 = t6 %>% bind_rows(t6.sum)
t6 %>% kable(caption = "Relative deviations from the best known values for IGA0 and IGA+NPSset.", col.names = c("$d$", "$m/n$", rep(n_names,2))) %>% kable_styling()
Relative deviations from the best known values for IGA0 and IGA+NPSset.
\(d\) \(m/n\) \(5\) \(10\) \(20\) \(30\) \(50\) \(100\) \(5\) \(10\) \(20\) \(30\) \(50\) \(100\)
0.2 5 1.587530 1.999124 0.9957623 0.6121372 0.6603856 0.8462824 1.417713 1.9100368 0.9540905 0.5313528 0.6419943 0.8402365
0.2 10 2.192750 3.466907 1.5811931 1.5321469 1.1923546 1.0947370 2.087026 2.9755271 1.3276047 1.2819325 0.9117050 0.9910113
0.2 20 3.745250 3.774197 2.2552336 1.8155205 1.5306961 1.5409866 3.565268 3.0948966 1.7984289 1.5094632 1.1985989 1.3244672
0.2 30 3.319447 2.673150 2.0889088 1.5788779 1.4796301 1.5987383 2.848653 2.3364843 1.6409343 1.1356316 1.0544441 1.1444058
0.3 5 1.282149 1.499652 0.4877897 0.4299889 0.6819751 1.0529197 1.111063 1.4824309 0.4877897 0.3721021 0.6630053 1.0470623
0.3 10 2.738577 5.162469 2.3128686 1.7864554 1.4113390 1.4321127 2.267044 4.6287120 2.0923891 1.5758371 1.1712460 1.2804850
0.3 20 4.575365 5.560647 3.5710433 3.2533417 1.5146992 1.6946747 3.635542 4.6233635 2.7398648 2.6691138 0.9719238 1.2335763
0.3 30 3.642171 4.364863 3.0519030 2.0335688 1.6344489 1.9390605 3.233488 3.5225871 2.1622447 1.1488691 0.9047450 1.2610539
0.4 5 1.753136 0.873885 0.8725716 0.3453694 0.5565285 1.0072808 1.431047 0.8462022 0.8305190 0.3427712 0.5514915 0.9979944
0.4 10 3.395113 5.687511 2.4985194 1.8479847 1.2765854 1.7151092 2.387861 4.8438348 2.0792999 1.5758766 1.0448852 1.5342604
0.4 20 4.903032 7.205967 4.4400236 3.3097779 1.6207505 1.8350395 3.930937 5.9659053 3.2731096 2.5559406 0.8802803 1.1630666
0.4 30 5.598329 5.755148 4.6579463 2.1772316 2.0858365 2.3318758 4.226098 4.4965928 3.3762806 1.0590377 0.8184653 1.2323979
NA NA 3.227737 4.001960 2.4011470 1.7268668 1.3037691 1.5074014 2.678478 3.3938811 1.8968797 1.3131607 0.9010654 1.1708348

Table 7

t7 = read_csv(here("data/table7.csv")) %>% group_by(n,m) %>% summarize(b=100*mean(bs),B=100*max(bs),jri=100*mean(jri)) %>% pivot_wider(names_from=m,values_from=c(b,B,jri)) 
t7.sum = t7 %>% ungroup() %>% summarize(across(contains("_"),function(x) { mean(x,na.rm=T) }))
t7 = t7 %>% bind_rows(t7.sum)
t7 %>% kable(caption = "Average and maximum buffer sizes and job reordering index (in percent) for the non-permutation solutions.", col.names = c("$m/n$", rep(n_names[1:4],3))) %>% kable_styling()
Average and maximum buffer sizes and job reordering index (in percent) for the non-permutation solutions.
\(m/n\) \(5\) \(10\) \(20\) \(30\) \(5\) \(10\) \(20\) \(30\) \(5\) \(10\) \(20\) \(30\)
5 16.222222 16.88889 19.55556 19.11111 40.00000 40.00000 40 40.00000 1.027778 0.9012346 0.8654971 0.7279693
10 17.444444 22.66667 23.55556 25.77778 40.00000 40.00000 40 50.00000 1.407407 1.1577503 0.6588694 0.5806726
20 16.222222 21.38889 26.05556 26.50000 30.00000 35.00000 50 45.00000 1.834795 1.0643275 0.7737765 0.5894334
30 13.222222 20.25926 26.44444 28.77778 23.33333 33.33333 40 40.00000 1.642401 1.1880233 0.8079586 0.6113533
50 9.466667 17.48889 24.13333 27.28889 20.00000 30.00000 36 36.00000 1.775057 1.1919375 0.8159924 0.6240050
100 6.555556 13.05556 20.10000 24.41111 11.00000 17.00000 28 39.00000 1.979517 1.2163362 0.8004135 0.6226092
NA 13.188889 18.62469 23.30741 25.31111 27.38889 32.55556 39 41.66667 1.611159 1.1199349 0.7870846 0.6260071

Table 8

t8 = read_csv(here("data/table8.csv")) %>% group_by(n,m) %>% summarize(b=100*mean(bs),B=100*max(bs),jri=100*mean(jri)) %>% pivot_wider(names_from=m,values_from=c(b,B,jri))
t8.sum = t8 %>% ungroup() %>% summarize(across(contains("_"),function(x) { mean(x,na.rm=T) }))
t8 = t8 %>% bind_rows(t8.sum)
t8 %>% kable(caption = "Average and maximum buffer sizes and job reordering index (in percent) for the permutation solutions.", col.names = c("$n/m$", rep(n_names[1:4],3))) %>% kable_styling()
Average and maximum buffer sizes and job reordering index (in percent) for the permutation solutions.
\(n/m\) \(5\) \(10\) \(20\) \(30\) \(5\) \(10\) \(20\) \(30\) \(5\) \(10\) \(20\) \(30\)
5 16.000000 16.44444 19.11111 19.33333 40.00000 40.00000 40.00000 40.00000 0.8888889 0.691358 0.6959064 0.5019157
10 17.555556 23.00000 25.66667 24.88889 40.00000 50.00000 40.00000 50.00000 1.3950617 1.113855 0.6094867 0.5193699
20 15.944444 21.88889 26.88889 27.16667 30.00000 40.00000 45.00000 45.00000 1.7997076 1.061079 0.7737765 0.6001210
30 13.037037 20.33333 27.62963 29.74074 23.33333 33.33333 43.33333 43.33333 1.5945083 1.183482 0.8142771 0.6146122
50 9.577778 17.93333 25.06667 28.35556 20.00000 28.00000 34.00000 40.00000 1.7473923 1.200202 0.8250149 0.6314176
100 6.711111 13.35556 20.77778 25.22222 12.00000 17.00000 27.00000 41.00000 1.9539282 1.218930 0.8074192 0.6327335
NA 13.137654 18.82593 24.19012 25.78457 27.55556 34.72222 38.22222 43.22222 1.5632478 1.078151 0.7543135 0.5833617