Full text
Equation Chapter 1 Section 1 Proyecto Fin de Carrera Ingeniería de Tecnologías Industriales Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario Autor: Juan López Garcelán Tutor: José Manuel Molina Pariente Dpto. Organización Industrial y Gestión de Empresas Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2023
iii Proyecto Fin de Carrera Ingeniería de Tecnologías Industriales Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario Autor: Juan López Garcelán Tutor: José Manuel Molina Pariente Dpto. de Organización Industrial y Gestión de Empresas I Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2023
v Proyecto Fin de Carrera: Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario Autor: Juan López Garcelán Tutor: José Manuel Molina Pariente El tribunal nombrado para juzgar el Proyecto arriba indicado, compuesto por los siguientes miembros: Presidente: Vocales: Secretario: Acuerdan otorgarle la calificación de: Sevilla, 2023 El Secretario del Tribunal
vii A mi familia A mis maestros
ix Agradecimientos En primer lugar, agradecer a mi familia y amigos, que han permanecido a mi lado a lo largo de toda mi etapa educativa, aportándome su apoyo, confianza, madurez, felicidad y amor, haciéndome crecer y madurar tanto en lo personal como en lo académico. Sin este pilar fundamental, estoy seguro de que no habría llegado hasta aquí y no sería quien soy ahora mismo. Por otro lado, agradecer a todos los profesores del grado su tiempo invertido en mi aprendizaje y educación, así como al personal de movilidad, que me permitió vivir una experiencia única en el curso académico 2021- 2022 de Erasmus. Por último, apreciar y agradecer el apoyo que José Manuel me ha dado durante la realización del presente TFG. Como él sabe, tenía pocos conocimientos sobre el tópico que concierne a este trabajo, pero me ha aceptado y me ha dedicado mucho tiempo en que yo aprenda y que hoy pueda entregar este proyecto. Gracias por tu cercanía y confianza depositada en mí. Juan López Garcelán Sevilla, 2023
ÍNDICE DE TABLAS Tabla 3-1. Datos para el problema de ejemplificación (1) 15 Tabla 3-2. Datos para el problema de ejemplificación (2) 15 Tabla 4-1. Conjuntos e índices 17 Tabla 4-2. Parámetros 17 Tabla 4-3. Variables de decisión para el primer método de programación 18 Tabla 4-4. Variables de decisión para el segundo método de programación 18 Tabla 5-1. Número de recursos por tipología a las 6:00 a.m. [5] 31 Tabla 5-2. Número de recursos por tipología a las 12:00 a.m. [5] 31 Tabla 5-3. Número de recursos por tipología a as 12:00 a.m. para la variante 3 [5] 31 Tabla 5-4. Relación de actividades maestras y tipología de recursos [5] 32 Tabla 5-5. Proceso de urgencia por prioridades de pacientes [5] 34 Tabla 5-6. Nomenclatura de las variantes en la experimentación 35 Tabla 5-7. Número de recursos por tipología del caso de estudio 1 [5] 36 Tabla 5-8. Pacientes, actividades y recursos del caso de estudio 1 con saturación del 25% 36 Tabla 5-9. Número de variables y restricciones en el caso de estudio 1 con saturación del 25% 39 Tabla 5-10. Pacientes, actividades y recursos del caso de estudio 1 con saturación del 50% 39 Tabla 5-11. Número de variables y restricciones en el caso de estudio 1 con saturación del 50% 42 Tabla 5-12. Pacientes, actividades y recursos del caso de estudio 1 con saturación del 75% 42 Tabla 5-13. Número de variables y restricciones en el caso de estudio 1 con saturación del 75% 44 Tabla 5-14. Número de recursos por tipología del caso de estudio 2 [5] 45 Tabla 5-15. Pacientes, actividades y recursos del caso de estudio 2 con saturación del 25% 45 Tabla 5-16. Número de variables y restricciones en el caso de estudio 2 con saturación del 25% 48 Tabla 5-17. Pacientes, actividades y recursos del caso de estudio 2 con saturación del 50% 48 Tabla 5-18. Número de variables y restricciones en el caso de estudio 2 con saturación del 50% 50 Tabla 5-19. Pacientes, actividades y recursos del caso de estudio 2 con saturación del 75% 50 Tabla 5-20. Número de variables y restricciones en el caso de estudio 2 con saturación del 75% 52 Tabla 5-21. Número de recursos por tipología del caso de estudio 3 [5] 53 Tabla 5-22. Pacientes, actividades y recursos del caso de estudio 3 con saturación del 25% 54 Tabla 5-23. Pacientes, actividades y recursos del caso de estudio 3 con saturación del 50% 55 Tabla 5-24. Resultados instancias 1 y 10 en el caso de estudio 3 con saturación del 50% 57 Tabla 5-25. Pacientes, actividades y recursos del caso de estudio 3 con saturación del 75% 57 Tabla 5-26. Valor de la F.O. y GAP del modelo 4 para el caso de estudio 3 al 75% de saturación 58 Tabla 5-27. Resultados instancia 3 en el caso de estudio 3 con nivel de saturación del 75% 58 Tabla 5-28. Estadísticas del término TEPCOF en la función objetivo 59
xvii
ÍNDICE DE FIGURAS Figura 1-1. Frecuentación en urgencias hospitalarias en el SNS en España [3] 3 Figura 1-2. Frecuentación en urgencias hospitalarias en el SNS en España según CC.AA [3] 3 Figura 2-1. Tipología de llegada al SUH [5] 10 Figura 2-2. Flujo de información y movimiento del paciente dentro del SUH [23] 11 Figura 3-1. Diagrama de Gantt I del problema de ejemplificación 15 Figura 3-2. Diagrama de Gantt II del problema de ejemplificación 16 Figura 3-3. Diagrama de Gantt III del problema de ejemplificación 16 Figura 3-4. Diagrama de Gantt IV del problema de ejemplificación 16 Figura 5-1. Calendario de médicos, médicos asistentes y enfermeros [5] 31 Figura 5-2. Resultados del estudio realizado en el artículo [5] 32 Figura 5-3. Porcentaje de asistencia de pacientes al SUH según prioridades [5] 33 Figura 5-4. Utilización de recursos en el proceso de urgencia por tipología de paciente [5] 33 Figura 5-5. Tiempos de proceso de las actividades del proceso de urgencia por prioridades [5] 34 Figura 5-6. Tipología de soluciones para el caso de estudio 1 al 25% de saturación 36 Figura 5-7. Valor medio de la F.O. para el caso de estudio 1 al 25% de saturación 37 Figura 5-8. Tiempo medio de ejecución de los modelos para el caso de estudio 1 al 25% de saturación 37 Figura 5-9. Comparativa del valor de la F.O. en modelo básico del caso 1 con satuación del 25% 38 Figura 5-10. Valor promedio del GAP para el caso de estudio 1 con saturación del 25% 38 Figura 5-11. Comparativa del número de variables y restricciones del caso 1 con saturación del 25% 39 Figura 5-12. Tipología de soluciones para el caso de estudio 1 al 50% de saturación 40 Figura 5-13. Valor medio de la F.O. para el caso de estudio 1 al 50% de saturación 40 Figura 5-14. Tiempo medio de ejecución de los modelos para el caso de estudio 1 al 50% de saturación 40 Figura 5-15. F.O. para el caso de estudio 1 al 50% de saturación (soluciones óptimas y factibles) 41 Figura 5-16. Valor promedio del GAP para el caso de estudio 1 con saturación del 50% 41 Figura 5-17. Comparativa del número de variables y restricciones del caso 1 con saturación del 50% 42 Figura 5-18. Tipología de soluciones para el caso de estudio 1 al 75% de saturación 42 Figura 5-19. Valor medio de la F.O. para el caso de estudio 1 al 75% de saturación 43 Figura 5-20. Tiempo medio de ejecución de los modelos para el caso de estudio 1 al 75% de saturación 43 Figura 5-21. F.O. para el caso de estudio 1 al 75% de saturación (soluciones óptimas y factibles) 43 Figura 5-22. Valor promedio del GAP para el caso de estudio 1 con saturación del 75% 44 Figura 5-23. Comparativa del número de variables y restricciones del caso 1 con saturación del 75% 44 Figura 5-24. Tipología de soluciones para el caso de estudio 2 al 25% de saturación 39 Figura 5-25. Valor medio de la F.O. para el caso de estudio 2 al 25% de saturación 46 Figura 5-26. F.O. para el caso de estudio 2 al 25% de saturación (soluciones óptimas y factibles) 46
xix Figura 5-27. Valor promedio del GAP para el caso de estudio 2 con saturación del 25% 47 Figura 5-28. Valor promedio del GAP para el caso de estudio 2 con saturación del 25% 47 Figura 5-29. Comparativa del número de variables y restricciones del caso 2 con saturación del 25% 48 Figura 5-30. Tipología de soluciones para el caso de estudio 2 al 50% de saturación 48 Figura 5-31. Valor medio de la F.O. para el caso de estudio 2 al 50% de saturación 49 Figura 5-32. F.O. para el caso de estudio 2 al 50% de saturación (soluciones óptimas y factibles) 49 Figura 5-33. Valor promedio del GAP para el caso de estudio 2 con saturación del 50% 49 Figura 5-34. Comparativa del número de variables y restricciones del caso 2 con saturación del 50% 50 Figura 5-35. Tipología de soluciones para el caso de estudio 2 al 75% de saturación 51 Figura 5-36. Valor medio de la F.O. para el caso de estudio 2 al 75% de saturación 51 Figura 5-37. Valor promedio del GAP para el caso de estudio 2 con saturación del 75% 51 Figura 5-38. Comparativa del número de variables y restricciones del caso 2 con saturación del 75% 52 Figura 5-39. Comparativa de ambos métodos en tipología de soluciones 52 Figura 5-40. Comparativa de ambos métodos en número de variables y restricciones 52 Figura 5-41. Tipología de soluciones para el caso de estudio 3 al 25% de saturación 54 Figura 5-42. Valor medio de la F.O. para el caso de estudio 3 al 25% de saturación 54 Figura 5-43. Valor promedio del GAP para el caso de estudio 3 con saturación del 25% 55 Figura 5-44. Número de variables y restricciones del caso 3 con saturación del 25% 55 Figura 5-45. Tipología de soluciones para el caso de estudio 3 al 50% de saturación 56 Figura 5-46. Valor medio de la F.O. para el caso de estudio 3 al 50% de saturación 56 Figura 5-47. Valor promedio del GAP para el caso de estudio 3 con saturación del 50% 56 Figura 5-48. Número de variables y restricciones del caso 3 con saturación del 50% 57 Figura 5-49. Tipología de soluciones para el caso de estudio 3 al 75% de saturación 58 Figura 5-50. Número de variables y restricciones del caso 3 con saturación del 75% 58 Figura 5-51. Tipología de soluciones de toda la experimentación 59
xxi Notación SUH Servicio de Urgencia Hospitalario CC.AA. [1] Comunidades Autónomas LOS Length of Stay TEPCOF Tiempo de Espera hasta la Primera Consulta Facultativa < Menor > Mayor ≤ Menor o igual ≥ Mayor o igual | Tal que ∈ Pertenece ∀ Para todo
1 1 INTRODUCCIÓN a optimización de recursos es un área cada vez más presente en todos los sectores de la industria. Así pues, los conceptos de eficiencia, eficacia o productividad conforman la base de cualquier industria, cuyo objetivo común es dar un servicio de la mayor calidad posible a coste mínimo. Para conseguir el mayor beneficio dentro de un proceso productivo, es fundamental realizar una buena gestión de los recursos que se tienen, de modo que no se produzcan despilfarros ni tiempos ociosos. La gestión de los recursos es un desafío clave en cualquier ámbito, ya sea en el sector público o privado. En el contexto empresarial, una gestión eficiente de los recursos se vuelve aún más crucial debido a su impacto directo en la rentabilidad, productividad y competitividad de las organizaciones. La asignación adecuada y la optimización de los recursos, tanto tangibles como intangibles, son elementos fundamentales para lograr el éxito y la sostenibilidad a largo plazo. En el sector sanitario es muy importante la optimización de los recursos, ya que aunque esta no va ligada a una rentabilidad cuantificable monetaria como la mayoría de las industrias, una buena gestión de los recursos que se tienen dentro del servicio de urgencias de un hospital puede llegar a salvar vidas, que aunque no cuantificable, es mucho más importante. Se ha vivido de primera mano hace tres años que la vida puede cambiar en cuestión de segundos y que los hospitales pueden desbordarse hasta niveles insospechables. Ello debe servir de lección para intentar prepararnos para cualquier otra situación similar que se pueda presentar, en la que cada segundo cuenta. Para poder afrontar situaciones de esta escala, hay que formar una base consistente del sistema sanitario, donde no existan despilfarros y donde, en las peores situaciones, se pueda exprimir el uso de los recursos al cien por cien. Este trabajo de fin de grado toma aún más valor después de que hace tres años la Organización Mundial de la Salud declarase una pandemia mundial odiada por todos, la infección por SARS-CoV-2, más conocida como la COVID-19. Ahora todos somos más conscientes del valor que tiene el trabajo que desarrollan los sanitarios, y de la importancia de tener un sistema sanitario de calidad en el país. La pandemia desestructuró todo el sistema sanitario de todos los países, donde los hospitales alcanzaron unos niveles de saturación nunca antes vistos. 1.1. Presentación del problema En el presente trabajo se va a abordar la gestión del flujo de pacientes en el servicio de urgencias hospitalario (SUH). Según el Ministerio de Sanidad y Política social, el SUH puede definirse como una organización de profesionales sanitarios, ubicada en un centro hospitalario, que ofrece asistencia multidisciplinar, cumpliendo unos requisitos funcionales, estructurales y organizativos, de forma que garantiza unas condiciones adecuadas de seguridad, calidad y eficiencia para atender a las urgencias y emergencias. El SUH se configura como una unidad intermedia, que presta servicios (asistencia médica, cuidados de enfermería) hasta la estabilización del cuadro clínico a los pacientes que son finalmente ingresados en el hospital, y como un servicio final para aquellos pacientes que, habiendo acudido a la unidad, son finalmente dados de alta [2]. L La salud es la riqueza real, y no piezas de oro y plata. - Mahatma Gandhi-
Introducción 2 El problema que existe es común para cualquier SUH del país, y es que todos ellos están saturados, con una carga asistencial que supera incluso el 40% en algunas CC.AA [3]. Esto se debe fundamentalmente a que los SUH cada vez tienen que atender a un mayor volumen de pacientes. La saturación del SUH es un problema que afecta a la mayoría de los países, independientemente de su nivel socioeconómico. No obstante, la situación de sobrecarga en urgencias es un problema de todo el hospital, y no exclusivo del SUH, aunque es aquí donde se pretende hacer hincapié. Las causas más frecuentemente implicadas en la saturación de urgencias son las siguientes [2]: ❖ Incremento en la demanda de asistencia al SUH: una de las principales causas de la saturación es el incremento inesperado y de gran volumen en el número de pacientes que buscan atención médica en el SUH. Esta situación se da por ejemplo en epidemias, brotes de enfermedades (como la gripe), desastres naturales o cualquier otro evento que provoque un aumento de la necesidad de atención médica urgente en las personas. ❖ Atención primaria escasa e inadecuada: la escasez de un servicio de atención primaria de calidad y puntual hace que muchas personas acudan al SUH para poder recibir atención médica, una atención que bien podría haberse desarrollado en un ambulatorio u otro centro de atención primaria. La escasez de médicos y de clínicas de atención primaria en el país, así como la dificultad para obtener citas médicas en un horizonte temporal razonable, hace que muchos pacientes acudan al SUH para recibir atención médica cuanto antes. ❖ Incremento del número de pacientes con enfermedades crónicas: es un hecho que la población se ha envejecido en los últimos años, lo que junto a la prevalencia de enfermedades crónicas (por ejemplo, la diabetes) han contribuido a la saturación del SUH en esta tipología de pacientes. Los pacientes que presentan este marco crónico pueden precisar atención recurrente y su estado puede empeorar en cuestión de segundos, lo que conlleva que también colaboren en la saturación de los SUHs. ❖ Insuficiencia de personal y de recursos: la falta de personal médico, enfermeros, celadores y otro personal de apoyo dentro del SUH, junto con la falta de camas, equipos médicos y suministros, limitan la capacidad de un SUH para atender los pacientes de forma efectiva y eficiente. El personal del SUH suele estar sobrecargado de trabajo, lo que afecta de forma directa a la calidad de la atención, mientras que la falta de recursos provoca grandes tiempos de espera. La falta de camas de hospital es en muchos estudios la causa fundamental de la saturación de un SUH. ❖ Retrasos durante el proceso de atención al paciente: la demora en la evaluación, diagnóstico y posterior tratamiento de los pacientes que acuden al SUH generan una gran acumulación de pacientes en el SUH, que provoca a veces que algunos pacientes incluso abandonen el SUH antes de ser atendidos. Esto se puede deber a muchos factores entre los que se encuentran la falta de especialistas, procedimientos que implican otros departamentos del hospital o la demora en la obtención de resultados por el mal procesamiento de los mismos. ❖ Pacientes no urgentes: son muchos los pacientes que acuden al SUH para recibir atención médica que no es urgente, o que podrían haberse abordado desde otros entornos, como por ejemplo clínicas de atención primaria, o que ni siquiera precisaban de atención médica. Hay muchas personas que acuden al SUH con el mínimo síntoma, provocando que la carga de trabajo aumente innecesariamente y retrasando la atención de aquellos pacientes que realmente si precisan de atención médica urgente. La frecuentación de la población al SUH (hospitales de agudos y de larga estancia) es de 0,50 veces por persona y año, lo que supone un total de 23.602.940 urgencias atendidas en 2019 [4]. La frecuentación urgente en el nivel de atención especializada muestra una clara tendencia al alza desde 2012, y entre 2010 y 2019 ha aumentado en todos los territorios, excepto en Navarra [4].
3 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario No obstante, la situación actual de saturación en los SUH, se puede abordar desde distintas soluciones que se citan a continuación [5]: ❖ Fortalecer el sistema de atención primaria: dar mayor accesibilidad a los centros de atención primaria, así como aumentar la calidad del servicio en dichos centros, pueden ayudar a reducir la alta demanda del SUH. Para ello, el aseguramiento de suficientes médicos de familias y centros de primaria para toda la población con el fin de aumentar la capacitación de todos los centros de atención primaria son factores claves en esta solución. Asimismo, se debe concienciar a la población de acudir al SUH solo y únicamente cuando sea necesario, y buscar sino la solución a su dolencia en otros medios. ❖ Implementación de un sistema de triaje eficiente: un sistema de triaje preciso y eficiente puede ayudar a identificar la gravedad del paciente; y, por tanto, el proceso de urgencia que seguirá dentro del SUH y los recursos que le serán asignados, de forma muy rápida y efectiva. Esto garantizaría además el hecho de que los pacientes más críticos reciban atención inmediata, mientras que los casos menos urgentes serían atendidos dentro de un tiempo estándar razonable. Aquí está la clave de muchos SUH, que ya tienen implementado un sistema de triaje, pero no está bien depurado o no se utiliza correctamente. ❖ Gestión eficiente de la demanda: implementar estrategias en la gestión de la demanda puede descongestionar el SUH. Para ello, soluciones tales como servicios de atención telefónica de asesoramiento de pacientes (que también determine si es oportuna la asistencia a urgencias del paciente), el establecimiento de citas programadas para pacientes no urgentes, o el desarrollo de programas de educación en salud para concienciar a la población, son claves para conseguir disminuir la saturación del SUH. ❖ Optimización de la gestión de recursos: muchas veces se dan tiempos ociosos en los recursos que Figura 1-1. Frecuentación en urgencias hospitalarias en el SNS en España. [4] Figura 1-2. Frecuentación en urgencias hospitalarias en el SNS en España según CC.AA [4]
Gestión del Servicio de Urgencias Hospitalario 10 identificar posibles cuellos de botella y realizar ajustes para mejorar la eficiencia y reducir los tiempos de espera [14]. Además, en el nivel operativo se implementan medidas de control de infecciones y de seguridad del paciente. Se promueve el cumplimiento de las normas y protocolos de higiene, se monitorea la limpieza y desinfección de las áreas y se promueve la seguridad en la administración de medicamentos y en la realización de procedimientos médicos [14]. De este modo, el nivel operativo de gestión en un servicio de urgencias hospitalario implica la gestión del flujo de pacientes, la coordinación de los recursos humanos y materiales, la monitorización de los tiempos de espera y de atención, y la implementación de medidas de control de infecciones y seguridad del paciente [13]. Muchos son los indicadores para medir la eficiencia del SUH a nivel operativo que se pueden encontrar en [2], no obstante, los más importantes son los siguientes [6]: ✓ Length of Stay (LOS): tiempo total que un paciente pasa dentro del SUH, es decir, desde que es atendido en triaje hasta que recibe el alta o pasa a ser ingresado en el hospital. ✓ Time to Be Seen By a Physician or Physician Assistant (TBSPPA): tiempo que pasa desde que el paciente es registrado con una prioridad en triaje, hasta que es atendido por primera vez en 1ª Consulta. En España, este indicador se denomina TEPCOF. ✓ Left Without Been Seen (LWBS): número de pacientes que abandonan el SUH sin ser atendidos. Dada la complejidad del problema de secuenciación de pacientes, actualmente existen numerosos estudios con distintas metodologías para abordarlo tales como modelos de programación lineal, programación dinámica, heurísticas constructivas o metaheurísticas [14]. Este es el nivel que se abordará en este TFG, donde se analizará la situación del SUH en un instante de tiempo determinado y se intentará dar una solución óptima al mismo en el menor plazo posible. En este trabajo, se pretende crear modelos de programación lineal en los que el objetivo sea cumplir con los valores establecidos por la dirección del hospital de algunos de los indicadores anteriormente mencionados. 2.2.2 Configuración del SUH Todo hospital cuenta con un SUH, al que los pacientes pueden llegar a pie, en ambulancia, trasladado por la policía como emergencia… La tasa de llegada de pacientes es una demanda plenamente estocástica, que varía diariamente y a cada hora. Es cierto que hay franjas horarias en las que se puede afirmar una mayor afluencia de pacientes en el SUH, pero cuantificar de manera certera resulta algo imposible, por lo que es común recurrir a distribuciones estadísticas (por ejemplo, en [6] se utiliza una distribución de Poisson λ(t) con la que se puede aproximar la tasa de llegada al SUH). En este mismo artículo, se estudió en que porcentaje los pacientes llegaban de una forma u otra al SUH (ver Figura 2-1). A continuación, se muestra una ilustración esquemática del proceso que un paciente sigue a lo largo de toda su estancia dentro del SUH: Figura 2-1. Tipología de llegada al SUH [6]
11 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario En primera instancia, todos los pacientes pasan un proceso de admisión en el que el personal de la recepción del SUH recoge todos los datos del paciente en cuestión necesario para su registro en el sistema. Posteriormente, el personal de triaje, que habitualmente es personal de enfermería, realizan una primera evaluación del paciente, sin ni siquiera ver al mismo. Esta evaluación se basa en distintos parámetros tales como el motivo de ingreso en el SUH, estado del paciente, forma de llegada, entre otros. El objetivo principal de esta evaluación es poder elaborar una jerarquía de pacientes, en la que en base a parámetros estandarizados se pueda generar una estructura de los pacientes por prioridad asistencial, ya que no tiene la misma urgencia a ser atendido una persona resfriada que una con dolores crónicos. No se puede hablar de prioridad asistencial sin hacer referencia al TEPCOF (Tiempo de Espera de Primera Consulta Facultativa), parámetro estandarizado en el que se establece un tiempo máximo según la prioridad del paciente en que este debe ser atendido en primera consulta por el médico correspondiente. Así pues, para pacientes de alta gravedad, dicho tiempo es nulo. De este modo, tomando los datos de TEPCOF oficiales publicados por la Junta de Andalucía [15], se muestran a continuación el tiempo en que los pacientes deben ser atendidos como máximo para una primera evaluación por un profesional: Prioridad Nivel de Urgencia TEPCOF P1 Emergencia 0 P2 Muy urgente 15 P3 Urgente 60 P4 Poco urgente 100 P5 No urgente 120 Tabla 2-1. TEPCOF según prioridad del paciente [15] [14] Una vez priorizado, el paciente es evaluado en una 1ª Consulta Facultativa, que debe de producirse en un tiempo menor al TEPCOF asignado a esa prioridad. A partir de aquí, el paciente puede ser sometido a distintas pruebas como radiología, extracción de sangre, TAC, o cualquier otra prueba que el médico estime oportuno para poder diagnosticar al paciente. Finalmente, el paciente será reevaluado de nuevo por un médico, que determinará si el paciente debe ingresar en planta en el hospital, o si por el contrario el paciente recibe el alta y abandona el hospital. En ambos casos, el paciente sale del sistema del servicio de urgencias, ya sea por irse a casa o por pasar al sistema de ingresos del propio hospital. Figura 2-2. Flujo de información y movimiento del paciente dentro del SUH [21]
13 3 DESCRIPCIÓN DEL PROBLEMA n este apartado se procede a poner en contexto del problema concreto que se pretende abordar. Así pues, es necesario conocer en que entorno se va a desarrollar el problema, qué recursos se deben considerar, las limitaciones de dichos recursos; y, qué función objetivo se tiene con el fin de optimizar la secuenciación del proceso de urgencia de los pacientes del SUH. 3.1 Descripción del entorno El presente trabajo que aborda la secuenciación del proceso de urgencia es equiparable al entorno de trabajo Jobshop [14]. En este entorno se tienen m máquinas y n trabajos, con la peculiaridad de que cada trabajo puede seguir una ruta distinta, y que una máquina puede desarrollar más de una tarea (son máquinas multidisciplinares). Esta flexibilidad sin apenas restricciones hace que la programación óptima de las n tareas en las m máquinas sea habitualmente imposible. Estas máquinas y trabajos mencionados, se pueden trasladar al ámbito sanitario, de modo que las máquinas serían las consultas (cada consulta tiene siempre asignado un médico o médico asistente), el personal de enfermería, salas de rayos, entre otros, y los trabajos serían los pacientes, que según la prioridad seguirán una ruta por unas máquinas u otra. De este modo, un mismo recurso, por ejemplo la consulta, puede llevar a cabo dos actividades, la 1ª consulta y la posterior reevaluación. Siguiendo con la equivalencia entre el Jobshop y el problema planteado, se mencionan a continuación los recursos (máquinas) de los que se dispone en un SUH [14]: ✓ Consulta ✓ Enfermería ✓ Sala de rayos ✓ Laboratorio ✓ Sala TAC ✓ Celadores ✓ Camas de observación Asimismo, las principales actividades que se desarrollan a lo largo del proceso de urgencia de cualquier paciente son: ✓ 1ª Consulta facultativa ✓ 1ª Enferemería ✓ Pruebas radiodiagnósticas (TAC, Rayos X…) ✓ Traslado del paciente por medio de celadores ✓ Analíticas ✓ Reevaluación ✓ Alta Dichas actividades se pueden subdividir en más, por ejemplo, en enfermería normalmente hay dos vistitas, una al comienzo y otra justo antes de abandonar el SUH [6]. O en el caso de Rayos X o el TAC, muchas veces las salas o recursos donde se llevan a cabo son distintas áreas del SUH. En la experimentación de este TFG que se expondrá más adelante, se tomarán datos y recursos concretos apoyados en el artículo [6]. Así pues, para cada paciente se tiene un proceso de urgencia dentro del SUH según la prioridad asignada al mismo. E
Descripción del problema 14 3.2 Limitaciones de los recursos Cada hospital tiene una organización distinta, pero lo más frecuente es que todos los médicos (doctores, enfermeros, celadores…) tengan una jornada laboral de 8 horas/día durante 5 días a la semana, a lo que habría que sumar días de guardia, vacaciones… Aunque esto es algo que no concierne al problema que se quiere abordar en este proyecto. Lo relevante es que aunque se tengan determinados recursos, hay que tener en cuenta los horarios del personal y en que momentos se puede contar con ese recurso para llevar a cabo un trabajo, porque en caso contrario no se podrá asignar a un paciente a ese recurso. Por un lado, se puede dar el caso de que los pacientes más graves (menor prioridad) tengan que ser atendidos por los médicos de más experiencia, mientras que los de menor gravedad pueden ser atendidos por médicos asistentes o en prácticas. De esta forma, el SUH queda sectorizado según las prioridades que presenten los pacientes. Por otro lado, con la reciente pandemia vivida más aún, también hay que tener en cuenta posibles situaciones que se pueden dar en las que debido a un alto riesgo de contagio, hay salas que quedan totalmente inhabilitadas para pacientes no contagiados (o contagiados), por lo que tampoco se puede asignar pacientes a recursos si no están o si están contagiados. Estas variantes serán explicadas más adelante. Asimismo, también se puede dar el caso de que la política del hospital sea que los pacientes de gravedad elevada, necesiten doble asistencia simultáneamente, o que sean atendidos por los médicos más expertos y preparados para ello, mientras que los menos grave pueden ser atendidos por médicos en prácticas o con menos experiencia. Ello también limita la asignación de pacientes a recursos, al igual que la disponibilidad o la tipología de pacientes [6]. Por último, otro aspecto a tener en cuenta es puede darse el caso de que los médicos más preparados o con más experiencia sean los encargados de realizar la primera consulta, mientras que los que tienen menos experiencia realicen la reevaluación o el alta del paciente. Esta sectorización limita los recursos de forma que haya consultas en las que solo se puede llevar a cabo las tareas de primera consulta facultativa, mientras que otras solo realizan altas o reevaluaciones. 3.3 Función objetivo Se pueden distinguir dos términos fundamentales que se pretenden minimizar con el fin de optimizar el flujo de pacientes dentro del SUH. Para conseguir la mayor eficiencia posible, se debe minimizar el tiempo que un paciente pasa dentro del SUH, de modo que cuanto menos tiempo pase quiere decir que menos tiempo ocupará los recursos disponibles y por tanto más disponibilidad habrá para el resto de pacientes. No obstante, la minimización del tiempo de estancia dentro del SUH debe venir acompañada de cumplimiento del llamado TEPCOF, de modo que según la prioridad del paciente, este haya sido atendido dentro del tiempo máximo prefijado por el parámetro estándar. A modo de resumen, los dos indicadores sobre los que se va a trabajar y que se desean minimizar son: ❖ Cumplimiento del TEPCOF ❖ Length Of Stay (LOS) 3.4 Ejemplificación del problema A modo de explicación gráfica, y con la ayuda del lenguaje de programación Python, se ha tomado una instancia pequeña con datos cualesquiera, con el fin de mostrar visualmente la secuenciación del proceso de urgencia de cada paciente en el SUH. Veamos los datos del problema para una mejor comprensión:
15 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario Actividades Tipos de recurso Recursos (1) 1ª Consulta Consulta Consulta 1 (2) Enfermería Enfermería Consulta 2 (3) Rayos Rayos Consulta 3 (4) Reevaluación Enfermería 1 (5) Alta Enfermería 2 Rayos Tabla 3-1. Datos para el problema de ejemplificación (1) Paciente Prioridad Ruta Fecha de llegada 1 1 1 – 2 – 3 – 4 – 5 6 2 3 1 – 2 – 5 10 3 3 1 – 2 – 5 1 4 4 1 – 2 – 5 20 Tabla 3-2. Datos para el problema de ejemplificación (2) Minimizando las variables LOS y TEPCOF, la ruta óptima para estos cuatro pacientes dentro del SUH queda de la siguiente forma:
Descripción del problema 16 Las actividades correspondientes al paciente 1 van desde la actividad 1 a la 5, para el paciente 2 son las actividades 6, 7 y 8; para el paciente 3 son las actividades 9, 10 y 11; y, por último, para el paciente 4 las actividades son la 12, 13 y 14. Como se puede observar, las fechas de llegada de cada uno de los pacientes se respetan, y el paciente 1 es atendido nada más llegar (instante de llegada al SUH t=6), debido a su prioridad asistencial. Además, para este ejemplo el único paciente que visita la sala de rayos es el paciente uno. Supongamos ahora que los pacientes 2 y 4 presentan COVID, de modo que solo pueden ser atendidos en las consultas 2 y 3, y en la enfermería 2, entonces el nuevo diagrama es el que se muestra en la Figura 3-2. Como se puede apreciar, las actividades 6,7 y 8, y las actividades 12, 13 y 14, pertenecientes a los pacientes que presentan COVID respectivamente, se realizan en los correspondientes recursos destinados para ello. Supongamos ahora que debido a la gravedad que presenta el paciente 1, debe ser atendido por dos enfermeros en vez de uno: Figura 3-1. Diagrama de Gantt I del problema de ejemplificación. Fuente: propia Figura 3-1. Diagrama de Gantt I del problema de ejemplificación. Fuente: propia Figura 3-2. Diagrama de Gantt II del problema de ejemplificación. Fuente: propia
17 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario El cambio introducido hace que las enfermerías 1 y 3 estén ocupadas al mismo tiempo y por la misma actividad (actividad 2, enfermería del paciente 1; ver Figura 3-3). Finalmente, supongamos que ninguna de las tres consultas está disponible hasta el minuto 30, de modo que las fechas de llegada se convierten en irrelevantes: Se puede ver (Figura 3-4) que ningún paciente recibe la diagnosis de un médico hasta al menos transcurridos los 30 primeros minutos del marco temporal. Muchas son las variantes que se pueden presentar a lo largo de una jornada laboral en un hospital, por lo que encontrar un modelo único que resuelva el problema existente con la saturación en los SUH es muy complejo debido a la fluctuación en la demanda y casuística presente en los hospitales diariamente. Figura 3-4. Diagrama de Gantt IV del problema de ejemplificación. Fuente: propia Figura 3-3. Diagrama de Gantt III del problema de ejemplificación. Fuente: propia Figura 3-4. Diagrama de Gantt IV del problema de ejemplificación. Fuente: propia
19 4 MODELADO DEL PROBLEMA n este capítulo se procede a la exposición y respectiva explicación de los modelos desarrollados de programación lineal entera para la secuenciación de pacientes del SUH. Para ello, en primer lugar, se describen los conjuntos, parámetros y variables decisión necesarios para la gestión del SUH. En segundo lugar, se explican todos los modelos diseñados y desarrollados en el TFG. Cabe destacar que se han considerado dos formas de modelar diferentes, relativas a la discretización o no del dominio de las variables de decisión. Para ambas metodologías, en primer lugar se expone un modelo básico, al cual se van sumando variantes reales que se pueden encontrar en el problema de gestión del SUH. Asimismo, para la programación e implementación de estos modelos se ha utilizado el lenguaje de programación Python. 4.1 Datos 4.1.1 Conjuntos En primer lugar, se describen los conjuntos que definen el modelo de programación lineal: Nomenclatura Descripción i 𝜖 I Conjunto de pacientes j 𝜖 J Conjunto de recursos a 𝜖 A Conjunto de actividades p 𝜖 P Conjunto de posiciones w 𝜖 W Conjunto tipo de recurso k 𝜖 K Conjunto prioridad de pacientes c 𝜖 C Conjunto tipo de paciente o 𝜖 O Conjunto de actividades maestras Tabla 4–1 Conjuntos e índices El conjunto posiciones solo estará presente en una de los dos métodos de programación. 4.1.2 Parámetros A continuación, se muestran todos los parámetros que componen el problema, es decir, los datos conocidos a partir de los cuales hay que optimizar los procesos de urgencia de cada uno de los pacientes: Nomenclatura Descripción I Número total de pacientes 𝑝𝑢𝑖,𝑎 Actividad a del proceso de urgencia del paciente i 𝑝𝑝𝑖 Prioridad del paciente i 𝑓𝑖𝑟𝑠𝑡𝑖 Primera actividad en el proceso de urgencia del paciente i 𝑙𝑎𝑠𝑡𝑖 Última actividad en el proceso de urgencia del paciente i 𝑟_𝑡𝑒𝑝𝑐𝑜𝑓𝑖 Fecha de llegada al SUH del paciente i 𝑟𝑖 Tiempo que le queda al paciente i de la actividad que esté en curso en el instante en que se quiere resolver el problema 𝐴 Número total de actividades 𝑚𝑎𝑥𝐴 Número máximo de actividades que puede tener un paciente E
Modelado del problema 26 4.3.1.1 Asignación de prioridades a recursos: “Modelo G-2” Se divide la restricción número 2 del modelo básico en dos restricciones: ∑ 𝑋𝑎,𝑗 𝑗 ∈𝐽 | 𝑠𝑎=𝑡𝑗,𝑝𝑟𝑝𝑎𝑎,𝑗=0 =0 ∀ 𝑎∈𝐴 (2.1) ∑ 𝑋𝑎,𝑗 𝑗 ∈𝐽 | 𝑠𝑎≠𝑡𝑗=0 ∀ 𝑎∈𝐴 (2.2) La restricción 2.2 sigue siendo la misma que la restricción 2 del modelo básico, es decir, que si la tipología de recurso que necesita la actividad a para ser desarrollada no es la misma que la del recurso j, la actividad a no podrá ser asignada a dicho recurso. Con la restricción 2.1 además se añade, que si la tipología de recurso de la actividad a y la del recurso j coinciden, pero sin embargo el recurso j no puede atender a pacientes de la prioridad asignada a dicho paciente y por tanto a la actividad a, dicha actividad a tampoco podrá ser asignada al recurso j. El parámetro pr es una matriz 5 (nº de prioridades) x nº de recursos, de modo que si el valor es la unidad en una prioridad i y un recurso j, quiere decir que esa actividad a de prioridad i podría ser asignada en el recurso j. 4.3.1.2 Asignación de prioridades a recursos: “Modelo D-2” Se realiza el mismo cambio que el propuesto en el apartado 4.3.1.1. del modelo gamma: ∑ ∑𝑋𝑎,𝑗,𝑝 𝑝∈𝑃𝑗 ∈𝐽 | 𝑠𝑎=𝑡𝑗,𝑝𝑟𝑝𝑎𝑎,𝑗=0 =0 ∀ 𝑎∈𝐴 (2.1) ∑ ∑𝑋𝑎,𝑗,𝑝 𝑝∈𝑃𝑗 ∈𝐽 | 𝑠𝑎≠𝑡𝑗=0 ∀ 𝑎∈𝐴 (2.2) De nuevo, en la restricción 2.1 se añade que aunque la tipología de recursos coincida en actividad-recurso, si el recurso no puede atender actividades de la prioridad asignada a una actividad a, ésta no podrá ser asignado a dicho recurso j. 4.3.2 Asignación de actividades maestras a recursos Puede darse la casuística de que en un SUH se quiera que solo determinados recursos realicen determinadas actividades. Por ejemplo, si hay 4 consultas, que solo dos de ellas realicen la 1ª consulta del paciente, y las otras dos se encarguen de realizar la reevaluación del paciente y el posterior alta del mismo. Esto se puede modelar también haciendo pequeños cambios en las restricciones planteadas. Para ello, es necesario conocer cuales son las actividades maestras de las que se compone el SUH, independientemente de que haya pacientes que realicen o no todas ellas. Conocidas las actividades, se pueden asignar a recursos de la misma forma que se ha realizado la asignación de prioridades a recursos. 4.3.2.1 Asignación de actividades maestras a recursos: “Modelo G-3” A continuación, se muestran la variación que hay que hacer en la restricción número 1 con respecto al modelo básico con el fin de poder asignar determinadas actividades a recursos:
27 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario ∑ 𝑋𝑎,𝑗 𝑗 ∈𝐽 | 𝑠𝑎=𝑡𝑗,𝑏𝑚𝑎,𝑗=1 =𝑛𝑝𝑎𝑎,𝑚𝑎 ∀ 𝑎∈𝐴 (1) Anteriormente solo se exigía que el tipo de recurso de la actividad a coincidiese con el del recurso j. Ahora se añade la restricción de que la actividad maestra a la que se corresponde la actividad a en el recurso j se puedan asignar, es decir, que el parámetro b tome valor 1. Dicho parámetro es una matriz de nº de actividades maestras x nº de recursos, de modo que toma valor 1 si la actividad maestra a puede ser realizada en el recurso j, y 0 en caso contrario, caso en el que no aplicaría la restricción número 1. 4.3.2.2 Asignación de actividades maestras a recursos: “Modelo D-3” Al igual que para el modelo gamma, solo hay que añadir la restricción de que el parámetro b tome valor unidad para que aplique en la restricción 1, de modo que dicha restricción queda de la siguiente forma: ∑ ∑𝑋𝑎,𝑗,𝑝 𝑝∈𝑃𝑗 ∈𝐽 | 𝑠𝑎=𝑡𝑗,𝑏𝑚𝑎,𝑗=1 =𝑛𝑝𝑎𝑎,𝑚𝑎 ∀ 𝑎∈𝐴 (1) 4.3.3 Distribución de recursos por tipología de pacientes En un SUH se pueden dar situaciones en las que sea necesario sectorizar el SUH para atender a distintos tipos de pacientes. Sin ir más lejos, durante la pandemia del COVID, en muchos servicios de urgencias del país se crearon salas de espera a parte del resto de pacientes para aquellos que presentaran síntomas y poder así evitar contagios. También era efectivo utilizar solo determinados recursos para pacientes contagiados y otros para los no contagiados, con el fin de ahorrar tiempo en desinfectar salas y utillaje. Esto también se puede modelar para que según el tipo de paciente, este solo pueda ser atendido en determinados recursos. Por ejemplo, si se tienen de nuevo 4 consultas, sería inteligente, ahora que la pandemia está mucho más relajada, destinar solo una de esas 4 consultas a pacientes COVID, mientras que las otras tres pueden atender a pacientes ordinarios. Así, se evitarían los famosos tiempos de set-up para tener que limpiar, y aumentaría la seguridad del paciente de contraer algún virus. 4.3.3.1 Distribución de recurso por tipología de pacientes: “Modelo G-4” De nuevo, para el caso que se plantea, solo es necesario hacer una pequeña modificación en la restricción número 1: ∑ 𝑋𝑎,𝑗 𝑗 ∈𝐽 | 𝑠𝑎=𝑡𝑗,𝑏𝑚𝑎,𝑗=1,𝑘𝑐𝑣𝑎,𝑗=1 =𝑛𝑝𝑎𝑎,𝑚𝑎 ∀ 𝑎∈𝐴 (1) Se tiene un parámetro parecido al parámetro b introducido en la variante anterior. El parámetro k es una matriz c x nº de recursos, de modo que para un paciente del tipo c, si en el recurso j el parámetro k toma valor 1, quiere decir que puede ser asignado a ese recurso, mientras que en el caso de que el parámetro k tome valor nulo, quiere decir que ese tipo de paciente no podrá ser atendido en el recurso correspondiente. Para que la restricción 1 aplique y la actividad a sea asignada a un recurso j, la actividad a debe pertenecer a una tipología de paciente admisible en el recurso j. 4.3.3.2 Distribución por tipología de pacientes: “Modelo D-4” Nuevamente, hay que añadir exactamente lo mismo que lo que se ha añadido en el apartado 4.3.3.1 del modelo gamma para esta nueva variante, de modo que la restricción 1 aplique solamente cuando el parámetro k tome
Modelado del problema 28 valor unitario: ∑ ∑𝑋𝑎,𝑗,𝑝 𝑝∈𝑃𝑗 ∈𝐽 | 𝑠𝑎=𝑡𝑗,𝑏𝑚𝑎,𝑗=1,𝑘𝑐𝑣𝑎,𝑗=1 =𝑛𝑝𝑎𝑎,𝑚𝑎 ∀ 𝑎∈𝐴 (1) 4.4 Modelos definitivos En este apartado, a modo de resumen, se vuelven a presentar los modelos, pero ya con todas las variantes activas al mismo tiempo. De este modo, para que una actividad a sea asignada a un recurso j, ambos tienen que tener la misma tipología de recurso asignado, el recurso j tiene que poder atender a pacientes de prioridad k, el recurso j tiene que poder realizar la actividad maestra “o” a la que se corresponda la actividad a, y además el recurso j tiene que poder recibir a pacientes de una determinada tipología. En caso contrario, la actividad a no podrá ser asignada al recurso j. 4.4.1 Modelo G Se muestra el modelo de programación lineal que aúna todas las variantes en un único modelo, atendiendo al método de programación que incluye la variable de decisión gamma: 𝑀𝑖𝑛.∑𝑇𝑖 𝐼 𝑖=1 +∑∑𝐶𝑇𝑙𝑎𝑠𝑡𝑖,𝑗 𝐽 𝑗=1 𝐼 𝑖=1 𝑠.𝑎: ∑ 𝑋𝑎,𝑗 𝑗 ∈𝐽 | 𝑠𝑎=𝑡𝑗,𝑏𝑚𝑎,𝑗=1,𝑘𝑐𝑣𝑎,𝑗=1 =𝑛𝑝𝑎𝑎,𝑚𝑎 ∀ 𝑎∈𝐴 (1) ∑ 𝑋𝑎,𝑗 𝑗 ∈𝐽 | 𝑠𝑎=𝑡𝑗,𝑝𝑟𝑝𝑎𝑎,𝑗=0 =0 ∀ 𝑎∈𝐴 (2.1) ∑ 𝑋𝑎,𝑗 𝑗 ∈𝐽 | 𝑠𝑎≠𝑡𝑗=0 ∀ 𝑎∈𝐴 (2.2) 𝐶𝑇𝑓𝑖𝑟𝑠𝑡𝑖,𝑗≥ (𝑟𝑖+𝑝𝑡𝑓𝑖𝑟𝑠𝑡𝑖)∙𝑋𝑓𝑖𝑟𝑠𝑡𝑖,𝑗 ∀ 𝑖∈𝐼,∀𝑗∈𝐽 | 𝑠𝑓𝑖𝑟𝑠𝑡𝑖=𝑡𝑗 (3) 𝐶𝑇𝑝𝑢𝑖,𝑎,𝑗≥ 𝐶𝑇𝑝𝑢𝑖,𝑎−1,𝑗′+𝑝𝑡𝑝𝑢𝑖,𝑎+𝑀∙(𝑋𝑝𝑢𝑖,𝑎,𝑗+𝑋𝑝𝑢𝑖,𝑎−1,𝑗′− 2) ∀ 𝑖 ∈𝐼,∀ 𝑎∈𝐴,∀ 𝑗∈𝐽,∀ 𝑗′∈𝐽 | 𝑝𝑢𝑖,𝑎≠0,𝑡𝑗=𝑠𝑝𝑢𝑖,𝑎 ,𝑡𝑗′=𝑠𝑝𝑢𝑖,𝑎−1 (4) 𝐶𝑇𝑎′,𝑗+𝑀∙(2−𝑋𝑎,𝑗−𝑋𝑎′,𝑗)≥𝐶𝑇𝑎,𝑗+𝑝𝑡𝑎′−𝑀∙(1−𝛾𝑎,𝑎′,𝑗) ∀𝑎∈𝐴,∀ 𝑎′∈𝐴,∀𝑗∈𝐽 | 𝑎<𝑎′,𝑡𝑗=𝑠𝑎,𝑡𝑗=𝑠𝑎′ (5) 𝐶𝑇𝑎,𝑗+𝑀∙(2−𝑋𝑎,𝑗−𝑋𝑎′,𝑗)≥𝐶𝑇𝑎′,𝑗+𝑝𝑡𝑎−𝑀∙𝛾𝑎,𝑎′,𝑗
29 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario ∀𝑎∈𝐴,∀ 𝑎′∈𝐴,∀𝑗∈𝐽 | 𝑎<𝑎′,𝑡𝑗=𝑠𝑎,𝑡𝑗=𝑠𝑎′ (6) 𝐶𝑇𝑎,𝑗≥(𝑝𝑡𝑎+𝑑𝑗,1)∙𝑋𝑎,𝑗 ∀ 𝑎∈𝐴,∀𝑗∈𝐽 | 𝑠𝑎=𝑡𝑗 (7) 𝐶𝑇𝑎,𝑗≤𝑑𝑗,2∙𝑋𝑎,𝑗 ∀ 𝑎∈𝐴,∀𝑗∈𝐽 | 𝑠𝑎=𝑡𝑗 (8) 𝑇𝑖≥𝐶𝑇𝑓𝑖𝑟𝑠𝑡𝑖,𝑗−𝑝𝑡𝑓𝑖𝑟𝑠𝑡𝑖−𝑟𝑡𝑒𝑝𝑐𝑜𝑓𝑖−𝑡𝑒𝑝𝑐𝑜𝑓𝑝𝑝𝑖 ∀ 𝑖∈𝐼,∀ 𝑗∈𝐽 | 𝑚𝑓𝑖𝑟𝑠𝑡𝑖=1,𝑡𝑗=𝑠𝑓𝑖𝑟𝑠𝑡𝑖 (9) 𝑋𝑎,𝑗 ∈{0,1} ∀ 𝑎∈𝐴,∀𝑗∈𝐽 (10) 𝐶𝑇𝑎,𝑗≥0 ∀ 𝑎∈𝐴,∀𝑗∈𝐽 (11) 𝛾𝑎,𝑎′,𝑗∈{0,1} ∀ 𝑎∈𝐴,∀ 𝑎′∈𝐴,∀𝑗∈𝐽 (12) 𝑇𝑖≥0 ∀ 𝑖∈𝐼 (13) 4.4.2 Modelo D Por último, se expone el modelo de programación lineal que aúna todas las variantes en un único modelo, atendiendo al método de programación que divide los recursos en P posiciones: 𝑀𝑖𝑛.∑𝑇𝑖 𝐼 𝑖=1 +∑∑𝐶𝑇𝑙𝑎𝑠𝑡𝑖,𝑗 𝐽 𝑗=1 𝐼 𝑖=1 𝑠.𝑎: ∑ ∑ 𝑋𝑎,𝑗,𝑝 𝑝∈𝑃𝑗 ∈𝐽 | 𝑠𝑎=𝑡𝑗,𝑏𝑚𝑎,𝑗=1,𝑘𝑐𝑣𝑎,𝑗=1 =𝑛𝑝𝑎𝑎,𝑚𝑎 ∀ 𝑎∈𝐴 (1) ∑ ∑𝑋𝑎,𝑗,𝑝 𝑝∈𝑃𝑗 ∈𝐽 | 𝑠𝑎=𝑡𝑗,𝑝𝑟𝑝𝑎𝑎,𝑗=0 =0 ∀ 𝑎∈𝐴 (2.1) ∑ ∑ 𝑋𝑎,𝑗,𝑝 𝑝∈𝑃𝑗 ∈𝐽 | 𝑠𝑎≠𝑡𝑗=0 ∀ 𝑎∈𝐴 (2.2) 𝐶𝑇𝑓𝑖𝑟𝑠𝑡𝑖,𝑗≥ (𝑟𝑖+𝑝𝑡𝑓𝑖𝑟𝑠𝑡𝑖)∙∑𝑋𝑓𝑖𝑟𝑠𝑡𝑖,𝑗,𝑝 𝑝∈𝑃 ∀ 𝑖∈𝐼,∀𝑗∈𝐽 | 𝑠𝑓𝑖𝑟𝑠𝑡𝑖=𝑡𝑗 (3)
Modelado del problema 30 𝐶𝑇𝑝𝑢𝑖,𝑎,𝑗≥ 𝐶𝑇𝑝𝑢𝑖,𝑎−1,𝑗′+𝑝𝑡𝑝𝑢𝑖,𝑎+𝑀∙(∑𝑋𝑝𝑢𝑖,𝑎,𝑗,𝑝 𝑝∈𝑃 +∑𝑋𝑝𝑢𝑖,𝑎−1,𝑗′,𝑝 𝑝∈𝑃 − 2) ∀ 𝑖 ∈𝐼,∀ 𝑎∈𝐴,∀ 𝑗∈𝐽,∀ 𝑗′∈𝐽 | 𝑝𝑢𝑖,𝑎≠0,𝑡𝑗=𝑠𝑝𝑢𝑖,𝑎 ,𝑡𝑗′=𝑠𝑝𝑢𝑖,𝑎−1 (4) ∑𝑋𝑎,𝑗,𝑝≤1 ∀ 𝑗∈𝐽,∀ 𝑝 ∈𝑃 𝑎∈𝐴 (5) 𝐶𝑇𝑎,𝑗≥𝐶𝑇𝑎′,𝑗+𝑝𝑡𝑎−𝑀∙(2−𝑋𝑎,𝑗,𝑝−∑𝑋𝑎′,𝑗,𝑝′) 𝑝′∈𝑃 ∀ 𝑎∈𝐴,∀ 𝑎′∈𝐴,∀ 𝑗∈𝐽,∀ 𝑝∈𝑃 | 𝑎≠𝑎′,𝑝>1 𝑡𝑗=𝑠𝑎,𝑡𝑗=𝑠𝑎′ (6) 𝐶𝑇𝑎,𝑗≥(𝑝𝑡𝑎+𝑑𝑗,1)∙∑𝑋𝑎,𝑗,𝑝 𝑝∈𝑃 ∀ 𝑎∈𝐴,∀𝑗∈𝐽 | 𝑠𝑎=𝑡𝑗 (7) 𝐶𝑇𝑎,𝑗≤𝑑𝑗,2∙∑𝑋𝑎,𝑗,𝑝 𝑝∈𝑃 ∀ 𝑎∈𝐴,∀𝑗∈𝐽 | 𝑠𝑎=𝑡𝑗 (8) 𝑇𝑖≥𝐶𝑇𝑓𝑖𝑟𝑠𝑡𝑖,𝑗−𝑝𝑡𝑓𝑖𝑟𝑠𝑡𝑖−𝑟𝑡𝑒𝑝𝑐𝑜𝑓𝑖−𝑡𝑒𝑝𝑐𝑜𝑓𝑝𝑝𝑖 ∀ 𝑖∈𝐼,∀ 𝑗∈𝐽 | 𝑚𝑓𝑖𝑟𝑠𝑡𝑖=1,𝑡𝑗=𝑠𝑓𝑖𝑟𝑠𝑡𝑖 (9) 𝑋𝑎,𝑗,𝑝 ∈{0,1} ∀ 𝑎∈𝐴,∀𝑗∈𝐽,∀ 𝑝∈𝑃 (10) 𝐶𝑇𝑎,𝑗≥0 ∀ 𝑎∈𝐴,∀𝑗∈𝐽 (11) 𝑇𝑖≥0 ∀ 𝑖∈𝐼 (12)
31 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario
Experimentación 32 5 EXPERIMENTACIÓN En este apartado, se muestran los resultados de los diferentes modelos de decisión propuestos en el TFG. Para ello, se considera el problema de gestión del SUH de un hospital clásico americano, cuyas características se muestran en el artículo [6]. El hospital donde se desarrolla dicho artículo cuenta con una serie de recursos que permanecerán fijos durante toda la experimentación, siendo variables otros parámetros como el número de pacientes, y los procesos de urgencia de dichos pacientes. En primer lugar, se citan las asunciones del marco en que se desarrolla la experimentación [6]: ✓ Ningún paciente abandona el SUH antes de recibir el alta. Es decir, todos los pacientes realizan su proceso de urgencias de principio a fin. ✓ Todos los equipos de procesamiento de pruebas y datos permanecen disponible y operativo las 24 horas del día y los 7 días de la semana. ✓ El índice de desempeño de todo el personal médico permanece constante durante todo el horizonte temporal de resolución del problema, así como la disponibilidad de dicho personal. ✓ El tiempo que tarda el personal del hospital en trasladarse de su ubicación al recurso donde tiene que atender a un paciente es muy pequeño y se considera despreciable. ✓ Todos los pacientes permanecen en el mismo grado de prioridad que el asignado en triaje durante todo su proceso de urgencias. Durante la experimentación, el objetivo es ver como responden los modelos ante distintos niveles de saturación del SUH. Para ello, se generarán 10 instancias para tres niveles disitntos de saturación, de modo que para el primero de los niveles el SUH esté muy poco saturado (25%); en el segundo se dará un nivel intermedio de saturación (50%); y por último un tercer nivel que implica una alta saturación del SUH (75%). 5.1 Datos de la experimentación La generación de instancias mencionadas es aleatoria, atendiendo únicamente a los distintos grados de saturación. Es decir, los pacientes y sus respectivos procesos de urgencias se generan aleatoriamente (datos dinámicos). No obstante, también hay datos estáticos que no cambiarán y que son independientes del nivel de saturación que se tenga en el SUH, como lo son aquellos datos que conciernen a los recursos y la tipología de los mismos. 5.1.1 Datos estáticos En [6] se presenta un calendario diario que muestra los recursos que se tienen disponibles por rangos horarios en lo que a médicos, médicos asistentes y enfermeros concierne. Como solo se expone el horario de dichos recursos, hacemos tres nuevas asunciones para abordar el problema: ✓ Se tiene un laboratorio para las pruebas de extracción de sangre siempre disponible. ✓ Se tiene una sala de radiodiagnóstico (rayos X) siempre disponible. ✓ Se tiene una sala para pruebas TAC (CT-Scan, Computed-Tomography Scan) siempre disponible. ✓ Para poder trabajar con la variante de tipología de pacientes, se va a incrementar el número de dichos tres recursos a dos unidades para poder diferenciar un tipo de pacientes de otro. No obstante, también se podría abordar la variante aumentando los tiempos de procesos de las actividades para considerar hipotéticos tiempos de set-up en desinfección de recursos y limpieza. El horario que se propone en el artículo es el siguiente:
33 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario Figura 5-1. Calendario de médicos, médicos asistentes y enfermeros [6] En la experimentación, al ejecutar el modelo nos situamos en un instante t=0 en el que ya existe un número de pacientes en el SUH, de forma que algunos pueden estar en mitad de su proceso de urgencia, otros ni haberlo empezado, y otros estar terminándolo. Para obtener un mayor número de soluciones en distintas situaciones y rangos, en la experimentación nos vamos a situar en dos horarios de los planteados en [6] , las 6:00 a.m. y las 12:00 p.m. Cabe destacar que durante dichos horarios los recursos disponibles son constantes, de modo que los recursos que se tienen por tipología en ambos horarios son los siguientes (unificando médicos y médicos asistentes): 6:00 a.m. Consulta Enfermería Laboratorio Sala rayos CT-Scan Número de recursos 1 6 1 1 1 Tabla 5-1. Número de recursos por tipología a las 6:00 a.m. [6] 12:00 a.m. Consulta Enfermería Laboratorio Sala rayos CT-Scan Número de recursos 4 8 1 1 1 Tabla 5-2. Número de recursos por tipología a las 12:00 a.m. [6] Para abordar la cuarta variante en la que se consideran distintos tipos de pacientes, el desglose de recursos queda de la siguiente forma: 12:00 a.m. Consulta Enfermería Laboratorio Sala rayos CT-Scan Número de recursos 4 8 2 2 2 Tabla 5-3. Número de recursos por tipología a las 12:00 a.m. para la variante de tipología de pacientes [6] Todos ellos hacen un total de 10, 15 y 18 recursos disponibles respectivamente en el horizonte temporal en que se desarrolla la experimentación. Cabe destacar que, en el instante inicial, puede ser que un recurso esté ocupado atendiendo a un paciente, por lo que no estaría disponible dicho instante inicial, sino una vez haya terminado de atender al paciente en curso. Asimismo, las actividades maestras presentes en la experimentación, así como el tipo de recurso que dicha actividad maestra necesita para ser desarrollada, se muestran en la siguiente tabla:
Experimentación 34 Actividad maestra Tipo de recurso 1ª Consulta Consulta 1ª Enfermería Enfermería Extracción de sangre Laboratorio Rayos X Sala rayos TAC CT-Scan Reevaluación Consulta 2ª Enfermería Enfermería Alta Consulta Tabla 5-4. Relación actividades maestras y tipología de recursos. [6] 5.1.2 Datos dinámicos Como se ha explicado anteriormente, se generarán instancias con datos de pacientes aleatorios según el nivel de saturación del SUH. De [6] se pueden extraer datos que hacen referencia al cálculo del indicador Length of Stay real de cada paciente atendiendo a la prioridad del mismo: Figura 5-2. Resultados del estudio realizado en el artículo [6] Lo que se busca es llegar a un nivel de saturación determinado dentro del periodo de tipo LOSmedio, es por ello tomando los datos de la segunda fila, se puede obtener un tiempo medio del parámetro LOS: 𝐿𝑂𝑆𝑚𝑒𝑑𝑖𝑜=3.15+3.14+2.86+1.49+1.31 5=2.39 ℎ𝑜𝑟𝑎𝑠=143.4 𝑚𝑖𝑛𝑢𝑡𝑜𝑠 Con este dato, la generación de pacientes aleatoria se detendrá cuando en cualquiera de los tipos de recursos de los que se dispone, se alcance el nivel de saturación establecido en el periodo de tipo LOSmedio. Por ejemplo, si se estima un nivel de saturación del 75%, cuando un tipo de recurso acumule 0.75 ∙ 143.4 = 107.55 minutos, la generación de pacientes se detendrá, y se obtiene una primera instancia. En [6], también se realiza un estudio de en qué porcentaje acude un paciente de una determinada prioridad a urgencias, dato con el que también se produce la asignación aleatoria con dicha probabilidad de prioridad a un paciente:
35 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario Para los procesos de urgencia de cada paciente, en [6] se propone una utilización de recursos para cada prioridad de paciente, las cuales se muestran en la siguiente ilustración: Figura 5-4. Utilización de recursos en el proceso de urgencia por tipología de paciente [6] Como se puede observar, los pacientes de prioridad 1 y 2, necesitan ser atendidos por dos enfermeros, lo que se modela en la variante de complejidad mencionada anteriormente. Asimismo, no se va a distinguir entre consulta de médico y consulta de médicos asistentes, sino que en a través de la variante de asignación de prioridades a recursos, se destinarán algunas consultas para los pacientes de prioridad 1,2 y 3 (médicos), y otras para los pacientes de prioridad 4 y 5 (médicos asistentes). Además, no siempre está asegurada la presencia del CT-Scan para ninguno de los pacientes, solo se da en los procesos de urgencia de pacientes de prioridad 1, 2 y 3 en según que porcentaje. Otro factor a tener en cuenta es que en la experimentación planteada se excluye el servicio EMT (Equipos de Emergencia Médica), dado que no se asocian a ninguna tipología de recurso concreto, sino que son equipos de médicos que actúan en situaciones de extrema urgencia, como recibir a pacientes que llegan críticos en ambulancia (que quizás ni entren en el SUH y vayan directamente a cuidados intensivos) o proporcionan servicio clínico directo a poblaciones afectadas por emergencias y desastres. [16] Los procesos de urgencia que se plantean se simplifican al excluir los casos en los que hace falta este servicio de urgencia, teniendo en cuenta que los pacientes más críticos deben recibir atención inmediata (TEPCOF nulo). Por otro lado, la experimentación también está apoyada en los datos que el artículo [6] proporciona del estudio de los tiempos de proceso de todas las actividades del proceso de urgencia de todos los pacientes según a prioridad. Estos tiempos presentan variabilidad, con lo que el artículo los plantea como una distribución triangular, y para la generación de instancias se utilizará un tiempo rándom dentro de dicha distribución. La tabla con los tiempos de proceso es la siguiente: Figura 5-3. Porcentajes de asistencia de pacientes al SUH según prioridad [6]
Experimentación 42 Duplicar el nivel de saturación ha supuesto duplicar también el número de pacientes que pueden ser atendidos en el SUH. En lo que a la tipología de soluciones encontradas se refiere, se recogen los datos en la Figura 5-12. Los resultados han empeorado. Los tres modelos realizados con el método de modelado G siguen obteniendo resultados óptimos casi en un 93% de los casos, mientras que el otro método no ha conseguido llegar a la solución (o demostrar la optimalidad de la solución encontrada) en ninguno de los casos propuestos. No obstante, respecto a la factibilidad de las soluciones encontradas, apenas hay cuatro casos en los que algún modelo no ha sido capaz de encontrar solución. Es decir que, en diez minutos, de todas las soluciones encontradas, un 93% de todas ellas son al menos factibles. Cabe reseñar que ese 7% pertenece a casos de modelos en los que se ha empleado el método de programación que divide la disponibilidad de los recursos en p posiciones. En la siguiente figura (5-13), se muestra el valor promedio de la función objetivo que cada modelo ha proporcionado: Es claro que los resultados obtenidos en los tres primeros modelos (primer método de programación) son considerablemente mejor que los otros. Este resultado era esperable visto el porcentaje de optimalidad del gráfico anterior. Atendiendo al tiempo de ejecución promedio de cada modelo para todos los problemas propuestos, se obtiene el gráfico que se muestra en la Figura 5-14.: Figura 5-.12 Tipología de soluciones para el caso de estudio 1 al 50% de saturación Figura 5-13. Valor medio de la F.O. para el caso de estudio 1 al 50% de saturación Figura 5-14. Tiempo medio de ejecución de los modelos para el caso de estudio 1 al 50% de saturación
43 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario Como los modelos correspondientes al método de modelado D no han obtenido ninguna solución óptima, en las diez instancias propuestas han consumido la totalidad del tiempo límite de ejecución (600s). Ahora los tiempos medios de ejecución se han incrementado considerablemente al tratarse de problemas más complejos. Sin embargo, para una mejor comparación, de nuevo se eliminan las instancias para las que los modelos no han podido encontrar solución, y se vuelve a calcular el valor promedio de la función objetivo en el resto de problemas (Figura 5-15). La diferencia, al igual que en el caso anterior, es bastante significativa, siendo el método G el que aporta mejores soluciones. No obstante, se debe contemplar en aquellos casos en los que la solución es factible, cuanto de cerca se ha quedado el modelo de la optimalidad, para lo que se representa el GAP promedio en la Figura 5-16. En el modelo básico, el método de modelado D queda bastante lejos de la solución óptima, de ahí la gran diferencia entre los valores obtenidos en la función objetivo para el primer método de programación y para éste segundo. No obstante, para las otras dos variantes, aunque no llega al óptimo, no está del todo lejos del mismo, con lo que para la configuración de recursos y el nivel de saturación propuestos, son modelos a tener en cuenta al aportar soluciones asumiblemente buenas dentro del tiempo límite. Por último, se muestra la comparativa de restricciones y variables (Tabla 5-11 y Figura 5-17) empleadas para cada modelo y cada método de programación utilizado, sirviendo la reflexión realizada en el apartado inmediatamente anterior. V1_G V2_G V3_G V1_P V2_P V3_P Número de variables 2350,7 2350,7 2350,7 2095 2095 2095 Número de restricciones 488 507,6 507,6 2647 2666,6 2666,6 Tabla 5-11. Número de variables y restricciones en el caso de estudio 1 con saturación del 50% Figura 5-15. F.O. para el caso de estudio 1 al 50% de saturación (soluciones óptimas y factibles) Figura 5-16. Valor promedio del GAP para el caso de estudio 1 con saturación del 50%
Experimentación 44 El número de variables y restricciones se ha duplicado y triplicado en algunos casos, lo que es normal pues al tener más actividades y pacientes, se tienen más variables y por ende más restricciones. Sin embargo, el cambio más brusco se ve en el número de restricciones del método de modelado D, que supera incluso al número de variables de método G. Como se ha comentado en el anterior apartado, esto se debe fundamentalmente a un mal ajuste del parámetro p, que podría reducirse considerablemente, eliminando variables y restricciones de estos modelos. 5.2.1.3 Nivel de saturación del 75% Para la misma configuración de recursos, se aumenta una última vez el nivel máximo de saturación del SUH, con lo que también lo hacen de nuevo el número de pacientes que el mismo puede abordar: | I | | A | | J | 6,4 25,8 10 Tabla 5-12 Pacientes, actividades y recursos del caso de estudio 1 con saturación del 75% En este caso, los resultados obtenidos en las diez instancias propuestas son de la siguiente clase: Obviamente, al aumentar el número de pacientes al que hay que atender al admitir mayor nivel de saturación, la complejidad del problema aumenta, con lo que encontrar una solución óptima en el tiempo establecido es cada vez más difícil. Es por ello que ahora para el método de modelado G solo se han encontrado un 43% de soluciones óptimas, frente al 93% anterior. No obstante, dichos modelos siguen encontrando siempre una solución al problema propuesto, aunque no se pueda demostrar la optimalidad de las mismas. Por otro lado, los resultados que conciernen al método de modelado de discretización del dominio de las variables de decisión han variado muy poco, aunque tampoco eran buenos resultados en el caso anterior frente al primero de los métodos, no consiguiendo ninguna solución óptima, aunque con un 80% de soluciones factibles de todas las encontradas. Figura 5-17. Comparativa del número de variables y restricciones del caso de estudio 1 con saturación del 50% Figura 5-18. Tipología de soluciones para el caso de estudio 1 al 75% de saturación
45 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario Respecto a los valores de la función objetivo y los tiempos de ejecución promedio, se han obtenido los siguientes resultados que se muestran en las Figuras 5-19 y 5-20. Como consecuencia del aumento del nivel máximo de saturación, ahora los valores de la función objetivo son mayores ya que son más pacientes los que hay que atender, y ante un problema más complejo, el tiempo de ejecución también se incrementa, siendo igual al tiempo límite de ejecución en la mayoría de los casos ya que solo un 21,6% de las soluciones encontradas son óptimas, el resto, al ser factibles o al no haberse encontrado solución, consumen todo el tiempo que se le permite para resolver el problema. Se muestra a continuación el gráfico que compara, para cada variante, ambos métodos de modelado, eliminando aquellas instancias para los que alguno de los modelos no haya podido encontrar solución, pues al no haber valor de la función objetivo, el GAP es infinito y no se puede comparar con nada: Figura 5-19. Valor medio de la F.O. para el caso de estudio 1 al 75% de saturación Figura 5-20. Tiempo medio de ejecución de los modelos para el caso de estudio 1 al 75% de saturación Figura 5-21. F.O. para el caso de estudio 1 al 75% de saturación (soluciones óptimas y factibles)
Experimentación 46 Figura 5-22. Valor promedio del GAP para el caso de estudio 1 con saturación del 75% Al tratarse de valores más complejos, la diferencia entre ambos métodos cada vez se hace más reseñable. Por un lado, las soluciones factibles encontradas por cada modelo, están ahora más lejos del óptimo que en los dos casos anteriores, donde para alguno de los modelos el GAP era nulo al conseguir encontrar el 100% de soluciones óptimas. Además, para el método de programación D, los resultados factibles cada vez están más lejos de los que encuentra el primer método de programación, y por ende más lejos de la optimalidad. La mayor diferencia entre ambos métodos está en el modelo básico, que como se ha comentado es un modelo abierto a infinitas soluciones, sin limitaciones demasiado restrictivas que reduzcan el campo de soluciones a menor rango, como en las otras variantes donde al exigir ciertas condiciones, en 10 minutos los modelos pueden conseguir llegar a una solución que aunque no óptima, se acerque al mismo de manera aceptable. Ya por último solo queda ver cuantas variables y restricciones se han tenido de media en los problemas resueltos para este caso, que se representan en la Tabla 5-13 y Figura 5-23. V1_G V2_G V3_G V1_P V2_P V3_P Número de variables 3794,4 3794,4 3794,4 3417 3417 3417 Número de restricciones 826 851,5 851,5 6524 6549,5 6549,5 Tabla 5-13. Número de variables y restricciones en el caso de estudio 1 con saturación del 25% De nuevo la diferencia es muy significativa. El primer método (G) siempre va a tener un número mayor de variables que el segundo al contar con la variable γ, aunque la diferencia no es excesivamente grande. Sin embargo, la diferencia en el número de restricciones es muy significativa, y es el factor clave de los malos resultados que otorga el segundo de los métodos de programación. Al tener tantas restricciones, hace que diez minutos no sea tiempo suficiente para poder llegar a una solución tan buena como la del primer método al tener ocho veces más restricciones que satisfacer que dicho método aún teniendo menos variables en el problema. Figura 5-23. Comparativa del número de variables y restricciones del caso de estudio 1 con saturación del 75%
47 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario 5.2.2 Caso de estudio 2: “12:00 p.m.” Al igual que para el primer caso, en este segundo escenario solo serán evaluados los modelos básicos con ambos métodos de modelado, así como las variantes de asignación de prioridades a recursos y de asignación de actividades maestras a recursos para ambos métodos también. Se recuerda a continuación los recursos que se tienen en dicho horario: 12:00 a.m. Consulta Enfermería Laboratorio Sala rayos CT-Scan Número de recursos 4 8 1 1 1 Tabla 5-14. Número de recursos por tipología del caso de estudio 2 [6] 5.2.2.1 Nivel de saturación del 25% Para un nivel de saturación bastante bajo del SUH y bajo la configuración de recursos indicada, se han generado otras diez instancias aleatorias, en las que se han obtenido un promedio de los siguientes pacientes y actividades de los mismos: | I | | A | | J | 7,3 32,4 15 Tabla 5-15. Pacientes, actividades y recursos a las 12:00 con saturación del 25% Es claro que al aumentar el número de recursos disponibles en 3 consultas y 2 enfermerías más, aumenta el número de pacientes que se generan antes de alcanzar el nivel de saturación propuesto, y con ello también lo hace el número de actividades que habrá en total dentro del SUH. En el siguiente gráfico se muestra como han respondido los modelos en lo que a la tipología de soluciones obtenidas se refiere para el total de diez instancias generadas: Al aumentar el número de recursos disponibles, los modelos no han podido encontrar ni siquiera una solución óptima. Es decir, que al aumentar el número de recursos, la complejidad del problema asciende hasta un nivel en que ninguno de los modelos es capaz de encontrar la solución óptima, o asegurar que la solución encontrada es óptima, en el tiempo límite de ejecución establecido. Asimismo, el número de soluciones no encontradas también asciende respecto a la cifra anterior del primer caso de estudio. No obstante, para un nivel de saturación del 25%, los modelos son capaces de dar una solución factible en la mayoría de los casos. El valor promedio de la función objetivo para cada modelo en las distintas instancias es el que se muestra en la Figura 5-25. Figura 5-24. Tipología de soluciones para el caso de estudio 2 al 25% de saturación
Experimentación 48 En promedio, teniendo en cuenta para cada modelo solo aquellas soluciones en las que el modelo ha encontrado solución, se ve claramente que el método de modelado G encuentra una solución mejor que el segundo de los métodos. No obstante, el tiempo de ejecución obtenido en todas las soluciones de todas las instancias y para todos los modelos es de 600 segundos, ya que en ninguno de los casos se ha llegado al óptimo. Para una mejor visualización de la comparación de métodos, se muestran en la Figura 5-26 los gráficos que enfrentan cada método para cada una de las variantes, teniendo en cuenta solo y únicamente aquellas instancias en las que ambos métodos de programación han obtenido alguna solución (eliminando aquellas en las que el modelo no ha encontrado solución en el tiempo límite): De nuevo se demuestra que las soluciones que obtiene el primer método de modelado son mucho mejores que las que obtiene el método D planteado para un mismo tiempo de ejecución 10 minutos. Asimismo, los valores de la función objetivo han aumentado su valor respecto al primer caso de estudio, lo que es normal al tener que ubicar a un mayor número de pacientes con más actividades dentro del SUH. Se analiza ahora el GAP para todas las soluciones factibles en el siguiente gráfico: Figura 5-25. Valor medio de la F.O. para el caso de estudio 2 al 25% de saturación Figura 5-26. F.O. para el caso de estudio 2 al 25% de saturación (soluciones óptimas y factibles)
49 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario Figura 5-28. Valor promedio del GAP para el caso de estudio 2 con saturación del 25% Al igual que se ha analizado con el valor de la función objetivo, para un mejor análisis se muestra la comparativa del valor promedio del GAP para cada variante en función de los métodos de programación utilizados teniendo en cuenta solo aquellas instancias para las que ambos métodos han encontrado una solución factible: El resultado obtenido del parámetro GAP es razonable dado que como los valores de la función objetivo obtenidos para el método G eran menores que las obtenidos en el método D, quiere decir que el primero de los métodos se queda más cerca de la solución óptima del problema planteado, con lo que el GAP será menor, tal y como se muestra en las gráficas. Dicha diferencia se incrementa significativamente al implementar las variantes, que dejan una solución no tan abierta como la del modelo básico, al exigir restricciones en las que los pacientes solo pueden ir a según que recursos. Al no tener tantos casos que contemplar en 10 minutos de tiempo de ejecución, se llega a una mejor solución (menor valor de la función objetivo) en el mismo tiempo, lo que también ocurre al implementar el segundo método de modelado pero en menor medida. Por último, también se puede comparar el número de variables y de restricciones que se han obtenido de media para ambos métodos de programación, que se muestran en la Tabla 5-16 y Figura 5-29. V1_G V2_G V3_G V1_P V2_P V3_P Número de variables 8758 8758 8758 7930 7930 7930 Número de restricciones 2562 2594 2594 24763 24795 24795 Tabla 5-16. Número de variables y restricciones en el caso de estudio 2 con saturación del 25% Figura 5-27. Valor promedio del GAP para el caso de estudio 2 con saturación del 25%
Experimentación 50 Figura 5-29. Comparativa del número de variables y restricciones del caso de estudio 2 con saturación del 25% De nuevo se visualiza que, aunque para el método de modelado G el número de variables que componen el modelo es ligeramente mayor, la gran diferencia que existe en el número de restricciones que hay en cada modelo hace que, en términos generales, el método de programación que emplea la variable γ sea mejor aún teniendo más variables que resolver. Esto también se ve reflejado en que para el método D, el valor obtenido en la función objetivo siempre es peor, ya que para el tiempo de ejecución establecido no es capaz de llegar a la misma solución que el primero de los métodos. 5.2.2.2 Nivel de saturación del 50% Continuando con la misma distribución de recursos, se aumenta ahora el nivel de saturación al doble, lo que supone problemas más complejos con mayor número de pacientes a los que asignar recursos dentro de su proceso de urgencias: | I | | A | | J | 13,1 58,9 15 Tabla 5-17. Pacientes, actividades y recursos del caso de estudio 2 con saturación del 50% Los resultados obtenidos en lo referente a la tipología de soluciones se presentan en el siguiente diagrama: Como se puede observar, no se ha obtenido ni una solución óptima. Si se vuelve la mirada atrás al caso de estudio 1 para este mismo nivel de saturación, es fácil comprobar como los resultados han empeorado considerablemente. No obstante, para el primero de los métodos de modelado, el resultado obtenido sigue siendo bueno, con un 97% de las soluciones obtenidas factibles, es decir, que dentro del horizonte de programación los modelos han conseguido encontrar al menos una solución factible para el problema. Sin embargo, para el método D, los resultados son peores, con un 56% de soluciones no encontradas. Para estas nuevas diez instancias, el valor promedio de la función objetivo obtenido para los distintos modelos, Figura 5-30. Tipología de soluciones para el caso de estudio 2 al 50% de saturación
51 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario aunque haya un elevado número de soluciones no encontradas, es: Un apunte importante es el hecho de que todos los tiempos de ejecución han sido igual al tiempo límite establecido en 600 segundos, ya que en ninguno de los casos ninguno de los modelos ha encontrado una solución óptima. La diferencia entre unos modelos y otros se ha disparado, especialmente en las variantes V2_P y V3_P, debido a que en algún caso, estos modelos han encontrado una solución factible, pero en la que los pacientes salen del SUH en un instante excesivamente tardío, haciendo que el valor del parámetro LOS de la función objetivo también se dispare. No obstante, en la Figura 5-32 se comparan los valores de la función objetivo solo en aquellas instancias en las que ambos modelos han encontrado solución factible: La diferencia se hace aún más grande si cabe. Esto hace esperar que, si se atiende al valor del parámetro GAP obtenido, el método de modelado D tenga un valor del mismo bastante alto y cercano a la unidad en las soluciones factibles encontradas, mientras que ocurrirá lo contrario para el método G. En la Figura 5-33, se representa el valor medio obtenido del parámetro GAP para todos los modelos. Figura 5-31. Valor medio de la F.O. para el caso de estudio 2 al 50% de saturación Figura 5-33. Valor promedio del GAP para el caso de estudio 2 con saturación del 50% Figura 5-32. F.O. para el caso de estudio 2 al 50% de saturación (soluciones óptimas y factibles)
Experimentación 58 | I | | A | | J | 16,8 71,7 18 Tabla 5-23. Pacientes, actividades y recursos para el caso de estudio 3 al 50% de saturación Así pues, el problema pasa a tener el doble de pacientes y de actividades, con lo que la complejidad del problema en cuestión también aumenta. En lo que a la tipología de soluciones obtenidas se refiere, se representa en la Figura 5-45. Los resultados han empeorado considerablemente, pasando del pleno en soluciones óptimas y factibles en el caso anterior, a solo un 45% de soluciones encontradas. Es decir, que 22 de las 40 soluciones son de tipo no encontrada. No obstante, la variante de distribución por tipología de pacientes sigue dando los mejores resultados, encontrando una solución al problema planteado en todos los casos, aunque sin demostrar la optimalidad de las mismas. En cuanto al valor de la función objetivo y al GAP obtenido, en las Figuras 5-46 y 5-47 se muestra el valor medio que cada modelo ha proporcionado. Figura 5-45. Tipología de soluciones para el caso de estudio 3 al 50% de saturación Figura 5-46. Valor medio de la F.O. para el caso de estudio 3 al 50% de saturación Figura 5-47. Valor promedio del GAP para el caso de estudio 3 con saturación del 50%
59 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario Por los mismos motivos que los explicados en el punto inmediatamente anterior, el modelo básico lejos queda de una solución óptima, al tener un valor medio de la función objetivo que duplica al que encuentran los otros modelos y un valor medio del GAP cercano a la unidad. Asimismo, la última de las variantes es capaz de encontrar el mejor valor de la función objetivo para los problemas, aunque en este caso con un valor más alto del GAP, con lo que al aumentar la saturación, las soluciones encontradas son peores y quedan más lejos de la solución óptima. Por otro lado, de los diez problemas planteados, solo hay uno para el que los cuatro modelos han encontrado solución, y otro de los problemas en el que tres de los cuatro modelos han también llegado a la factibilidad. Se muestran los resultados de esos problemas: V1_G V2_G V3_G V4_G Instancia 1 Valor F.O. 2393 1648 1648 1180 GAP 0,9412 0,8477 0,8477 0,299 Instancia 10 Valor F.O. None 1692 1692 1436 GAP inf 0,7874 0,7875 0,467 Tabla 5-24. Resultados instancias 1 y 10 en el caso de estudio 3 con nivel de saturación del 50% Realizando la comparativa con solo aquellos problemas en las que la mayoría de modelos han encontrado solución se ve más claro aún que el cuarto modelo consigue llegar a una solución bastante mejor que los otros tres, y por tanto más cerca del óptimo. Por último, la Figura 5-48 muestra el número de variables y restricciones obtenidas en este caso. 5.2.4.3 Nivel de saturación del 75% Por ultimo, el nivel de saturación asciende hasta el 75%, de modo que los recursos tienen capacidad para asistir a una media de pacientes tal que: | I | | A | | J | 24,5 103,9 18 Tabla 5-25. Pacientes, actividades y recursos para el caso de estudio 3 al 75% de saturación Este caso es el más complejo, al ser el caso en que mayor media de pacientes y actividades deben ser Figura 5-48. Número de variables y restricciones en el caso de estudio 3 con saturación del 50%
Experimentación 60 atendidos. Así pues, cabe esperar que en lo que a tipología de soluciones encontradas se refiere, también se haya empeorado debido al alto nivel de complejidad que suponen estos problemas (Figura 5-49). Para esta configuración de recursos y el nivel de saturación establecido, los tres primeros modelos no son capaces de encontrar una solución dentro del tiempo límite de computación establecido. El cuarto modelo si llega a soluciones factibles la mayoría de veces, pero hay que analizar si dichas soluciones son buenas o si por el contrario quedan excesivamente lejos del óptimo. Para ello, en la siguiente tabla se muestran el valor medio de la función objetivo y del parámetro GAP para el cuarto de los modelos de programación lineal: V4_G Valor medio de la F.O. 2745 GAP 0,637 Tabla 5-26. Valor de la F.O. y GAP del modelo 4 para el caso de estudio 3 al 75% de saturación El valor del parámetro GAP asciende respecto al caso anterior, lo que quiere decir que al aumentar la saturación, las soluciones factibles que dicho modelo encuentran se van alejando cada vez más del óptimo que se busca alcanzar. En la siguiente tabla, se muestran los resultados del único problema en el que los cuatro modelos han sido capaces de al menos encontrar una solución factible, para ver el contraste entre las soluciones que cada uno de ellos ofrece: V1_G V2_G V3_G V4_G Instancia 3 Valor F.O. 7949 6325 6325 3145 GAP 0,971 0,9498 0,9498 0,687 Tabla 5-27. Resultados instancia 3 en el caso de estudio 3 con nivel de saturación del 75% Es claro que para este problema, el cuarto modelo llega a una solución mucho mejor que los otros tres, siendo la solución del modelo básico una solución factible pero que muy lejos queda de ser una solución buena para Figura 5-49. Tipología de soluciones para el caso de estudio 3 al 75% de saturación Figura 5-50. Número de variables y restricciones en el caso de estudio 3 con saturación del 75%
61 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario la organización del SUH. Para finalizar, la Figura 5-50 muestra el número de variables y restricciones promedio obtenidos en estos problemas. 5.2.5 Términos de la función objetivo A lo largo de toda la experimentación, se han resuelto un total de 90 instancias, de las cuales 60 de ellas han sido resueltas para seis de los modelos de programación lineal creados (modelo básico y variantes 1 y 2 de ambos métodos de programación), y las otras 30 han sido resueltas para cuatro de estos modelos (el modelo básico y las tres variantes utilizando el método de modelado G para la secuenciación del proceso de urgencias). Del total de todas las soluciones obtenidas, la tipología de todas ellas se resume en la Figura 5-51. Es decir, que 355 de las 480 soluciones son factibles u óptimas en las que hay un valor de la función objetivo, sin importar lo lejos que estén dichos valores de la optimalidad (74% de las soluciones). Se recuerda cual era la función objetivo del problema planteado: 𝑀𝑖𝑛.∑𝑇𝑖 𝐼 𝑖=1 +∑∑𝐶𝑇𝑙𝑎𝑠𝑡𝑖,𝑗 𝐽 𝑗=1 𝐼 𝑖=1 El primero de los términos hace referencia al cumplimiento del TEPCOF, mientras que el segundo de ellos concierne al LOS de cada paciente. Es claro que el LOS nunca podrá tomar valor nulo ya que el instante en que el paciente abandone el SUH siempre será un valor mayor que la nulidad. Sin embargo, minimizar el primer término de la función objetivo conlleva hacer que el mayor número de pacientes posibles cumplan el TEPCOF, de modo que, en una situación ideal, si todos los pacientes que hay en el SUH han cumplido con su TEPCOF, el valor de la variable Ti si tomará valor nulo. Que el término de la función objetivo de la variable Ti tome valor mayor que cero, implica que al menos un paciente dentro del SUH no ha cumplido con su TEPCOF. Dicho término (Ti) tomará valores más grandes en dos casos: si el único paciente que no ha cumplido el TEPCOF lo ha hecho con mucha diferencia (por ejemplo, un paciente de prioridad 2 que tiene que ser atendido en 15 minutos y no ha sido atendido hasta el minuto 60); o bien si son varios los pacientes que no han sido atendidos dentro de su TEPCOF, haciendo que haya varias variables Ti con valor distinto a la nulidad. Pues bien, del total de las 355 soluciones factibles, los resultados obtenidos de la variable Ti se muestran en la siguiente tabla: ∑𝑻𝒊 𝑰𝒊=𝟏 = 0 329 veces 0 < ∑𝑻𝒊 𝑰𝒊=𝟏 < 50 17 veces ∑𝑻𝒊 𝑰𝒊=𝟏 > 50 9 veces Tabla 5-28. Estadísticas del término TEPCOF en la función objetivo En resumen, en un 93% de los casos en que se ha encontrado solución, todos los pacientes han cumplido con Figura 5-51. Tipología de soluciones de toda la experimentación
Experimentación 62 su TEPCOF, con lo que el valor de la función objetivo se limita al valor del sumatorio del LOS de todos los pacientes. Solo en un 2,5% de los casos, el valor que dicho término de la función objetivo se ha disparado por encima del valor de 50, lo que quiere decir que o bien más de un paciente a incumplido el TEPCOF, o hay alguno de los pacientes que ha sido atendido excesivamente tarde. Esto es normal debido a que ha habido modelos que puntualmente han ofrecido una solución que, aunque factible, era bastante mala con un GAP cercano a la unidad. En definitiva, el valor de la función objetivo ha tomado el valor del sumatorio del LOS de todos los pacientes del problema en un 93% de los casos, mientras que el primer término que envuelve el cumplimiento del TEPCOF de los pacientes solo ha afectado en el 7% de las soluciones restantes. Este resultado implica que los modelos asignan bien los pacientes que inicialmente tienen que pasar por 1º Consulta por orden de prioridad, ya que casi siempre lo hacen dentro del tiempo establecido, sin embargo, tratar de minimizar la duración de cada paciente dentro del SUH se vuelve una tarea compleja, con una dificultad que asciende bruscamente al aumentar el número de recursos o el nivel de saturación del SUH.
63 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario 6 CONCLUSIONES En el presente TFG se han desarrollado modelos de programación lineal utilizando el programa Python con el fin de abordar el problema de la gestión del flujo de pacientes dentro del SUH. Actualmente hay numerosas líneas de investigación que abordan esta temática debido al hecho de que la saturación de los SUH es una realidad que atañe a toda la población, que ha vivido un momento extremo de colapso hace escasos años y a que es un problema al que no se le consigue poner solución. Este proyecto ha sido enfocado en la creación de modelos de programación lineal como alternativa para tratar de resolver problemas reales de un SUH. Así pues, no solo se han generado un modelo básico con tres variantes aplicables en el ámbito real del SUH, sino que también se han analizado como responden esos modelos programados con dos formas de modelar distintas, con el fin de comprobar cual de estas dos formas de modelar muy comunes en la literatura es más eficiente. Así pues, se desarrollaron los cuatro modelos para ambos métodos, utilizando una instancia pequeña y un código que permite pintar la solución obtenida en un diagrama de Gantt, de forma que se viera visualmente que las restricciones se cumplían y que el modelo respondía debidamente. Es claro que al tomar la misma instancia en ambos métodos de modelado, los resultados tenían que ser los mismos para la misma variante. Pues bien, ya solo con esta instancia de prueba nos dimos cuenta de que el segundo método, aunque alcanzaba el óptimo, lo hacía en mucho más tiempo que el primero de los métodos, aún cogiendo el valor de p óptimo. No obstante, quedaba iniciar la experimentación para poder desacreditar el segundo de los métodos. Tal y como se ha explicado, hallar el valor de p óptimo para estos problemas es una tarea compleja que no concierne a este TFG, con lo que se decidió determinar un valor de p admisible y comenzar con la experimentación. Tras los dos primeros casos de estudio, era más que evidente que el segundo método se quedaba atrás con respecto al primero, por lo que se decidió descarta el mismo para el tercer caso de estudio. Se puede decir que los modelos creados responden correctamente para hospitales pequeños, cuya configuración de recursos no sea grande y que no tenga que atender diariamente a demasiados pacientes. De hecho, en el primer caso de estudio y para niveles de saturación del 25% y 50%, los resultados son en general bastante buenos, con un alto porcentaje de optimalidad y un GAP aceptable para las soluciones factibles. De hecho, para las tres configuraciones de recursos propuestas, si se establece un nivel de saturación del 25%, es decir, si son pocos los pacientes que tienen que ser atendidos, los modelos responden muy bien al problema. Sin embargo, cuando se aumenta la saturación a niveles más altos con demasiados recursos, los modelos empiezan a no encontrar solución al problema, o las soluciones que encuentran están demasiado lejos de la óptima. En resumen, para una distribución de recursos pequeña e independientemente del nivel de saturación establecido, o bien para una distribución más grande pero con niveles de saturación bajos (pocos pacientes), los modelos que en este TFG se proponen aportan una solución factible buena en un tiempo razonable. No obstante, si la distribución de recursos es grande y hay muchos pacientes que atender, la complejidad del problema aumenta hasta el punto en que los modelos ya no responden de igual forma, dejando problemas sin solución dentro del tiempo establecido o encontrando soluciones que implican un alto incumplimiento del TEPCOF y largas estancias de los pacientes dentro del SUH. 6.1 Líneas de trabajo futuras Hay hospitales en los que en vez de que los recursos estén en una posición fija y los pacientes se muevan, los pacientes son asignados a un box fijo, y son los recursos los que se desplazan para atender a los pacientes. Esta podría ser una línea de trabajo futura, de modo que los modelos matemáticos de programación lineal diseñados y desarrollados podrían ser adaptados de forma que se consideren otros parámetros como el tiempo de desplazamiento de los recursos de un paciente a otro, entre otros. Asimismo, se ha visto que los modelos no responden lo bien que se desea para una saturación del 75%. Peor respuesta dará si cabe para una saturación del 100%, o más aún para el 125% (sobresaturación), cabe esperar
Conclusiones 64 que en 10 minutos no encuentren ni siquiera una solución. Para estos casos y a modo de línea de investigación futura, habría que considerar otras metodologías de resolución del campo de algoritmos avanzados de optimización como metaheurísticas.
65 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario REFERENCIAS [1] N. S. y. C. Gutiérrez, «SEMES,» 2023. [En línea]. Available: https://www.semes.org/los-urgenciologos- alertan-los-servicios-de-urgencias-de-todo-el-pais-estan-saturados-con-un-incremento-de-la-carga- asistencial-que-llega-al-40-en-algunas-comunidades/. [2] M. d. S. y. P. Social, Unidad de Ugrencia Hospitalaria: Estándares y recomendaciones, 2010. [3] F. J. &. B.-P. G. Martín-Sánchez, Los servicios de urgencias hospitalarios en España: realidad y desafíos, 2018. [4] M. d. sanidad, Informe Anual del Sistema Nacional de Salud, 2020-2021. [5] M. B. Orduna, «Saturación en los Servicios de Urgencias hospitalarios: análisis causal y búsqueda de soluciones,» 2015-2016. [6] L. B.-V. y. E. Kirac, «Evaluating alternative resource allocation in an emergency department using discrete event simulation,» 2016. [7] C. Teresa Morales y F. J. Garcia Berrocal, Hôtel-Dieu de París; orígenes y aparición de las primeras enfermeras religiosas de la historia, 2013. [8] A. P. Álvarez-Arenas, Los hospitales de Franco, 2003. [9] J.-H. L. y. Y.-H. T. Kuan-Chia Lin, Emergency Department Overcrowding: A Global Perspective, Revista Academia Emergency Medicine, 2001. [10]]]] R. F. M. M. &. F. R. Colom, Planificación, gestión y dirección de los servicios de urgencias y emergencias sanitarias, Elsevier España. [11]]]] E. S. D. M. C. y. G. M. P. Navarro, Gestión clínica y calidad asistencial en los servicios de urgencias hospitalarios, Index de Enfermería, 2013. [12] A. C.-B. M. y. N.-V. J. R. Zapata-López, Planificación y organización de los servicios de urgencias hospitalarios: guía práctica, 2017. [13] ]]]] M. y. L.-F. L. A. Córdoba, Organización y gestión de los servicios de urgencias hospitalarios, Revista de la Sociedad Española de Enfermería de Urgencias y Emergencias, 2013. [14] D. G. Medina, Algoritmos de Optimización para el servicio de urgencias: Caso de estudio en el hospital Virgen del Rocío, Sevilla, 2021. [15] S. A. d. Salud, Plan de Mejora de los Servicios de Urgencias de Hospital del Sistema Sanitario Público de Andalucía, 2019. [16] O. P. d. l. Salud, «Organización Panamericana de la Salud,» [En línea]. Available: https://www.paho.org/es/emergencias-salud/equipos-medicos-
Anexos 66 emergencia#:~:text=Los%20Equipos%20M%C3%A9dicos%20de%20Emergencia%20(EMT%20por%20s us%20siglas%20en,los%20sistemas%20locales%20de%20salud.. [17] I. VIANA, «ABC Historia,» 19 04 2020. [En línea]. Available: https://www.abc.es/historia/abcifuncionaba-edad-media-hospital-mas-antiguo-mundo-curando-desde-hace-1400-anos- 202004170103_noticia.html. [18] J. Erich, «EMSWORLD,» 30 01 2020. [En línea]. Available: https://www.hmpgloballearningnetwork.com/site/emsworld/article/1223826/el-salon-de-la-fama-clawson- cowley. [19] J. E. Tintinalli, Emergency Medicine: A Comprehensive Study Guide, McGraw-Hill Education, 2016. [20] A. P.-S. Á. R.-P. J. D. N.-H. F. y. Ú.-B. I. Martínez-Rubio, Gestión de los servicios de urgencias hospitalarios: modelo y organización, 2018. [21] J. N. J. A. M. A. G. M. B. M. C. Molina-Pariente, Soporte a la toma de decisiones en la gestión de pacientes COVID en un servicio de urgencia hospitalaria. En B. Puebla-Martínez (Ed.). Ecosistema de una pandemia. COVID-19, la transformación mundial (pp. 27-51), Dykinson, S.L., 2021. [22] O. P. d. l. Salud, «Organización Panamericana de la Salud,» [En línea]. Available: https://www.paho.org/es/emergencias-salud/equipos-medicos- emergencia#:~:text=Los%20Equipos%20M%C3%A9dicos%20de%20Emergencia%20(EMT%20por%20s us%20siglas%20en,los%20sistemas%20locales%20de%20salud.. ANEXOS
67 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario modelos.py import random import numpy as np import mip from mip import * from gantt import * import time #Modelo básico con modelaje gamma def modelo1_gamma(I,pu,pp,first,last,r,A,pt,s,m,am,maxA,J,t,d,M,tepcof,r_tepcof): ini=time.time() Modelo=Model("Modelo1_gamma",sense=MINIMIZE,solver_name=CBC) X_aj=[[Modelo.add_var(name="X_"+str(a+1)+str(j+1), var_type=BINARY) for j in range(J)]for a in range(A)] GAMMA_aa1j=[[[Modelo.add_var(name="Gamma_"+str(a+1)+str(a1+1)+str(j+1), var_type=BINARY) for j in range(J) if a1>a]for a1 in range(A)] for a in range (A)] CT_aj=[[Modelo.add_var(name="CT_"+str(a+1)+str(j+1), var_type=INTEGER, lb=0, ub=INF) for j in range(J)]for a in range(A)] T_i=[Modelo.add_var(name="T_"+str(i+1), var_type=INTEGER, lb=0, ub=INF) for i in range (I)] #Restriccion 1 for a in range(A): Modelo+=(xsum(X_aj[a][j]for j in range(J) if s[a]==t[j])==1), "R1_"+str(a+1) #Restriccion 2 for a in range(A): Modelo+=(xsum(X_aj[a][j]for j in range (J) if s[a]!=t[j])==0),"R2_"+str(a+1) #Restriccion 3: for i in range(I): for j in range (J): if s[first[i]-1]==t[j]: Modelo += CT_aj[first[i]-1][j]>=(r[i]+pt[first[i]- 1])*X_aj[first[i]-1][j], "R3_"+str(i+1)+str(j+1) #Restriccion 4: para un paciente i, que la actividad a no empiece hasta que la a-1 no haya temrinado for i in range (I): for a in range(1,maxA): if (pu[i][a]!=0): #JM for j in range(J): for j1 in range(J): if(t[j]==s[pu[i][a]-1] and t[j1]==s[pu[i][a-1]-1]): Modelo += CT_aj[pu[i][a]-1][j]>=CT_aj[pu[i][a-1]- 1][j1]+pt[pu[i][a]-1]+M*(X_aj[pu[i][a]-1][j]+X_aj[pu[i][a-1]-1][j1]-2), "R4_"+str(i+1)+str(a+1) #Restriccion 5: actividades en un mismo recurso no se solapen for a in range(A): for a1 in range(A): if a<a1: for j in range (J):
Anexos 74 for j in range(J): for j1 in range(J): if(t[j]==s[pu[i][a]-1] and t[j1]==s[pu[i][a-1]-1]): Modelo += CT_aj[pu[i][a]-1][j]>=CT_aj[pu[i][a-1]- 1][j1]+pt[pu[i][a]-1]+M*(xsum(X_ajp[pu[i][a]-1][j][p]for p in range (P))+xsum(X_ajp[pu[i][a-1]-1][j1][p] for p in range (P))-2), "R4_"+str(i+1)+str(a+1) #Restricción 5: en un recurso una posicion solo puede estar asignada a una actividad for j in range(J): for p in range (P): Modelo+= (xsum(X_ajp[a][j][p] for a in range (A))<=1),"R5_"+str(j+1) #Restriccion 6: actividades en un mismo recurso no se solapen for a in range(A): for a1 in range(A): if a!=a1: for j in range (J): for p in range (1,P): if(t[j]==s[a1] and t[j]==s[a]): Modelo+=CT_aj[a][j]>=CT_aj[a1][j]+pt[a]-M*(2- X_ajp[a][j][p]-xsum(X_ajp[a1][j][p1] for p1 in range (p))),"R6_"+str(j+1) #Restricción 7: disponibilidad de los recursos (comienzo) for a in range (A): for j in range (J): if s[a]==t[j]: Modelo += CT_aj[a][j]>=(pt[a]+d[j][0])*(xsum(X_ajp[a][j][p]for p in range (P))), "R7_"+str(a+1)+str(j+1) #Restricción 8: disponibilidad de los recursos (final) for a in range(A): for j in range(J): if s[a]==t[j]: Modelo += CT_aj[a][j]<=d[j][1]*(xsum(X_ajp[a][j][p] for p in range (P))), "R8_"+str(a+1)+str(j+1) #Restricción 9: variable auxiliar para minimizar los pacientes que NO cumplen TEPCO for i in range (I): if (m[first[i]-1]==1): for j in range (J): if(t[j]==s[first[i]-1]): Modelo += T_i[i]>=CT_aj[first[i]-1][j]-pt[first[i]-1]- r_tepcof[i]-tepcof[pp[i]-1], "R9_"+str(i+1)+str(j+1) Modelo.objective = (xsum(T_i[i] for i in range (I))+xsum(xsum(CT_aj[last[i]-1][j] for j in range (J)) for i in range(I))) Modelo.write("Modelo1_posiciones.lp") Modelo.optimize(max_seconds=600)
75 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario print("El valor de la funcion objetivo es: " +str(Modelo.objective_value)) print("El status de la solucion es: " + str(Modelo.status)) """print("Los procesos planificados son: ") for j in range (J): for p in range (P): for a in range (A): if (X_ajp[a][j][p].x>0): print("La actividdad "+str(a+1)+" se desarrolla en el recurso "+str(j+1)+"en la poscion "+str(p+1)+" y termina en ",CT_aj[a][j].x) """ fin=time.time() if(Modelo.status==OptimizationStatus.FEASIBLE or Modelo.status==OptimizationStatus.OPTIMAL): tepcof_fo=xsum(T_i[i].x for i in range (I)) LOS_fo=xsum(xsum(CT_aj[last[i]-1][j].x for j in range (J)) for i in range(I)) else: tepcof_fo=0 LOS_fo=0 return(Modelo.objective_value,Modelo.status,finini,Modelo.gap,600,Modelo.num_cols,Modelo.num_rows,I,A,J,tepcof_fo,LOS_fo) #Modelo prioridades y rec-act con modelaje gamma def modelo3_gamma(I,pu,pp,first,last,r,A,pt,pa,s,m, am,maxA,J,t,d,pr,b,n,M,tepcof,r_tepcof): ini=time.time() Modelo=Model("Modelo2_gamma",sense=MINIMIZE,solver_name=CBC) X_aj=[[Modelo.add_var(name="X_"+str(a+1)+str(j+1), var_type=BINARY) for j in range(J)]for a in range(A)] GAMMA_aa1j=[[[Modelo.add_var(name="Gamma_"+str(a+1)+str(a1+1)+str(j+1), var_type=BINARY) for j in range(J) if a1>a]for a1 in range(A)] for a in range (A)] CT_aj=[[Modelo.add_var(name="CT_"+str(a+1)+str(j+1), var_type=INTEGER, lb=0, ub=INF) for j in range(J)]for a in range(A)] T_i=[Modelo.add_var(name="T_"+str(i+1), var_type=INTEGER, lb=0, ub=INF) for i in range (I)] #Restriccion 1 for a in range(A): Modelo+=(xsum(X_aj[a][j]for j in range(J) if s[a]==t[j] and b[m[a]-1][j]==1)==n[pa[a]-1][m[a]-1]), "R1_"+str(a+1) #Restricción 2.1 for a in range(A): Modelo+=(xsum(X_aj[a][j]for j in range(J) if (s[a]==t[j] and pr[pa[a]-1][j]==0))==0),"R2_1_"+str(a+1) #Restriccion 2.2 for a in range(A): Modelo+=(xsum(X_aj[a][j]for j in range (J) if s[a]!=t[j])==0),"R2_2_"+str(a+1) #Restriccion 3:
Anexos 76 for i in range(I): for j in range (J): if s[first[i]-1]==t[j]: Modelo += CT_aj[first[i]-1][j]>=(r[i]+pt[first[i]- 1])*X_aj[first[i]-1][j], "R3_"+str(i+1)+str(j+1) #Restriccion 4: para un paciente i, que la actividad a no empiece hasta que la a-1 no haya temrinado for i in range (I): for a in range(1,maxA): if (pu[i][a]!=0): #JM for j in range(J): for j1 in range(J): if(t[j]==s[pu[i][a]-1] and t[j1]==s[pu[i][a-1]-1]): Modelo += CT_aj[pu[i][a]-1][j]>=CT_aj[pu[i][a-1]- 1][j1]+pt[pu[i][a]-1]+M*(X_aj[pu[i][a]-1][j]+X_aj[pu[i][a-1]-1][j1]-2), "R4_"+str(i+1)+str(a+1) #Restriccion 5: actividades en un mismo recurso no se solapen for a in range(A): for a1 in range(A): if a<a1: for j in range (J): if(t[j]==s[a1] and t[j]==s[a]): Modelo+=CT_aj[a1][j]+M*(2-X_aj[a][j]- X_aj[a1][j])>=CT_aj[a][j]+pt[a1]-M*(1-GAMMA_aa1j[a][a1][j]),"R5_"+str(j+1) #Restriccion 6: actividades en un mismo recurso no se solapen for a in range(A): #(1,P) for a1 in range(A): if a<a1: #a != a1 for j in range (J): if(t[j]==s[a1] and t[j]==s[a]): Modelo+=CT_aj[a][j]+M*(2-X_aj[a][j]- X_aj[a1][j])>=CT_aj[a1][j]+pt[a]-M*(GAMMA_aa1j[a][a1][j]),"R6_"+str(j+1) #Restricción 7: disponibilidad de los recursos (comienzo) for a in range (A): for j in range (J): if s[a]==t[j]: Modelo += CT_aj[a][j]>=(pt[a]+d[j][0])*X_aj[a][j], "R7_"+str(a+1)+str(j+1) #Restricción 8: disponibilidad de los recursos (final) for a in range(A): for j in range(J): if s[a]==t[j]: Modelo += CT_aj[a][j]<=d[j][1]*X_aj[a][j], "R8_"+str(a+1)+str(j+1) #Restricción 9: variable auxiliar para minimizar los pacientes que NO cumplen TEPCO for i in range (I): if (m[first[i]-1]==1): for j in range (J): if(t[j]==s[first[i]-1]): Modelo += T_i[i]>=CT_aj[first[i]-1][j]-pt[first[i]-1]- r_tepcof[i]-tepcof[pp[i]-1], "R9_"+str(i+1)+str(j+1)
77 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario Modelo.objective = (xsum(T_i[i] for i in range (I))+xsum(xsum(CT_aj[last[i]-1][j] for j in range (J)) for i in range(I))) Modelo.write("Modelo2_gamma.lp") Modelo.optimize(max_seconds=600) print("El valor de la funcion objetivo es: " +str(Modelo.objective_value)) print("El status de la solucion es: " + str(Modelo.status)) """print("Los procesos planificados son: ") for a in range (A): for j in range (J): if (X_aj[a][j].x>0): print("La actividdad "+str(a+1)+" se desarrolla en el recurso "+str(j+1)+" y termina en ",CT_aj[a][j].x) """ fin=time.time() if(Modelo.status==OptimizationStatus.FEASIBLE or Modelo.status==OptimizationStatus.OPTIMAL): tepcof_fo=xsum(T_i[i].x for i in range (I)) LOS_fo=xsum(xsum(CT_aj[last[i]-1][j].x for j in range (J)) for i in range(I)) else: tepcof_fo=0 LOS_fo=0 return(Modelo.objective_value,Modelo.status,finini,Modelo.gap,600,Modelo.num_cols,Modelo.num_rows,I,A,J,tepcof_fo,LOS_fo) #Modelo prioridades y rec-act con modelaje posiciones def modelo3_posiciones(I,pu,pp,first,last,r,A,pt,pa,s,m, am,maxA,J,t,d,pr,b,n,M,tepcof,P,r_tepcof): ini=time.time() Modelo=Model("Modelo2_posiciones",sense=MINIMIZE,solver_name=CBC) X_ajp=[[[Modelo.add_var(name="X_"+str(a+1)+str(j+1), var_type=BINARY) for p in range (P)] for j in range(J)]for a in range(A)] CT_aj=[[Modelo.add_var(name="CT_"+str(a+1)+str(j+1), var_type=INTEGER, lb=0, ub=INF) for j in range(J)]for a in range(A)] T_i=[Modelo.add_var(name="T_"+str(i+1), var_type=INTEGER, lb=0, ub=INF) for i in range (I)] #Restriccion 1 for a in range(A): Modelo+=(xsum(X_ajp[a][j][p] for p in range (P) for j in range(J) if s[a]==t[j] and b[m[a]-1][j]==1)==n[pa[a]-1][m[a]-1]), "R1_"+str(a+1) #Restricción 2.1 for a in range(A): Modelo+=(xsum(X_ajp[a][j][p] for p in range (P) for j in range(J) if (s[a]==t[j] and pr[pa[a]-1][j]==0))==0),"R2_1_"+str(a+1) #Restriccion 2.2 for a in range(A):
Anexos 78 Modelo+=(xsum(X_ajp[a][j][p] for p in range (P) for j in range (J) if s[a]!=t[j])==0),"R2_2_"+str(a+1) #Restriccion 3: for i in range(I): for j in range (J): if s[first[i]-1]==t[j]: Modelo += CT_aj[first[i]-1][j]>=(r[i]+pt[first[i]- 1])*xsum(X_ajp[first[i]-1][j][p] for p in range (P)), "R3_"+str(i+1)+str(j+1) #Restriccion 4: para un paciente i, que la actividad a no empiece hasta que la a-1 no haya temrinado for i in range (I): for a in range(1,maxA): if (pu[i][a]!=0): #JM for j in range(J): for j1 in range(J): if(t[j]==s[pu[i][a]-1] and t[j1]==s[pu[i][a-1]-1]): Modelo += CT_aj[pu[i][a]-1][j]>=CT_aj[pu[i][a-1]- 1][j1]+pt[pu[i][a]-1]+M*(xsum(X_ajp[pu[i][a]-1][j][p]for p in range (P))+xsum(X_ajp[pu[i][a-1]-1][j1][p] for p in range (P))-2), "R4_"+str(i+1)+str(a+1) #Restricción 5: en un recurso una posicion solo puede estar asignada a una actividad for j in range(J): for p in range (P): Modelo+= (xsum(X_ajp[a][j][p] for a in range (A))<=1),"R5_"+str(a+1) #Restriccion 6: actividades en un mismo recurso no se solapen for a in range(A): for a1 in range(A): if a!=a1: for j in range (J): for p in range (1,P): if(t[j]==s[a1] and t[j]==s[a]): Modelo+=CT_aj[a][j]>=CT_aj[a1][j]+pt[a]-M*(2- X_ajp[a][j][p]-xsum(X_ajp[a1][j][p1] for p1 in range (p))),"R6_"+str(j+1) #Restricción 7: disponibilidad de los recursos (comienzo) for a in range (A): for j in range (J): if s[a]==t[j]: Modelo += CT_aj[a][j]>=(pt[a]+d[j][0])*(xsum(X_ajp[a][j][p]for p in range (P))), "R7_"+str(a+1)+str(j+1) #Restricción 8: disponibilidad de los recursos (final) for a in range(A): for j in range(J): if s[a]==t[j]: Modelo += CT_aj[a][j]<=d[j][1]*(xsum(X_ajp[a][j][p] for p in range (P))), "R8_"+str(a+1)+str(j+1) #Restricción 9: variable auxiliar para minimizar los pacientes que NO cumplen TEPCO for i in range (I): if (m[first[i]-1]==1):
79 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario for j in range (J): if(t[j]==s[first[i]-1]): Modelo += T_i[i]>=CT_aj[first[i]-1][j]-pt[first[i]-1]- r_tepcof[i]-tepcof[pp[i]-1], "R9_"+str(i+1)+str(j+1) Modelo.objective = (xsum(T_i[i] for i in range (I))+xsum(xsum(CT_aj[last[i]-1][j] for j in range (J)) for i in range(I))) Modelo.write("Modelo2_posiciones.lp") Modelo.optimize(max_seconds=600) print("El valor de la funcion objetivo es: " +str(Modelo.objective_value)) print("El status de la solucion es: " + str(Modelo.status)) """print("Los procesos planificados son: ") for j in range (J): for p in range (P): for a in range (A): if (X_ajp[a][j][p].x>0): print("La actividdad "+str(a+1)+" se desarrolla en el recurso "+str(j+1)+"en la poscion "+str(p+1)+" y termina en ",CT_aj[a][j].x) """ fin=time.time() if(Modelo.status==OptimizationStatus.FEASIBLE or Modelo.status==OptimizationStatus.OPTIMAL): tepcof_fo=xsum(T_i[i].x for i in range (I)) LOS_fo=xsum(xsum(CT_aj[last[i]-1][j].x for j in range (J)) for i in range(I)) else: tepcof_fo=0 LOS_fo=0 return(Modelo.objective_value,Modelo.status,finini,Modelo.gap,600,Modelo.num_cols,Modelo.num_rows,I,A,J,tepcof_fo,LOS_fo) #Modelo COVID (final) con modelaje gamma (prioridades y rec-act) def modelo4_gamma(I,pu,pp,first,last,r,tp,A,pt,pa,s,m,cv, am,maxA,J,t,d,pr,b,covid,n,M,tepcof,r_tepcof): ini=time.time() Modelo=Model("Modelo3_gamma",sense=MINIMIZE,solver_name=CBC) X_aj=[[Modelo.add_var(name="X_"+str(a+1)+str(j+1), var_type=BINARY) for j in range(J)]for a in range(A)] GAMMA_aa1j=[[[Modelo.add_var(name="Gamma_"+str(a+1)+str(a1+1)+str(j+1), var_type=BINARY) for j in range(J) if a1>a]for a1 in range(A)] for a in range (A)] CT_aj=[[Modelo.add_var(name="CT_"+str(a+1)+str(j+1), var_type=INTEGER, lb=0, ub=INF) for j in range(J)]for a in range(A)] T_i=[Modelo.add_var(name="T_"+str(i+1), var_type=INTEGER, lb=0, ub=INF) for i in range (I)] #Restriccion 1 for a in range(A): Modelo+=(xsum(X_aj[a][j]for j in range(J) if s[a]==t[j]
Anexos 80 and b[m[a]-1][j]==1 and covid[cv[a]- 1][j]==1)==n[pa[a]-1][m[a]-1]), "R1_"+str(a+1) #Restricción 2.1 for a in range(A): Modelo+=(xsum(X_aj[a][j]for j in range(J) if (s[a]==t[j] and pr[pa[a]-1][j]==0))==0),"R2_1_"+str(a+1) #Restriccion 2.2 for a in range(A): Modelo+=(xsum(X_aj[a][j]for j in range (J) if s[a]!=t[j])==0),"R2_2_"+str(a+1) #Restriccion 3: for i in range(I): for j in range (J): if s[first[i]-1]==t[j]: Modelo += CT_aj[first[i]-1][j]>=(r[i]+pt[first[i]- 1])*X_aj[first[i]-1][j], "R3_P"+str(i+1)+str(j+1) #Restriccion 4: para un paciente i, que la actividad a no empiece hasta que la a-1 no haya temrinado for i in range (I): for a in range(1,maxA): if (pu[i][a]!=0): #JM for j in range(J): for j1 in range(J): if(t[j]==s[pu[i][a]-1] and t[j1]==s[pu[i][a-1]-1]): Modelo += CT_aj[pu[i][a]-1][j]>=CT_aj[pu[i][a-1]- 1][j1]+pt[pu[i][a]-1]+M*(X_aj[pu[i][a]-1][j]+X_aj[pu[i][a-1]-1][j1]-2), "R4_"+str(i+1)+str(a+1) #Restriccion 5: actividades en un mismo recurso no se solapen for a in range(A): for a1 in range(A): if a<a1: for j in range (J): if(t[j]==s[a1] and t[j]==s[a]): Modelo+=CT_aj[a1][j]+M*(2-X_aj[a][j]- X_aj[a1][j])>=CT_aj[a][j]+pt[a1]-M*(1-GAMMA_aa1j[a][a1][j]),"R5_"+str(j+1) #Restriccion 6: actividades en un mismo recurso no se solapen for a in range(A): #(1,P) for a1 in range(A): if a<a1: #a != a1 for j in range (J): if(t[j]==s[a1] and t[j]==s[a]): Modelo+=CT_aj[a][j]+M*(2-X_aj[a][j]- X_aj[a1][j])>=CT_aj[a1][j]+pt[a]-M*(GAMMA_aa1j[a][a1][j]),"R6_"+str(j+1) #Restricción 7: disponibilidad de los recursos (comienzo) for a in range (A): for j in range (J): if s[a]==t[j]: Modelo += CT_aj[a][j]>=(pt[a]+d[j][0])*X_aj[a][j], "R7_"+str(a+1)+str(j+1)
81 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario #Restricción 8: disponibilidad de los recursos (final) for a in range(A): for j in range(J): if s[a]==t[j]: Modelo += CT_aj[a][j]<=d[j][1]*X_aj[a][j], "R8_"+str(a+1)+str(j+1) #Restricción 9: variable auxiliar para minimizar los pacientes que NO cumplen TEPCOF for i in range (I): if (m[first[i]-1]==1): for j in range (J): if(t[j]==s[first[i]-1]): Modelo += T_i[i]>=CT_aj[first[i]-1][j]-pt[first[i]-1]- r_tepcof[i]-tepcof[pp[i]-1], "R9_"+str(i+1)+str(j+1) Modelo.objective = (xsum(T_i[i] for i in range (I))+xsum(xsum(CT_aj[last[i]-1][j] for j in range (J)) for i in range(I))) Modelo.write("Modelo4_gamma.lp") Modelo.optimize(max_seconds=600) print("El valor de la funcion objetivo es: " +str(Modelo.objective_value)) print("El status de la solucion es: " + str(Modelo.status)) """print("Los procesos planificados son: ") for a in range (A): for j in range (J): if (X_aj[a][j].x>0): print("La actividdad "+str(a+1)+" se desarrolla en el recurso "+str(j+1)+" y termina en ",CT_aj[a][j].x) """ fin=time.time() if(Modelo.status==OptimizationStatus.FEASIBLE or Modelo.status==OptimizationStatus.OPTIMAL): tepcof_fo=xsum(T_i[i].x for i in range (I)) LOS_fo=xsum(xsum(CT_aj[last[i]-1][j].x for j in range (J)) for i in range(I)) else: tepcof_fo=0 LOS_fo=0 return(Modelo.objective_value,Modelo.status,finini,Modelo.gap,600,Modelo.num_cols,Modelo.num_rows,I,A,J,tepcof_fo,LOS_fo) #Modelo COVID (final) con modelaje posiciones (prioridades y rec-act) def modelo4_posiciones(I,pu,pp,first,last,r,tp,A,pt,pa,s,m,cv, am,maxA,J,t,d,pr,b,k,n,M,tepcof,P,r_tepcof): ini=time.time() Modelo=Model("Modelo3_posiciones",sense=MINIMIZE,solver_name=CBC) X_ajp=[[[Modelo.add_var(name="X_"+str(a+1)+str(j+1), var_type=BINARY) for p in range (P)] for j in range(J)]for a in range(A)] CT_aj=[[Modelo.add_var(name="CT_"+str(a+1)+str(j+1), var_type=INTEGER, lb=0, ub=INF) for j in range(J)]for a in range(A)]
Anexos 82 T_i=[Modelo.add_var(name="T_"+str(i+1), var_type=INTEGER, lb=0, ub=INF) for i in range (I)] #Restriccion 1 for a in range(A): Modelo+=(xsum(X_ajp[a][j][p] for p in range (P) for j in range(J) if s[a]==t[j] and b[m[a]-1][j]==1 and k[cv[a]-1][j]==1)==n[pa[a]- 1][m[a]-1]), "R1"+str(a+1) #Restricción 2.1 for a in range(A): Modelo+=(xsum(X_ajp[a][j][p] for p in range (P) for j in range(J) if (s[a]==t[j] and pr[pa[a]-1][j]==0))==0),"R2_1_"+str(a+1) #Restriccion 2.2 for a in range(A): Modelo+=(xsum(X_ajp[a][j][p] for p in range (P) for j in range (J) if s[a]!=t[j])==0),"R2_2_"+str(a+1) #Restriccion 3: for i in range(I): for j in range (J): if s[first[i]-1]==t[j]: Modelo += CT_aj[first[i]-1][j]>=(r[i]+pt[first[i]- 1])*xsum(X_ajp[first[i]-1][j][p] for p in range (P)), "R3_"+str(i+1)+str(j+1) #Restriccion 4: para un paciente i, que la actividad a no empiece hasta que la a-1 no haya temrinado for i in range (I): for a in range(1,maxA): if (pu[i][a]!=0): #JM for j in range(J): for j1 in range(J): if(t[j]==s[pu[i][a]-1] and t[j1]==s[pu[i][a-1]-1]): Modelo += CT_aj[pu[i][a]-1][j]>=CT_aj[pu[i][a-1]- 1][j1]+pt[pu[i][a]-1]+M*(xsum(X_ajp[pu[i][a]-1][j][p]for p in range (P))+xsum(X_ajp[pu[i][a-1]-1][j1][p] for p in range (P))-2), "R4_"+str(i+1)+str(a+1) #Restricción 5: en un recurso una posicion solo puede estar asignada a una actividad for j in range(J): for p in range (P): Modelo+= (xsum(X_ajp[a][j][p] for a in range (A))<=1),"R5_"+str(j+1) #Restriccion 6: actividades en un mismo recurso no se solapen for a in range(A): for a1 in range(A): if a!=a1: for j in range (J): for p in range (1,P): if(t[j]==s[a1] and t[j]==s[a]): Modelo+=CT_aj[a][j]>=CT_aj[a1][j]+pt[a]-M*(2- X_ajp[a][j][p]-xsum(X_ajp[a1][j][p1] for p1 in range (p))),"R6_"+str(j+1) #Restricción 7: disponibilidad de los recursos (comienzo) for a in range (A): for j in range (J):
83 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario if s[a]==t[j]: Modelo += CT_aj[a][j]>=(pt[a]+d[j][0])*(xsum(X_ajp[a][j][p]for p in range (P))), "R7_"+str(a+1)+str(j+1) #Restricción 8: disponibilidad de los recursos (final) for a in range(A): for j in range(J): if s[a]==t[j]: Modelo += CT_aj[a][j]<=d[j][1]*(xsum(X_ajp[a][j][p] for p in range (P))), "R8_"+str(a+1)+str(j+1) #Restricción 9: variable auxiliar para minimizar los pacientes que NO cumplen TEPCO for i in range (I): if (m[first[i]-1]==1): for j in range (J): if(t[j]==s[first[i]-1]): Modelo += T_i[i]>=CT_aj[first[i]-1][j]-pt[first[i]-1]- r_tepcof[i]-tepcof[pp[i]-1], "R9_"+str(i+1)+str(j+1) Modelo.objective = (xsum(T_i[i] for i in range (I))+xsum(xsum(CT_aj[last[i]-1][j] for j in range (J)) for i in range(I))) Modelo.write("Modelo3_posiciones.lp") Modelo.optimize(max_seconds=600) print("El valor de la funcion objetivo es: " +str(Modelo.objective_value)) print("El status de la solucion es: " + str(Modelo.status)) """print("Los procesos planificados son: ") for j in range (J): for p in range (P): for a in range (A): if (X_ajp[a][j][p].x>0): print("La actividdad "+str(a+1)+" se desarrolla en el recurso "+str(j+1)+"en la poscion "+str(p+1)+" y termina en ",CT_aj[a][j].x) """ fin=time.time() if(Modelo.status==OptimizationStatus.FEASIBLE or Modelo.status==OptimizationStatus.OPTIMAL): tepcof_fo=xsum(T_i[i].x for i in range (I)) LOS_fo=xsum(xsum(CT_aj[last[i]-1][j].x for j in range (J)) for i in range(I)) else: tepcof_fo=0 LOS_fo=0 return(Modelo.objective_value,Modelo.status,finini,Modelo.gap,600,Modelo.num_cols,Modelo.num_rows,I,A,J,tepcof_fo,LOS_fo)
Anexos 90 pt.append(round(triangular(20,30,75))) pt.append(round(triangular(3,5,15))) pt.append(round(triangular(3,5,15))) pt.append(round(triangular(20,30,40))) pt.append(round(triangular(20,30,40))) pt.append(10) #las altas vamos a poner que duran 10min en prior 1 saturacion[0]=saturacion[0]+pt[i+3]+10 saturacion[1]=saturacion[1]+pt[i]+pt[i+4] saturacion[2]=saturacion[2]+pt[i+1] saturacion[3]=saturacion[3]+pt[i+2] i=i+6 last.append(i) for j in range (6): pa.append(1) s.append(2) s.append(3) s.append(4) s.append(1) s.append(2) s.append(1) m.append(2) m.append(3) m.append(4) m.append(6) m.append(7) m.append(8) if(covid==[1]): for j in range(6): cv.append(1) else: for j in range(6): cv.append(2) if(inst_act==[3]): pac_activo.append(I) pu = np.append(pu, np.array([[i+1,i+2,i+3,i+4,i+5,0,0,0]]),axis=0) first.append(i+1) pt.append(round(triangular(3,5,15))) pt.append(round(triangular(3,5,15))) pt.append(round(triangular(20,30,40))) pt.append(round(triangular(20,30,40))) pt.append(10) #las altas vamos a poner que duran 10min en prior 1 saturacion[0]=saturacion[0]+pt[i+2]+10 saturacion[1]=saturacion[1]+pt[i+3] saturacion[2]=saturacion[2]+pt[i] saturacion[3]=saturacion[3]+pt[i+1] i=i+5 last.append(i) for j in range (5): pa.append(1) s.append(3) s.append(4) s.append(1) s.append(2) s.append(1)
91 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario m.append(3) m.append(4) m.append(6) m.append(7) m.append(8) if(covid==[1]): for j in range(5): cv.append(1) else: for j in range(5): cv.append(2) if(inst_act==[4]): pac_activo.append(I) pu = np.append(pu, np.array([[i+1,i+2,i+3,i+4,0,0,0,0]]),axis=0) first.append(i+1) pt.append(round(triangular(3,5,15))) pt.append(round(triangular(20,30,40))) pt.append(round(triangular(20,30,40))) pt.append(10) #las altas vamos a poner que duran 10min en prior 1 saturacion[0]=saturacion[0]+pt[i+1]+10 saturacion[1]=saturacion[1]+pt[i+2] saturacion[3]=saturacion[3]+pt[i] i=i+4 last.append(i) for j in range (4): pa.append(1) s.append(4) s.append(1) s.append(2) s.append(1) m.append(4) m.append(6) m.append(7) m.append(8) if(covid==[1]): for j in range(4): cv.append(1) else: for j in range(4): cv.append(2) if(inst_act==[5]): pac_activo.append(I) pu = np.append(pu, np.array([[i+1,i+2,i+3,0,0,0,0,0]]),axis=0) first.append(i+1) pt.append(round(triangular(20,30,40))) pt.append(round(triangular(20,30,40))) pt.append(10) #las altas vamos a poner que duran 10min en prior 1 saturacion[0]=saturacion[0]+pt[i]+10 saturacion[1]=saturacion[1]+pt[i+1] i=i+3 last.append(i) for j in range (3): pa.append(1) s.append(1)
Anexos 92 s.append(2) s.append(1) m.append(6) m.append(7) m.append(8) if(covid==[1]): for j in range(3): cv.append(1) else: for j in range(3): cv.append(2) if(inst_act==[6]): pac_activo.append(I) pu = np.append(pu, np.array([[i+1,i+2,0,0,0,0,0,0]]),axis=0) first.append(i+1) pt.append(round(triangular(20,30,40))) pt.append(10) #las altas vamos a poner que duran 10min en prior 1 saturacion[0]=saturacion[0]+10 saturacion[1]=saturacion[1]+pt[i] i=i+2 last.append(i) for j in range (2): pa.append(1) s.append(2) s.append(1) m.append(7) m.append(8) if(covid==[1]): for j in range(2): cv.append(1) else: for j in range(2): cv.append(2) if(prior==[2]): #Puede haber CT-scan con una probabilidad del 70% ct_scan=random.choices([1,2],weights=[70,30]) if(ct_scan==[1]): inst_act=random.choices([1,2,3,4,5,6,7]) if(inst_act==[1]): pu = np.append(pu, np.array([[i+1,i+2,i+3,i+4,i+5,i+6,i+7,i+8]]),axis=0) first.append(i+1) pt.append(round(triangular(10,20,25))) pt.append(round(triangular(18,28,45))) pt.append(round(triangular(3,5,15))) pt.append(round(triangular(5,10,20))) pt.append(15) pt.append(round(triangular(15,20,25))) pt.append(round(triangular(15,20,30))) pt.append(8) #las altas vamos a poner que duran 8min en prior 2 saturacion[0]=saturacion[0]+pt[i]+pt[i+5]+8 saturacion[1]=saturacion[1]+pt[i+1]+pt[i+6] saturacion[2]=saturacion[2]+pt[i+2] saturacion[3]=saturacion[3]+pt[i+3]
93 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario saturacion[4]=saturacion[4]+15 i=i+8 last.append(i) for j in range (8): pa.append(1) s.append(1) s.append(2) s.append(3) s.append(4) s.append(5) s.append(1) s.append(2) s.append(1) m.append(1) m.append(2) m.append(3) m.append(4) m.append(5) m.append(6) m.append(7) m.append(8) if(covid==[1]): for j in range(8): cv.append(1) else: for j in range(8): cv.append(2) if(inst_act==[2]): pac_activo.append(I) pu = np.append(pu, np.array([[i+1,i+2,i+3,i+4,i+5,i+6,i+7,0]]),axis=0) first.append(i+1) pt.append(round(triangular(18,28,45))) pt.append(round(triangular(3,5,15))) pt.append(round(triangular(5,10,20))) pt.append(15) pt.append(round(triangular(15,20,25))) pt.append(round(triangular(15,20,30))) pt.append(8) #las altas vamos a poner que duran 8min en prior 2 saturacion[0]=saturacion[0]+pt[i+4]+8 saturacion[1]=saturacion[1]+pt[i]+pt[i+5] saturacion[2]=saturacion[2]+pt[i+1] saturacion[3]=saturacion[3]+pt[i+2] saturacion[4]=saturacion[4]+15 i=i+7 last.append(i) for j in range (7): pa.append(1) s.append(2) s.append(3) s.append(4) s.append(5) s.append(1) s.append(2) s.append(1) m.append(2) m.append(3)
Anexos 94 m.append(4) m.append(5) m.append(6) m.append(7) m.append(8) if(covid==[1]): for j in range(7): cv.append(1) else: for j in range(7): cv.append(2) if(inst_act==[3]): pac_activo.append(I) pu = np.append(pu, np.array([[i+1,i+2,i+3,i+4,i+5,i+6,0,0]]),axis=0) first.append(i+1) pt.append(round(triangular(3,5,15))) pt.append(round(triangular(5,10,20))) pt.append(15) pt.append(round(triangular(15,20,25))) pt.append(round(triangular(15,20,30))) pt.append(8) #las altas vamos a poner que duran 8min en prior 2 saturacion[0]=saturacion[0]+pt[i+3]+8 saturacion[1]=saturacion[1]+pt[i+4] saturacion[2]=saturacion[2]+pt[i] saturacion[3]=saturacion[3]+pt[i+1] saturacion[4]=saturacion[4]+15 i=i+6 last.append(i) for j in range (6): pa.append(1) s.append(3) s.append(4) s.append(5) s.append(1) s.append(2) s.append(1) m.append(3) m.append(4) m.append(5) m.append(6) m.append(7) m.append(8) if(covid==[1]): for j in range(6): cv.append(1) else: for j in range(6): cv.append(2) if(inst_act==[4]): pac_activo.append(I) pu = np.append(pu, np.array([[i+1,i+2,i+3,i+4,i+5,0,0,0]]),axis=0) first.append(i+1) pt.append(round(triangular(5,10,20))) pt.append(15)
95 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario pt.append(round(triangular(15,20,25))) pt.append(round(triangular(15,20,30))) pt.append(8) #las altas vamos a poner que duran 8min en prior 2 saturacion[0]=saturacion[0]+pt[i+2]+8 saturacion[1]=saturacion[1]+pt[i+3] saturacion[3]=saturacion[3]+pt[i] saturacion[4]=saturacion[4]+15 i=i+5 last.append(i) for j in range (5): pa.append(1) s.append(4) s.append(5) s.append(1) s.append(2) s.append(1) m.append(4) m.append(5) m.append(6) m.append(7) m.append(8) if(covid==[1]): for j in range(5): cv.append(1) else: for j in range(5): cv.append(2) if(inst_act==[5]): pac_activo.append(I) pu = np.append(pu, np.array([[i+1,i+2,i+3,i+4,0,0,0,0]]),axis=0) first.append(i+1) pt.append(15) pt.append(round(triangular(15,20,25))) pt.append(round(triangular(15,20,30))) pt.append(8) #las altas vamos a poner que duran 8min en prior 2 saturacion[0]=saturacion[0]+pt[i+1]+8 saturacion[1]=saturacion[1]+pt[i+2] saturacion[4]=saturacion[4]+15 i=i+4 last.append(i) for j in range (4): pa.append(1) s.append(5) s.append(1) s.append(2) s.append(1) m.append(5) m.append(6) m.append(7) m.append(8) if(covid==[1]): for j in range(4): cv.append(1) else: for j in range(4):
Anexos 96 cv.append(2) if(inst_act==[6]): pac_activo.append(I) pu = np.append(pu, np.array([[i+1,i+2,i+3,0,0,0,0,0]]),axis=0) first.append(i+1) pt.append(round(triangular(15,20,25))) pt.append(round(triangular(15,20,30))) pt.append(8) #las altas vamos a poner que duran 8min en prior 2 saturacion[0]=saturacion[0]+pt[i]+8 saturacion[1]=saturacion[1]+pt[i+1] i=i+3 last.append(i) for j in range (3): pa.append(1) s.append(1) s.append(2) s.append(1) m.append(6) m.append(7) m.append(8) if(covid==[1]): for j in range(3): cv.append(1) else: for j in range(3): cv.append(2) if(inst_act==[7]): pac_activo.append(I) pu = np.append(pu, np.array([[i+1,i+2,0,0,0,0,0,0]]),axis=0) first.append(i+1) pt.append(round(triangular(15,20,30))) pt.append(8) #las altas vamos a poner que duran 8min en prior 2 saturacion[0]=saturacion[0]+8 saturacion[1]=saturacion[1]+pt[i] i=i+2 last.append(i) for j in range (2): pa.append(1) s.append(2) s.append(1) m.append(7) m.append(8) if(covid==[1]): for j in range(2): cv.append(1) else: for j in range(2): cv.append(2) else: inst_act=random.choices([1,2,3,4,5,6]) if(inst_act==[1]): pu = np.append(pu, np.array([[i+1,i+2,i+3,i+4,i+5,i+6,i+7,0]]),axis=0)
97 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario first.append(i+1) pt.append(round(triangular(10,20,25))) pt.append(round(triangular(18,28,45))) pt.append(round(triangular(3,5,15))) pt.append(round(triangular(5,10,20))) pt.append(round(triangular(15,20,25))) pt.append(round(triangular(15,20,30))) pt.append(8) #las altas vamos a poner que duran 8min en prior 2 saturacion[0]=saturacion[0]+pt[i]+pt[i+4]+8 saturacion[1]=saturacion[1]+pt[i+1]+pt[i+5] saturacion[2]=saturacion[2]+pt[i+2] saturacion[3]=saturacion[3]+pt[i+3] i=i+7 last.append(i) for j in range (7): pa.append(1) s.append(1) s.append(2) s.append(3) s.append(4) s.append(1) s.append(2) s.append(1) m.append(1) m.append(2) m.append(3) m.append(4) m.append(6) m.append(7) m.append(8) if(covid==[1]): for j in range(7): cv.append(1) else: for j in range(7): cv.append(2) if(inst_act==[2]): pac_activo.append(I) pu = np.append(pu, np.array([[i+1,i+2,i+3,i+4,i+5,i+6,0,0]]),axis=0) first.append(i+1) pt.append(round(triangular(18,28,45))) pt.append(round(triangular(3,5,15))) pt.append(round(triangular(5,10,20))) pt.append(round(triangular(15,20,25))) pt.append(round(triangular(15,20,30))) pt.append(8) #las altas vamos a poner que duran 8min en prior 2 saturacion[0]=saturacion[0]+pt[i+3]+8 saturacion[1]=saturacion[1]+pt[i]+pt[i+4] saturacion[2]=saturacion[2]+pt[i+1] saturacion[3]=saturacion[3]+pt[i+2] i=i+6 last.append(i) for j in range (6): pa.append(1) s.append(2)
Anexos 98 s.append(3) s.append(4) s.append(1) s.append(2) s.append(1) m.append(2) m.append(3) m.append(4) m.append(6) m.append(7) m.append(8) if(covid==[1]): for j in range(6): cv.append(1) else: for j in range(6): cv.append(2) if(inst_act==[3]): pac_activo.append(I) pu = np.append(pu, np.array([[i+1,i+2,i+3,i+4,i+5,0,0,0]]),axis=0) first.append(i+1) pt.append(round(triangular(3,5,15))) pt.append(round(triangular(5,10,20))) pt.append(round(triangular(15,20,25))) pt.append(round(triangular(15,20,30))) pt.append(8) #las altas vamos a poner que duran 8min en prior 2 saturacion[0]=saturacion[0]+pt[i+2]+8 saturacion[1]=saturacion[1]+pt[i+3] saturacion[2]=saturacion[2]+pt[i] saturacion[3]=saturacion[3]+pt[i+1] i=i+5 last.append(i) for j in range (5): pa.append(1) s.append(3) s.append(4) s.append(1) s.append(2) s.append(1) m.append(3) m.append(4) m.append(6) m.append(7) m.append(8) if(covid==[1]): for j in range(5): cv.append(1) else: for j in range(5): cv.append(2) if(inst_act==[4]): pac_activo.append(I) pu = np.append(pu, np.array([[i+1,i+2,i+3,i+4,0,0,0,0]]),axis=0) first.append(i+1)
99 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario pt.append(round(triangular(5,10,20))) pt.append(round(triangular(15,20,25))) pt.append(round(triangular(15,20,30))) pt.append(8) #las altas vamos a poner que duran 8min en prior 2 saturacion[0]=saturacion[0]+pt[i+1]+8 saturacion[1]=saturacion[1]+pt[i+2] saturacion[3]=saturacion[3]+pt[i] i=i+4 last.append(i) for j in range (4): pa.append(1) s.append(4) s.append(1) s.append(2) s.append(1) m.append(4) m.append(6) m.append(7) m.append(8) if(covid==[1]): for j in range(4): cv.append(1) else: for j in range(4): cv.append(2) if(inst_act==[5]): pac_activo.append(I) pu = np.append(pu, np.array([[i+1,i+2,i+3,0,0,0,0,0]]),axis=0) first.append(i+1) pt.append(round(triangular(15,20,25))) pt.append(round(triangular(15,20,30))) pt.append(8) #las altas vamos a poner que duran 8min en prior 2 saturacion[0]=saturacion[0]+pt[i]+8 saturacion[1]=saturacion[1]+pt[i+1] i=i+3 last.append(i) for j in range (3): pa.append(1) s.append(1) s.append(2) s.append(1) m.append(6) m.append(7) m.append(8) if(covid==[1]): for j in range(3): cv.append(1) else: for j in range(3): cv.append(2) if(inst_act==[6]): pac_activo.append(I) pu = np.append(pu, np.array([[i+1,i+2,0,0,0,0,0,0]]),axis=0) first.append(i+1)
Anexos 106 cv.append(2) if(inst_act==[3]): pac_activo.append(I) pu = np.append(pu, np.array([[i+1,i+2,i+3,i+4,i+5,0,0,0]]),axis=0) first.append(i+1) pt.append(round(triangular(3,5,15))) pt.append(round(triangular(5,10,20))) pt.append(round(triangular(8,15,18))) pt.append(round(triangular(10,15,20))) pt.append(7) #las altas vamos a poner que duran 7min en prior 3 saturacion[0]=saturacion[0]+pt[i+2]+7 saturacion[1]=saturacion[1]+pt[i+3] saturacion[2]=saturacion[2]+pt[i] saturacion[3]=saturacion[3]+pt[i+1] i=i+5 last.append(i) for j in range (5): pa.append(1) s.append(3) s.append(4) s.append(1) s.append(2) s.append(1) m.append(3) m.append(4) m.append(6) m.append(7) m.append(8) if(covid==[1]): for j in range(5): cv.append(1) else: for j in range(5): cv.append(2) if(inst_act==[4]): pac_activo.append(I) pu = np.append(pu, np.array([[i+1,i+2,i+3,i+4,0,0,0,0]]),axis=0) first.append(i+1) pt.append(round(triangular(5,10,20))) pt.append(round(triangular(8,15,18))) pt.append(round(triangular(10,15,20))) pt.append(7) #las altas vamos a poner que duran 7min en prior 3 saturacion[0]=saturacion[0]+pt[i+1]+7 saturacion[1]=saturacion[1]+pt[i+2] saturacion[3]=saturacion[3]+pt[i] i=i+4 last.append(i) for j in range (4): pa.append(1) s.append(4) s.append(1) s.append(2) s.append(1)
107 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario m.append(4) m.append(6) m.append(7) m.append(8) if(covid==[1]): for j in range(4): cv.append(1) else: for j in range(4): cv.append(2) if(inst_act==[5]): pac_activo.append(I) pu = np.append(pu, np.array([[i+1,i+2,i+3,0,0,0,0,0]]),axis=0) first.append(i+1) pt.append(round(triangular(8,15,18))) pt.append(round(triangular(10,15,20))) pt.append(7) saturacion[0]=saturacion[0]+pt[i]+7 saturacion[1]=saturacion[1]+pt[i+1] i=i+3 last.append(i) for j in range (3): pa.append(1) s.append(1) s.append(2) s.append(1) m.append(6) m.append(7) m.append(8) if(covid==[1]): for j in range(3): cv.append(1) else: for j in range(3): cv.append(2) if(inst_act==[6]): pac_activo.append(I) pu = np.append(pu, np.array([[i+1,i+2,0,0,0,0,0,0]]),axis=0) first.append(i+1) pt.append(round(triangular(10,15,20))) pt.append(7) saturacion[0]=saturacion[0]+7 saturacion[1]=saturacion[1]+pt[i] i=i+2 last.append(i) for j in range (2): pa.append(1) s.append(2) s.append(1) m.append(7) m.append(8) if(covid==[1]): for j in range(2): cv.append(1) else: for j in range(2):
Anexos 108 cv.append(2) if(prior==[4]): inst_act=random.choices([1,2,3,4,5]) if(inst_act==[1]): pu = np.append(pu, np.array([[i+1,i+2,i+3,i+4,i+5,i+6,0,0]]),axis=0) first.append(i+1) pt.append(round(triangular(2,3,5))) pt.append(round(triangular(5,10,20))) pt.append(round(triangular(2,5,10))) pt.append(round(triangular(5,10,15))) pt.append(round(triangular(5,8,12))) pt.append(5) saturacion[0]=saturacion[0]+pt[i]+pt[i+3]+5 saturacion[1]=saturacion[1]+pt[i+1]+pt[i+4] saturacion[3]=saturacion[3]+pt[i+2] i=i+6 last.append(i) for j in range (6): pa.append(4) s.append(1) s.append(2) s.append(4) s.append(1) s.append(2) s.append(1) m.append(1) m.append(2) m.append(4) m.append(6) m.append(7) m.append(8) if(covid==[1]): for j in range(6): cv.append(1) else: for j in range(6): cv.append(2) if(inst_act==[2]): pac_activo.append(I) pu = np.append(pu, np.array([[i+1,i+2,i+3,i+4,i+5,0,0,0]]),axis=0) first.append(i+1) pt.append(round(triangular(5,10,20))) pt.append(round(triangular(2,5,10))) pt.append(round(triangular(5,10,15))) pt.append(round(triangular(5,8,12))) pt.append(5) saturacion[0]=saturacion[0]+pt[i+2]+5 saturacion[1]=saturacion[1]+pt[i]+pt[i+3] saturacion[3]=saturacion[3]+pt[i+1] i=i+5 last.append(i) for j in range (5): pa.append(4) s.append(2) s.append(4)
109 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario s.append(1) s.append(2) s.append(1) m.append(2) m.append(4) m.append(6) m.append(7) m.append(8) if(covid==[1]): for j in range(5): cv.append(1) else: for j in range(5): cv.append(2) if(inst_act==[3]): pac_activo.append(I) pu = np.append(pu, np.array([[i+1,i+2,i+3,i+4,0,0,0,0]]),axis=0) first.append(i+1) pt.append(round(triangular(2,5,10))) pt.append(round(triangular(5,10,15))) pt.append(round(triangular(5,8,12))) pt.append(5) saturacion[0]=saturacion[0]+pt[i+1]+5 saturacion[1]=saturacion[1]+pt[i+2] saturacion[3]=saturacion[3]+pt[i] i=i+4 last.append(i) for j in range (4): pa.append(4) s.append(4) s.append(1) s.append(2) s.append(1) m.append(4) m.append(6) m.append(7) m.append(8) if(covid==[1]): for j in range(4): cv.append(1) else: for j in range(4): cv.append(2) if(inst_act==[4]): pac_activo.append(I) pu = np.append(pu, np.array([[i+1,i+2,i+3,0,0,0,0,0]]),axis=0) first.append(i+1) pt.append(round(triangular(5,10,15))) pt.append(round(triangular(5,8,12))) pt.append(5) saturacion[0]=saturacion[0]+pt[i]+5 saturacion[1]=saturacion[1]+pt[i+1] i=i+3 last.append(i) for j in range (3): pa.append(4)
Anexos 110 s.append(1) s.append(2) s.append(1) m.append(6) m.append(7) m.append(8) if(covid==[1]): for j in range(3): cv.append(1) else: for j in range(3): cv.append(2) if(inst_act==[5]): pac_activo.append(I) pu = np.append(pu, np.array([[i+1,i+2,0,0,0,0,0,0]]),axis=0) first.append(i+1) pt.append(round(triangular(5,8,12))) pt.append(5) saturacion[0]=saturacion[0]+5 saturacion[1]=saturacion[1]+pt[i] i=i+2 last.append(i) for j in range (2): pa.append(4) s.append(2) s.append(1) m.append(7) m.append(8) if(covid==[1]): for j in range(2): cv.append(1) else: for j in range(2): cv.append(2) if(prior==[5]): inst_act=random.choices([1,2]) if(inst_act==[1]): pu = np.append(pu, np.array([[i+1,i+2,i+3,0,0,0,0,0]]),axis=0) first.append(i+1) pt.append(round(triangular(2,3,5))) pt.append(round(triangular(2,4,8))) pt.append(3) saturacion[0]=saturacion[0]+pt[i]+3 saturacion[1]=saturacion[1]+pt[i+1] i=i+3 last.append(i) for j in range (3): pa.append(5) s.append(1) s.append(2) s.append(1) m.append(1) m.append(2) m.append(8) if(covid==[1]): for j in range(3):
111 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario cv.append(1) else: for j in range(3): cv.append(2) if(inst_act==[2]): pac_activo.append(I) pu = np.append(pu, np.array([[i+1,i+2,0,0,0,0,0,0]]),axis=0) first.append(i+1) pt.append(round(triangular(2,4,8))) pt.append(3) saturacion[0]=saturacion[0]+3 saturacion[1]=saturacion[1]+pt[i] i=i+2 last.append(i) for j in range (2): pa.append(5) s.append(2) s.append(1) m.append(2) m.append(8) if(covid==[1]): for j in range(2): cv.append(1) else: for j in range(3): cv.append(2) for k in range(5): if(saturacion[k]>=LOS_medio*num_recursos[k]*sat): flag=0 A=len(pt) #Esta d es para [4,8,2,2,1], ni siquiera sirve para el tercer caso """d=[[np.random.randint(0,20),960],[np.random.randint(0,20),960],[np.random. randint(0,4),960], [np.random.randint(0,20),960],[np.random.randint(0,36),960],[np.random.randin t(0,36),960], [np.random.randint(0,36),960],[np.random.randint(0,23),960],[np.random.randin t(0,23),960], [np.random.randint(0,11),960],[np.random.randint(0,36),960],[np.random.randin t(0,36),960], [np.random.randint(0,7),960],[np.random.randint(0,7),960],[np.random.randint( 0,7),960], [np.random.randint(0,7),960],[np.random.randint(0,20),960]]""" #Esta d es para [1,6,1,1,1] d=[[np.random.randint(0,20),960],[np.random.randint(0,36),960],[np.random.ran dint(0,36),960], [np.random.randint(0,36),960],[np.random.randint(0,23),960],[np.random.randin t(0,23),960], [np.random.randint(0,11),960],[np.random.randint(0,7),960],[np.random.randint (0,7),960], [np.random.randint(0,20),960]]
Anexos 112 """d=[[np.random.randint(0,20),960],[np.random.randint(0,20),960],[np.random. randint(0,4),960], [np.random.randint(0,20),960],[np.random.randint(0,36),960],[np.random.randin t(0,36),960], [np.random.randint(0,36),960],[np.random.randint(0,23),960],[np.random.randin t(0,23),960], [np.random.randint(0,11),960],[np.random.randint(0,36),960],[np.random.randin t(0,36),960], [np.random.randint(0,7),960],[np.random.randint(0,7),960],[np.random.randint( 0,20),960]]""" #Esta d es para [4,8,2,2,2] """d=[[np.random.randint(0,20),960],[np.random.randint(0,20),960],[np.random. randint(0,4),960], [np.random.randint(0,20),960],[np.random.randint(0,36),960],[np.random.randin t(0,36),960], [np.random.randint(0,36),960],[np.random.randint(0,23),960],[np.random.randin t(0,23),960], [np.random.randint(0,11),960],[np.random.randint(0,36),960],[np.random.randin t(0,36),960], [np.random.randint(0,7),960],[np.random.randint(0,7),960],[np.random.randint( 0,7),960], [np.random.randint(0,7),960],[np.random.randint(0,20),960],[np.random.randint (0,20),960]]""" if(pac_activo!=[]): for j in range(15): if(d[j][0]!=0): pac=random.choice(pac_activo) r[pac-1]=d[j][0] indice=pac_activo.index(pac) pac_activo.pop(indice) if(pac_activo==[]): break return(I,pu,pp,first,last,r,tp,A,pt,pa,s,m,cv,r_tepcof,d)
113 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario codigo.py from instancias import * from modelos import * import xlsxwriter libro = xlsxwriter.Workbook('Resultados.xlsx') hoja = libro.add_worksheet('Resultados') random.seed(2) #Semilla 2 para [1,6,1,1,1] y semilla 1 para [4,8,1,1,1] am=[1,2,3,4,5,6,7,8] #1ºCons, Enf, Sangre, Rayos, TAC, Reeval, 2ªEnfermería, Alta maxA=8 tr=[1,2,3,4,5] #Consulta, enfermería, laboratorio, rayos y sala TAC n=[[1,2,1,1,1,1,2,1],[1,2,1,1,1,1,2,1],[1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1],[1 ,1,1,1,1,1,1,1]] M=1600 tepcof=[0,15,60,100,120] sat=[0.25,0.5,0.75] #A las 6 de la mañana se tienen 1 consulta, 6 enfermerías, 1 rayos, 1 lab y 1 TAC J=10 t=[1,2,2,2,2,2,2,3,4,5] pr=[[1,1,1,1,0,0,0,1,1,1],[1,1,1,1,0,0,0,1,1,1],[1,0,1,1,1,1,0,1,1,1], [1,0,0,0,1,1,1,1,1,1],[1,0,0,0,0,1,1,1,1,1]] b=[[1,0,0,0,0,0,0,0,0,0],[0,1,1,1,1,1,1,0,0,0],[0,0,0,0,0,0,0,1,0,0], [0,0,0,0,0,0,0,0,1,0],[0,0,0,0,0,0,0,0,0,1],[1,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,0,0,0],[1,0,0,0,0,0,0,0,0,0]] #A las 12 de la mañana se tienen 4 consultas, 8 enfermerías, 1 rayos, 1 lab y 1 TAC """J=15 t=[1,1,1,1,2,2,2,2,2,2,2,2,3,4,5] pr=[[1,1,0,0,1,1,1,1,0,0,0,0,1,1,1],[1,1,0,0,1,1,1,1,0,0,0,0,1,1,1], [1,1,0,0,0,1,1,1,1,1,0,0,1,1,1],[0,0,1,1,0,0,0,0,1,1,1,1,1,1,1], [0,0,1,1,0,0,0,0,0,1,1,1,0,0,0]] b=[[1,1,1,1,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],[1,1,1,1,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,1,0,0,0],[1,1,1,1,0,0,0,0,0,0,0,0,0,0,0]]""" #A las 12 de la mañana se tienen 4 consultas, 8 enfermerías, 2 rayos, 2 lab y 2 TAC """J=18 t=[1,1,1,1,2,2,2,2,2,2,2,2,3,3,4,4,5,5] pr=[[1,1,0,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1],[1,1,0,1,1,1,1,1,0,0,1,1,1,1,1,1,1, 1], [1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1],[0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1], [0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0]] b=[[1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0 ], [0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1],[1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
Anexos 114 [0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0],[1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]] covid=[[0,0,0,1,0,0,0,0,0,0,1,1,0,1,0,1,0,1],[1,1,1,0,1,1,1,1,1,1,0,0,1,0,1,0 ,1,0]]""" hoja.write(0,1,'Número de instancia') hoja.write(0,2,'Modelo') hoja.write(0,3,'Valor F.O.') hoja.write(0,4,'Status') hoja.write(0,5,'Tiempo ejecución') hoja.write(0,6,'GAP') hoja.write(0,7,'Tiempo límite') hoja.write(0,8,'Número vbles') hoja.write(0,9,'Número restricciones') hoja.write(0,10,'Número de pacientes') hoja.write(0,11,'Número de actividades') hoja.write(0,12,'Número de recursos') hoja.write(0,13,'TEPCOF F.O.') hoja.write(0,14,'LOS F.O.') hoja.write(1,0,'Saturación de 25%') hoja.write(61,0,'Saturación de 50%') hoja.write(121,0,'Saturación de 75%') f=1 for k in (1,7,13,19,25,31,37,43,49,55,61,67,73,79,85,91,97,103,109,115,121, 127,133,139,145,151,157,163,169,175): hoja.write(k,1,str(f)) f=f+1 for h in range(6): hoja.write(k,2,str(h+1)) k=k+1 k=1 m=[3,4,5,6,7,8,9,10,11,12,13,14] for sat in (0.25,0.5,0.75): for h in range(10): hoja.write(k,1,str(h+1)) instancia=Generar_Instancia(sat) pos=0 P=0 s=instancia[10] for f in range (len(tr)): pos=0 for i in range(len(s)): if(s[i]==f+1): pos=pos+1 if(pos>P): P=pos modelo1g=modelo1_gamma(instancia[0],instancia[1],instancia[2],instancia[3],in stancia[4], instancia[5],instancia[7],instancia[8], instancia[10],instancia[11],am,maxA,J, t,instancia[14],M,tepcof,instancia[13]) for v in (m): hoja.write(k,v,str(modelo1g[v-3])) k=k+1
115 Desarrollo de modelos de programación lineal para la gestión del flujo de pacientes en un servicio de urgencias hospitalario modelo2g=modelo2_gamma(instancia[0],instancia[1],instancia[2],instancia[3],in stancia[4], instancia[5],instancia[7],instancia[8],instancia[9], instancia[10],instancia[11],am,maxA,J,t,instancia[14], pr,n,M,tepcof,instancia[13]) for v in (m): hoja.write(k,v,str(modelo2g[v-3])) k=k+1 modelo3g=modelo3_gamma(instancia[0],instancia[1],instancia[2],instancia[3],in stancia[4], instancia[5],instancia[7],instancia[8],instancia[9], instancia[10],instancia[11],am,maxA,J,t,instancia[14], pr,b,n,M,tepcof,instancia[13]) for v in (m): hoja.write(k,v,str(modelo3g[v-3])) k=k+1 modelo1p=modelo1_posiciones(instancia[0],instancia[1],instancia[2],instancia[ 3],instancia[4], instancia[5],instancia[7],instancia[8], instancia[10],instancia[11],am,maxA,J,t,instancia[14],M,tepcof,P,instancia[13 ]) for v in (m): hoja.write(k,v,str(modelo1p[v-3])) k=k+1 modelo2p=modelo2_posiciones(instancia[0],instancia[1],instancia[2],instancia[ 3],instancia[4], instancia[5],instancia[7],instancia[8],instancia[9], instancia[10],instancia[11],am,maxA,J,t,instancia[14], pr,n,M,tepcof,P,instancia[13]) for v in (m): hoja.write(k,v,str(modelo2p[v-3])) k=k+1 modelo3p=modelo3_posiciones(instancia[0],instancia[1],instancia[2],instancia[ 3],instancia[4], instancia[5],instancia[7],instancia[8],instancia[9], instancia[10],instancia[11],am,maxA,J,t,instancia[14], pr,b,n,M,tepcof,P,instancia[13]) for v in (m): hoja.write(k,v,str(modelo3p[v-3])) k=k+1 libro.close() """m=[3,4,5,6,7,8,9,10,11,12,13,14] f=1 for k in (1,5,9,13,17,21,25,29,33,37,41,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101, 105,107):