2009-06-23 10 views
10

Tenemos una aplicación que requiere la asignación de trabajos a recursos. Los recursos tienen una serie de atributos que definen su idoneidad para un trabajo en particular: algunos son preferencias, otros son restricciones difíciles (toda la variedad de miembros, por ejemplo, "recurso A es adecuado para trabajos con color X, Y o Z").Algoritmos de optimización de colas de trabajos

los recursos tienen un costo asociado con ellos (la duración que pasan en línea) Tenemos la capacidad de reclutar recursos -. esto toma una cantidad de tiempo variable podemos reclutar para un intervalo de tiempo fijo

..

Para dar una idea de la escala: habrá alrededor de 20 recursos en un momento dado, 100 trabajos sobresalientes. La finalización de los trabajos tarda de 5 a 15 segundos. La contratación de un recurso toma alrededor de 1-2 minutos, y podemos reclutar desde 1 30 minutos de tiempo (se permite volver a reclutar). No tenemos mucho cara a cara en los trabajos que se envían, tal vez unos pocos segundos.

El objetivo es completar trabajos con el menor costo (uso de recursos) para una latencia promedio determinada (tiempo de finalización del trabajo).

Agradecería consejos sobre algoritmos, bibliotecas de software o enfoques para resolver este problema.

+0

Una nota sobre los valores numéricos anteriores, no son restricciones duras, sino promedios. – sehugg

+0

Ah, y los trabajos tienen prioridades definidas (solo unos pocos). Voy a callarme ahora :) – sehugg

+0

No entiendo completamente. ¿La "latencia" significa el tiempo de espera del trabajo o la capacidad de recursos no utilizados? Si el primero, simplemente recluta todos los recursos que puedas tener. Si es el último, recluta solo 1 recurso por restricción difícil para su idoneidad. ¿Falta alguna pieza o simplemente estoy malinterpretando el problema? –

Respuesta

2

Puede que desee examinar el problema knapsack problem o el bin packing ya que, en principio, son similares a lo que está tratando de hacer aquí.

En la descripción de su problema, menciona que el objetivo es completar trabajos con la latencia más baja. Si ese es realmente su único objetivo, entonces la solución es simple: contrate todos los recursos disponibles. Muchos de ellos estarán inactivos la mayor parte del tiempo, pero prácticamente garantiza la latencia más baja posible.

Sospecho que su objetivo real es minimizar tanto la latencia como los recursos inactivos tanto como sea posible, por lo que siempre habrá un equilibrio entre la latencia y los recursos desperdiciados en juego aquí.

+0

Sí, no dejé claro que los recursos tienen un costo asociado con su tiempo en línea. Lo siento. – sehugg

0

Lo vería de esta manera ... no estoy seguro si cubre todo.

1) Un "recurso" en realidad podría ser visto como un "centro de trabajo". Cuantos centros de trabajo tiene para trabajar en "trabajos" es relativo a quién inicia sesión en el sistema.

2) Asignar recursos por tiempo de espera - cuanto más tiempo hayan estado esperando un trabajo, más alto deberían estar en la lista para la próxima solicitud. De esa forma, nadie se enfría o se ralentiza. Tendrá que encontrar y establecer un umbral por el cual (en relación con los recursos y trabajos). Puede decidir si desea que haga clic para recoger su siguiente trabajo, o para el sistema para obtener automáticamente una entre dos trabajos

3) Configuración de una cola de planificación de tareas - No sé si es relevante, pero puede haber trabajos de alta/baja prioridad, etc. Necesita un conjunto de trabajos, enumerados "por orden de ataque". Cada trabajo en el cronograma de trabajo puede pasar por las diferentes etapas para que sepa dónde está todo y saber cuándo ha terminado para pasar al siguiente. El planificador de tareas buscará los recursos disponibles y los asignará a los trabajos en el cronograma. Es probable que esto sea la mayoría de los cerebros de su sistema de programación.

Sólo espero que no está la construcción de un centro de llamadas salientes: P

+0

uhm ... 2)? el frío se ralentiza? ¿Estamos hablando de personas reales? Pensé que esto se trata de que los procesos de computación sean los trabajadores que realizan "algún trabajo" (por ejemplo, algo en línea grep) – jitter

