Articulo de referencia

Problema de selección de actividades

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...

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 if j o s jf 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 S

Explicació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.

  • A{\displaystyle A}es una matriz que contiene las actividades .
  • s{\displaystyle s}es una matriz que contiene las horas de inicio de las actividades enA{\displaystyle A}.
  • F{\displaystyle f} es una matriz que contiene los tiempos de finalización de las actividades enA{\displaystyle A}.

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 actividadesA{\displaystyle A}utilizando los tiempos de finalización almacenados en el arrayF{\displaystyle f}Esta operación se puede realizar enO(norteregistronorte){\displaystyle O(n\cdot \log n)}tiempo, 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 conjuntoS{\displaystyle S}para almacenar las actividades seleccionadas y lo inicializa con la actividadA[1]{\displaystyle A[1]}que tenga el tiempo de finalización más temprano.

Línea 5: Crea una variablek{\displaystyle k}que realiza un seguimiento del índice de la última actividad seleccionada.

Línea 9: Comienza a iterar desde el segundo elemento de ese array.A{\displaystyle A}hasta su último elemento.

Líneas 10,11: Si la hora de inicios[i]{\displaystyle s[i]}delith{\displaystyle ith}actividad (A[i]{\displaystyle A[i]}) es mayor o igual que el tiempo de finalizaciónF[k]{\displaystyle f[k]}de la última actividad seleccionada (A[k]{\displaystyle A[k]}), entoncesA[i]{\displaystyle A[i]}es compatible con las actividades seleccionadas en el conjuntoS{\displaystyle S}y por lo tanto se puede agregar aS{\displaystyle S}.

Línea 12: El índice de la última actividad seleccionada se actualiza a la actividad recién agregada.A[i]{\displaystyle A[i]}.

Prueba de optimalidad

DejarS={1,2,,norte}{\displaystyle S=\{1,2,\ldots ,n\}}Sea el conjunto de actividades ordenadas por tiempo de finalización. Suponga queAS{\displaystyle A\subseteq S}es una solución óptima, también ordenada por tiempo de finalización; y que el índice de la primera actividad en A esk1{\displaystyle k\neq 1}, es decir, esta solución óptima no comienza con la elección voraz. Demostraremos queB=(A{k}){1}{\displaystyle B=(A\setminus \{k\})\cup \{1\}}, que comienza con la elección codiciosa (actividad 1), es otra solución óptima. Dado queF1Fk{\displaystyle f_{1}\leq f_{k}}y 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,|A|=|B|{\displaystyle |A|=|B|}, 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, entoncesA=A{1}{\displaystyle A^{\prime }=A\setminus \{1\}}es una solución óptima al problema de selección de actividadesS={iS:siF1}{\displaystyle S'=\{i\in S:s_{i}\geq f_{1}\}}.

¿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 unaO(norte3){\displaystyle O(n^{3})}solución. Esto se puede optimizar aún más considerando que para cada conjunto de actividades en(i,j){\displaystyle (i,j)}, podemos encontrar la solución óptima si hubiéramos conocido la solución para(i,t){\displaystyle (i,t)}donde t es el último intervalo no superpuesto con j en(i,j){\displaystyle (i,j)}Esto produce unO(norte2){\displaystyle O(n^{2})}solución. Esto se puede optimizar aún más considerando que no necesitamos considerar todos los rangos.(i,j){\displaystyle (i,j)}pero en cambio solo(1,j){\displaystyle (1,j)}. El siguiente algoritmo produce, por lo tanto, unO(norteregistronorte){\displaystyle O(n\log n)}solució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

  1. Programación dinámica con introducción a la selección ponderada de actividades.
  • Problema de selección de actividades