Enunciado
Considere el proyecto cuyo cuadro de prelaciones, duraciones normal y tope (semanas) y coste unitario de reducción CUR (k€/semana) se adjunta. Las actividades con CUR infinito no pueden acelerarse. Se quiere reducir la duración del proyecto en 3 semanas con el mínimo sobrecoste.
- Calcule la duración normal del proyecto, construya la matriz de caminos \(R\) y la duración de cada ruta.
- Aplique el algoritmo de Ackoff-Sasieni para reducir 3 semanas y obtenga el sobrecoste total.
- Plantee el problema como un programa lineal: variables \(x_i\) = semanas que se acorta la actividad \(i\); minimizar \(\sum_i CUR_i\, x_i\) sujeto a que ninguna ruta supere la duración objetivo, \(R\,(d - x) \le T_{obj}\), y \(0 \le x_i \le d_i - d_i^{tope}\). Resuélvalo con
scipy.optimize.linprog.
- Compare las dos soluciones. ¿Puede el algoritmo voraz ser peor que el óptimo? ¿Por qué el programa lineal da aquí soluciones enteras?
Resolución
Apartado 1
- Calcule la duración normal del proyecto, construya la matriz de caminos \(R\) y la duración de cada ruta.
Cálculo de los tiempos tempranos y tardíos de los sucesos y de las holguras totales paso a paso. El primer paso muestra el grafo resuelto; a partir del siguiente se calcula desde el principio (avance con los botones):
Apartado 2
- Aplique el algoritmo de Ackoff-Sasieni para reducir 3 semanas y obtenga el sobrecoste total.
Ackoff-Sasieni acorta A (1), D (2) con un sobrecoste de 16 k€; duración 27.
Apartado 3
- Plantee el problema como un programa lineal: variables \(x_i\) = semanas que se acorta la actividad \(i\); minimizar \(\sum_i CUR_i\, x_i\) sujeto a que ninguna ruta supere la duración objetivo, \(R\,(d - x) \le T_{obj}\), y \(0 \le x_i \le d_i - d_i^{tope}\). Resuélvalo con
scipy.optimize.linprog.
Cada fila de \(R\) es una ruta; \(R\,d\) son las duraciones de las rutas y \(R\,x\) lo que se acorta cada una. La restricción \(R\,(d - x) \le T_{obj}\) se escribe como \(-R\,x \le T_{obj} - R\,d\) para linprog (que exige la forma \(A x \le b\)).
| x (Ackoff) |
1.0 |
0.0 |
0.0 |
2.0 |
0.0 |
0.0 |
0.0 |
0.0 |
0.0 |
| x (PL) |
0.0 |
0.0 |
0.0 |
2.0 |
0.0 |
1.0 |
0.0 |
0.0 |
0.0 |
| CUR |
6.0 |
inf |
8.0 |
5.0 |
3.0 |
6.0 |
7.0 |
inf |
inf |
La programación lineal acorta D (2), F (1) con sobrecoste 16 k€; todas las rutas quedan en como mucho 27 semanas (objetivo 27).
Apartado 4
- Compare las dos soluciones. ¿Puede el algoritmo voraz ser peor que el óptimo? ¿Por qué el programa lineal da aquí soluciones enteras?
Aquí las dos soluciones cuestan lo mismo: el algoritmo voraz ha acertado. No siempre es así: decide semana a semana y no revisa decisiones anteriores, por lo que puede ser más caro que el óptimo cuando una actividad acortada pronto deja de ser útil al cambiar las rutas críticas. Aquí el PL ha dado una solución entera: con datos enteros suele ocurrir, pero no está garantizado (la matriz de caminos no es en general totalmente unimodular); si hiciera falta, habría que exigir x entera con un programa entero, que linprog no resuelve. En todo caso el óptimo del PL es una cota inferior del coste de cualquier reducción entera.