+0

Jas tiene razón, los recursos se enfrían. La aplicación inicial es de uso humano, aunque este algoritmo también se aplica a las máquinas (reclutamiento == staging new virtual server) – sehugg

+0

por cierto, no es un centro de llamadas salientes;) – sehugg

1

Esto se siente como un par de cosas: lote económico, el balance de costo de contratación por adelantado con el coste de ejecución; un LP o IP, minimizando una fórmula para el costo total sujeto a varias restricciones; y luego están las distribuciones de probabilidad (tiempo para reclutar, ¿se requieren recursos de trabajo?), lo que lo convierte en algo estocástico.

Suena suficientemente complejo que, si lo hiciera, probablemente configuraría una simulación. El sistema no parece demasiado complicado para hacerlo, o demasiado oneroso matemáticamente para ejecutarse en grandes cantidades de iteraciones o tiempo de ejecución prolongado, por lo que puede obtener resultados bastante estables y útiles.

+0

John, gracias por el comentario, ahora tengo cosas nuevas y viejas para Google;) El problema del reclutamiento parece en gran medida un problema de predicción, ya que cuando recité los recursos, el tiempo de finalización del trabajo deseado ha pasado. La única manera que conozco para resolver los problemas de predicción es "ir largo" :) Creo que la parte que se puede optimizar está haciendo el mejor uso posible de los recursos disponibles, y eso me parece una tarea difícil. La simulación es probablemente el camino a seguir. – sehugg

+0

El proceso de Poisson parece estar allí también en algún lugar ... – sehugg

+0

Deberá configurar algún tipo de heurística para la contratación, obviamente, en función de la demanda anticipada, la capacidad actual disponible, el costo inicial del reclutamiento y el costo para llevar tiempo de recursos no utilizados, etc. Eso es lo bueno de una simulación: la configura, luego prueba varios heurísticos hasta que obtenga uno que parezca de bajo costo. –

0

No conozco la literatura sobre problemas como este. Supongo que hay algunos, sin embargo, ya que la teoría de colas es una gran área académica, y esto no suena como una situación ridículamente artificial. Eso sí, el hecho de que te preocupes por la latencia promedio, en lugar de la latencia del peor de los casos o la latencia del percentil N, podría ponerte en minoría.

Mi primer instinto es que, dado que parece que hay muchos trabajos disponibles, una buena solución tendría varios trabajadores "flexibles" empleados continuamente. Este es un conjunto de trabajadores que, entre ellos, puede completar la mayoría de los tipos de trabajos comunes con una latencia aceptable. Cuanto menor sea el nivel de latencia, más recursos habrá en este conjunto y más tiempo pasarán inactivos. Además, cuanto más "ráfaga" sea su entrada (suponiendo que las ráfagas sean impredecibles), más tiempo inactivo necesitará para evitar una alta latencia durante las ráfagas.

A continuación, en dos ocasiones se contratan trabajadores "especializados" adicionales:

1) Un raro tipo de trabajo en el que viene el conjunto actual de contrataciones sólo puede manejar a un costo más alto o nada en absoluto. Así que contratas (hablando en términos generales) a cualquiera que pueda cambiarlo y luego haces la mayor cantidad posible del resto de tu cola.

2) No existe tal trabajo, pero se ve la oportunidad de contratar a alguien que resulta ser capaz de tomar una combinación de trabajos de la fila actual, y hacerlos más baratos que sus empleados actuales, pero sin salir tus contrataciones actuales inactivas. Entonces contratas ese recurso.

En cuanto al algoritmo real: es casi seguro que no sea computacionalmente factible encontrar la mejor solución, por lo que la respuesta correcta depende de los recursos de procesamiento y de que está viendo la heurística y la solución de problemas parciales. Mientras que todos los que contrates estén ocupados, y no puedes contratar a nadie más sin causar un tiempo de inactividad significativo en algún momento en el futuro, probablemente estés cerca de una buena solución, y en algún lugar cerca de la "mayor explosión por cada dólar". "punto de la latencia/costo de intercambio. Contratar más recursos después de eso da rendimientos decrecientes, pero eso no significa que no esté dispuesto a hacerlo por una latencia específica y/o un presupuesto específico.

