Algoritmo para encontrar un espacio libre de recursos

Estoy diseñando una aplicación de gestión de proyectos para una fábrica. Se espera que la aplicación produzca borradores de planes de proyecto. Para programar una tarea, la aplicación debe verificar tres condiciones:

  1. dependencia de tareas: no empieces antes,
  2. disponibilidad de la máquina, y
  3. horas de trabajo por turnos

Realizo un seguimiento de la participación de la máquina en machine_allocations mesa:

machine_allocations
+------------+--------------+-----------------+---------------+
| machine_id | operation_id | start_timestamp | end_timestamp |
+------------+--------------+-----------------+---------------+

Las horas de turno siguen un patrón.

Ahora, para encontrar la fecha y hora más temprana posible para una operación, estoy pensando en una función:

function earliest_slot($machine_id, $for_duration, $no_sooner_than) {
   // pseudo code
   1. get records for the machine in question for after $no_sooner_than 
   2. put start and end timestamps into $unavailable array
   3. add non-working times as new elements to the array
   4. in a loop find timeslots which are not in the array
   5. if a timeslot is found which is equal to or bigger than $for_duration, return that
}

Mi pregunta es, ¿es este un buen enfoque? ¿Hay formas más sencillas de hacer esto?

preguntado el 27 de agosto de 11 a las 23:08

1+ de mi parte por ser literalmente la primera pregunta sobre el tema que he visto en la etiqueta [gestión de proyectos] que en realidad usa la etiqueta correctamente. -

2 Respuestas

Es posible que encontrar la fecha y hora más temprana para una operación a la vez no le dé el mejor resultado. Considere el ejemplo en el que la operación A usa la máquina 1 durante mucho tiempo, la operación B usa la máquina 1 por un período corto y la operación C usa la máquina 2 por un período corto, pero la operación C debe realizarse después de B.

En este caso, es mejor programar B antes que A en la máquina 1, pero su enfoque no lograría esto. Por supuesto, escribir y usar software para administrar esto sería más difícil de lo que ha sugerido, por lo que debe decidir si el beneficio vale la pena el esfuerzo adicional.

Echa un vistazo a Planificación, Programación del taller de trabajo y Algoritmo de programación.

Primero debe pensar qué tipo de información puede recopilar sobre las tareas (como dependencias, prioridades, fechas límite) y luego decidir la mejor manera de reunirla.

Puede encontrar que un enfoque como el que propone es lo suficientemente bueno en su caso. Mi adición a su algoritmo propuesto sería ordenar la lista de operaciones de máquinas existentes para hacer la búsqueda más rápida, es decir, puede detenerse tan pronto como encuentre un momento en el que su operación se ajuste porque está garantizado que será el momento más temprano.

Una extensión relativamente simple sería un sistema de prioridad que le permite adelantar tareas de menor prioridad (lo que también puede requerir el ajuste de sus dependencias), pero los algoritmos más complicados considerarían múltiples tareas a la vez y tratarían de optimizar el resultado. Al final, todo se reduce a lo que es apropiado para su problema específico.

Respondido 28 ago 11, 15:08

Gracias por el buen consejo. Soy consciente de que el plan así elaborado no sería óptimo, y es por eso que lo llamo un draft plan. No le prometo al cliente que lo liberaría de la necesidad de ajustar los horarios a mano. Así que lo estoy abordando de una manera para mantener la complejidad bajo control. Entonces, para el valor de utilidad limitado Estoy planeando ofrecer, ¿encuentra que el algoritmo es lo más simple que puede ser? - Majid Fouladpour

Creo que el algoritmo es Suficientemente simple para que no importe. No pierda el tiempo buscando la solución más simple si tiene una solución simple, especialmente si sus requisitos pueden cambiar ... - Artelius

Otra pieza de muy buen consejo. Tienes razón, ¡será mejor que empiece a implementarlo! - Me acordaría de este último (lo prometo;)). - Majid Fouladpour

Eso depende de cuándo quieras planificar el trabajo. Si antes de comenzar a trabajar con las máquinas, puede hacerlo mediante un algoritmo Branch & Bound, o algo parecido (puede ser mediante programación dinámica). Si el trabajo tiene que planificarse cuando las máquinas están funcionando y no puede decir qué trabajos se realizarían, entonces para una solución óptima no puede contar (bueno, no puedo pensar en eso). ¿Mayby puso los próximos trabajos en la máquina con un tiempo máximo menor? Mayby una versión dinámica de Ford-Bellmas alg (si tiene un par de capas de producción). Difícil de decir. Haría un par de aproximaciones y determinaría que son las mejores. Puedes escribir un artículo sobre esto :)

Respondido 28 ago 11, 03:08

Creo que no leíste la pregunta correctamente. La pregunta es bastante específica: cómo implementar mejor la earliest_slot función. - svick

@neosatan gracias. Cada tarea debe planificarse en el primer momento posible; y posible aquí significa que debemos satisfacer las tres condiciones: (i) no comer el helado antes de comprarlo, (ii) la máquina que necesitamos debe estar libre durante la duración de la tarea, (iii) no establecer la tarea en un tiempo no laborable. - Majid Fouladpour

@svick Lo leí correctamente, pero cuando se trata de burlar el trabajo, toda la información que puede obtener es muy importante. En mi opinión, la pregunta no era precisa, así que pongo aquí una respuesta general. Artelius dio una muy buena respuesta, quería obtener más información. - pawel-kuznik

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.