diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..3f4f0d9 Binary files /dev/null and b/.DS_Store differ diff --git a/.gitignore b/.gitignore index 14f4cdf..c925567 100644 --- a/.gitignore +++ b/.gitignore @@ -116,6 +116,10 @@ src/token.json *.aux *.out *.synctex.gz +*.fdb_latexmk +*.fls +*.bbl +*.blg ########## # SPHINX # @@ -169,4 +173,4 @@ docs/build/doctrees # ignore cbc files !scripts/ -scripts/cbc* \ No newline at end of file +scripts/cbc* diff --git a/paper/data/configs/2015_config.json b/paper/data/configs/2015_config.json new file mode 100644 index 0000000..0172567 --- /dev/null +++ b/paper/data/configs/2015_config.json @@ -0,0 +1,104 @@ +{ + "B": { + "name": "B", + "email": "", + "divisions": { + "HIV": { + "min": 9, + "max": 10 + }, + "ID": { + "min": 3, + "max": 4 + } + } + }, + "A": { + "name": "A", + "email": "", + "divisions": { + "HIV": { + "min": 11, + "max": 12 + } + } + }, + "E": { + "name": "E", + "email": "", + "divisions": { + "ID": { + "min": 2, + "max": 3 + } + } + }, + "F": { + "name": "F", + "email": "", + "divisions": { + "ID": { + "min": 4, + "max": 5 + } + } + }, + "D": { + "name": "D", + "email": "", + "divisions": { + "ID": { + "min": 3, + "max": 4 + }, + "HIV": { + "min": 2, + "max": 3 + } + } + }, + "C": { + "name": "C", + "email": "", + "divisions": { + "ID": { + "min": 3, + "max": 4 + }, + "HIV": { + "min": 2, + "max": 3 + } + } + }, + "G": { + "name": "G", + "email": "", + "divisions": { + "ID": { + "min": 3, + "max": 4 + } + } + }, + "H": { + "name": "H", + "email": "", + "divisions": { + "ID": { + "min": 4, + "max": 5 + } + } + }, + "I": { + "name": "I", + "email": "", + "divisions": { + "ID": { + "min": 3, + "max": 4 + } + } + } +} \ No newline at end of file diff --git a/paper/data/configs/2016_config.json b/paper/data/configs/2016_config.json new file mode 100644 index 0000000..5787f95 --- /dev/null +++ b/paper/data/configs/2016_config.json @@ -0,0 +1,114 @@ +{ + "F": { + "name": "F", + "email": "", + "divisions": { + "ID": { + "min": 4, + "max": 5 + } + } + }, + "I": { + "name": "I", + "email": "", + "divisions": { + "ID": { + "min": 4, + "max": 5 + } + } + }, + "G": { + "name": "G", + "email": "", + "divisions": { + "ID": { + "min": 2, + "max": 3 + } + } + }, + "E": { + "name": "E", + "email": "", + "divisions": { + "ID": { + "min": 3, + "max": 4 + } + } + }, + "B": { + "name": "B", + "email": "", + "divisions": { + "HIV": { + "min": 9, + "max": 10 + }, + "ID": { + "min": 3, + "max": 4 + } + } + }, + "A": { + "name": "A", + "email": "", + "divisions": { + "HIV": { + "min": 11, + "max": 12 + } + } + }, + "D": { + "name": "D", + "email": "", + "divisions": { + "ID": { + "min": 2, + "max": 3 + }, + "HIV": { + "min": 2, + "max": 3 + } + } + }, + "H": { + "name": "H", + "email": "", + "divisions": { + "ID": { + "min": 4, + "max": 5 + } + } + }, + "C": { + "name": "C", + "email": "", + "divisions": { + "ID": { + "min": 3, + "max": 4 + }, + "HIV": { + "min": 2, + "max": 3 + } + } + }, + "J": { + "name": "J", + "email": "", + "divisions": { + "HIV": { + "min": 1, + "max": 2 + } + } + } +} \ No newline at end of file diff --git a/paper/data/configs/2017_config.json b/paper/data/configs/2017_config.json new file mode 100644 index 0000000..4c0f590 --- /dev/null +++ b/paper/data/configs/2017_config.json @@ -0,0 +1,114 @@ +{ + "B": { + "name": "B", + "email": "", + "divisions": { + "HIV": { + "min": 8, + "max": 9 + }, + "ID": { + "min": 2, + "max": 3 + } + } + }, + "A": { + "name": "A", + "email": "", + "divisions": { + "HIV": { + "min": 8, + "max": 9 + } + } + }, + "E": { + "name": "E", + "email": "", + "divisions": { + "ID": { + "min": 4, + "max": 5 + } + } + }, + "G": { + "name": "G", + "email": "", + "divisions": { + "ID": { + "min": 3, + "max": 4 + } + } + }, + "I": { + "name": "I", + "email": "", + "divisions": { + "ID": { + "min": 3, + "max": 4 + } + } + }, + "F": { + "name": "F", + "email": "", + "divisions": { + "ID": { + "min": 4, + "max": 5 + } + } + }, + "D": { + "name": "D", + "email": "", + "divisions": { + "ID": { + "min": 2, + "max": 3 + }, + "HIV": { + "min": 3, + "max": 4 + } + } + }, + "J": { + "name": "J", + "email": "", + "divisions": { + "HIV": { + "min": 3, + "max": 4 + } + } + }, + "H": { + "name": "H", + "email": "", + "divisions": { + "ID": { + "min": 4, + "max": 5 + } + } + }, + "C": { + "name": "C", + "email": "", + "divisions": { + "ID": { + "min": 3, + "max": 4 + }, + "HIV": { + "min": 3, + "max": 4 + } + } + } +} \ No newline at end of file diff --git a/paper/data/configs/2018_config.json b/paper/data/configs/2018_config.json new file mode 100644 index 0000000..9408630 --- /dev/null +++ b/paper/data/configs/2018_config.json @@ -0,0 +1,104 @@ +{ + "I": { + "name": "I", + "email": "", + "divisions": { + "ID": { + "min": 3, + "max": 4 + } + } + }, + "G": { + "name": "G", + "email": "", + "divisions": { + "ID": { + "min": 4, + "max": 5 + } + } + }, + "E": { + "name": "E", + "email": "", + "divisions": { + "ID": { + "min": 3, + "max": 4 + } + } + }, + "B": { + "name": "B", + "email": "", + "divisions": { + "HIV": { + "min": 8, + "max": 9 + }, + "ID": { + "min": 2, + "max": 3 + } + } + }, + "A": { + "name": "A", + "email": "", + "divisions": { + "HIV": { + "min": 10, + "max": 11 + } + } + }, + "D": { + "name": "D", + "email": "", + "divisions": { + "ID": { + "min": 3, + "max": 4 + }, + "HIV": { + "min": 3, + "max": 4 + } + } + }, + "H": { + "name": "H", + "email": "", + "divisions": { + "ID": { + "min": 2, + "max": 3 + } + } + }, + "C": { + "name": "C", + "email": "", + "divisions": { + "ID": { + "min": 3, + "max": 4 + }, + "HIV": { + "min": 4, + "max": 5 + } + } + }, + "F": { + "name": "F", + "email": "", + "divisions": { + "ID": { + "min": 4, + "max": 5 + } + } + } +} \ No newline at end of file diff --git a/paper/data/configs/sim_1srv_10clin.json b/paper/data/configs/sim_1srv_10clin.json new file mode 100644 index 0000000..78b7e6e --- /dev/null +++ b/paper/data/configs/sim_1srv_10clin.json @@ -0,0 +1 @@ +{"1": {"name": "1", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "2": {"name": "2", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "3": {"name": "3", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "4": {"name": "4", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "5": {"name": "5", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "6": {"name": "6", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "7": {"name": "7", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "8": {"name": "8", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "9": {"name": "9", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "10": {"name": "10", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}} \ No newline at end of file diff --git a/paper/data/configs/sim_1srv_20clin.json b/paper/data/configs/sim_1srv_20clin.json new file mode 100644 index 0000000..9634d51 --- /dev/null +++ b/paper/data/configs/sim_1srv_20clin.json @@ -0,0 +1 @@ +{"1": {"name": "1", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "2": {"name": "2", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "3": {"name": "3", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "4": {"name": "4", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "5": {"name": "5", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "6": {"name": "6", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "7": {"name": "7", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "8": {"name": "8", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "9": {"name": "9", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "10": {"name": "10", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "11": {"name": "11", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "12": {"name": "12", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "13": {"name": "13", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "14": {"name": "14", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "15": {"name": "15", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "16": {"name": "16", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "17": {"name": "17", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "18": {"name": "18", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "19": {"name": "19", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "20": {"name": "20", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}} \ No newline at end of file diff --git a/paper/data/configs/sim_1srv_30clin.json b/paper/data/configs/sim_1srv_30clin.json new file mode 100644 index 0000000..b2def81 --- /dev/null +++ b/paper/data/configs/sim_1srv_30clin.json @@ -0,0 +1 @@ +{"1": {"name": "1", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "2": {"name": "2", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "3": {"name": "3", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "4": {"name": "4", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "5": {"name": "5", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "6": {"name": "6", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "7": {"name": "7", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "8": {"name": "8", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "9": {"name": "9", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "10": {"name": "10", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "11": {"name": "11", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "12": {"name": "12", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "13": {"name": "13", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "14": {"name": "14", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "15": {"name": "15", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "16": {"name": "16", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "17": {"name": "17", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "18": {"name": "18", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "19": {"name": "19", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "20": {"name": "20", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "21": {"name": "21", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "22": {"name": "22", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "23": {"name": "23", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "24": {"name": "24", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "25": {"name": "25", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "26": {"name": "26", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "27": {"name": "27", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "28": {"name": "28", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "29": {"name": "29", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "30": {"name": "30", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}} \ No newline at end of file diff --git a/paper/data/configs/sim_1srv_50clin.json b/paper/data/configs/sim_1srv_50clin.json new file mode 100644 index 0000000..ad0de51 --- /dev/null +++ b/paper/data/configs/sim_1srv_50clin.json @@ -0,0 +1 @@ +{"1": {"name": "1", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "2": {"name": "2", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "3": {"name": "3", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "4": {"name": "4", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "5": {"name": "5", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "6": {"name": "6", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "7": {"name": "7", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "8": {"name": "8", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "9": {"name": "9", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "10": {"name": "10", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "11": {"name": "11", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "12": {"name": "12", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "13": {"name": "13", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "14": {"name": "14", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "15": {"name": "15", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "16": {"name": "16", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "17": {"name": "17", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "18": {"name": "18", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "19": {"name": "19", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "20": {"name": "20", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "21": {"name": "21", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "22": {"name": "22", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "23": {"name": "23", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "24": {"name": "24", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "25": {"name": "25", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "26": {"name": "26", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "27": {"name": "27", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "28": {"name": "28", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "29": {"name": "29", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "30": {"name": "30", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "31": {"name": "31", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "32": {"name": "32", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "33": {"name": "33", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "34": {"name": "34", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "35": {"name": "35", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "36": {"name": "36", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "37": {"name": "37", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "38": {"name": "38", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "39": {"name": "39", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "40": {"name": "40", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "41": {"name": "41", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "42": {"name": "42", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "43": {"name": "43", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "44": {"name": "44", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "45": {"name": "45", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "46": {"name": "46", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "47": {"name": "47", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "48": {"name": "48", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "49": {"name": "49", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}, "50": {"name": "50", "email": "", "divisions": {"1": {"min": 0, "max": 1000}}}} \ No newline at end of file diff --git a/paper/data/configs/sim_2srv_10clin.json b/paper/data/configs/sim_2srv_10clin.json new file mode 100644 index 0000000..80fff60 --- /dev/null +++ b/paper/data/configs/sim_2srv_10clin.json @@ -0,0 +1 @@ +{"1": {"name": "1", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "2": {"name": "2", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "3": {"name": "3", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "4": {"name": "4", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "5": {"name": "5", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "6": {"name": "6", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "7": {"name": "7", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "8": {"name": "8", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "9": {"name": "9", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "10": {"name": "10", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}} \ No newline at end of file diff --git a/paper/data/configs/sim_2srv_20clin.json b/paper/data/configs/sim_2srv_20clin.json new file mode 100644 index 0000000..8378228 --- /dev/null +++ b/paper/data/configs/sim_2srv_20clin.json @@ -0,0 +1 @@ +{"1": {"name": "1", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "2": {"name": "2", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "3": {"name": "3", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "4": {"name": "4", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "5": {"name": "5", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "6": {"name": "6", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "7": {"name": "7", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "8": {"name": "8", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "9": {"name": "9", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "10": {"name": "10", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "11": {"name": "11", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "12": {"name": "12", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "13": {"name": "13", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "14": {"name": "14", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "15": {"name": "15", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "16": {"name": "16", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "17": {"name": "17", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "18": {"name": "18", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "19": {"name": "19", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "20": {"name": "20", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}} \ No newline at end of file diff --git a/paper/data/configs/sim_2srv_30clin.json b/paper/data/configs/sim_2srv_30clin.json new file mode 100644 index 0000000..3babf57 --- /dev/null +++ b/paper/data/configs/sim_2srv_30clin.json @@ -0,0 +1 @@ +{"1": {"name": "1", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "2": {"name": "2", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "3": {"name": "3", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "4": {"name": "4", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "5": {"name": "5", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "6": {"name": "6", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "7": {"name": "7", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "8": {"name": "8", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "9": {"name": "9", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "10": {"name": "10", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "11": {"name": "11", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "12": {"name": "12", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "13": {"name": "13", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "14": {"name": "14", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "15": {"name": "15", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "16": {"name": "16", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "17": {"name": "17", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "18": {"name": "18", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "19": {"name": "19", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "20": {"name": "20", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "21": {"name": "21", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "22": {"name": "22", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "23": {"name": "23", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "24": {"name": "24", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "25": {"name": "25", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "26": {"name": "26", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "27": {"name": "27", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "28": {"name": "28", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "29": {"name": "29", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "30": {"name": "30", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}} \ No newline at end of file diff --git a/paper/data/configs/sim_2srv_50clin.json b/paper/data/configs/sim_2srv_50clin.json new file mode 100644 index 0000000..e7d38ca --- /dev/null +++ b/paper/data/configs/sim_2srv_50clin.json @@ -0,0 +1 @@ +{"1": {"name": "1", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "2": {"name": "2", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "3": {"name": "3", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "4": {"name": "4", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "5": {"name": "5", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "6": {"name": "6", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "7": {"name": "7", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "8": {"name": "8", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "9": {"name": "9", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "10": {"name": "10", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "11": {"name": "11", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "12": {"name": "12", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "13": {"name": "13", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "14": {"name": "14", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "15": {"name": "15", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "16": {"name": "16", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "17": {"name": "17", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "18": {"name": "18", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "19": {"name": "19", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "20": {"name": "20", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "21": {"name": "21", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "22": {"name": "22", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "23": {"name": "23", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "24": {"name": "24", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "25": {"name": "25", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "26": {"name": "26", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "27": {"name": "27", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "28": {"name": "28", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "29": {"name": "29", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "30": {"name": "30", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "31": {"name": "31", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "32": {"name": "32", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "33": {"name": "33", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "34": {"name": "34", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "35": {"name": "35", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "36": {"name": "36", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "37": {"name": "37", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "38": {"name": "38", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "39": {"name": "39", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "40": {"name": "40", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "41": {"name": "41", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "42": {"name": "42", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "43": {"name": "43", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "44": {"name": "44", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "45": {"name": "45", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "46": {"name": "46", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "47": {"name": "47", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "48": {"name": "48", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "49": {"name": "49", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}, "50": {"name": "50", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}}}} \ No newline at end of file diff --git a/paper/data/configs/sim_3srv_10clin.json b/paper/data/configs/sim_3srv_10clin.json new file mode 100644 index 0000000..a868567 --- /dev/null +++ b/paper/data/configs/sim_3srv_10clin.json @@ -0,0 +1 @@ +{"1": {"name": "1", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "2": {"name": "2", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "3": {"name": "3", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "4": {"name": "4", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "5": {"name": "5", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "6": {"name": "6", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "7": {"name": "7", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "8": {"name": "8", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "9": {"name": "9", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "10": {"name": "10", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}} \ No newline at end of file diff --git a/paper/data/configs/sim_3srv_20clin.json b/paper/data/configs/sim_3srv_20clin.json new file mode 100644 index 0000000..082215f --- /dev/null +++ b/paper/data/configs/sim_3srv_20clin.json @@ -0,0 +1 @@ +{"1": {"name": "1", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "2": {"name": "2", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "3": {"name": "3", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "4": {"name": "4", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "5": {"name": "5", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "6": {"name": "6", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "7": {"name": "7", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "8": {"name": "8", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "9": {"name": "9", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "10": {"name": "10", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "11": {"name": "11", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "12": {"name": "12", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "13": {"name": "13", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "14": {"name": "14", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "15": {"name": "15", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "16": {"name": "16", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "17": {"name": "17", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "18": {"name": "18", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "19": {"name": "19", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "20": {"name": "20", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}} \ No newline at end of file diff --git a/paper/data/configs/sim_3srv_30clin.json b/paper/data/configs/sim_3srv_30clin.json new file mode 100644 index 0000000..b2eb293 --- /dev/null +++ b/paper/data/configs/sim_3srv_30clin.json @@ -0,0 +1 @@ +{"1": {"name": "1", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "2": {"name": "2", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "3": {"name": "3", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "4": {"name": "4", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "5": {"name": "5", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "6": {"name": "6", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "7": {"name": "7", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "8": {"name": "8", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "9": {"name": "9", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "10": {"name": "10", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "11": {"name": "11", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "12": {"name": "12", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "13": {"name": "13", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "14": {"name": "14", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "15": {"name": "15", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "16": {"name": "16", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "17": {"name": "17", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "18": {"name": "18", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "19": {"name": "19", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "20": {"name": "20", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "21": {"name": "21", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "22": {"name": "22", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "23": {"name": "23", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "24": {"name": "24", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "25": {"name": "25", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "26": {"name": "26", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "27": {"name": "27", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "28": {"name": "28", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "29": {"name": "29", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "30": {"name": "30", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}} \ No newline at end of file diff --git a/paper/data/configs/sim_3srv_50clin.json b/paper/data/configs/sim_3srv_50clin.json new file mode 100644 index 0000000..2d505df --- /dev/null +++ b/paper/data/configs/sim_3srv_50clin.json @@ -0,0 +1 @@ +{"1": {"name": "1", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "2": {"name": "2", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "3": {"name": "3", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "4": {"name": "4", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "5": {"name": "5", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "6": {"name": "6", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "7": {"name": "7", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "8": {"name": "8", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "9": {"name": "9", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "10": {"name": "10", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "11": {"name": "11", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "12": {"name": "12", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "13": {"name": "13", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "14": {"name": "14", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "15": {"name": "15", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "16": {"name": "16", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "17": {"name": "17", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "18": {"name": "18", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "19": {"name": "19", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "20": {"name": "20", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "21": {"name": "21", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "22": {"name": "22", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "23": {"name": "23", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "24": {"name": "24", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "25": {"name": "25", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "26": {"name": "26", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "27": {"name": "27", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "28": {"name": "28", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "29": {"name": "29", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "30": {"name": "30", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "31": {"name": "31", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "32": {"name": "32", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "33": {"name": "33", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "34": {"name": "34", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "35": {"name": "35", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "36": {"name": "36", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "37": {"name": "37", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "38": {"name": "38", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "39": {"name": "39", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "40": {"name": "40", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "41": {"name": "41", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "42": {"name": "42", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "43": {"name": "43", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "44": {"name": "44", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "45": {"name": "45", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "46": {"name": "46", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "47": {"name": "47", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "48": {"name": "48", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "49": {"name": "49", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}, "50": {"name": "50", "email": "", "divisions": {"1": {"min": 0, "max": 1000}, "2": {"min": 0, "max": 1000}, "3": {"min": 0, "max": 1000}}}} \ No newline at end of file diff --git a/paper/data/generate_configs.py b/paper/data/generate_configs.py new file mode 100644 index 0000000..966f8d3 --- /dev/null +++ b/paper/data/generate_configs.py @@ -0,0 +1,28 @@ +import json + +def main(num_clin, num_services): + divisions = {} + for i in range(1, num_services + 1): + divisions[str(i)] = { + "min": 0, "max": 1000 + } + + data = {} + for i in range(1, num_clin + 1): + data[str(i)] = { + "name": str(i), + "email": "", + "divisions": divisions + } + + with open('./configs/sim_{}srv_{}clin.json'.format(num_services, num_clin), 'w') as f: + json.dump(data, f) + +if __name__ == "__main__": + import argparse + parser = argparse.ArgumentParser() + parser.add_argument('num_clinicians', type=int) + parser.add_argument('num_services', type=int) + + args = parser.parse_args() + main(args.num_clinicians, args.num_services) \ No newline at end of file diff --git a/paper/data/generate_requests.py b/paper/data/generate_requests.py new file mode 100644 index 0000000..9d78ced --- /dev/null +++ b/paper/data/generate_requests.py @@ -0,0 +1,37 @@ +from openpyxl import Workbook +from datetime import datetime, timedelta +import itertools + +num_clin = 10 +req_per_clin = 10 + +def main(num_clinicians, req_per_clin): + start = datetime(2019, 1, 1) + next_date = datetime(2019, 1, 1) + blocks = [] + clin_requests = {i: list() for i in range(1, num_clin + 1)} + + while (next_date - start).days < 360: + blocks.append(next_date) + next_date = next_date + timedelta(weeks=2) + + wb = Workbook() + block_iterator = itertools.cycle(blocks) + for clin in range(num_clinicians): + ws = wb.create_sheet(str(clin + 1)) + for row in range(1, req_per_clin + 1): + val = next(block_iterator).strftime('%d-%b-%Y') + ws.cell(column=1, row=row, value=val) + ws.cell(column=2, row=row, value=val) + + wb.remove(wb.active) + wb.save('{}clin_{}requests.xlsx'.format(num_clinicians, req_per_clin)) + +if __name__ == '__main__': + import argparse + parser = argparse.ArgumentParser() + parser.add_argument('num_clinicians', type=int) + parser.add_argument('req_per_clinician', type=int) + + args = parser.parse_args() + main(args.num_clinicians, args.req_per_clinician) \ No newline at end of file diff --git a/paper/data/holidays/2015 Holidays.xlsx b/paper/data/holidays/2015 Holidays.xlsx new file mode 100644 index 0000000..58f39f1 Binary files /dev/null and b/paper/data/holidays/2015 Holidays.xlsx differ diff --git a/paper/data/holidays/2016 Holidays.xlsx b/paper/data/holidays/2016 Holidays.xlsx new file mode 100644 index 0000000..728e621 Binary files /dev/null and b/paper/data/holidays/2016 Holidays.xlsx differ diff --git a/paper/data/holidays/2017 Holidays.xlsx b/paper/data/holidays/2017 Holidays.xlsx new file mode 100644 index 0000000..4a955bb Binary files /dev/null and b/paper/data/holidays/2017 Holidays.xlsx differ diff --git a/paper/data/holidays/2018 Holidays.xlsx b/paper/data/holidays/2018 Holidays.xlsx new file mode 100644 index 0000000..0bcd6e8 Binary files /dev/null and b/paper/data/holidays/2018 Holidays.xlsx differ diff --git a/paper/data/requests/10clin_10requests.xlsx b/paper/data/requests/10clin_10requests.xlsx new file mode 100644 index 0000000..ca0ef9c Binary files /dev/null and b/paper/data/requests/10clin_10requests.xlsx differ diff --git a/paper/data/requests/10clin_11requests.xlsx b/paper/data/requests/10clin_11requests.xlsx new file mode 100644 index 0000000..3eed3ef Binary files /dev/null and b/paper/data/requests/10clin_11requests.xlsx differ diff --git a/paper/data/requests/10clin_12requests.xlsx b/paper/data/requests/10clin_12requests.xlsx new file mode 100644 index 0000000..efa6f9f Binary files /dev/null and b/paper/data/requests/10clin_12requests.xlsx differ diff --git a/paper/data/requests/10clin_13requests.xlsx b/paper/data/requests/10clin_13requests.xlsx new file mode 100644 index 0000000..3cd1267 Binary files /dev/null and b/paper/data/requests/10clin_13requests.xlsx differ diff --git a/paper/data/requests/10clin_14requests.xlsx b/paper/data/requests/10clin_14requests.xlsx new file mode 100644 index 0000000..2e2af22 Binary files /dev/null and b/paper/data/requests/10clin_14requests.xlsx differ diff --git a/paper/data/requests/10clin_15requests.xlsx b/paper/data/requests/10clin_15requests.xlsx new file mode 100644 index 0000000..4151109 Binary files /dev/null and b/paper/data/requests/10clin_15requests.xlsx differ diff --git a/paper/data/requests/10clin_1requests.xlsx b/paper/data/requests/10clin_1requests.xlsx new file mode 100644 index 0000000..40547c1 Binary files /dev/null and b/paper/data/requests/10clin_1requests.xlsx differ diff --git a/paper/data/requests/10clin_2requests.xlsx b/paper/data/requests/10clin_2requests.xlsx new file mode 100644 index 0000000..d563d79 Binary files /dev/null and b/paper/data/requests/10clin_2requests.xlsx differ diff --git a/paper/data/requests/10clin_3requests.xlsx b/paper/data/requests/10clin_3requests.xlsx new file mode 100644 index 0000000..f26debc Binary files /dev/null and b/paper/data/requests/10clin_3requests.xlsx differ diff --git a/paper/data/requests/10clin_4requests.xlsx b/paper/data/requests/10clin_4requests.xlsx new file mode 100644 index 0000000..0699916 Binary files /dev/null and b/paper/data/requests/10clin_4requests.xlsx differ diff --git a/paper/data/requests/10clin_5requests.xlsx b/paper/data/requests/10clin_5requests.xlsx new file mode 100644 index 0000000..fb11c1b Binary files /dev/null and b/paper/data/requests/10clin_5requests.xlsx differ diff --git a/paper/data/requests/10clin_6requests.xlsx b/paper/data/requests/10clin_6requests.xlsx new file mode 100644 index 0000000..52081dc Binary files /dev/null and b/paper/data/requests/10clin_6requests.xlsx differ diff --git a/paper/data/requests/10clin_7requests.xlsx b/paper/data/requests/10clin_7requests.xlsx new file mode 100644 index 0000000..855a2cd Binary files /dev/null and b/paper/data/requests/10clin_7requests.xlsx differ diff --git a/paper/data/requests/10clin_8requests.xlsx b/paper/data/requests/10clin_8requests.xlsx new file mode 100644 index 0000000..f1f1ef6 Binary files /dev/null and b/paper/data/requests/10clin_8requests.xlsx differ diff --git a/paper/data/requests/10clin_9requests.xlsx b/paper/data/requests/10clin_9requests.xlsx new file mode 100644 index 0000000..ca5cf0c Binary files /dev/null and b/paper/data/requests/10clin_9requests.xlsx differ diff --git a/paper/data/requests/2015 Requests.xlsx b/paper/data/requests/2015 Requests.xlsx new file mode 100644 index 0000000..4a38cbc Binary files /dev/null and b/paper/data/requests/2015 Requests.xlsx differ diff --git a/paper/data/requests/2016 Requests.xlsx b/paper/data/requests/2016 Requests.xlsx new file mode 100644 index 0000000..a7eb9c2 Binary files /dev/null and b/paper/data/requests/2016 Requests.xlsx differ diff --git a/paper/data/requests/2017 Requests.xlsx b/paper/data/requests/2017 Requests.xlsx new file mode 100644 index 0000000..3ae4e04 Binary files /dev/null and b/paper/data/requests/2017 Requests.xlsx differ diff --git a/paper/data/requests/2018 Requests.xlsx b/paper/data/requests/2018 Requests.xlsx new file mode 100644 index 0000000..168ab9a Binary files /dev/null and b/paper/data/requests/2018 Requests.xlsx differ diff --git a/paper/fig/runtime-blocks.pdf b/paper/fig/runtime-blocks.pdf new file mode 100644 index 0000000..007e019 Binary files /dev/null and b/paper/fig/runtime-blocks.pdf differ diff --git a/paper/fig/runtime-blocks.pdf_tex b/paper/fig/runtime-blocks.pdf_tex new file mode 100644 index 0000000..3ad058e --- /dev/null +++ b/paper/fig/runtime-blocks.pdf_tex @@ -0,0 +1,75 @@ +%% Creator: Inkscape inkscape 0.92.4, www.inkscape.org +%% PDF/EPS/PS + LaTeX output extension by Johan Engelen, 2010 +%% Accompanies image file 'runtime-blocks.pdf' (pdf, eps, ps) +%% +%% To include the image in your LaTeX document, write +%% \input{.pdf_tex} +%% instead of +%% \includegraphics{.pdf} +%% To scale the image, write +%% \def\svgwidth{} +%% \input{.pdf_tex} +%% instead of +%% \includegraphics[width=]{.pdf} +%% +%% Images with a different path to the parent latex file can +%% be accessed with the `import' package (which may need to be +%% installed) using +%% \usepackage{import} +%% in the preamble, and then including the image with +%% \import{}{.pdf_tex} +%% Alternatively, one can specify +%% \graphicspath{{/}} +%% +%% For more information, please see info/svg-inkscape on CTAN: +%% http://tug.ctan.org/tex-archive/info/svg-inkscape +%% +\begingroup% + \makeatletter% + \providecommand\color[2][]{% + \errmessage{(Inkscape) Color is used for the text in Inkscape, but the package 'color.sty' is not loaded}% + \renewcommand\color[2][]{}% + }% + \providecommand\transparent[1]{% + \errmessage{(Inkscape) Transparency is used (non-zero) for the text in Inkscape, but the package 'transparent.sty' is not loaded}% + \renewcommand\transparent[1]{}% + }% + \providecommand\rotatebox[2]{#2}% + \newcommand*\fsize{\dimexpr\f@size pt\relax}% + \newcommand*\lineheight[1]{\fontsize{\fsize}{#1\fsize}\selectfont}% + \ifx\svgwidth\undefined% + \setlength{\unitlength}{2012.59847934bp}% + \ifx\svgscale\undefined% + \relax% + \else% + \setlength{\unitlength}{\unitlength * \real{\svgscale}}% + \fi% + \else% + \setlength{\unitlength}{\svgwidth}% + \fi% + \global\let\svgwidth\undefined% + \global\let\svgscale\undefined% + \makeatother% + \begin{picture}(1,0.54450831)% + \lineheight{1}% + \setlength\tabcolsep{0pt}% + \put(0,0){\includegraphics[width=\unitlength,page=1]{runtime-blocks.pdf}}% + \put(0.05517508,0.08284147){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0\end{tabular}}}}% + \put(0.05517508,0.15522138){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}1\end{tabular}}}}% + \put(0.05517508,0.22758172){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}2\end{tabular}}}}% + \put(0.05517508,0.29996163){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}3\end{tabular}}}}% + \put(0.05517508,0.37236111){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}4\end{tabular}}}}% + \put(0.05517508,0.44474102){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}5\end{tabular}}}}% + \put(0.05517508,0.51710136){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}6\end{tabular}}}}% + \put(0.07602613,0.05983017){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0\end{tabular}}}}% + \put(0.21888791,0.05983017){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}20\end{tabular}}}}% + \put(0.36621106,0.05983017){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}40\end{tabular}}}}% + \put(0.51351465,0.05983017){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}60\end{tabular}}}}% + \put(0.6608378,0.05983017){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}80\end{tabular}}}}% + \put(0.80369958,0.05983017){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}100\end{tabular}}}}% + \put(0.95102273,0.05983017){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}120\end{tabular}}}}% + \put(0.04390425,0.23077121){\color[rgb]{0.34901961,0.34901961,0.34901961}\rotatebox{90.00000252}{\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}Runtime (seconds)\end{tabular}}}}}% + \put(0.45185769,0.03047904){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}Number of Blocks\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=2]{runtime-blocks.pdf}}% + \end{picture}% +\endgroup% diff --git a/paper/fig/runtime-requests.pdf b/paper/fig/runtime-requests.pdf new file mode 100644 index 0000000..68364e0 Binary files /dev/null and b/paper/fig/runtime-requests.pdf differ diff --git a/paper/fig/runtime-requests.pdf_tex b/paper/fig/runtime-requests.pdf_tex new file mode 100644 index 0000000..08a3ae5 --- /dev/null +++ b/paper/fig/runtime-requests.pdf_tex @@ -0,0 +1,81 @@ +%% Creator: Inkscape inkscape 0.92.4, www.inkscape.org +%% PDF/EPS/PS + LaTeX output extension by Johan Engelen, 2010 +%% Accompanies image file 'runtime-requests.pdf' (pdf, eps, ps) +%% +%% To include the image in your LaTeX document, write +%% \input{.pdf_tex} +%% instead of +%% \includegraphics{.pdf} +%% To scale the image, write +%% \def\svgwidth{} +%% \input{.pdf_tex} +%% instead of +%% \includegraphics[width=]{.pdf} +%% +%% Images with a different path to the parent latex file can +%% be accessed with the `import' package (which may need to be +%% installed) using +%% \usepackage{import} +%% in the preamble, and then including the image with +%% \import{}{.pdf_tex} +%% Alternatively, one can specify +%% \graphicspath{{/}} +%% +%% For more information, please see info/svg-inkscape on CTAN: +%% http://tug.ctan.org/tex-archive/info/svg-inkscape +%% +\begingroup% + \makeatletter% + \providecommand\color[2][]{% + \errmessage{(Inkscape) Color is used for the text in Inkscape, but the package 'color.sty' is not loaded}% + \renewcommand\color[2][]{}% + }% + \providecommand\transparent[1]{% + \errmessage{(Inkscape) Transparency is used (non-zero) for the text in Inkscape, but the package 'transparent.sty' is not loaded}% + \renewcommand\transparent[1]{}% + }% + \providecommand\rotatebox[2]{#2}% + \newcommand*\fsize{\dimexpr\f@size pt\relax}% + \newcommand*\lineheight[1]{\fontsize{\fsize}{#1\fsize}\selectfont}% + \ifx\svgwidth\undefined% + \setlength{\unitlength}{2073.22281418bp}% + \ifx\svgscale\undefined% + \relax% + \else% + \setlength{\unitlength}{\unitlength * \real{\svgscale}}% + \fi% + \else% + \setlength{\unitlength}{\svgwidth}% + \fi% + \global\let\svgwidth\undefined% + \global\let\svgscale\undefined% + \makeatother% + \begin{picture}(1,0.63321976)% + \lineheight{1}% + \setlength\tabcolsep{0pt}% + \put(0,0){\includegraphics[width=\unitlength,page=1]{runtime-requests.pdf}}% + \put(0.06823049,0.07872524){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0\end{tabular}}}}% + \put(0.05489353,0.13156821){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.2\end{tabular}}}}% + \put(0.05489353,0.18443884){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.4\end{tabular}}}}% + \put(0.05489353,0.23728181){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.6\end{tabular}}}}% + \put(0.05489353,0.29012478){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.8\end{tabular}}}}% + \put(0.06823049,0.34299541){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}1\end{tabular}}}}% + \put(0.05489353,0.39583838){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}1.2\end{tabular}}}}% + \put(0.05489353,0.44870901){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}1.4\end{tabular}}}}% + \put(0.05489353,0.50155198){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}1.6\end{tabular}}}}% + \put(0.05489353,0.55438112){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}1.8\end{tabular}}}}% + \put(0.06823049,0.60726558){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}2\end{tabular}}}}% + \put(0.08899713,0.05688827){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0\end{tabular}}}}% + \put(0.19844527,0.05688827){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}2\end{tabular}}}}% + \put(0.30787893,0.05688827){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}4\end{tabular}}}}% + \put(0.41735602,0.05688827){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}6\end{tabular}}}}% + \put(0.52678969,0.05688827){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}8\end{tabular}}}}% + \put(0.6317806,0.05688827){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}10\end{tabular}}}}% + \put(0.74122874,0.05688827){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}12\end{tabular}}}}% + \put(0.85070582,0.05688827){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}14\end{tabular}}}}% + \put(0.96013949,0.05688827){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}16\end{tabular}}}}% + \put(0.04370994,0.27727707){\color[rgb]{0.34901961,0.34901961,0.34901961}\rotatebox{90.00000264}{\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}Runtime (seconds)\end{tabular}}}}}% + \put(0.39897718,0.02897181){\color[rgb]{0.34901961,0.34901961,0.34901961}\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}Number of Requests per Clinician\end{tabular}}}}% + \put(0,0){\includegraphics[width=\unitlength,page=2]{runtime-requests.pdf}}% + \end{picture}% +\endgroup% diff --git a/paper/fig/runtime_blocks.svg b/paper/fig/runtime_blocks.svg new file mode 100644 index 0000000..a1db018 --- /dev/null +++ b/paper/fig/runtime_blocks.svg @@ -0,0 +1,732 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + 1 + + + + + + + 2 + + + + + + + 3 + + + + + + + 4 + + + + + + + 5 + + + + + + + 6 + + + + + + + 0 + + + + + + + 20 + + + + + + + 40 + + + + + + + 60 + + + + + + + 80 + + + + + + + 100 + + + + + + + 120 + + + + + + + Runtime (seconds) + + + + + + + Number of Blocks + + + + + + + + + + + diff --git a/paper/fig/runtime_requests.svg b/paper/fig/runtime_requests.svg new file mode 100644 index 0000000..a62eb3a --- /dev/null +++ b/paper/fig/runtime_requests.svg @@ -0,0 +1,802 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + 0.2 + + + + + + + 0.4 + + + + + + + 0.6 + + + + + + + 0.8 + + + + + + + 1 + + + + + + + 1.2 + + + + + + + 1.4 + + + + + + + 1.6 + + + + + + + 1.8 + + + + + + + 2 + + + + + + + 0 + + + + + + + 2 + + + + + + + 4 + + + + + + + 6 + + + + + + + 8 + + + + + + + 10 + + + + + + + 12 + + + + + + + 14 + + + + + + + 16 + + + + + + + Runtime (seconds) + + + + + + + Number of Requests per Clinician + + + + + + + diff --git a/paper/paper.abstract.tex b/paper/paper.abstract.tex new file mode 100644 index 0000000..6b8ad28 --- /dev/null +++ b/paper/paper.abstract.tex @@ -0,0 +1,20 @@ +Scheduling of personnel in a hospital environment is vital to improving the +service provided to patients and balancing the workload assigned to clinicians. +Many approaches have been tried and successfully applied to generate efficient +schedules in such settings. However, due to the computational complexity of the +scheduling problem in general, most approaches resort to heuristics to find a +non-optimal solution in a reasonable amount of time. We designed an integer +linear programming formulation to find an optimal schedule in a clinical +division of a hospital. Our formulation mitigates issues related to +computational complexity by minimizing the set of constraints, yet retains +sufficient flexibility so that it can be adapted to a variety of clinical +divisions. \\ + +We then conducted a case study for our approach using data from the Infectious +Diseases division at St. Michael's Hospital in Toronto, Canada. We analyzed and +compared the results of our approach to manually-created schedules at the +hospital, and found improved adherence to departmental constraints and clinician +preferences. We used simulated data to examine the sensitivity of the runtime of +our linear program for various parameters and observed reassuring results, +signifying the practicality and generalizability of our approach in different +real-world scenarios. diff --git a/paper/paper.acknowledgements.tex b/paper/paper.acknowledgements.tex new file mode 100644 index 0000000..1739a88 --- /dev/null +++ b/paper/paper.acknowledgements.tex @@ -0,0 +1,6 @@ +The authors are grateful to Julie Veitch (St.\ Michael's Hospital) for her contributions to testing and +designing the scheduling software. SM is supported by a Canadian Institutes of +Health Research New Investigator Award. JK is supported by a Natural Sciences and +Engineering Research Council doctoral award. DL conducted part of this project as a +Keenan Research Summer Student, Li Ka Shing Knowledge Institute, St.\ Michael's +Hospital, University of Toronto. diff --git a/paper/paper.discussion.tex b/paper/paper.discussion.tex new file mode 100644 index 0000000..fad034e --- /dev/null +++ b/paper/paper.discussion.tex @@ -0,0 +1,91 @@ +In this paper, we present a simple, yet flexible, integer linear programming +formulation to generate schedules for clinical departments at hospitals. +The challenge in applying ILP to the task of scheduling clinicians lies in the +computational complexity of finding an optimal solution. As the size of the +% JK: Is this a challenge of applying ILP? Or of the problem in general? +% I got the impression that ILP was a nice way to overcome this problem. +scheduling problem grows, due to a larger roster of clinicians or more +complicated constraints, the time it takes to generate an optimal schedule may +grow exponentially in the worst case. +%The challenge in applying such an approach to this task lies in the fact that +%ILP is an NP-hard problem. %specify what 'such an approach' and 'this task' +%are... the first part of the sentence was a bit hard to follow. Define what you +%mean by NP-hard problem and cite --> i.e. NP-hard = the following sentence +%about how time to optimal solution grows exponentially? if yes, then instead of +%'As such' - say 'That is,...or "An NP-hard problem means that..." +% JK: How come only "may"? Under what conditions? +Many previous approaches to creating schedules in similar scenarios have avoided +this problem by using heuristics to find an approximately optimal solution +in a shorter amount of time~\cite{burke_state_2004}. +%As a result, the majority of approaches taken to create schedules for similar +%scenarios tend to use heuristics in order to find an approximately optimal +%solution in a shorter time~\cite{burke_state_2004}. %cite/reference +%statement (i.e. the 'vast majority'...) I can't remember if the introduction +%details the heuristics --> but if yes, then great. if no, then include that +%review of the prior literature here in discussion. I think as you said - the +%journals we are submitting to seem to have more of those details in the +%introduction. + +%double-check all abbreviations have been defined. I would prefer limiting +%abbreviations to no more than 3 at most if possible. We are ok for word count +%in this paper :). + +We presented a formulation that includes both hard constraints to ensure the +schedule satisfies hospital and logistics requirements, and a multi-goal +objective function to satisfy soft constraints (work preferences of clinicians). +%Our formulation includes hard constraints to ensure the schedule satisfies +%hospital and logistics requirements. It also aims to satisfy the work +%preferences of clinicians in a clinical department by optimizing a multi-goal +%objective function. +Although we restricted our application of the formulation to a set of +constraints for the particular needs of the case study (St.\ Michael's Hospital +Division of Infectious Diseases), our formulation can be adapted to various +clinical departments at different hospitals. The flexibility of our ILP allows +changing the number of services provided in a division, the length of a work +block, clinicians' preference for block to weekend adjacency as well as +clinicians' requests for time off. +% JK: Nice! + +When comparing the optimal schedule generated by our tool to the +manually-created schedules at St.\ Michael's Hospital, we found that the ILP +formulation was always able to find an optimal schedule satisfying all required +hard constraints, unlike the manual schedule, which often did not satisfy all +constraints. Moreover, due to the multi-goal objective function in +the ILP, the algorithm was able to fulfill the majority of clinician +preferences and requests, more so than the manually-created schedule. These +observations reinforce the benefits of automated tools when generating schedules +in hospital departments to balance the workload of clinicians and improve the +service provided to patients. The use of automated tools alleviates the time +spent on designing the schedule by hand, and provides clinical departments with +a more fair distribution of work that helps improve the overall satisfaction of +both employees and patients~\cite{silvestro_evaluation_2000}. % how the +%finding compares to the wider literature when automated compared to manual? +%What does it mean re: "so what" - human error in generating tools, etc. or +%challenges in heuristics used manually by people? include citations this last +%sentence in particular - what dos it reinforce exactly - what are the benefits? + +In our simulations, we also found that increasing the number of requests per +clinician did not affect the runtime of the algorithm, highlighting the +flexibility of the tool to incorporate clinician preferences. Further, we saw +that the algorithm can accommodate an increase in time-horizon up to four years +with little impact on runtime, suggesting the algorithm can be used generate +schedules far in advance. A key limitation we identified was the sensitivity +of the runtime to larger numbers of services offered by a single department. +One solution to mitigate the runtime issues created by a +larger number of services would be removing the constraint that prevents +assignment of consecutive blocks, followed by manual readjustment from the +generated schedule. %what do we mean by certain constraints? specify the other +%constraints? +Overall, our sensitivity analyses using simulated data provided reassurance that +the ILP formulation can be applied to schedule clinicians across real-world +variability between clinical departments. %SM - will look for reference and we +%can ask Kevin Gough too. +Next steps include expanding the generalizability of the tool beyond smaller +clinical departments to larger departments within and outside of health-care -- +especially those that provide multiple services in parallel for patients and +other clients. As well, additional work can be done to incorporate other +clinician preferences, such as the ability to request time-on slots or preference +for time of year. + +%SM: terrific. check if the journals we are submitting to (look at prior papers + journal specs) to see if we need to +% provide a conclusion statement/sentence. diff --git a/paper/paper.experiments.tex b/paper/paper.experiments.tex new file mode 100644 index 0000000..879bc38 --- /dev/null +++ b/paper/paper.experiments.tex @@ -0,0 +1,147 @@ +% JK: I think give an overview here of the experiments here +% and what you're going to show in this section (and why) +% check verb tense - use past tense I think given flow +Our goal was to determine if the schedules provided by solving the ILP +could successfully +(i) enforce all hard constraints; +(ii) improve fulfillment of soft constraints compared to the manual approach; %SM: found "improve satisfiability" a bit hard to follow. revise this phrase for clarity +and (iii) assess whether our ILP formulation can be used for a wide range +of configurations. %list objectives with numbers (i, ii, iii) or separated by semi-colons - helps the reader re: flow +First, we compared the schedules created by solving the ILP formulation +given in Section~\ref{sec:methods} to schedules that were manually generated, +with respect to adherence to the hard and soft constraints outlined in Section~\ref{sec:problem}. +We then examined the efficiency of the ILP approach in generating schedules +by its runtime on a variety of instances that may be found in the real-world. + +\subsection{Implementation} +We developed a Python software package with a user interface that implements the above +linear program and allows configuration of clinicians, to be +% JK: what is this ref? Do you want to mention it is in Python? +used by the ID division at St.\ Michael's Hospital~\cite{landsman_scheduling}. +The software was used to +generate the results in the following sections, using real data as well as +simulated data as input. All the following experiments were conducted on an +Intel Core i7-4770k CPU @ 3.50 GHz with 16 GB of RAM running 64-bit Windows 10. +Our software package uses COIN-OR Branch-and-Cut open source solver +% JK: "software" here is not clear to me, is it the solver for the ILP formulation? +version 2.9.9~\cite{johnjforrest_coin-or/cbc:_2019}. + +\subsection{Comparison with Manually Generated Schedules} %main comment = I think use past +%tense in writing +We used clinician time-off requests and minimum/maximum requirements from +2015-2018 as input data for the ILP problem. +Table~\ref{tbl:2018-schedule-comparison} compares the optimal schedule generated using +the software with the manually-created schedule for data from 2018. The +schedule is color-coded to distinguish between the different clinicians. + +\input{tbl/2018_schedule_comparison} +% JK: I think use input not include here to avoid unnecessary page breaks +% https://tex.stackexchange.com/questions/246 + +First, we evaluated the ILP solution by comparing it with the +% JK: I think it would be good to give a short name for manual and the proposed +% data -- e.g. LP Solution as in Table 4 and Manual Generation. %SM: great suggestion! +% Then check for consistency throughout. +% While lack of synonyms can sound repetitive, it can help avoid confusion. %SM: agree +manual generation, as in Table~\ref{tbl:2018-schedule-comparison}. Specifically, we examined the adherence of each +schedule to the constraints presented in Table~\ref{tbl:constraint-summary}. As +shown in Table~\ref{tbl:constraints-comparison}, the ILP solution satisfied all +hard constraints. In contrast, +% JK: "mandatory" = "hard"? if possible just use one. +manual generation did not satisfy all hard constraints. In +particular, we see that the manual generation assigned clinicians to multiple +consecutive blocks in all four years. Moreover, the manual generation did not have +an equal distribution of weekends and holidays for all four years of data. +Considering all objectives, we see that the ILP solution outperforms manual generation +in all four years, by accommodating almost all time-off requests and +ensuring that weekends are always assigned close to blocks. + +\input{tbl/constraints_comparison} +% JK: If you want to be funny, you can estimate the approximate time to +% generate the schedule and include that too (16 hours vs 1 second)... + +\subsection{Influence of Problem Complexity on Runtime} +Next, we examined the influence of the following four parameters on the +runtime of the ILP solver using simulated data: +number of clinicians; +number of services offered; +number of time-off requests per clinician per year; +time-horizon of the schedule. + +% JK: Introduce what you did first and then the figure showing results (see above) +The effect of increasing the number of clinicians and number of services %divisions %do you mean +%services? +on the runtime of the program is shown in Table~\ref{tbl:runtime-services-clinicians-comparison}. +We executed the algorithm for +$S = \{1, 2, 3\}$ total services and $C = \{10, 20, 30, 50\}$ clinicians in +total across all services. +In a department providing a single service, increasing the number of clinicians +did not affect the runtime, and we were able to find an ILP solution in all four cases +within 1 second. +For 2 concurrent services, a roster of 30 or more +clinicians becomes impractical to schedule, as searching for a solution required +over 24 hours. We saw similar issues for a roster of 20 or more clinicians +assigned to a division with 3 concurrent services. However, when removing the +NCB constraint, we saw a great improvement in runtime for divisions with 2 and 3 +services, and we were able to generate a schedule with upwards of 50 clinicians +in under 1.5 seconds. %what does division mean? do you mean services? %SM: make sure division vs. services defined in introduction, but may need to repeat again in problem statement to help the reader + +\input{tbl/runtime_services_clinicians} + +% JK: Good to introduce the detault parameters first, then for each parameter explored, +% Describe what varied. +For the remaining experiments, we simulated a department with 10 clinicians offering +two services, similar to the department at St.\ Michael's Hospital. +% JK: \abs{BR} does not clearly imply number of blocks (could be confused with week indices), +% so just leave out the LHS here I think. +% JK: What do you mean by non-overlapping? And why only increments of 5? +The effect of an increasing number of requests per clinician on the runtime of +the ILP solver is shown in Figure~\ref{fig:runtime-requests}. +In this experiment, each clinician was configured with 1 to 15 total block requests. +The runtime of the algorithm is constant with respect to the number of requests, +indicating that it can accommodate a lot of flexibility in +clinician requests. Moreover, we see that all runs were completed in under +2 seconds. +% JK: See somments below about trends and repeating simulations. + +\begin{figure}[h] + \centering + \def\svgwidth{\columnwidth} + \caption{Runtime of ILP solver with an increasing number of requests per clinician} + \input{fig/runtime-requests.pdf_tex} % JK: can you export this to PDF or SVG to avoid pixelation? + \label{fig:runtime-requests} + % JK: The trend here is a bit confusing, since I think you're trying to say + % that the runtime is not affected by the number of constraints, + % but there is noise in these results. + % I would re-run this 10-100 times and average the results so that (I expect) + % the mean trend is actually flat. You could (should) then also present the runtimes + % as box-plots to show that the trend is less than the variability. %SM: great suggestion! Did you do this (re-run 10-100 times?) - was not clear from description of experiments above +\end{figure} + +% JK: Introduce what you did first and then the figure showing results (see above) +% JK: Try to introduce these results in the same order as they appear in the +% first paragraph of this section. +Figure~\ref{fig:runtime-blocks} presents the change in runtime when increasing +the number of 2-week blocks in a department with 10 +clinicians offering two services. In this experiment, we investigated time horizons +from 5 to 110 blocks. This is equivalent to generating a schedule for up to 4 years ahead. +The trend in the graph indicates a linear growth in runtime with respect to the time-horizon. +Notably, the ILP solver was able to find all solutions in under 6 seconds, indicating very +good performance for long-term scheduling. +% 'very reasonable amount of time" is vague. what is reasonable? +%better to give a range in value. +% JK: same comment as above re. trends + +\begin{figure}[h] + \centering + \def\svgwidth{\textwidth} + \caption{Runtime of ILP solver with an increasing number of 2-week blocks}% + \input{fig/runtime-blocks.pdf_tex} + \label{fig:runtime-blocks} + % JK: same comment as above re. trends + % JK: Thess figures could also possible be Figure 1. a) and b) +\end{figure} + + +%SM: Table 6. change column heading "number of services" to "number of services within 1 division" +%SM: Table 6. without NCB is a double-negative (without no consecutive blocks). Can this be revised? \ No newline at end of file diff --git a/paper/paper.funding.tex b/paper/paper.funding.tex new file mode 100644 index 0000000..9c1b6f8 --- /dev/null +++ b/paper/paper.funding.tex @@ -0,0 +1,2 @@ +The work was jointly funded by the Ontario Ministry of Science and Innovation Early Researcher Award Number ER17-13-043; the Division of Infectious Diseases, St.\ Michael's Hospital, University of Toronto; and the University of Toronto Work Study Program. +%SM - confirmed reviewed \ No newline at end of file diff --git a/paper/paper.includes.tex b/paper/paper.includes.tex new file mode 100644 index 0000000..7ee55e8 --- /dev/null +++ b/paper/paper.includes.tex @@ -0,0 +1,31 @@ +% includes +\usepackage{amsmath} +\usepackage{amsthm} +\usepackage{amssymb} +\usepackage{authblk} +\usepackage{mathtools} +\usepackage{makecell} +\usepackage{physics} +\usepackage{hyperref} +\usepackage{bm}\newcommand{\ind}{\bm{1}} +\usepackage{multirow} +\usepackage[table]{xcolor} +\usepackage{booktabs} +\usepackage[utf8]{inputenc} +\usepackage{adjustbox} +\usepackage{caption}\captionsetup[table]{skip=1em} +\usepackage{rotating} +\usepackage{graphicx} +\graphicspath{{fig/}} +% JK: personal preference: join paper.includes + paper.definitions +% and write any definitions which rely on the package +% immediately after loading the package so you can see dependencies. + +% JK: personal formatting preference: +\usepackage[margin=3cm]{geometry} + +% definitions +\DeclarePairedDelimiter{\floor}{\lfloor}{\rfloor} +\DeclarePairedDelimiter{\ceil}{\lceil}{\rceil} +\DeclareUnicodeCharacter{2713}{\checkmark} +\setlength{\parskip}{1em} \ No newline at end of file diff --git a/paper/paper.intro.tex b/paper/paper.intro.tex new file mode 100644 index 0000000..5cd33a3 --- /dev/null +++ b/paper/paper.intro.tex @@ -0,0 +1,137 @@ +Hospital departments must allocate and use their limited resources efficiently +in order to provide a high quality of care for their patients. +%Hospital departments provide services where patient needs, and thus the system's +%demands, often exceed the available supply. +% JK: Not sure I follow this sentence. +% I think we dont need to say demands > needs, can just say efficieny improves care. SM: i really like JK suggestions and edits! +In particular, on-call schedules for +a fixed number of health-care providers are central to the efficient running of +hospitals. Carefully allocated schedules should balance +sufficient staff with clinician workload %SM: are staff and clinician the same thing? or are we balancing the two. clarify this sentence - what is balanced with what? +to maximize quality of care. It is common for on-call schedules in +hospitals to be created manually. However, +manually-created schedules are subject to three problems. +First, when there are a large number of clinicians, +or the constraints that need to be satisfied +by the schedule are complex, it becomes infeasible +to find a satisfying schedule by hand. +%a manual method may not provide a schedule +%that satisfies all constraints. +Second, when creating a schedule manually it is difficult to ensure +that all constraints are met while also trying to satisfy all staff +preferences. +%manual methods may overlook +%certain constraints that must be maintained to have an operational department, +%such as preventing many consecutive work blocks from being assigned or ensuring +%clinicians are allocated a specific amount of work blocks throughout the year, +%especially if there are many complex constraints to keep track of. +% JK: Can you clarify why / how these may be overlooked? +Third, manual scheduling is often time-consuming even for relatively small +departments, and can take up time and resources that are better used +for improving patient care. +For these reasons, it is important to develop automated methods that +can efficiently generate schedules that satisfy the given constraints. +% JK: haven't introduced what "optimal" means yet so I think maybe leave it out for now. +%For example, it is important that a hospital department allocates its +%resources, such as the availability of a finite number of clinicians, +%optimally, to ensure the best possible service for its patients. +% JK: instead of using \\ everywhere for paragraph breaks, use: +% \setlength{\parskip}{1em} +% in the preamble + +Automated methods to generate schedules have been studied and applied in many +industries, including +% JK: I find this is a nice way to organize these lists of topics & citations. SM: I like this +transportation~\cite{aickelin_improved_2006, goel_truck_2012, gunther_combined_2010}, +manufacturing~\cite{al-yakoob_mixed-integer_2007, al-yakoob_column_2008, alfares_simulation_2007}, +retail~\cite{chapados_retail_2011, nissen_automatic_2010}, and +military~\cite{horn_scheduling_2007, laguna_modeling_2005}. +Of special interest to a clinician scheduling +problem are the approaches to scheduling nurses, who often work in shifts. In the +nurse scheduling problem, the goal is to find an optimal assignment of nurses to +shifts that satisfies all hard constraints (such as hospital regulations), +and as many soft constraints (such as nurse preferences) as possible. +% JK: Is this specific to the nurse scheduling problem? +% This sounds like the more general definition of the scheduling problem. +% Can you define hard and soft constraints here and give +% one example of a hard constraint and one example of a soft constraint. +Hard constraints must be satisfied by any candidate solution to the nurse scheduling problem, +while soft constraints can be used to rank the candidate solutions. +For instance, a nurse scheduling problem may include a hard constraint to assign +at most a single shift for each nurse per day. It can also incorporate +nurse preference for shift time (that is, day versus night shifts) as a soft constraint +that is meant to optimize the schedule, but is not guaranteed to be fulfilled. +A wide variety of approaches, including exact and heuristic approaches, have been +used to solve the nurse scheduling problem: +integer linear programming~\cite{azaiez_0-1_2005, trilling_nurse_2006, widyastiti_nurses_2016}, +network flows~\cite{el_adoly_new_2018}, +genetic algorithms~\cite{aickelin_exploiting_2000, jan_evolutionary_2000, kawanaka_genetic_2001}, +simulated annealing~\cite{jaszkiewicz_metaheuristic_1997}, and +artificial intelligence~\cite{abdennadher_nurse_1999, li_hybrid_2003}. +A comprehensive +literature review of these and other methods applied to nurse scheduling is +presented in~\cite{burke_state_2004}. +% JK: rostering = scheduling? I think okay to re-use "scheduling" unless its getting extremely repetitive. +% but even then I think SM would agree clarity > flow/repetition. SM: agree!! :) use same terminology throughout + +%An extensive literature review of these and other methods is presented by [??]. +%We will briefly summarize the main ideas of some of these approaches. \\ SM - +%don't need to introduce that you will do this for this type of paper I think - +%would do in a thesis chapter though. + +Many of the approaches to nurse scheduling were designed to satisfy the +requirements of a specific hospital department, which results in a large number of +variables and constraints to be incorporated into the problem formulation. While +these department-specific approaches allow end-users to find precise schedules +that satisfy the needs of that department and the preferences of nurses and +clinicians in that department, they are difficult to adapt to other +departments. % explain why hard to +%adapt?... what makes their generalizablility/adaptability limited? +% JK: I'm less bothered by this lack of explaination, since I know its +% hard to explain without getting into the nitty-gritty. +Moreover, the large number of variables and constraints also leads to +computational complexity issues~\cite{goos_complexity_1996}, especially when +% JK: I think good to clarify that these complextiy issues would imply that +% the problem is essentially impossible to solve in a limited amount of time. +trying to find the most optimal solution. In particular, difficult instances of these formulations +become impossible to solve in a reasonable amount of time. +In this paper, we tackle the clinician +scheduling problem arising from a case study of one clinical +division, providing two different services (general infectious +disease (ID) consults; and HIV consults) at St.\ Michael's Hospital in +Toronto, Canada. The clinician scheduling problem involves creating +a yearly schedule that assigns clinicians to on-call work on a weekly basis, +while ensuring a fair and balanced workload. +% JK: the nurse scheduling problem? +% I think we need to define the "scheduling problem" +% and how / if it differs from other scheduling problem. +Our goals in this paper are to (1) present an integer linear programming +(ILP) formulation for our problem, and +describe the flexibility of this formulation for solving similar problems; +(2) compare the performance of our tool for solving the ILP formulation to the +results of a manual approach; +and (3) analyze the robustness of this approach +in difficult instances of the problem, by exploring the change in runtime with +changes to: +the number of clinicians, +the number of services provided by the department, +the number of requests per clinician, and +the time-horizon of the schedule. +% JK: what do you mean by different instances? Can you be more specific? SM: nice, i like the clarity of what is being explored up front like this +% The results explore: +% (1) runtime vs number of requests +% (2) runtime vs number of blocks +% (3) satisfaction of hard and soft constraints. +% present a simple formulation for the problem developed and tested at the +%hospital after switching from a manual approach to scheduling; and (2) analyze +%the performance of integer linear programming in solving difficult instances of +%the problem and compare the results with those of the manual approach; and (3) +%describe the adaptability of the formulation as a basic framework for solving +%similar problems in other departments. \\ %make #3 an objective + +We begin by describing the details of the problem in Section~\ref{sec:problem}, and presenting +our ILP formulation in Section~\ref{sec:methods}. Next, we compare the results +of our formulation to manually-created schedules, and evaluate the performance +of the algorithm on simulated data in Section~\ref{sec:experiments}. Finally, we +discuss and interpret the results in Section~\ref{sec:discussion}. % list the +%main contents/elements of the paper. diff --git a/paper/paper.methods.tex b/paper/paper.methods.tex new file mode 100644 index 0000000..ee8e648 --- /dev/null +++ b/paper/paper.methods.tex @@ -0,0 +1,293 @@ +In this section, we present an application of integer linear programming to solve the clinician +% JK: there are a few variations of +% "nurse scheduling problem", "scheduling problem" "clinician scheduling problem" +% floating around. Can you do a consistency check throughout? SM: agree +scheduling problem presented in Section~\ref{sec:problem}. +An integer linear program (ILP) consists of a linear objective function and linear constraints, +with integer-valued variables. The optimal solution to the ILP must lie within the space +defined by the constraints while also maximizing the objective value. +First, we describe +% JK: Also, while the intro gives a reference for ILP, +% I think you should define it here. e.g. It is not clear to the naive reader (me!) +% that ILP needs an objective function +% or (most importantly) how ILP works to satisfy multiple constraints. %SM: great JK comments + how you addrssed them DL +the sets, indices and variables necessary for the formulation of the problem. We +then write the constraints given in Table~\ref{tbl:constraint-summary} as +linear functions of the variables, and define the objective function of the ILP. + +\subsection{Sets and Indices}\label{sec:meth-sets-indices} +We denote the set of all services %or I think services is good (vs. +%services/divisions) as you define two types of services (ID vs. HIV) in the +%problem statement +% JK: same thing, consistency check with division / service +% I think maybe you already did this... +that clinicians in a single department can provide as $\mathcal{S}$. +%The following formulation assumes that all clinicians are able to provide all services. +% JK: but could you not also just set some clinician-service max-mins zero +% to deal with if some clinicians are not able to provide some services? +The set of all clinicians in the department is denoted as +$\mathcal{C}$. The sets of blocks and weekends +% JK: removed "will be assigned to" since on first read I confused it with +% the binary assignment variable X below. +are denoted as $\mathcal{B}$ and $\mathcal{W}$ respectively. The block size +used in our experiments is 2 weeks, but the following LP formulation does not +require a particular size for blocks, and so it can be adapted for other cases. +%The size of a block is not constrained and can be adapted %how? +%to the needs of the given department. +A subset of weekends are denoted $\mathcal{L} \subset \mathcal{W}$, corresponding to statutory +long/holiday weekends such as the Thanksgiving weekend in the United States and Canada. Lastly, +% JK: I'm being picky, but maybe a non-Canadian holiday like Thanksgiving as the e.g. %SM: but not in Europe yak! +the block and weekend time-off requests of clinicians are denoted as the following +subsets of all blocks and weekends: $\mathcal{U}_c \subset \mathcal{B}$ and $\mathcal{V}_c \subset \mathcal{W}$, respectively. +% JK: keeping "x is denoted as x" sentence structure +% JK: Also, I'm generally not a fan of multiple-letter variables since they can be +% easily confused for multiplication. Can you find another notation? +For instance, if clinician $c$'s time-off requests intersect with blocks 1 and 2, and weekend +1, then $\mathcal{U}_c = \{1, 2\}$ and $\mathcal{V}_c = \{1\}$. Table~\ref{tbl:sets-indices} presents a summary of the sets and indices described. + +\begin{table}[h] + \centering + \caption{Description of sets and indices in the problem}% + \label{tbl:sets-indices} + \begin{tabular}{ c c l } + \toprule + \textbf{Set} & \textbf{Index} & \textbf{Description} + \\ \midrule + $\mathcal{S} = \{1, \ldots, S \}$ & $s$ & services + \\ + $\mathcal{C} = \{1, \ldots, C \}$ & $c$ & clinicians + \\ + $\mathcal{B} = \{1, \ldots, B \}$ & $b$ & blocks + \\ + $\mathcal{W} = \{1, \ldots, W \}$ & $w$ & weekends + \\ + $\mathcal{L} \subset \mathcal{W}$ & & long weekends + \\ + $\mathcal{U}_c \subset \mathcal{B}$ & & block requests of + clinician $c$ \\ + $\mathcal{V}_c \subset \mathcal{W}$ & & weekend requests of + clinician $c$ \\ + \bottomrule + \end{tabular} + +\end{table} + +\subsection{Variables}\label{sec:meth-variables} +Since each clinician may be assigned to work on any service, during any block of +the year, we denote such an assignment as a binary variable $X_{c, b, s} \in \{0,1\}$. +% JK: I know its implied but if its easy to spell it out might as well. +A value of 1 indicates that clinician $c$ is assigned to service $s$ during block $b$, +while a value of 0 indicates they are not assigned. +Weekend assignments are similarly defined using a binary +variable $Y_{c, w} \in \{0,1\}$, but without a service index, as clinicians are expected to +provide all services during the weekends. We then define +$m_{c, s}$ and $M_{c, s}$ to represent the minimal and maximal number of blocks of service $s$ +that clinician $c$ is required to work during the year. +Table~\ref{tbl:variables-constants} presents a summary of the constants and variables +in the problem. +%To optimize the soft constraint Block-Weekend Adjacency, we maximize the +%product $X_{c, b, s} \cdot Y_{c, w}$ for adjacent blocks and weekends. To +%formulate such an objective as a linear function of variables, we introduce +%another set of variables, denoted by $Z_{c, b, s}$, with additional constraints +%on its range. Further details regarding this variable are described in Section +%\ref{sec:meth-objectives}. + +\begin{table}[h] + \centering + \caption{Description of variables and constants in the problem}% + \label{tbl:variables-constants} + \begin{tabular}{ c l } + \toprule + \textbf{Name} & \textbf{Description} + \\ \midrule + $X_{c, b, s} \in \{0, 1\}$ & assignment of clinician $c$ to service $s$ on + block $b$ \\ + $Y_{c, w} \in \{0, 1\}$ & assignment of clinician $c$ on weekend $w$ + \\ + % $Z_{c, b, s} \in \{0, 1\}$ & helper variable for optimizing Block-Weekend + %adjacency \\ + $m_{c, s}$ & minimum number of blocks clinician $c$ should + cover on service $s$ \\ + $M_{c, s}$ & maximum number of blocks clinician $c$ should + cover on service $s$ \\ + \bottomrule + \end{tabular} +\end{table} + +\subsection{Constraints}\label{sec:meth-constraints} +We now formalize the hard constraints in Table~\ref{tbl:constraint-summary} +using the variables defined above. +The BC (block coverage) and WC (weekend coverage) constraints, +are given by Eqns. (\ref{eqn:constr-block-cov}) and (\ref{eqn:constr-weekend-cov}), respectively. +\begin{align} +&\sum_{c=1}^{C} X_{c, b, s} = 1 &&\forall b\in \mathcal{B}, s \in \mathcal{S} \label{eqn:constr-block-cov} \\ +&\sum_{c=1}^{C} Y_{c, w} = 1 &&\forall w\in \mathcal{W} \label{eqn:constr-weekend-cov} +\end{align} +The MM (min/max) constraint is given by: +\begin{align} +&m_{c, s} \leq \sum_{b=1}^{B} X_{c, b, s} \leq M_{c, s} &&\forall\ +c\in\mathcal{C}, s\in\mathcal{S} \label{eqn:constr-min-max} +\end{align} +The NCB (no consecutive blocks) and NCW (no consecutive weekends) constraints are +given by Eqns. (\ref{eqn:constr-no-consec-blocks}) and (\ref{eqn:constr-no-consec-weekends}), respectively. +\begin{align} +&X_{c, b, s} + X_{c, b + 1, s} \leq 1 &&\forall c\in\mathcal{C}, b \leq B - 1, +s\in\mathcal{S} \label{eqn:constr-no-consec-blocks} \\ +&Y_{c, w} + Y_{c, w + 1} \leq 1 &&\forall c\in\mathcal{C}, w \leq W - 1 \label{eqn:constr-no-consec-weekends} +\end{align} +The EW (equal weekend) and EH (equal holidays) constraints are given by Eqns. (\ref{eqn:constr-equal-weekends}) +and (\ref{eqn:constr-equal-holidays}), respectively. +\begin{align} +&\floor*{\frac{W}{C}} \leq \sum_{w=1}^W Y_{c, w} \leq \ceil*{\frac{W}{C}} +&&\forall c\in\mathcal{C} \label{eqn:constr-equal-weekends} \\ +&\floor*{\frac{\abs{\mathcal{L}}}{C}} \leq \sum_{w\in\mathcal{L}} Y_{c, w} \leq +\ceil*{\frac{\abs{\mathcal{L}}}{C}} &&\forall c\in\mathcal{C} +\label{eqn:constr-equal-holidays} +\end{align} +% JK: not sure how I feel about these letters as equation refs +% SM: agree. on reading in full, it felt odd enough for me to suggest using number for equations... +% e.g. The WC (weekend coverage) constraint is given by .... [equation] + + +\subsection{Objectives}\label{sec:meth-objectives} +As described in Section~\ref{sec:problem}, the soft constraints of the clinician +scheduling problem include: satisfying clinician block off requests (BR), +satisfying clinician weekend off requests (WR), and assigning weekends closer to +blocks (BWA). We convert these soft constraints into linear objective functions +of the binary variables defined in Section~\ref{sec:meth-variables}. +Objectives BR and WR are given in Eqns. (\ref{eqn:obj-block-requests}) and (\ref{eqn:obj-weekend-requests}) +as linear functions of $X$ and $Y$: +%minor suggestion - consider +%numbering the objectives for ease later when saying things like "these two +%objectives"...or writing the full name of the objectives instead of 'this' and +%'these' as sometimes can get confusing what the 'this' and the 'these' refer %SM: agree! +%to. +\begin{align} +&Q_1(X) = \sum_{c=1}^{C} \sum_{b=1}^{B} \sum_{s=1}^{S} +{(-1)}^{\ind(b\,\in\,\mathcal{U}_c)}\cdot X_{c, b, s} +\label{eqn:obj-block-requests}\\ +&Q_2(Y) = \sum_{c=1}^{C} \sum_{w=1}^{W} +{(-1)}^{\ind(w\,\in\,\mathcal{V}_c)}\cdot Y_{c, w} +\label{eqn:obj-weekend-requests} +\end{align} +where $\ind(P)$ is the indicator function that has value 1 when predicate $P$ +holds and 0 otherwise. In the above two objectives, we penalize any assignments +that conflict with a block or weekend request, and aim to maximize the +non-conflicting assignments. + +The BWA objective is optimized by considering the product $X_{c, b, s}\cdot Y_{c, w}$ +for values of $w$ ``adjacent'' to the value of $b$. This +leads to the maximization objective:%avoid editorial adjectives +\begin{align} +&Q_3(X, Y) = \sum_{c=1}^{C} \sum_{b=1}^{B} \sum_{s=1}^{S} X_{c, b, s}\cdot Y_{c, + w=\varphi(b)} \label{eqn:obj-block-weekend-adj} +\end{align} +where $\varphi(b)$ is a one-to-one mapping of a block to an adjacent weekend, by +some appropriate definition of adjacency. For instance, clinicians might want to +be assigned during a weekend that falls within an assigned block. In this case, +we will have $\varphi(b) = 2b-1$. + +%So if clinician $c$ is assigned to work during block 3, corresponding to weeks +%5 and 6 assuming 2-week blocks, they might also want to be assigned to work +%during weekend 5. In that case, we would like $X_{c, b=3, s} \cdot Y_{c, w=5}$ +%to be 1, since that indicates both variables are assigned. If at least one of +%the two variables is not assigned, the product will be 0. +% I really liked the example explanation! +%For instance, in the above example we will have $\varphi(b) = 2b - 1$. \\ + +However, as it is, $Q_3$ is not a linear function of the assignment variables +$X$ and $Y$, and cannot be optimized in a linear programming framework. +An approach used to convert such +functions into linear objectives involves introducing a helper variable and +additional constraints~\cite{hammer_boolean_1968}. +In our case, we introduce a variable $Z_{c, b, s}$ +for every product $X_{c, b, s} \cdot Y_{c, w}$ with $w = \varphi(b)$, and +constraining $Z$ such that +\begin{align} +&Z_{c, b, s} \leq X_{c, b, s} \label{eqn:helper-x-constraint}\\ +&Z_{c, b, s} \leq Y_{c, w=\varphi(b)} &&\forall s\in\mathcal{S} +\label{eqn:helper-y-constraint} +\end{align} +Since $X_{c, b, s}$ and $Y_{c, w}$ are binary variables, $Z_{c, b, s}$ will be constrained +to 0, unless both $X_{c, b, s}$ and $Y_{c, w}$ are 1. Therefore, it suffices to maximize +the following linear function of $Z$, +\begin{align} +&Q_3(Z) = \sum_{c=1}^{C} \sum_{b=1}^{B} \sum_{s=1}^{S} Z_{c, b, s} +\end{align} +to get the correct adjacency maximization objective. +%In our case, introducing a +%variable $Z_{c, b, s}$ for every product $X_{c, b, s} \cdot Y_{c, w}$ with $w = +%\varphi(b)$, and constraining $Z$ such that +%\begin{align} +%&Z_{c, b, s} \leq X_{c, b, s} \label{eqn:helper-x-constraint}\\ +%&Z_{c, b, s} \leq Y_{c, w=\varphi(b)} &&\forall s\in\mathcal{S} +%\label{eqn:helper-y-constraint} +%\end{align} +%allows us to rewrite $Q_3$ as a linear function of $Z$, +%\begin{align} +%&Q_3(Z) = \sum_{c=1}^{C} \sum_{b=1}^{B} \sum_{s=1}^{S} Z_{c, b, s} +%\end{align} +%Indeed from Eqns. (\ref{eqn:helper-x-constraint}) and +%(\ref{eqn:helper-y-constraint}), whenever $X_{c, b, s} \cdot Y_{c, w} = 1$ +%(respectively, 0), $Z_{c, b, s}$ can attain a maximum value of 1 (respectively, +%0), giving us the correct adjacency maximization objective. +% JK: not sure I follow these (respectively, 0). +%Indeed, whenever $X_{c, b, s} \cdot Y_{c, w} = 1$, $Z_{c, b, s}$ can attain a +%maximum value of 1, and whenever $X_{c, b, s} \cdot Y_{c, w} = 0$, at least one +%of $X_{c, b, s}$ or $Y_{c, w}$ must be 0, so $Z_{c, b, s}$ will be constrained +%to attain a maximum value of 0, giving us the correct adjacency maximization +%objective. \\ + +In order to optimize all objectives simultaneously, we optimize a weighted sum +of the normalized objective functions, +% JK: This only considers the soft constraints. +% Should this maximization not also be subject to the Constraints in 3.3? +\begin{equation} +\max_{X, Y, Z} \alpha_1 \bar{Q}_1(X) + \alpha_2 \bar{Q}_2(Y) + \alpha_3 +\bar{Q}_3(Z) +\end{equation} +% JK: I would use $\alpha_1, \alpha_2, \alpha_3$ here which could take any value, +% and then not necessary to have any bounds like \sum_i^3 \alpha_i = 1, +% though you could enforce it to compare across permutations of \alpha +subject to the constraints defined in Section \ref{sec:meth-constraints}, +where $\bar{Q}_i$ is the normalization of objective $Q_i$, and $0 \leq \alpha_i \leq 1$. +This method guarantees an optimal solution to be Pareto optimal~\cite{stanimirovic_linear_2011}. + +Currently, the most efficient approach to finding an exact solution for +an ILP is called Branch-and-Cut~\cite{mitchell_branch-and-cut_2002}. %SM: good +This method involves iteratively solving +LP relaxations of the ILP, then constraining the relaxed problems and +considering various sub-problems until it finds integral solutions to the +original ILP. +In the intermediate relaxations, the integer assignment variables can +take on real values, allowing the problem to be solved efficiently using +the Simplex method~\cite{shamir_efficiency_1987}. The +complexity of finding an optimal integral solution thus lies in the +branching search structure of Branch-and-Cut. + +% JK: How can ILP be used solve such problems? Can you briefly describe? + +%Thus, our clinician scheduling problem is a multiple objective optimization +%problem. The most common approach to solving multiple objective optimization +%problems is by optimizing a weighted sum of the normalized objective functions, +%as this guarantees the optimal solution to be Pareto optimal [ref \ref{???}]. +%This is the approach we decided to use in our problem, to ensure all three +%objectives are considered when finding a solution. Under the assumption that +%each clinician in $\mathcal{C}$ provides all types of services in +%$\mathcal{S}$, the normalized objectives can be written as follows, +%\begin{align} +% &\bar{Q}_1(X) = \frac{Q_1(X)}{C \cdot B \cdot S} \tag{Block Requests} +%\label{eqn:norm-obj-block-requests}\\ +% &\bar{Q}_2(Y) = \frac{Q_2(Y)}{C \cdot W} \tag{Weekend Requests} +%\label{eqn:norm-obj-weekend-requests} \\ +% &\bar{Q}_3(Z) = \frac{Q_3(Z)}{C \cdot B \cdot S} \tag{Block-Weekend Adjacency} +%\label{eqn:norm-obj-block-weekend-adj} +%\end{align} +%where we divide each of the original objective functions by the sum of the +%absolute values of its coefficients [ref \ref{???}]. The final weighted +%objective is given by +%\begin{equation} +% \alpha \bar{Q}_1(X) + \beta \bar{Q}_2(Y) + (1 - \alpha - \beta) \bar{Q}_3(Z) +%\end{equation} +%with $0 \leq \alpha, \beta \leq 1$. \\ + diff --git a/paper/paper.pdf b/paper/paper.pdf new file mode 100644 index 0000000..3059d5c Binary files /dev/null and b/paper/paper.pdf differ diff --git a/paper/paper.problem.tex b/paper/paper.problem.tex new file mode 100644 index 0000000..2960a53 --- /dev/null +++ b/paper/paper.problem.tex @@ -0,0 +1,111 @@ +At St.\ Michael's Hospital, the division of infectious diseases offers +separate but concurrent services for general ID consultations and for HIV consultations. Each +service provides clinical care throughout the year, during regular working hours +and on weekends and holidays. The schedule is created in advance, +outlining all work-week and weekend shifts for the full year. +In the yearly schedule clinicians are assigned to ``blocks'' of +two consecutive regular work weeks and individual weekends. Apart +% JK: when I first read this I thought weekends were also in 2-week blocks +from long (holiday) weekends, a work week starts on Monday at 8 A.M. and ends on +Friday at 5 P.M. Accordingly, weekend service starts on Friday at 5 P.M., and +ends on Monday at 8 A.M. During the weekend, ID and HIV consultation services +are combined and provided by one clinician. During the regular work week the ID +and HIV services are led by one clinician each. +% JK: I thik we need something like: +% Therefore, our objective is to: assign one clinician to ... +% while additionally considering the following constraints ... +Therefore, our objective is to assign a single clinician to cover +each service for each block and each weekend of the year, while +additionally ensuring a balanced workload. + +In most scheduling problems, the constraints can be divided into hard and soft +constraints. Hard constraints must be satisfied by any candidate solution, while +soft constraints can be used to select a more favourable solution from a set of +candidate solutions. Typically, soft constraints are therefore encoded as objective +functions which are +maximized when finding a solution. In the case of the clinician +% JK: the direction of max / minimization is arbitrary, +% I think sufficient to pick one here to avoid confusion. +scheduling problem, we chose departmental regulations and workload balance as hard constraints, +while clinician preference and requests serve as soft constraints. +%we chose Block Requests, Weekend Requests and Block-Weekend +%Adjacency as our soft constraints, while the rest of the constraints are hard. +After the schedule is generated, clinicians may +exchange certain weeks or days throughout the year, to fulfill any missed requests. +%Our approach to schedule generation does not +%consider such future exchanges, and instead generates on one full year at a time. +% JK: I think this para (4) should go instead as the 2nd in this section. +% you could introduce the ideas of hard and soft constraints (this para) first, +% and then have the current paras (2) and (3) after this one, where the reader +% is already aware that (2) is hard constraints and (3) is soft. +% Oh, I see that they're not currently split up exactly, but I think it would be +% helpful to do so. Maybe double check with SM though. SM: agree with JK and it reads nicely to see the definition of constraints up front here. + +The following are the departmental and workload constraints placed on the clinician assignments. +% JK: I think you need to introduce BC and WC constraints here, +% since they appear in Table 1 without text in the body. +First, each clinician +must work between a minimum and maximum number of blocks of each service during the year. +For instance, one clinician might have to +provide 3-5 blocks of general ID service and 2-3 blocks of HIV service +% JK: trying to reduce synonyms "service" / "consultation" +throughout the year. These limits may be different for each clinician, +and they may change from year to year as +the number of clinicians in the department changes. Second, the schedule +should not assign a clinician to work for two consecutive blocks or two +consecutive weekends. The schedule should also distribute regular +weekends and holiday weekends each equally among all clinicians. + +In addition to balancing the workload among clinicians, the schedule +should accommodate their preferences. Clinicians provide their requests for +time off before schedule generation so that the requests may be integrated +into the schedule. Clinicians may specify days, weeks or weekends off, with the +understanding that any blocks overlapping with their request will be assigned to +a different clinician where possible. For example, if a clinician only requests +a given Monday and Tuesday off, the schedule should avoid assigning the +entire block to that clinician. Clinicians also typically prefer to have their weekend and +block assignments side by side, so the schedule should accommodate this where possible. +A summary of the outlined constraints is given in +Table~\ref{tbl:constraint-summary}. + +\begin{table}[h] + \centering + \caption{Summary of the constraints for the clinician scheduling problem}% + \label{tbl:constraint-summary} + % JK: table caption should go at the top. + % The spacing can be funny so I use: + % \usepackage{caption}\captionsetup[table]{skip=1em} SM: I need to learn these tricks for appendices of modeling papers! + % also labels should be on their own line. + % JK: below: I would consider making the 2-3 letter abbreviations its own column + \begin{tabular}{ l c l l } + \toprule + % JK: different line weights support table structure + \textbf{Constraint Name} & \textbf{Abbreviation} & \textbf{Description} & \textbf{Type} \\ \midrule + Block Coverage & BC & \makecell[l]{each service needs to have + exactly \\ one clinician that covers any given block} & Hard \\ \hline + Weekend Coverage & WC & \makecell[l]{every weekend needs to have + exactly \\ one clinician that covers it} & Hard \\ \hline + Min/Max & MM & \makecell[l]{for a given service, each + clinician can only \\ work between the minimum and maximum \\ number of allowed + blocks} & Hard \\ \hline + No Consecutive Blocks & NCB & \makecell[l]{any clinician should not work \\ + two consecutive blocks, across all services} & Hard \\ \hline + No Consecutive Weekends & NCW & \makecell[l]{any clinician should not work two + consecutive \\ weekends} & Hard \\ \hline + Equal Weekends & EW & \makecell[l]{weekends should be equally + distributed \\ between clinicians} & Hard \\ \hline + Equal Holidays & EH & \makecell[l]{long weekends should be equally + distributed \\ between clinicians} & Hard \\ \hline + Block Requests & BR & \makecell[l]{each clinician can request to be + off service \\ during certain blocks throughout the year} & Soft \\ \hline + Weekend Requests & WR & \makecell[l]{each clinician can request to be + off service \\ during certain weekends throughout the year} & Soft \\ \hline + Block-Weekend Adjacency & BWA & \makecell[l]{the block and weekend + assignments of a given \\ clinician should be adjacent} & Soft \\ \bottomrule + % JK: I think usually table bottom also has a rule & & & + \end{tabular} + % JK: please define Hard & Soft constraints in a footnote +\footnotesize\raggedright +Hard constraints must be satisfied by any candidate schedule. +Soft constraints are optionally satisfied, and are used to rank the set of candidate solutions. +\end{table} \ No newline at end of file diff --git a/paper/paper.tex b/paper/paper.tex new file mode 100644 index 0000000..efc91e3 --- /dev/null +++ b/paper/paper.tex @@ -0,0 +1,53 @@ +\documentclass[]{article} +\input{paper.includes.tex} +%\input{paper.definitions.tex} + +\title{A flexible integer linear programming formulation for scheduling + clinician on-call service in hospitals} + +\author[a, b]{David Landsman} +\author[a]{Huiting Ma} +\author[a]{Jesse Knight} +\author[c]{Kevin Gough} +\author[a, c, d, e]{Sharmistha Mishra} + +\renewcommand\Affilfont{\itshape\small} +\affil[a]{MAP Centre for Urban Health Solutions, Unity Health Toronto, Toronto, + ON, Canada} +\affil[b]{Department of Computer Science, University of Toronto, Toronto, ON, + Canada} +\affil[c]{Department of Medicine, Division of Infectious Disease, St.\ Michael's + Hospital, University of Toronto, Toronto, ON, Canada} +\affil[d]{Institute of Health Policy, Management and Evaluation, Dalla Lana + School of Public Health, University of Toronto, Toronto, ON, Canada} +\affil[e]{Institute of Medical Sciences, University of Toronto, Toronto, ON, + Canada} + +\begin{document} + \maketitle + + \begin{abstract} + \input{paper.abstract.tex} + \end{abstract} + + \section{Introduction}\label{sec:introduction} + \input{paper.intro.tex} + \section{Problem}\label{sec:problem} + \input{paper.problem.tex} + \section{Methods}\label{sec:methods} + \input{paper.methods.tex} + \section{Experiments}\label{sec:experiments} + % JK: not sure the journal requirements, but I would title this section Experiments + % since the methods do not introduce any experiments and then its not clear what + % results this are refering to. + \input{paper.experiments.tex} + \section{Discussion}\label{sec:discussion} + \input{paper.discussion.tex} + \section{Acknowledgements}\label{sec:acknowledgements} + \input{paper.acknowledgements.tex} + \section{Funding}\label{sec:funding} + \input{paper.funding.tex} + + \bibliographystyle{unsrt} + \bibliography{references} +\end{document} diff --git a/paper/references.bib b/paper/references.bib new file mode 100644 index 0000000..6d4eaf2 --- /dev/null +++ b/paper/references.bib @@ -0,0 +1,420 @@ + +@article{burke_state_2004, + title = {The {State} of the {Art} of {Nurse} {Rostering}}, + volume = {7}, + issn = {1094-6136}, + url = {http://link.springer.com/10.1023/B:JOSH.0000046076.75950.0b}, + doi = {10.1023/B:JOSH.0000046076.75950.0b}, + abstract = {Nurse rostering is a complex scheduling problem that affects hospital personnel on a daily basis all over the world. The need for quality software solutions is acute for a number of reasons. In particular, it is very important to efficiently utilise time and effort, to evenly balance the workload among people and to attempt to satisfy personnel preferences. A high quality roster can lead to a more contented and thus more effective workforce.}, + language = {en}, + number = {6}, + urldate = {2019-08-27}, + journal = {Journal of Scheduling}, + author = {Burke, Edmund K. and De Causmaecker, Patrick and Berghe, Greet Vanden and Van Landeghem, Hendrik}, + month = nov, + year = {2004}, + pages = {441--499} +} + +@article{azaiez_0-1_2005, + title = {A 0-1 goal programming model for nurse scheduling}, + volume = {32}, + issn = {03050548}, + url = {https://linkinghub.elsevier.com/retrieve/pii/S0305054803002491}, + doi = {10.1016/S0305-0548(03)00249-1}, + abstract = {In this study, a computerized nurse-scheduling model is developed. The model is approached through a 0-1 linear goal program. It is adapted to Riyadh Al-Kharj hospital Program (in Saudi Arabia) to improve the current manual-made schedules. The developed model accounts both for hospital objectives and nurses’ preferences, in addition to considering some recommended policies that are displayed in the literature. Hospital objectives include ensuring a continuous service with appropriate nursing skills and sta ng size, while avoiding additional costs for unnecessary overtime. Nurses preferences, which are deduced from a survey conducted on-purpose for the sake of this study, include mainly fairness considerations, in terms of ratio of night shifts and weekends o , in addition to avoiding isolated days on and o . The model is implemented in an experimental phase of six-month period using LINGO and is considered to perform reasonably well, based both on some quality criteria displayed in the literature and on the feedback obtained from a second survey, that has been developed to assess the scheduling system performance.}, + language = {en}, + number = {3}, + urldate = {2019-08-27}, + journal = {Computers \& Operations Research}, + author = {Azaiez, M.N. and Al Sharif, S.S.}, + month = mar, + year = {2005}, + pages = {491--507} +} + +@article{widyastiti_nurses_2016, + title = {Nurses {Scheduling} by {Considering} the {Qualification} using {Integer} {Linear} {Programming}}, + volume = {14}, + issn = {2302-9293, 1693-6930}, + url = {http://www.journal.uad.ac.id/index.php/TELKOMNIKA/article/view/2913}, + doi = {10.12928/telkomnika.v14i3.2913}, + abstract = {One of problems that frequently occurs in hospital management is nurses scheduling problem. A suitable schedule is needed in order to avoid fatigue, both physically and psychologically, which subsequently may deteriorate their performance. Nurse scheduling is commonly designed by the head of nurse manually. In this research, nurse scheduling problem is modeled by considering the qualification of the nurses and the model has the form of integer linear programming. The objective of the model is to maximize the number of nurse’s day-offs. Then optimization problem is implemented to nurses scheduling in the High Care Unit and the Emergency room of Rumah Sehat Terpadu Dompet Dhuafa Parung Bogor.}, + language = {en}, + number = {3}, + urldate = {2019-08-27}, + journal = {TELKOMNIKA (Telecommunication Computing Electronics and Control)}, + author = {Widyastiti, Maya and Aman, Amril and Bakhtiar, Toni}, + month = sep, + year = {2016}, + pages = {933} +} + +@article{el_adoly_new_2018, + title = {A new formulation and solution for the nurse scheduling problem: {A} case study in {Egypt}}, + volume = {57}, + issn = {11100168}, + shorttitle = {A new formulation and solution for the nurse scheduling problem}, + url = {https://linkinghub.elsevier.com/retrieve/pii/S111001681730282X}, + doi = {10.1016/j.aej.2017.09.007}, + abstract = {Nurse Scheduling Problem (NSP) is the assignment of a number of nurses to a number of shifts in order to satisfy hospital’s demand. The objectives of NSP are the minimization of the overall hospital cost, and the maximization of nurses’ preferences while taking into consideration the governmental rules and hospital standards. In this article, a proposed mathematical model for the NSP is presented, which is based on the idea of multi-commodity network flow model. The proposed model was verified using hypothetical instances as well as benchmark instances, then, it is applied to a real case study in an Egyptian hospital. The results demonstrate the advantage of using the proposed model in generating schedule required to solve the problem. Furthermore, it proves the superiority of the obtained schedule to those generated manually by the supervisor head nurse as it improves the level of nurses’ satisfaction by creating fair schedule system take care about nurses’ preferences as well as decreases the overall overtime cost by 36\%.}, + language = {en}, + number = {4}, + urldate = {2019-08-27}, + journal = {Alexandria Engineering Journal}, + author = {El Adoly, Ahmed Ali and Gheith, Mohamed and Nashat Fors, M.}, + month = dec, + year = {2018}, + pages = {2289--2298} +} + +@article{aickelin_exploiting_2000, + title = {Exploiting problem structure in a genetic algorithm approach to a nurse rostering problem}, + volume = {3}, + copyright = {Copyright © 2000 John Wiley \& Sons, Ltd.}, + issn = {1099-1425}, + url = {https://onlinelibrary.wiley.com/doi/abs/10.1002/%28SICI%291099-1425%28200005/06%293%3A3%3C139%3A%3AAID-JOS41%3E3.0.CO%3B2-2}, + doi = {10.1002/(SICI)1099-1425(200005/06)3:3<139::AID-JOS41>3.0.CO;2-2}, + abstract = {There is considerable interest in the use of genetic algorithms to solve problems arising in the areas of scheduling and timetabling. However, the classical genetic algorithm (GA) paradigm is not well equipped to handle the conflict between objectives and constraints that typically occur in such problems. In order to overcome this, successful implementations frequently make use of problem specific knowledge. This paper is concerned with the development of a GA for a nurse rostering problem at a major U.K. hospital. The structure of the constraints is used as the basis for a co-evolutionary strategy using co-operating subpopulations. Problem-specific knowledge is also used to define a system of incentives and disincentives, and a complementary mutation operator. Empirical results based on 52 weeks of data show how these features are able to improve an unsuccessful canonical GA to the point where it is able to provide a practical solution to the problem. Copyright © 2000 John Wiley \& Sons, Ltd.}, + language = {en}, + number = {3}, + urldate = {2019-08-27}, + journal = {Journal of Scheduling}, + author = {Aickelin, Uwe and Dowsland, Kathryn A.}, + year = {2000}, + keywords = {co-evolution, genetic algorithms, heuristics, manpower scheduling}, + pages = {139--153} +} + +@inproceedings{jan_evolutionary_2000, + title = {Evolutionary algorithms for nurse scheduling problem}, + volume = {1}, + doi = {10.1109/CEC.2000.870295}, + abstract = {The nurse scheduling problem (NSPs) represents a difficult class of multi-objective optimisation problems consisting of a number of interfering objectives between the hospitals and individual nurses. The objective of this research is to investigate difficulties that occur during the solution of NSP using evolutionary algorithms, in particular genetic algorithms (GA). As the solution method a population-less cooperative genetic algorithm (CGA) is taken into consideration. Because contrary to competitive GAs, we have to simultaneously deal with the optimization of the fitness of the individual nurses and also optimization of the entire schedule as the final solution to the problem in hand. To confirm the search ability of CGA, first a simplified version of NSP is examined. Later we report a more complex and useful version of the problem. We also compare CGA with another multi-agent evolutionary algorithm using pheromone style communication of real ants. Finally, we report the results of computer simulations acquired throughout the experiments.}, + booktitle = {Proceedings of the 2000 {Congress} on {Evolutionary} {Computation}. {CEC}00 ({Cat}. {No}.00TH8512)}, + author = {Jan, A. and Yamamoto, M. and Ohuchi, A.}, + month = jul, + year = {2000}, + keywords = {genetic algorithms, ant communication, computer simulation, Contracts, cooperative genetic algorithm, evolutionary algorithms, Evolutionary computation, Genetic algorithms, hospitals, Hospitals, human resource management, Mathematical model, Mathematical programming, medical administrative data processing, multi-agent evolutionary algorithm, multi-agent systems, multi-objective optimisation, nurse scheduling problem, optimization, pheromone style communication, Processor scheduling, scheduling, Scheduling algorithm, search, search problems}, + pages = {196--203 vol.1} +} + +@inproceedings{kawanaka_genetic_2001, + title = {Genetic algorithm with the constraints for nurse scheduling problem}, + volume = {2}, + doi = {10.1109/CEC.2001.934317}, + abstract = {The Nurse Scheduling Problem (NSP) is a problem of allocating shifts (day and night shifts, holidays, and so on) for nurses under various constraints. Generally, NSP has a lot of constraints. As a result, it needs a lot of knowledge and experience to construct the scheduling table with its constraints, and it is usually done by the head nurse or the authority in hospitals. Some research on NSP using genetic algorithms (GA) is reported. Conventional methods take the constraints into the fitness function. However, if it reduces the fitness value a lot to the parts of solution against the constraints, it causes useless search, because most of the chromosomes are selected in the initial population or in the change by the genetic operations. If it doesn't reduce the fitness value so much, the final solution has some parts against the constraints. Some of them are established by the Labor Standards Act or the Labor Union Act, so the solution has to be modified. As a result, it is difficult to acquire an effective scheduling table automatically. The paper studies the method of coding and genetic operations with their constraints for NSP. The exchange of shifts is done to satisfy the constraints in the coding and after the genetic operations. We apply this method to NSP using actual shifts and constraints being used in a hospital. It shows that an effective scheduling table satisfying the constraints is acquired by this method.}, + booktitle = {Proceedings of the 2001 {Congress} on {Evolutionary} {Computation} ({IEEE} {Cat}. {No}.01TH8546)}, + author = {Kawanaka, H. and Yamamoto, K. and Yoshikawa, T. and Shinogi, T. and Tsuruoka, S.}, + month = may, + year = {2001}, + keywords = {genetic algorithms, Genetic algorithms, Hospitals, human resource management, medical administrative data processing, scheduling, search problems, Biological cells, chromosomes, constraint theory, fitness function, fitness value, genetic algorithm, Genetic mutations, genetic operations, Heuristic algorithms, initial population, Labor Standards Act, Labor Union Act, NSP, nurse scheduling problem constraints, scheduling table, shift allocation}, + pages = {1123--1130 vol. 2} +} + +@article{jaszkiewicz_metaheuristic_1997, + title = {A metaheuristic approach to multiple objective nurse scheduling}, + volume = {22}, + number = {3}, + journal = {Foundations of Computing and Decision Sciences}, + author = {Jaszkiewicz, Andrzej}, + year = {1997}, + pages = {169--184} +} + +@inproceedings{li_hybrid_2003, + address = {New York, NY, USA}, + series = {{SAC} '03}, + title = {A {Hybrid} {AI} {Approach} for {Nurse} {Rostering} {Problem}}, + isbn = {978-1-58113-624-1}, + url = {http://doi.acm.org/10.1145/952532.952675}, + doi = {10.1145/952532.952675}, + abstract = {This paper presents a hybrid AI approach for a class of overconstrained Nurse Rostering Problems. Our approach comes in two phases. The first phase solves a relaxed version of problem which only includes hard rules and part of nurses' requests for shifts. This involves using a forward checking algorithm with non-binary constraint propagation, variable ordering, random value ordering and compulsory backjumping. In the second phase, adjustments with descend local search and tabu search are applied to improved the solution. This is to satisfy the preference rules as far as possible. Experiments show that our approach is able to solve this class of problems well.}, + urldate = {2019-08-27}, + booktitle = {Proceedings of the 2003 {ACM} {Symposium} on {Applied} {Computing}}, + publisher = {ACM}, + author = {Li, Haibing and Lim, Andrew and Rodrigues, Brian}, + year = {2003}, + pages = {730--735} +} + +@inproceedings{aickelin_improved_2006, + series = {Lecture {Notes} in {Computer} {Science}}, + title = {Improved {Squeaky} {Wheel} {Optimisation} for {Driver} {Scheduling}}, + isbn = {978-3-540-38991-0}, + abstract = {This paper presents a technique called Improved Squeaky Wheel Optimisation (ISWO) for driver scheduling problems. It improves the original Squeaky Wheel Optimisation’s (SWO) effectiveness and execution speed by incorporating two additional steps of Selection and Mutation which implement evolution within a single solution. In the ISWO, a cycle of Analysis-Selection-Mutation-Prioritization-Construction continues until stopping conditions are reached. The Analysis step first computes the fitness of a current solution to identify troublesome components. The Selection step then discards these troublesome components probabilistically by using the fitness measure, and the Mutation step follows to further discard a small number of components at random. After the above steps, an input solution becomes partial and thus the resulting partial solution needs to be repaired. The repair is carried out by using the Prioritization step to first produce priorities that determine an order by which the following Construction step then schedules the remaining components. Therefore, the optimisation in the ISWO is achieved by solution disruption, iterative improvement and an iterative constructive repair process performed. Encouraging experimental results are reported.}, + language = {en}, + booktitle = {Parallel {Problem} {Solving} from {Nature} - {PPSN} {IX}}, + publisher = {Springer Berlin Heidelberg}, + author = {Aickelin, Uwe and Burke, Edmund K. and Li, Jingpeng}, + editor = {Runarsson, Thomas Philip and Beyer, Hans-Georg and Burke, Edmund and Merelo-Guervós, Juan J. and Whitley, L. Darrell and Yao, Xin}, + year = {2006}, + keywords = {Construction Step, Nurse Rostering, Nurse Schedule, Schedule Problem, Solution Disruption}, + pages = {182--191} +} + +@article{goel_truck_2012, + title = {Truck driver scheduling in {Australia}}, + volume = {39}, + issn = {0305-0548}, + url = {http://www.sciencedirect.com/science/article/pii/S0305054811001559}, + doi = {10.1016/j.cor.2011.05.021}, + abstract = {In September 2008 new regulations for managing heavy vehicle driver fatigue entered into force in Australia. According to the new regulations there is a chain of responsibility ranging from drivers to dispatchers and shippers and thus, carriers must explicitly consider driving and working hour regulations when generating truck driver schedules. This paper presents and studies the Australian Truck Driver Scheduling Problem (AUS-TDSP) which is the problem of determining whether a sequence of locations can be visited within given time windows in such a way that driving and working activities of truck drivers comply with Australian Heavy Vehicle Driver Fatigue Law.}, + number = {5}, + urldate = {2019-08-27}, + journal = {Computers \& Operations Research}, + author = {Goel, Asvin and Archetti, Claudia and Savelsbergh, Martin}, + month = may, + year = {2012}, + keywords = {Hours of service regulations, Vehicle scheduling}, + pages = {1122--1132} +} + +@inproceedings{gunther_combined_2010, + series = {Lecture {Notes} in {Business} {Information} {Processing}}, + title = {Combined {Working} {Time} {Model} {Generation} and {Personnel} {Scheduling}}, + isbn = {978-3-642-12494-5}, + abstract = {Workforce management is comprised of several phases, such as working time model generation and personnel scheduling. The combination of these phases has significant potential, especially for volatile personnel demand. This article shows that the concepts for the automatic generation of working time models already used in retail can be transferred to personnel scheduling in the logistics industry. Through this, the assignment of personnel can be accurately adapted to personnel demand. The results suggest the use of heuristics, especially meta-heuristics such as the evolution strategy or constructive methods which are adapted to the problem at hand.}, + language = {en}, + booktitle = {Advanced {Manufacturing} and {Sustainable} {Logistics}}, + publisher = {Springer Berlin Heidelberg}, + author = {Günther, Maik and Nissen, Volker}, + editor = {Dangelmaier, Wilhelm and Blecken, Alexander and Delius, Robin and Klöpfer, Stefan}, + year = {2010}, + keywords = {constructive heuristic, evolution strategy, workforce management, workforce scheduling, working time model}, + pages = {210--221} +} + +@article{al-yakoob_mixed-integer_2007, + title = {Mixed-integer programming models for an employee scheduling problem with multiple shifts and work locations}, + volume = {155}, + issn = {1572-9338}, + url = {https://doi.org/10.1007/s10479-007-0210-4}, + doi = {10.1007/s10479-007-0210-4}, + abstract = {This paper is concerned with the problem of assigning employees to gas stations owned by the Kuwait National Petroleum Corporation (KNPC), which hires a firm to prepare schedules for assigning employees to about 86 stations distributed all over Kuwait. Although similar employee scheduling problems have been addressed in the literature, certain peculiarities of the problem require novel mathematical models and algorithms to deal with the specific nature and size of this problem. The problem is modeled as a mixed-integer program, and a problem size analysis based on real data reveals that the formulation is too complex to solve directly. Hence, a two-stage approach is proposed, where the first stage assigns employees to stations, and the second stage specifies shifts and off-days for each employee. Computational results related to solving the two-stage models directly via CPLEX and by specialized heuristics are reported. The two-stage approach provides daily schedules for employees for a given time horizon in a timely fashion, taking into consideration the employees’ expressed preferences. This proposed modeling approach can be incorporated within a decision support system to replace the current manual scheduling practice that is often chaotic and has led to feelings of bias and job dissatisfaction among employees.}, + language = {en}, + number = {1}, + urldate = {2019-08-27}, + journal = {Annals of Operations Research}, + author = {Al-Yakoob, Salem M. and Sherali, Hanif D.}, + month = nov, + year = {2007}, + keywords = {Employee scheduling, Manpower scheduling, Mixed-integer programming, Partitioning, Two-stage approach}, + pages = {119--142} +} + +@article{al-yakoob_column_2008, + title = {A column generation approach for an employee scheduling problem with multiple shifts and work locations}, + volume = {59}, + issn = {0160-5682}, + url = {https://doi.org/10.1057/palgrave.jors.2602294}, + doi = {10.1057/palgrave.jors.2602294}, + abstract = {This paper is concerned with the problem of assigning employees to a number of work centres taking into account employees' expressed preferences for specific shifts, off-days, and work centres. This particular problem is faced by the Kuwait National Petroleum Corporation that hires a firm to prepare schedules for assigning employees to about 86 stations distributed all over Kuwait. The number of variables in a mixed-integer programming model formulated for this problem is overwhelming, and hence, a direct solution to even the continuous relaxation of this model for relatively large-scale instances is inconceivable. However, we demonstrate that a column generation method, which exploits the special structures of the model, can readily solve the continuous relaxation of the model. Based on this column generation construct, we develop an effective heuristic to solve the problem. Computational results indicate that the proposed approach can facilitate the generation of good-quality schedules for even large-scale problem instances in a reasonable time.}, + number = {1}, + urldate = {2019-08-27}, + journal = {Journal of the Operational Research Society}, + author = {Al-Yakoob, S. M. and Sherali, H. D.}, + month = jan, + year = {2008}, + keywords = {optimization, scheduling, column generation, employee scheduling, mixed-integer programming}, + pages = {34--43} +} + +@article{alfares_simulation_2007, + title = {A {Simulation} {Approach} for {Stochastic} {Employee} {Days}-{Off} {Scheduling}}, + volume = {27}, + issn = {0228-6203}, + url = {https://doi.org/10.1080/02286203.2007.11442393}, + doi = {10.1080/02286203.2007.11442393}, + abstract = {This paper presents a simulation approach for employee days-off scheduling when the daily labour demands are random variables. A simulation model is constructed, and a case study application of the proposed approach is described. The model recognizes limited staff availability, stochastic workload variability, and policy restrictions on the choice of employee work schedules. The model has been successfully applied in the days-off scheduling of a multicraft maintenance workforce of an oil and gas pipelines department. Without increasing the number or cost of employees, the model recommended alternative days-off assignments that are expected to reduce throughput times for maintenance work orders by an average of 25\%.}, + number = {1}, + urldate = {2019-08-27}, + journal = {International Journal of Modelling and Simulation}, + author = {Alfares, H. K.}, + month = jan, + year = {2007}, + keywords = {Employee scheduling, days-off schedules, maintenance, simulation, stochastic optimization}, + pages = {9--15} +} + +@inproceedings{chapados_retail_2011, + series = {Lecture {Notes} in {Computer} {Science}}, + title = {Retail {Store} {Workforce} {Scheduling} by {Expected} {Operating} {Income} {Maximization}}, + isbn = {978-3-642-21311-3}, + abstract = {We address the problem of retail store sales personnel scheduling by casting it in terms of an expected operating income maximization. In this framework, salespeople are no longer only responsible for operating costs, but also contribute to operating revenue. We model the marginal impact of an additional staff by making use of historical sales and payroll data, conditioned on a store-, date- and time-dependent traffic forecast. The expected revenue and its uncertainty are then fed into a constraint program which builds an operational schedule maximizing the expected operating income. A case study with a medium-sized retailer suggests that revenue increases of 7\% and operating income increases of 3\% are possible with the approach.}, + language = {en}, + booktitle = {Integration of {AI} and {OR} {Techniques} in {Constraint} {Programming} for {Combinatorial} {Optimization} {Problems}}, + publisher = {Springer Berlin Heidelberg}, + author = {Chapados, Nicolas and Joliveau, Marc and Rousseau, Louis-Martin}, + editor = {Achterberg, Tobias and Beck, J. Christopher}, + year = {2011}, + keywords = {Constraint Programming, Retail, Shift Scheduling, Statistical Forecasting}, + pages = {53--58} +} + +@inproceedings{nissen_automatic_2010, + series = {Lecture {Notes} in {Computer} {Science}}, + title = {Automatic {Generation} of {Optimised} {Working} {Time} {Models} in {Personnel} {Planning}}, + isbn = {978-3-642-15461-4}, + abstract = {Retail is traditionally labour-intensive. Demand-oriented workforce management has great significance due to the amount of competition which enforces a strict cost management while keeping a good service level. Thus, highly flexible working time models are of particular importance. Our project addresses the question how to automatically and simultaneously assign staff to workstations and generate optimised working time models under constraints and on the basis of fluctuating personnel demand. The planning is completed for an entire year in order to assess adapted versions of the evolution strategy and particle swarm optimisation. A commercial constructive method is used as benchmark.}, + language = {en}, + booktitle = {Swarm {Intelligence}}, + publisher = {Springer Berlin Heidelberg}, + author = {Nissen, Volker and Günther, Maik}, + editor = {Dorigo, Marco and Birattari, Mauro and Di Caro, Gianni A. and Doursat, René and Engelbrecht, Andries P. and Floreano, Dario and Gambardella, Luca Maria and Groß, Roderich and Şahin, Erol and Sayama, Hiroki and Stützle, Thomas}, + year = {2010}, + keywords = {integrated personnel planning, metaheuristics}, + pages = {384--391} +} + +@article{horn_scheduling_2007, + title = {Scheduling patrol boats and crews for the {Royal} {Australian} {Navy}}, + volume = {58}, + issn = {0160-5682}, + url = {https://doi.org/10.1057/palgrave.jors.2602300}, + doi = {10.1057/palgrave.jors.2602300}, + abstract = {The Royal Australian Navy's Patrol Boat Force carries out essential tasks in the surveillance, policing and defence of Australia's coastal waters. To help the Navy make efficient use of a new generation of boats, the authors have developed optimization procedures to schedule the activities of the boats and their crews. The procedures—embodied in a software system called CBM (‘Crews, Boats, Missions’)—use simulated annealing and specialized heuristic techniques within a multi-stage problem-solving framework. Tests show that CBM is reliable in terms of solution quality, and flexible with respect to the range of scheduling conditions applied. CBM has proved valuable to the Navy as an investigatory tool, and it is planned that it should be adapted for operational use, as part of a decision support system to aid in the ongoing management of patrol boat operations.}, + number = {10}, + urldate = {2019-08-27}, + journal = {Journal of the Operational Research Society}, + author = {Horn, M. E. T. and Jiang, H. and Kilby, P.}, + month = oct, + year = {2007}, + keywords = {heuristics, optimization, scheduling, metaheuristics, military, multi-objective, penalty methods, planning, simulated annealing}, + pages = {1284--1293} +} + +@inproceedings{laguna_modeling_2005, + series = {Operations {Research}/{Computer} {Science} {Interfaces} {Series}}, + title = {Modeling and {Solving} a {Selection} and {Assignment} {Problem}}, + isbn = {978-0-387-23529-5}, + abstract = {In this paper, we first provide an MIP formulation of a selection/assignment problem and then we discuss a solution method based both on the use of a commercial general-purpose scatter-search and a simple implementation of tabu search. This optimization problem is related to a research project supported by the Office of Naval Research where sailors need to be selected to perform a set of jobs that require specific skill levels. The results of our computational experiments indicate the usefulness of the software system for workforce planning that we have developed.}, + language = {en}, + booktitle = {The {Next} {Wave} in {Computing}, {Optimization}, and {Decision} {Technologies}}, + publisher = {Springer US}, + author = {Laguna, Manuel and Wubbena, Terry}, + editor = {Golden, Bruce and Raghavan, S. and Wasil, Edward}, + year = {2005}, + keywords = {assignment/selection problem, bin packing, metaheuristic optimization}, + pages = {149--162} +} + +@incollection{goos_complexity_1996, + address = {Berlin, Heidelberg}, + title = {The complexity of timetable construction problems}, + volume = {1153}, + isbn = {978-3-540-61794-5 978-3-540-70682-3}, + url = {http://link.springer.com/10.1007/3-540-61794-9_66}, + abstract = {This paper shows that timetable construction is NP-complete in a number of quite different ways that arise in practice, and discusses the prospects of overcoming these problems. A formal specification of the problem based on TTL, a timetable specification language, is given.}, + language = {en}, + urldate = {2019-08-27}, + booktitle = {Practice and {Theory} of {Automated} {Timetabling}}, + publisher = {Springer Berlin Heidelberg}, + author = {Cooper, Tim B. and Kingston, Jeffrey H.}, + editor = {Goos, Gerhard and Hartmanis, Juris and Leeuwen, Jan and Burke, Edmund and Ross, Peter}, + year = {1996}, + doi = {10.1007/3-540-61794-9_66}, + pages = {281--295} +} + +@book{hammer_boolean_1968, + address = {Berlin Heidelberg}, + series = {{\"O}konometrie und {Unternehmensforschung} {Econometrics} and {Operations} {Research}}, + title = {Boolean {Methods} in {Operations} {Research} and {Related} {Areas}}, + isbn = {978-3-642-85825-3}, + url = {https://www.springer.com/gp/book/9783642858253}, + language = {en}, + urldate = {2019-08-29}, + publisher = {Springer-Verlag}, + author = {Hammer, P. L. and Rudeanu, S.}, + year = {1968} +} + +@article{stanimirovic_linear_2011, + title = {On the linear weighted sum method for multi-objective optimization}, + volume = {26}, + number = {4}, + journal = {Facta Acta Univ}, + author = {Stanimirovic, Ivan P. and Zlatanovic, Milan Lj and Petkovic, Marko D.}, + year = {2011}, + pages = {49--63} +} + +@misc{johnjforrest_coin-or/cbc:_2019, + title = {coin-or/{Cbc}: {Version} 2.9.9}, + shorttitle = {coin-or/{Cbc}}, + url = {https://zenodo.org/record/3246628}, + abstract = {COIN-OR Branch-and-Cut solver}, + urldate = {2019-08-30}, + publisher = {Zenodo}, + author = {{johnjforrest} and Vigerske, Stefan and Ralphs, Ted and Santos, Haroldo G. and Hafer, Lou and Kristjansson, Bjarni and {jpfasano} and Straver, Edwin and Lubin, Miles and {rlougee} and {jpgoncal1} and {h-i-gassmann} and Saltzman, Matthew}, + year = {2019}, + doi = {10.5281/zenodo.3246628} +} + +@article{trilling_nurse_2006, + title = {Nurse scheduling using integer linear programming and constraint programming}, + volume = {39}, + number = {3}, + journal = {IFAC Proceedings Volumes}, + author = {Trilling, Lorraine and Guinet, Alain and Le Magny, Dominiue}, + year = {2006}, + pages = {671--676} +} + +@article{silvestro_evaluation_2000, + title = {An evaluation of nurse rostering practices in the {National} {Health} {Service}}, + volume = {32}, + issn = {1365-2648}, + url = {https://onlinelibrary.wiley.com/doi/abs/10.1046/j.1365-2648.2000.01512.x}, + doi = {10.1046/j.1365-2648.2000.01512.x}, + abstract = {An evaluation of nurse rostering practices in the National Health Service The scheduling of nursing time on hospital wards is critical to the delivery of patient care, resource utilization and employee satisfaction. Over the past decade many hospital wards in the United Kingdom (UK) have moved away from the traditional planning of rosters by a single manager, towards more participative processes known as self-rostering and team rostering. This paper tests the hypothesis, developed from the literature, that the three types of rostering approach may be positioned along a continuum. Self-rostering at one extreme, is conducive to staff empowerment, motivation and roster effectiveness, whilst departmental rostering, at the other, leads to perceived autocracy, reduced empowerment, lower levels of staff motivation and roster effectiveness. Team rostering is positioned mid-way on this continuum. This paper reports the findings of an empirical study of nurse rostering practices in the UK National Health Service (NHS), with a view to developing an understanding of the implications of implementing these three rostering approaches and testing the above hypothesis. The survey of rostering practices in 50 NHS wards, and in-depth case studies of seven wards, revealed that each of the three rostering approaches has benefits and limitations and a picture emerges quite different from that implied by the research hypothesis. Whilst the literature suggests that the choice of rostering approach determines the level of perceived autocracy, staff motivation and roster effectiveness, it is proposed in this paper that selection of rostering approach should be contingent upon operational context. The paper concludes with a framework which stipulates that the choice of rostering approach for a ward should be determined on the basis of four contingent variables, namely, ward size, demand variability, demand predictability, and complexity of skill mix. It is recommended that departmental rostering be applied in large wards with complex rostering problems, whilst team rostering is more appropriate for medium sized wards, and self-rostering appropriate for small wards.}, + language = {en}, + number = {3}, + urldate = {2019-08-30}, + journal = {Journal of Advanced Nursing}, + author = {Silvestro, Rhian and Silvestro, Claudio}, + year = {2000}, + keywords = {capacity management, empowerment, health care, health personnel, human resource management, motivation, resource utilization, rostering practices, scheduling, self-rostering}, + pages = {525--535} +} +@article{mitchell_branch-and-cut_2002, + title = {Branch-and-cut algorithms for combinatorial optimization problems}, + volume = {1}, + journal = {Handbook of applied optimization}, + author = {Mitchell, John E.}, + year = {2002}, + pages = {65--77} +} + +@article{shamir_efficiency_1987, + title = {The {Efficiency} of the {Simplex} {Method}: {A} {Survey}}, + volume = {33}, + issn = {0025-1909}, + shorttitle = {The {Efficiency} of the {Simplex} {Method}}, + url = {http://www.jstor.org/stable/2631853}, + abstract = {The Linear Programming Problem is by far the most widely used optimization model. Its impact on economic and government modeling is immense. The Simplex Method for solving the Linear Programming (LP) Problem, due to George Dantzig, has been an extremely efficient computational tool for almost four decades. The method has been the subject of intense investigations for many years, but some major aspects of its behavior are not fully understood yet. The purpose of this paper is to survey the body of knowledge on the efficiency of the Simplex Method, from both practical and theoretical points of view. Adopting the number of iterations (pivot steps) as the yardstick for efficiency, we survey four aspects of the issue: 1. Reports on practical experience of the method's performance on real-life LP problems. 2. Results on controlled (Monte-Carlo) experiments solving LP problems which were randomly generated according to some predetermined distributions. 3. Complexity results, including theoretical analyses on both upper and lower bounds for the performance of the Simplex as well as non-Simplex algorithms for LP. 4. Results of recent theoretical studies using probabilistic analysis to derive bounds on the average behavior of the Simplex Method. We discuss the consequences and limitations of the various studies. Special emphasis is given to open questions.}, + number = {3}, + urldate = {2019-09-16}, + journal = {Management Science}, + author = {Shamir, Ron}, + year = {1987}, + pages = {301--334} +} + +@inproceedings{abdennadher_nurse_1999, + title = {Nurse scheduling using constraint logic programming}, + booktitle = {{AAAI}/{IAAI}}, + author = {Abdennadher, Slim and Schlenker, Hans}, + year = {1999}, + pages = {838--843} +} + +@misc{landsman_scheduling, + author = {Landsman, David}, + title = {On-call Scheduling Tool for Clinicians}, + year = {2019}, + publisher = {GitHub}, + journal = {GitHub repository}, + howpublished = {\url{https://github.com/c-uhs/scheduler}} +} \ No newline at end of file diff --git a/paper/scheduler.pdf b/paper/scheduler.pdf deleted file mode 100644 index 55d099a..0000000 Binary files a/paper/scheduler.pdf and /dev/null differ diff --git a/paper/scheduler.tex b/paper/scheduler.tex deleted file mode 100644 index b8fa0d7..0000000 --- a/paper/scheduler.tex +++ /dev/null @@ -1,137 +0,0 @@ -\documentclass[]{article} - -\usepackage{amsmath} -\usepackage{amsthm} -\usepackage{amssymb} -\usepackage{mathtools} -\usepackage{hyperref} -\usepackage{bbm} -\usepackage{physics} -\usepackage{xcolor} - -\newcommand{\mc}{\mathcal} -\newcommand{\bb}{\mathbb} -\DeclarePairedDelimiter{\floor}{\lfloor}{\rfloor} -\DeclarePairedDelimiter{\ceil}{\lceil}{\rceil} - -%opening -\title{Application of Network Flow and Linear Programming to Scheduling of Clinicians} -\author{David Landsman} - -\begin{document} -\maketitle - -\section{Problem} \label{problem} -A group of clinicians are working on-call at a clinic each day of the year, including weekends and holidays, at multiple divisions. When a clinician is assigned to work during the week, they work from 8 A.M. on Monday to 5 P.M. on Friday. During weekends, a clinician works the complement period of time, that is, Friday 5 P.M. to Monday 8 A.M. Each clinician can request not to work certain weeks and weekends of the year. We refer to this as the clinician's \textit{time-off}. - -\section{Linear Programming Approach} -We will attempt to solve \ref{problem} using an integer linear program. The assignment of a clinician from a certain division to a certain week or weekend is captured in a 0-1 variable. Constraints on the assignments are captured using (in-)equalities. - -\subsection{Constants} - \begin{align*} - \{1, \ldots, D\} : &\text{ the set of all divisions, indexed by } d \\ - \{1, \ldots, C\} : &\text{ the set of all clinicians, indexed by } c \\ - \{1, \ldots, B\} : &\text{ the set of all blocks, indexed by } b \\ - \{1, \ldots, W\} : &\text{ the set of all weekends, indexed by } w \\ - \{1, \ldots, W\} \supset \mc{L} : &\text{ the set of all long weekends} \\ - \{1, \ldots, B\} \supset\mc{S}_c : &\text{ the set of blocks clinician $c$ requested off} \\ - \{1, \ldots, W\} \supset\mc{T}_c : &\text{ the set of weekends clinician $c$ requested off} \\ - m_{c, d} : &\text{ the minimum number of blocks clinician $c$ should work in division $d$} \\ - M_{c, d} : &\text{ the maximum number of blocks clinician $c$ should work in division $d$} - \end{align*} - -\subsection{Variables} - \begin{align} - X_{c, b, d} \in \{0, 1\}: &\text{ clinician $c$ covers block $b$ for division $d$} \\ - Y_{c, w} \in \{0, 1\}: &\text{ clinician $c$ covers weekend $w$} - \end{align} -Note that weekends are not distinguished according to division, since the clinician assigned covers all divisions. \\ - -\textcolor{red}{\textbf{IMPORTANT: This assumes that each clinician works at each of the divisions $1, \ldots, D$. Some of the formulas below are not directly applicable to the case where some clinician only works a subset of those divisions}} - -\subsection{Constraints} \label{constraints} - \begin{itemize} - \item Each division needs to have exactly one clinician that covers any given block - \begin{equation} - \sum_{c} X_{c, b, d} = 1 \text{ for each } b, d - \end{equation} - \item Every weekend needs to have exactly one clinician that covers it - \begin{equation} - \sum_{c} Y_{c, w} = 1 \text{ for each } w - \end{equation} - \item In a given division, each clinician can only work between the minimum and maximum number of weeks they are allowed (note: these may be different for different divisions) - \begin{equation} - m_{c, d} \leq \sum_{d} X_{c, b, d} \leq M_{c, d} \text{ for each } c, d - \end{equation} - \item Weekends should be roughly equally distributed between clinicians. - \begin{equation} - \floor*{ \frac{W}{C} } \leq \sum_{w} Y_{c, w} \leq \ceil*{ \frac{W}{C} } \text{ for each } c - \end{equation} - \item Long weekends should be roughly equally distributed between clinicians. - \begin{equation} - \floor*{\frac{|\mc{L}|}{C}} \leq \sum_{w \in \mc{L}} Y_{c, w} \leq \ceil*{\frac{|\mc{L}|}{C}} \text{ for each } c - \end{equation} - \item A clinician cannot work two consecutive blocks (across all divisions) - \begin{equation} - \sum_d \left(X_{c, b, d} + X_{c, b+1, d}\right) \leq 1 \text{ for each $c$ and each $b \leq B - 1$} - \end{equation} - \item Prevent on-off-on-off-on block assignments (across all divisions) to improve the spread of assignments for any given clinician - \begin{equation} - \sum_d \left(X_{c, b, d} + X_{c, b + 2, d} + X_{c, b + 4, d}\right) \leq 2 \text{ for each $c$ and each $b \leq B - 4$} - \end{equation} - \item Improve spread of weekend assignments by preventing more than 1 assignment for a given clinician in a span of 4 weekends - \begin{equation} - Y_{c, w} + Y_{c, w+1} + Y_{c, w+2} + Y_{c, w+3} \leq 1 \text{ for each $c$ and each $w \leq W - 3$} - \end{equation} - \end{itemize} - -\subsection{Objectives} \label{objectives} -Our goal in the linear program is to accommodate clinician time-off requests as much as possible. Moreover, we try to assign weekends close to blocks, if possible. - \begin{itemize} - \item Minimize the number of blocks assigned to a clinician that they requested as time-off - \begin{equation} - \label{eqn_block_obj} - \min_X Q_1(X) = \min_X \sum_{c, b, d} (-1)^{ I(b \in \mc{S}_c) } \cdot X_{c, b, d} - \end{equation} - where $I(\cdot)$ is the indicator function. - \item Minimize the number of weekends assigned to a clinician that they requested as time-off - \begin{equation} - \label{eqn_weekend_obj} - \min_Y Q_2(Y) = \min_Y \sum_{c, w} (-1)^{ I (w \in \mc{T}_c)} \cdot Y_{c, w} - \end{equation} - \item Maximize the adjacency between blocks and weekends assigned for a given clinician. In particular, if a clinician is assigned to work a given block in a given division, we will prefer it if the clinician also works in the weekend between the weeks of the block. \\ \\ - In our formulation, this corresponds to maximizing the sum of products of $X_{c, b, d}$ and $Y_{c, w}$ where $w$ is a weekend adjacent to block $b$ (say, $w = 2b+1$, if each block covers 2 weeks). To accomplish this, we define helper variables: - \begin{equation} - Z_{c, b, d} \in \{0, 1\} : \text{represents product $X_{c, b, d}\cdot Y_{c, 2b+1}$} - \end{equation} - with constraints - \begin{align} - Z_{c, b, d} &\leq X_{c, b, d} \\ - Z_{c, b, d} &\leq Y_{c, 2b+1} \text{ for each division $d$} - \end{align} - Thus, the objective is: - \begin{equation} - \label{eqn_adjacency_obj} - \max_Z \sum_{c, b, d} Z_{c, b, d} = \min_Z \left(- \sum_{c, b, d} Z_{c, b, d}\right) = \min_Z Q_3(Z) - \end{equation} - \end{itemize} - -In order to optimize all the objectives simultaneously we can use the weighted sum method which guarantees our solutions to be Pareto optimal (??). It is necessary to normalize the objective functions, since their domains are not equivalent. In general, if the objective function is of the from -\[ - f(\vb{x}) = \sum_i a_ix_i -\] -Then we normalize it by dividing by the sum of absolute weights, thus giving -\[ - \bar{f}(\vb{x}) = \frac{f(\vb{x})}{\sum_i \abs{a_i}} -\] -In our case, this gives us the following objective functions: - \begin{align*} - \bar{Q}_1(X) = \frac{Q_1(X)}{\sum_{c, b, d} 1} = \frac{Q_1(X)}{C \cdot B \cdot D} \\ - \bar{Q}_2(Y) = \frac{Q_2(Y)}{\sum_{c, w} 1} = \frac{Q_2(Y)}{C \cdot W} \\ - \bar{Q}_3(Z) = \frac{Q_1(Z)}{\sum_{c, b, d} 1} = \frac{Q_3(Z)}{C \cdot B \cdot D} - \end{align*} -We also chose to weigh the objectives equally, thus giving us the final objective: - \begin{equation} - \min_{X, Y, Z} \frac{\bar{Q}_1(X) + \bar{Q}_2(Y) + \bar{Q}_3(Z)}{3} - \end{equation} -\end{document} diff --git a/paper/tbl/2017_schedule_comparison.tex b/paper/tbl/2017_schedule_comparison.tex new file mode 100644 index 0000000..61e2a9c --- /dev/null +++ b/paper/tbl/2017_schedule_comparison.tex @@ -0,0 +1,62 @@ +% Table generated by Excel2LaTeX from sheet '2017' +\begin{table}[h] + \tiny + \centering + \begin{tabular}{c||ccc||ccc} + \multicolumn{1}{c||}{\multirow{2}[1]{*}{Week \#}} & \multicolumn{3}{c||}{LP Solution} & \multicolumn{3}{c}{Historical Data} \\ + & HIV & ID & Weekend & HIV & ID & Weekend \\ \midrule\midrule + 1 & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .6, .2, 1}\textcolor[rgb]{ 1, 1, 1}{J} \\ + 2 & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .557, .663, .859}F \\ + 3 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ .663, .816, .557}A \\ + 4 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ .518, .592, .69}G \\ + 5 & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .6, .2, 1}\textcolor[rgb]{ 1, 1, 1}{J} & \cellcolor[rgb]{ .957, .69, .518}E \\ + 6 & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .6, .2, 1}\textcolor[rgb]{ 1, 1, 1}{J} & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} \\ + 7 & \cellcolor[rgb]{ .6, .2, 1}\textcolor[rgb]{ 1, 1, 1}{J} & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .6, .2, 1}\textcolor[rgb]{ 1, 1, 1}{J} & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .957, .69, .518}E \\ + 8 & \cellcolor[rgb]{ .6, .2, 1}\textcolor[rgb]{ 1, 1, 1}{J} & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ 1, .851, .4}C \\ + 9 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .6, .2, 1}\textcolor[rgb]{ 1, 1, 1}{J} & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .6, .2, 1}\textcolor[rgb]{ 1, 1, 1}{J} \\ + 10 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .788, .788, .788}D \\ + 11 & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .663, .816, .557}A \\ + 12 & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .6, .2, 1}\textcolor[rgb]{ 1, 1, 1}{J} & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} \\ + 13 & \cellcolor[rgb]{ .6, .2, 1}\textcolor[rgb]{ 1, 1, 1}{J} & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ .6, .2, 1}\textcolor[rgb]{ 1, 1, 1}{J} & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ .557, .663, .859}F \\ + 14 & \cellcolor[rgb]{ .6, .2, 1}\textcolor[rgb]{ 1, 1, 1}{J} & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ .6, .2, 1}\textcolor[rgb]{ 1, 1, 1}{J} & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .518, .592, .69}G \\ + 15 & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .459, .443, .443}H \\ + 16 & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .6, .2, 1}\textcolor[rgb]{ 1, 1, 1}{J} \\ + 17 & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .957, .69, .518}E \\ + 18 & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ .557, .663, .859}F \\ + 19 & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ .518, .592, .69}G \\ + 20 & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ .6, .2, 1}\textcolor[rgb]{ 1, 1, 1}{J} & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .663, .816, .557}A \\ + 21 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ 1, .851, .4}C \\ + 22 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} \\ + 23 & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .459, .443, .443}H \\ + 24 & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .788, .788, .788}D \\ + 25 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .663, .816, .557}A \\ + 26 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .6, .2, 1}\textcolor[rgb]{ 1, 1, 1}{J} & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .557, .663, .859}F \\ + 27 & \cellcolor[rgb]{ .6, .2, 1}\textcolor[rgb]{ 1, 1, 1}{J} & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ 1, .851, .4}C \\ + 28 & \cellcolor[rgb]{ .6, .2, 1}\textcolor[rgb]{ 1, 1, 1}{J} & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .788, .788, .788}D \\ + 29 & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .459, .443, .443}H \\ + 30 & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} \\ + 31 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .608, .761, .902}B \\ + 32 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .6, .2, 1}\textcolor[rgb]{ 1, 1, 1}{J} & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .6, .2, 1}\textcolor[rgb]{ 1, 1, 1}{J} & \cellcolor[rgb]{ .957, .69, .518}E \\ + 33 & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .788, .788, .788}D \\ + 34 & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .663, .816, .557}A \\ + 35 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ .6, .2, 1}\textcolor[rgb]{ 1, 1, 1}{J} \\ + 36 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .6, .2, 1}\textcolor[rgb]{ 1, 1, 1}{J} & \cellcolor[rgb]{ .663, .816, .557}A \\ + 37 & \cellcolor[rgb]{ .6, .2, 1}\textcolor[rgb]{ 1, 1, 1}{J} & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .6, .2, 1}\textcolor[rgb]{ 1, 1, 1}{J} & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .6, .2, 1}\textcolor[rgb]{ 1, 1, 1}{J} & \cellcolor[rgb]{ .518, .592, .69}G \\ + 38 & \cellcolor[rgb]{ .6, .2, 1}\textcolor[rgb]{ 1, 1, 1}{J} & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .6, .2, 1}\textcolor[rgb]{ 1, 1, 1}{J} \\ + 39 & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} \\ + 40 & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .788, .788, .788}D \\ + 41 & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ 1, .851, .4}C \\ + 42 & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .557, .663, .859}F \\ + 43 & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .788, .788, .788}D \\ + 44 & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .6, .2, 1}\textcolor[rgb]{ 1, 1, 1}{J} & \cellcolor[rgb]{ .459, .443, .443}H \\ + 45 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .6, .2, 1}\textcolor[rgb]{ 1, 1, 1}{J} & \cellcolor[rgb]{ 1, .851, .4}C \\ + 46 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ .518, .592, .69}G \\ + 47 & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .957, .69, .518}E \\ + 48 & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} \\ + 49 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .459, .443, .443}H \\ + 50 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .557, .663, .859}F \\ + 51 & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .957, .69, .518}E + \end{tabular}% + \caption{Comparison of schedules for 2017} + \label{tbl:2017-schedule-comparison}% +\end{table}% diff --git a/paper/tbl/2018_schedule_comparison.tex b/paper/tbl/2018_schedule_comparison.tex new file mode 100644 index 0000000..ae61f74 --- /dev/null +++ b/paper/tbl/2018_schedule_comparison.tex @@ -0,0 +1,73 @@ +% Table generated by Excel2LaTeX from sheet '2018_oldLP' +\begin{table}[htbp] + \centering + \caption{Comparison of automatically generated (ILP solution) and manually generated schedules for 2018. In the ILP solution there are rigid 2-week block assignments, unlike manual generation that often assigns 3-4 weeks in a row to a single clinician. Moreover, in the ILP solution we see for each block either the HIV or ID clinician was assigned weekend coverage, indicating improved Block-Weekend Adjacency.}% + \label{tbl:2018-schedule-comparison}% + % JK: could you clarify in the caption what we should take away from this table? + \begin{adjustbox}{scale=0.8} + \begin{tabular}{c||ccc||ccc} + \multicolumn{1}{c||}{\multirow{2}[1]{*}{Week \#}} & \multicolumn{3}{c||}{ILP Solution} & \multicolumn{3}{c}{Manual Generation} \\ + & HIV & ID & Weekend & HIV & ID & Weekend \\ + \midrule + \midrule + 1 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .459, .443, .443}H \\ + 2 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .663, .816, .557}A \\ + 3 & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .518, .592, .69}G \\ + 4 & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} \\ + 5 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ .557, .663, .859}F \\ + 6 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ 1, .851, .4}C \\ + 7 & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .608, .761, .902}B \\ + 8 & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .518, .592, .69}G \\ + 9 & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .788, .788, .788}D \\ + 10 & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .459, .443, .443}H \\ + 11 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .557, .663, .859}F \\ + 12 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .663, .816, .557}A \\ + 13 & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .459, .443, .443}H \\ + 14 & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} \\ + 15 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ 1, .851, .4}C \\ + 16 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ .957, .69, .518}E \\ + 17 & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .788, .788, .788}D \\ + 18 & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .957, .69, .518}E \\ + 19 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .557, .663, .859}F \\ + 20 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ 1, .851, .4}C \\ + 21 & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ .663, .816, .557}A \\ + 22 & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ 1, .851, .4}C \\ + 23 & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .788, .788, .788}D \\ + 24 & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ 1, .851, .4}C \\ + 25 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .518, .592, .69}G \\ + 26 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .459, .443, .443}H & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ .788, .788, .788}D \\ + 27 & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .957, .69, .518}E \\ + 28 & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} \\ + 29 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .788, .788, .788}D \\ + 30 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .663, .816, .557}A \\ + 31 & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .957, .69, .518}E \\ + 32 & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .557, .663, .859}F \\ + 33 & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} \\ + 34 & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ 1, .851, .4}C \\ + 35 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ .518, .592, .69}G \\ + 36 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} \\ + 37 & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .663, .816, .557}A \\ + 38 & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .957, .69, .518}E \\ + 39 & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .788, .788, .788}D \\ + 40 & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} \\ + 41 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ .518, .592, .69}G \\ + 42 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .557, .663, .859}F \\ + 43 & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ 1, .851, .4}C \\ + 44 & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} \\ + 45 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .957, .69, .518}E & \cellcolor[rgb]{ .957, .69, .518}E \\ + 46 & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .557, .663, .859}F & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .663, .816, .557}A \\ + 47 & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .788, .788, .788}D \\ + 48 & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ .251, .251, .251}\textcolor[rgb]{ 1, 1, 1}{I} & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .518, .592, .69}G \\ + 49 & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .663, .816, .557}A & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ .557, .663, .859}F \\ + 50 & \cellcolor[rgb]{ .788, .788, .788}D & \cellcolor[rgb]{ 1, .851, .4}C & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ .518, .592, .69}G \\ + 51 & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ .608, .761, .902}B & \cellcolor[rgb]{ .518, .592, .69}G & \cellcolor[rgb]{ .957, .69, .518}E \\ + \end{tabular}% + \end{adjustbox}\\[1em] + \footnotesize\raggedright + The ``HIV/ID'' columns represent the assignments for the two concurrent services offered at the department. The ``Weekend'' column represents the assignments for weekend coverage in both services. Different colours and letters are used to distinguish different clinicians. + % JK: should use a footnote to define the meaning of + % - HIV / ID + % - Weekend + % - Colors & Letters + % so that the reader can understand the table basically without reading the paper. +\end{table}% diff --git a/paper/tbl/constraints_comparison.tex b/paper/tbl/constraints_comparison.tex new file mode 100644 index 0000000..f9f0cc0 --- /dev/null +++ b/paper/tbl/constraints_comparison.tex @@ -0,0 +1,30 @@ +% Table generated by Excel2LaTeX from sheet 'constraints' +\begin{sidewaystable}[htbp] % JK: this makes sure the table caption gets rotated too + \centering + \caption{Comparison of constraint satisfaction and objectives values in LP-generated and historical schedules.}% + \label{tbl:constraints-comparison} + \begin{tabular}{l|cc|cc|cc|cc} + \toprule + \multirow{2}[1]{*}{} & \multicolumn{2}{c|}{\textbf{2015}} & \multicolumn{2}{c|}{\textbf{2016}} & \multicolumn{2}{c|}{\textbf{2017}} & \multicolumn{2}{c}{\textbf{2018}} \\ + & LP & Historical & LP & Historical & LP & Historical & LP & Historical \\ \midrule + \multicolumn{1}{c|}{\textbf{Constraint}} & & & & & & & & \\ \midrule + Block Coverage & \checkmark & \checkmark & \checkmark & \checkmark & \checkmark & \checkmark & \checkmark & \checkmark \\ + Weekend Coverage & \checkmark & \checkmark & \checkmark & \checkmark & \checkmark & \checkmark & \checkmark & \checkmark \\ + Min/Max & \checkmark & \checkmark & \checkmark & \checkmark & \checkmark & \checkmark & \checkmark & \checkmark \\ + No Consecutive Blocks & \checkmark & & \checkmark & & \checkmark & & \checkmark & \\ + No Consecutive Weekends & \checkmark & & \checkmark & & \checkmark & \checkmark & \checkmark & \checkmark \\ + Equal Weekends & \checkmark & & \checkmark & & \checkmark & & \checkmark & \\ + Equal Holidays & \checkmark & & \checkmark & \checkmark & \checkmark & & \checkmark & \checkmark \\ \midrule + \multicolumn{1}{c|}{\textbf{Objective}} & & & & & & & & \\ \midrule + \makecell[l]{Satisfied Block Requests} & 123/129 & 121/129 & 120/126 & 116/126 & 99/99 & 95/99 & 124/128 & 121/128 \\ + \makecell[l]{Satisfied Weekend Requests} & 113/113 & 111/113 & 119/119 & 112/119 & 75/75 & 75/75 & 115/115 & 113/115 \\ + \makecell[l]{Adjacent Block-Weekend Assignments} & 26/26 & 9/26 & 26/26 & 6/26 & 26/26 & 7/26 & 26/26 & 5/26 \\ + \bottomrule + % JK: why these newlines in Satisfied Block Requests etc.? + % Can you just make the cell a little bigger? + \end{tabular}\\[1em] + \footnotesize\raggedright + The objective denominator represents: + the total number of requests submitted by clinicians for request objectives; and + the total number of possible adjacencies for adjacency objectives. +\end{sidewaystable}% diff --git a/paper/tbl/runtime_services_clinicians.tex b/paper/tbl/runtime_services_clinicians.tex new file mode 100644 index 0000000..b298ced --- /dev/null +++ b/paper/tbl/runtime_services_clinicians.tex @@ -0,0 +1,18 @@ +\begin{table}[htbp] + \centering + \caption{Comparison of program runtime (in seconds) for different numbers of services and total clinicians in the division.}% + \label{tbl:runtime-services-clinicians-comparison}% + \begin{tabular}{|c|c||c|c||c|c|} + \toprule + & \multicolumn{5}{c|}{Number of Services} \\ \midrule + \makecell[l]{Number of \\ Clinicians} & 1 & 2 & 2 (*) & 3 & 3 (*) \\ \midrule + 10 & 0.16 & 0.74 & 0.16 & 1.40 & 0.23 \\ \hline + 20 & 0.25 & 7468.86 & 0.32 & -- & 0.43 \\ \hline + 30 & 0.42 & -- & 0.49 & -- & 0.66 \\ \hline + 50 & 0.62 & -- & 0.82 & -- & 1.14 \\ \bottomrule + \end{tabular}\\[1em] + \footnotesize\raggedright + Notes: + ``--'' indicates that no solution was found within 24 hours; + ``(*)'' indicates that the No Consecutive Blocks (NCB) constraint was removed. +\end{table} \ No newline at end of file