Pero depende de cómo sean los trabajos entrantes: si tiene un recurso que solo puede hacer un tipo de trabajo y ese trabajo solo se realiza una vez al día/semana/año, entonces es mejor contratarlo una vez un día que esperar hasta que tenga suficiente de ese trabajo para llenar su mínimo horario posible (que es por lo que los bomberos pasan la mayor parte de su tiempo jugando juegos de cartas, mientras que los mecanógrafos pasan la mayor parte de su tiempo escribiendo. Siempre hay suficiente tipeo para mantener al menos uno mecanógrafo ocupado, pero los incendios son raros. Además, no queremos la solución de "más explosión por cada dólar" para los incendios, queremos una latencia menor que eso). Por lo tanto, probablemente haya oportunidades para ajustar el algoritmo para su conjunto particular de recursos y patrón de trabajos entrantes, si está resolviendo una instancia particular del problema en lugar de escribir un software de programación general.

Además, presumiblemente si los recursos son humanos, no se puede garantizar que la contratación tenga éxito.No se quedarán todo el día sentados solo cobrando cuando sucede que hay trabajo minuto a minuto, ¿o sí?

+0

Gracias por la publicación, buenas ideas. Creo que la situación de contratación es interesante, porque desea contratar "generalistas" que tengan la mejor oportunidad de resolver los trabajos más próximos, en lugar de "especialistas" que hacen un mejor trabajo en algunos trabajos, pero no pueden cumplir otros. Casi me preocupa que mi problema sea demasiado general :) Y estoy preocupado por la latencia del peor de los casos, mi instinto me dice que sería intratable hacerlo de esa manera. – sehugg

0

Este problema se puede ver como un problema de optimización lineal, por lo que this debería ser un comienzo. He usado este library, pero tiene muchas otras cosas, por lo que puede ser excesivo. En cambio, no es difícil desarrollar su propia biblioteca, this book tiene un buen capítulo sobre LP.

0

pregunta impresionante !!

Me gustaría ver la programación dinámica, la optimización lineal y la teoría de colas. Desafortunadamente, no hay una manera muy fácil para mí de responder estas cosas. No tengo la experiencia matemática necesaria para darte una respuesta sólida y óptima para estas cosas.

Sin embargo, si está interesado en tales cosas, esto suena como una oportunidad para obtener una solución buena, aunque no óptima, utilizando un algoritmo de inteligencia artificial. Recomendaría un algoritmo genético o un anulador simulado. Cualquiera de estos no tardará mucho en codificar. La idea es que elija entradas válidas y aleatorias, y pueda modificar estas posibles soluciones, convirtiéndolas en mejores (o seleccionando nuevas automáticamente) a medida que pasa el tiempo. Estos son un buen compromiso entre obtener respuestas óptimas y gastar para siempre el código y demostrar la corrección.

0

Esto se parece mucho a Real-Time Operating System Programación. Wikipedia detalla algunos de los algoritmos que se utilizan:

  • programación Cooperativa
    • Round-robin
  • programación preventiva
    • prioridad fija la programación de suscripción preferente, una implementación de rebanada de tiempo preventivo
    • sección crítica planificación expulsora
    • tiempo estático programación
  • fecha más temprana para Primera aproximación
  • programación avanzada mediante el estocástico y MTG
+0

Esto es cierto, pero averiguar el horario es la parte difícil aquí, no simplemente elegir el algoritmo de programación que se utilizará. –

0

Unos pocos pensamientos:

  • ¿hay grupos de trabajos que pueden ser agrupados, todos tienen los mismos requisitos básicos?
  • hay gente que también pueden ser grupos juntos - todos tienen las habilidades básicas

Si es así, lo que puede reducir algo de la complejidad desde el primer momento y luego usar algún tipo de medias ponderadas para las preferencias. Además, cuando reclutas, desde el min. Puedes reclutar durante 30 minutos y, suponiendo que tengan un costo mayor, probablemente quieras asegurarte de que tengan los niveles de utilización más altos.

Aquí hay algunos artículos que pueden ayudar:

Cuestiones relacionadas