PrEDA: minimizando tiempo en el sistema

GanttLa gestión de los proyectos es la clave: puede marcar la diferencia entre el éxito o el desastre. La gestión de las tareas no se puede hacer de cualquier forma. Por esto que se han estudiado y se han establecido muchas estrategias. No cualquier software puede ser un buen gestor de proyectos. Por esto que existen estudios que lo integran, técnicas de programación.. y sobretodo en informática, que existen multitud de estrategias, ya que dentro de los ordenadores esto se aplica constantemente.

Los pasos clásicos a seguir son los siguientes:

  • Se establecen las tareas, fijando especificaciones.
  • Se estudian bien los tiempos que va a llevar cada tarea.
  • Se establece la estrategia para proceder.
  • Se resuelve el órden, con lo cual, aquí se obtienen las fechas de finalización de cada tarea y el tiempo total.
  • Se ejecuta el proyecto.

Como es obvio, en el primer paso se cierran especificaciones y cualquier modificación posterior invalida el algoritmo, y hay que recalcular todo.

A modo de code-kata traigo hoy una estrategia voraz para organizar un proyecto con el objetivo de minimizar el tiempo de espera de las tareas en el sistema. Suponiendo que todas las tareas son igual de importantes, se trata de hacer que esperen en total lo mínimo posible. Se trata de una estregia voraz porque simplemente se elige la siguientes tareas que menos tiempo se tarde en terminar, sin rectificar ni volver atrás. Así se terminarán primero las que menos se tarde, y más rápido se irán entregando las tareas. Otra cosa es el beneficio o la importancia que pueda tener cada tarea, pero para esto hay otro algoritmo 😉

Al grano, el código

<?php

define('NUMBER_OF_TASKS', 30);

for ($i = 0; $i < NUMBER_OF_TASKS; ++$i) { 
    $tasksTime[$i] = rand(1, 5); 
} 

$totalTimeClientsWaiting = printTasks($tasksTime);

echo 'Total time for each tasks waiting to finalize: '.$totalTimeClientsWaiting.PHP_EOL; 
asort($tasksTime); 
echo 'After shorting, the order to do tasks to minize time in system is:'.PHP_EOL;

$totalTimeClientsWaiting = printTasks($tasksTime); 

echo 'Total time for each tasks waiting to finalize: '.$totalTimeClientsWaiting.PHP_EOL; 

function printTasks($tasksTime) { 
    $total = 0; 
    $tasksRemaining = count($tasksTime); 
    echo 'Tasks: '; 
    foreach ($tasksTime as $task => $time) {
        echo str_pad($task, 4, ' ');
        $total = $total + $time * $tasksRemaining;
        --$tasksRemaining;
    }
    echo PHP_EOL.'Time:   ';
    foreach ($tasksTime as $task => $time) {
        echo str_pad($time, 4, ' ');
    }
    echo PHP_EOL;

    return $total;
}

Es bien simple de resolver este algoritmo, simplemente se ordena el vector de tareas por orden creciente de tiempos de ejecución mediante asort. Luego para obtener el tiempo total de espera se va sumando acumulativamente lo que espera cada tarea en ejecutarse, más las restantes. El tiempo acumulado está en: $total = $total + $time * $tasksRemaining;

PrEDA minimizando tiempo en el sistema

Compartir..

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *