Estoy trabajando en una aplicación de programación de trabajos interactiva. Dado un conjunto de recursos con los perfiles de capacidad/disponibilidad correspondientes, un conjunto de trabajos para ejecutar sobre estos recursos y un conjunto de restricciones que determinan la secuencia de trabajos y los tiempos de inicio/finalización más tempranos/más recientes para los trabajos. Quiero permitir al usuario mover manualmente trabajos alrededor. Básicamente, quiero que el usuario pueda "agarrar" un nodo de la red de trabajo y arrastrarlo hacia delante/atrás en el tiempo sin violar ninguna de las restricciones.Transformación de gráficos restringida en las aplicaciones de programación
La imagen muestra una configuración de ejemplo simple. El trabajo triangular al final denota el último tiempo de finalización para todos los trabajos, las líneas de conexión entre trabajos imponen un orden en los trabajos y las barras grises/verdes denotan disponibilidad de recursos y carga.
Puede arrastrar cualquiera de los trabajos para comprimir el programa. Tenga en cuenta que los trabajos cambiarán de longitud debido a los diferentes perfiles de capacidad.
He implementado un algoritmo de ad-hock que funciona. Sin embargo, todavía hay casos en los que fallará y violará algunas limitaciones. Sin embargo, dado que el horario de trabajo en taller es un campo bien investigado con muchos algoritmos y heurísticas para encontrar una solución óptima (o bastante buena) para el problema general NP-difícil, estoy pensando que las soluciones deberían existir para mi subconjunto más fácil. He analizado temas de programación de restricciones e incluso soluciones basadas en la física (cuerpos rígidos conectados mediante uniones estáticas) pero hasta ahora no he podido encontrar nada adecuado. ¿Alguna sugerencia/punteros/consejos/palabras clave de búsqueda para mí?
No entiendo el problema por completo, lo siento. ¿Por qué cambiarían las duraciones de los trabajos? ¿Qué quieres decir cuando dices agarrar y mover el nodo? ¿Es un trabajo un nodo? Gracias. –
La red como se muestra arriba se puede modificar a través de operaciones interactivas de arrastrar y soltar. Haga clic en un trabajo (los nodos en el gráfico con la etiqueta "trabajo") y muévalo a otro lugar. Dado que la duración del trabajo depende de la capacidad disponible (barras gris/verde), las longitudes de trabajo cambiarán durante el movimiento. – BuschnicK
Yo tampoco entiendo. ¿Es que quieres que otros trabajos se muevan para satisfacer un movimiento de trabajo en particular, digamos que si arrastras job032, job029 y job031 se reprograman para que job031 finalice antes de que comience job032? Si es así, deberá decirnos qué podemos hacer con los otros trabajos: mudarse a tiempo, cambiar recursos, etc. ¿Los recursos se comparten de forma simple (es decir, dos trabajos de trabajo en unidades que se ejecutan en el mismo recurso tardan 2 unidades de tiempo en finalizar)? –