El problema de selección de actividades es un problema de optimización combinatoria que consiste en seleccionar actividades no conflictivas para realizar dentro de un período de tiempo determinado , dado un conjunto de actividades, cada una marcada por una hora de inicio (s i ) y una hora de finalización (f i ). El objetivo es seleccionar el número máximo de actividades que puede realizar una sola persona o máquina , suponiendo que una persona solo puede trabajar en una actividad a la vez. Este problema también se conoce como problema de maximización de la programación de intervalos (ISMP, por sus siglas en inglés) , que es un tipo especial del problema de programación de intervalos más general .
Una aplicación clásica de este problema se da al programar una sala para múltiples eventos simultáneos , cada uno con sus propios requisitos de tiempo (hora de inicio y hora de finalización), y surgen muchos más dentro del marco de la investigación operativa .
Definición formal
Supongamos que existen n actividades, cada una representada por un tiempo de inicio s i y un tiempo de finalización f i . Se dice que dos actividades i y j no son conflictivas si s i ≥ f j o s j ≥ f i . El problema de selección de actividades consiste en encontrar el conjunto de soluciones máximo (S) de actividades no conflictivas, o más precisamente, no debe existir ningún conjunto de soluciones S' tal que |S'| > |S| en el caso de que múltiples soluciones máximas tengan tamaños iguales.
Solución óptima
El problema de selección de actividades destaca porque el uso de un algoritmo voraz para encontrar una solución siempre dará como resultado una solución óptima . A continuación se incluye un esquema en pseudocódigo de la versión iterativa del algoritmo y una demostración de la optimalidad de su resultado.
Algoritmo
Selector de actividad iterativo y voraz ( A , s , f ) :Ordenar A por tiempos de finalización almacenados en fS = { A [ 1 ]}k = 1n = A . longitudpara i = 2 a n :si s [ i ] ≥ f [ k ] :S = S U { A [ i ]}k = idevolver SExplicación
Línea 1: Este algoritmo se llama Selector de Actividad Iterativo y Codicioso , porque en primer lugar es un algoritmo codicioso y, además, es iterativo. También existe una versión recursiva de este algoritmo codicioso.
- es una matriz que contiene las actividades .
- es una matriz que contiene las horas de inicio de las actividades en.
- es una matriz que contiene los tiempos de finalización de las actividades en.
Tenga en cuenta que estos arreglos están indexados desde el 1 hasta la longitud del arreglo correspondiente.
Línea 3: Ordena en orden creciente de tiempos de finalización la serie de actividadesutilizando los tiempos de finalización almacenados en el arrayEsta operación se puede realizar entiempo, utilizando por ejemplo algoritmos de ordenación por fusión, ordenación por montículo o ordenación rápida.
Línea 4: Crea un conjuntopara almacenar las actividades seleccionadas y lo inicializa con la actividadque tenga el tiempo de finalización más temprano.
Línea 5: Crea una variableque realiza un seguimiento del índice de la última actividad seleccionada.
Línea 9: Comienza a iterar desde el segundo elemento de ese array.hasta su último elemento.
Líneas 10,11: Si la hora de iniciodelactividad () es mayor o igual que el tiempo de finalizaciónde la última actividad seleccionada (), entonceses compatible con las actividades seleccionadas en el conjuntoy por lo tanto se puede agregar a.
Línea 12: El índice de la última actividad seleccionada se actualiza a la actividad recién agregada..
Prueba de optimalidad
DejarSea el conjunto de actividades ordenadas por tiempo de finalización. Suponga quees una solución óptima, también ordenada por tiempo de finalización; y que el índice de la primera actividad en A es, es decir, esta solución óptima no comienza con la elección voraz. Demostraremos que, que comienza con la elección codiciosa (actividad 1), es otra solución óptima. Dado quey las actividades en A son disjuntas por definición, las actividades en B también son disjuntas. Dado que B tiene el mismo número de actividades que A , es decir,, B también es óptimo.
Una vez realizada la elección voraz, el problema se reduce a encontrar una solución óptima para el subproblema. Si A es una solución óptima para el problema original S que contiene la elección voraz, entonceses una solución óptima al problema de selección de actividades.
¿Por qué? Si no fuera así, elijamos una solución B ′ a S ′ con más actividades que A ′ que contenga la opción voraz para S ′. Entonces, al sumar 1 a B ′ se obtendría una solución factible B a S con más actividades que A , lo que contradice la optimalidad.
Problema de selección de actividades ponderadas
La versión generalizada del problema de selección de actividades implica seleccionar un conjunto óptimo de actividades no superpuestas de manera que se maximice el peso total. A diferencia de la versión sin ponderación, no existe una solución voraz para el problema de selección de actividades ponderadas. Sin embargo, se puede formular fácilmente una solución de programación dinámica utilizando el siguiente enfoque: [ 1 ]
Consideremos una solución óptima que contiene la actividad k . Ahora tenemos actividades que no se superponen a la izquierda y a la derecha de k . Podemos encontrar recursivamente soluciones para estos dos conjuntos debido a la subestructura óptima. Como no conocemos k , podemos probar cada una de las actividades. Este enfoque conduce a unasolución. Esto se puede optimizar aún más considerando que para cada conjunto de actividades en, podemos encontrar la solución óptima si hubiéramos conocido la solución paradonde t es el último intervalo no superpuesto con j enEsto produce unsolución. Esto se puede optimizar aún más considerando que no necesitamos considerar todos los rangos.pero en cambio solo. El siguiente algoritmo produce, por lo tanto, unsolución:
Selección ponderada de actividades ( S ) : // S = lista de actividadesordenar S por tiempo de finalizaciónopt [ 0 ] = 0 // opt[j] representa la solución óptima (suma de los pesos de las actividades seleccionadas) para S[1,2..,j]para i = 1 a n :t = búsqueda binaria para encontrar la actividad con tiempo de finalización <= tiempo de inicio para i// Si hay más de una actividad de este tipo, elige la que tenga la última hora de finalización.opt [ i ] = MAX ( opt [ i -1 ], opt [ t ] + w ( i ))devolver opt [ n ]Referencias
- ↑ Programación dinámica con introducción a la selección ponderada de actividades.
Enlaces externos
- Problema de selección de actividades
- Programación óptima