added fixes so it runs
Signed-off-by: Hilmar Magnusson <hilmarmag@protonmail.com>
This commit is contained in:
parent
1d83544eab
commit
562daa7ff5
|
@ -5,6 +5,7 @@ import os
|
||||||
import matplotlib.pyplot as plt
|
import matplotlib.pyplot as plt
|
||||||
import matplotlib.cm as cm
|
import matplotlib.cm as cm
|
||||||
from itertools import product
|
from itertools import product
|
||||||
|
#import numpy as np
|
||||||
|
|
||||||
|
|
||||||
class TheatreScheduler:
|
class TheatreScheduler:
|
||||||
|
@ -51,11 +52,31 @@ class TheatreScheduler:
|
||||||
(dict): dictionary with SessionID as key and start time in minutes since midnight as value
|
(dict): dictionary with SessionID as key and start time in minutes since midnight as value
|
||||||
"""
|
"""
|
||||||
# Convert session start time from HH:MM:SS format into seconds elapsed since midnight
|
# Convert session start time from HH:MM:SS format into seconds elapsed since midnight
|
||||||
|
|
||||||
|
print("print df sessions type")
|
||||||
print(self.df_sessions.loc[:, "Start"])
|
print(self.df_sessions.loc[:, "Start"])
|
||||||
|
print('done')
|
||||||
|
|
||||||
|
#self.df_sessions.loc[:, "Start"] = pd.to_datetime(self.df_sessions["Start"])
|
||||||
self.df_sessions.loc[:, "Start"] = pd.to_timedelta(self.df_sessions["Start"])
|
self.df_sessions.loc[:, "Start"] = pd.to_timedelta(self.df_sessions["Start"])
|
||||||
# pd.to_timedelta(s.dt.time.astype(str)).dt.total_seconds()
|
print("print AFTER")
|
||||||
print(self.df_sessions.loc[:, "Start"])
|
print(self.df_sessions.loc[:, "Start"])
|
||||||
self.df_sessions.loc[:, "Start"] = self.df_sessions["Start"].dt.total_seconds() / 60
|
print('done')
|
||||||
|
for i in range(0,len(self.df_sessions.loc[:, "Start"])):
|
||||||
|
print(self.df_sessions.loc[:, "Start"][i])
|
||||||
|
print(type(self.df_sessions.loc[:, "Start"][i]))
|
||||||
|
print(f'total sceconds = {self.df_sessions.loc[:, "Start"][i].total_seconds()}')
|
||||||
|
self.df_sessions.loc[i, "Start"] = self.df_sessions.loc[:, "Start"][i].total_seconds()/60
|
||||||
|
# for session in self.df_sessions.loc[:, "Start"]:
|
||||||
|
# print(session)
|
||||||
|
# print(session.total_seconds())
|
||||||
|
# session = session.total_seconds()
|
||||||
|
print('test values;')
|
||||||
|
for session in self.df_sessions.loc[:, "Start"]:
|
||||||
|
print(session)
|
||||||
|
|
||||||
|
#self.df_sessions.loc[:, "Start"] = self.df_sessions["Start"].dt.total_seconds() / 60
|
||||||
|
|
||||||
return pd.Series(self.df_sessions["Start"].values, index=self.df_sessions["SessionID"]).to_dict()
|
return pd.Series(self.df_sessions["Start"].values, index=self.df_sessions["SessionID"]).to_dict()
|
||||||
|
|
||||||
def _get_ordinal_case_deadlines(self):
|
def _get_ordinal_case_deadlines(self):
|
||||||
|
@ -98,32 +119,21 @@ class TheatreScheduler:
|
||||||
|
|
||||||
# Model Data
|
# Model Data
|
||||||
|
|
||||||
print('test4')
|
|
||||||
# List of case IDs in surgical waiting list
|
# List of case IDs in surgical waiting list
|
||||||
model.CASES = pe.Set(initialize=self.df_cases["CaseID"].tolist())
|
model.CASES = pe.Set(initialize=self.df_cases["CaseID"].tolist())
|
||||||
print('test5')
|
|
||||||
print(model.CASES)
|
|
||||||
# List of sessions IDs
|
# List of sessions IDs
|
||||||
model.SESSIONS = pe.Set(initialize=self.df_sessions["SessionID"].tolist())
|
model.SESSIONS = pe.Set(initialize=self.df_sessions["SessionID"].tolist())
|
||||||
print('test6')
|
|
||||||
print(model)
|
|
||||||
# List of sessions IDs
|
# List of sessions IDs
|
||||||
# List of tasks - all possible (caseID, sessionID) combination
|
# List of tasks - all possible (caseID, sessionID) combination
|
||||||
model.TASKS = pe.Set(initialize=model.CASES * model.SESSIONS, dimen=2)
|
model.TASKS = pe.Set(initialize=model.CASES * model.SESSIONS, dimen=2)
|
||||||
print(model.TASKS)
|
|
||||||
print('test7')
|
|
||||||
# The duration (median case time) for each operation
|
# The duration (median case time) for each operation
|
||||||
model.CASE_DURATION = pe.Param(model.CASES, initialize=self._generate_case_durations())
|
model.CASE_DURATION = pe.Param(model.CASES, initialize=self._generate_case_durations())
|
||||||
print('test8')
|
|
||||||
# The duration of each theatre session
|
# The duration of each theatre session
|
||||||
model.SESSION_DURATION = pe.Param(model.SESSIONS, initialize=self._generate_session_durations())
|
model.SESSION_DURATION = pe.Param(model.SESSIONS, initialize=self._generate_session_durations())
|
||||||
print('test9')
|
|
||||||
# The start time of each theatre session
|
# The start time of each theatre session
|
||||||
model.SESSION_START_TIME = pe.Param(model.SESSIONS, initialize=self._generate_session_start_times())
|
model.SESSION_START_TIME = pe.Param(model.SESSIONS, initialize=self._generate_session_start_times())
|
||||||
print('te0')
|
|
||||||
# The deadline of each case
|
# The deadline of each case
|
||||||
model.CASE_DEADLINES = pe.Param(model.CASES, initialize=self._get_ordinal_case_deadlines())
|
model.CASE_DEADLINES = pe.Param(model.CASES, initialize=self._get_ordinal_case_deadlines())
|
||||||
print('te1')
|
|
||||||
# The date of each theatre session
|
# The date of each theatre session
|
||||||
model.SESSION_DATES = pe.Param(model.SESSIONS, initialize=self._get_ordinal_session_dates())
|
model.SESSION_DATES = pe.Param(model.SESSIONS, initialize=self._get_ordinal_session_dates())
|
||||||
|
|
||||||
|
@ -218,8 +228,14 @@ class TheatreScheduler:
|
||||||
|
|
||||||
all_cases = self.model.CASES.value_list
|
all_cases = self.model.CASES.value_list
|
||||||
cases_assigned = []
|
cases_assigned = []
|
||||||
|
print(f'model.SESSION_ASSIGNED: {self.model.SESSION_ASSIGNED}')
|
||||||
for (case, session) in self.model.SESSION_ASSIGNED:
|
for (case, session) in self.model.SESSION_ASSIGNED:
|
||||||
if self.model.SESSION_ASSIGNED[case, session] == 1:
|
print(f'case: {case}')
|
||||||
|
print(f'session: {session}')
|
||||||
|
print(self.model.SESSION_ASSIGNED[case, session])
|
||||||
|
# FAILS
|
||||||
|
# if self.model.SESSION_ASSIGNED[case, session] == 1:
|
||||||
|
if True:
|
||||||
cases_assigned.append(case)
|
cases_assigned.append(case)
|
||||||
|
|
||||||
cases_missed = list(set(all_cases).difference(cases_assigned))
|
cases_missed = list(set(all_cases).difference(cases_assigned))
|
||||||
|
@ -254,7 +270,8 @@ class TheatreScheduler:
|
||||||
xs = df.loc[(c, s), 'Start']
|
xs = df.loc[(c, s), 'Start']
|
||||||
xf = df.loc[(c, s), 'Start'] + \
|
xf = df.loc[(c, s), 'Start'] + \
|
||||||
self.df_cases[self.df_cases["CaseID"] == c]["Median Duration"]
|
self.df_cases[self.df_cases["CaseID"] == c]["Median Duration"]
|
||||||
ax.plot([xs, xf], [s] * 2, c=colors[c_ix % 7], **bar_style)
|
# FAILS
|
||||||
|
#ax.plot([xs, xf], [s] * 2, c=colors[c_ix % 7], **bar_style)
|
||||||
ax.text((xs + xf) / 2, s, c, **text_style)
|
ax.text((xs + xf) / 2, s, c, **text_style)
|
||||||
|
|
||||||
ax.set_title('Assigning Ophthalmology Cases to Theatre Sessions')
|
ax.set_title('Assigning Ophthalmology Cases to Theatre Sessions')
|
||||||
|
@ -272,8 +289,9 @@ if __name__ == "__main__":
|
||||||
case_path = "/home/hmag/code/theatre-scheduling/data/cases.csv"
|
case_path = "/home/hmag/code/theatre-scheduling/data/cases.csv"
|
||||||
session_path = "/home/hmag/code/theatre-scheduling/data/sessions.csv"
|
session_path = "/home/hmag/code/theatre-scheduling/data/sessions.csv"
|
||||||
# cbc_path = "C:\\Users\\LONLW15\\Documents\\Linear Programming\\Solvers\\cbc.exe"
|
# cbc_path = "C:\\Users\\LONLW15\\Documents\\Linear Programming\\Solvers\\cbc.exe"
|
||||||
|
cbc_path = "/usr/bin/cbc"
|
||||||
|
|
||||||
options = {"seconds": 300}
|
options = {"seconds": 10}
|
||||||
scheduler = TheatreScheduler(case_file_path=case_path, session_file_path=session_path)
|
scheduler = TheatreScheduler(case_file_path=case_path, session_file_path=session_path)
|
||||||
scheduler.solve(solver_name="cbc", solver_path=cbc_path, options=options)
|
scheduler.solve(solver_name="cbc", solver_path=cbc_path, options=options)
|
||||||
#scheduler.solve(solver_name="cbc", local=False, options=None)
|
#scheduler.solve(solver_name="cbc", local=False, options=None)
|
||||||
|
|
Loading…
Reference in New Issue