Nombre de taches simultanées

Nombre de taches simultanées - Algo - Programmation

Marsh Posté le 30-05-2008 à 11:27:34    

Bonjour,
 
Imaginons un "calendrier" contenant un ensemble de tâches pouvant s'étaler sur un certain temps, plusieurs tâches peuvent se chevaucher.
Je souhaite trouver un algorithme (certainement implémenté par la suite en vbs) qui puisse me donner le nombre maximum de tâches simultanées ayant eu lieu pendant une période donnée.
 
Données :
Fichier texte avec séparations par tabulation, chaque ligne représente une tâche et contient 2 champs : date_de_début et date_de_fin
Les lignes sont dans l'ordre chronologique des date_de_début.
 
Sortie
Fichier texte à une seule colonne, composé d'autant de lignes/tâches que le fichier source.  
Chaque ligne indique le nombre maximum de tâches simultanées ayant eu lieu durant la tâche de la même ligne du fichier source.
 
Exemple visuel:

Code :
  1. T1 -----
  2. T2   ------
  3. T3       -------
  4. T4       ---


Fichier source :

Code :
  1. 1   5
  2. 3   8
  3. 7   13
  4. 7   9


Fichier sortie :

Code :
  1. 2
  2. 3
  3. 3
  4. 3


 
Voila ...

Reply

Marsh Posté le 30-05-2008 à 11:27:34   

Reply

Marsh Posté le 30-05-2008 à 11:38:11    

en gros un diagramme de Gant , non ?

Reply

Marsh Posté le 31-05-2008 à 15:35:59    

Joel F a écrit :

en gros un diagramme de Gant , non ?


Ce n'est pas le but de mon algo, mais en quelque sorte ça y ressemble.
Je veux seulement savoir dans un période donnée (du 1er Juin au 1er Juillet par exemple), combien il y a eu de tâches simultanées au maximum (ne serait-ce que pendant une seconde).

Reply

Marsh Posté le 01-06-2008 à 11:19:46    

Tu fabriques un ensemble ordonné de couple de valeurs (date, entier).
L'ordre est donné par le champ date d'un couple.
Au départ, cet ensemble est vide.
Tu parcours tes données.  
Pour chaque date (debut ou fin) D:
Si ton ensemble contient déja un couple de la forme (D, n) alors
  Si D est une date de début, tu remplaces (D, n) par (D, n+1)
  Si D est une date de fin, tu remplaces (D, n) par (D, n-1)
Si ton ensemble ne contient pas de couple de la forme (D, n) alors
  Si D est une date de début, tu insères (D, 1) dans ton ensemble, en respectant l'ordre
  Si D est une date de fin, tu insères (D, -1) dans ton ensemble, en respectant l'ordre
(Fin de la premiere phase)
Une fois que c'est fait, tu initialise un entier N a 0
Tu parcours ton ensemble de couples dans l'ordre.
Pour chaque couple (d, n) rencontré
  tu remplaces (d, n) par (d, N+n)
  N = N+n
(Fin de la seconde phase et donc de l'initialisation de la structure de données)
Notes qu'une fois cette phase terminée, tu dois avoir N == 0, sinon, il y a une erreur qque part.
A ce stade, la suite des dates des couples est la suite des dates auxquelles le nb de taches change, et pour un couple (d,n), n est le nombre de taches a partir de la date d, jusqu'a la date suivante.
 
Pour déterminer le nombre maximal de taches entre les dates ddeb, dfin, il suffit de proceder ainsi:
Initialiser un entier tmax a 0
parcourir l'ensemble des couples (d, n), dans l'ordre.
  si d >= dfin fin du parcours de l'ensemble (ou d > dfin, ca dépend de comment tu considere ton pb)
  si  d < ddeb passer au couple suivant
  si n > tmax tmax = n et passer au couple suivant
A la fin de ce parcours, tmax contient le nombre maximal de taches entre les dates ddeb, dfin.
 
On peut optimiser ce qui est décrit précedemment, je ne l'ai pas fait pour que ce soit plus compréhensible.
A+,


Message édité par gilou le 01-06-2008 à 11:31:29

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 01-06-2008 à 14:44:49    

c'est pas plus simple d'avoir une collection des tâches (début,fin) triée par le début et pour chaque tâche tu comptes le nombre de tâches suivantes qui commence avant ou à la fin ?  

Reply

Marsh Posté le 01-06-2008 à 15:03:58    

Citation :

qui commence avant ou à la fin

déja la ce que tu veux dire n'est pas clair.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 01-06-2008 à 15:27:24    

gilou a écrit :

Citation :

qui commence avant ou à la fin

déja la ce que tu veux dire n'est pas clair.
A+,


 
suivant.debut <= courant.fin
 
"pas clair" semble être une définition qui doit être différente entre nous deux :D

Message cité 1 fois
Message édité par bjone le 01-06-2008 à 15:28:18
Reply

Marsh Posté le 01-06-2008 à 16:37:05    

bjone a écrit :


 
suivant.debut <= courant.fin
 
"pas clair" semble être une définition qui doit être différente entre nous deux :D


Ca collera pas pour donner le nombre max, ce que tu proposes a priori (ou alors il faut que tu indiques ta maniere de calculer ce nb max).
En particulier a cause des taches telles que suivant.debut <= courant.fin et suivant.fin <= courant.fin et sur des plages de temps disjointes.
A+,


Message édité par gilou le 01-06-2008 à 16:37:36

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 01-06-2008 à 19:46:12    

y'avais effectivement le cas de recouvrement avec une tache précédent qui pouvais chier, mais à priori avec:
pour chaque tâche: date début, date fin, compteur  recouvrement (initialisé à 1)
 
les tâches dans une collection ordonnée par date de début
pour chaque tâche "courante"
    pour chaque tâche "suivante" dont la date de début <= tâche "courante".date de fin
         incrémenter compteur de la tâche "courante"
         incrémenter compteur de la tâche "suivante"
 
si je me plante pas, tous les types de recouvrements devraient passer.


Message édité par bjone le 01-06-2008 à 19:48:11
Reply

Marsh Posté le 01-06-2008 à 21:47:00    

Merci beaucoup gilou, ton idée me semble très bonne :)

 

bjone, tu ne sembles pas utiliser ton "compteur de revouvrement".
J'avais pensé à ton idée initialement, mais ça ne marche pas, comme le précise gilou, si tu as plusieurs taches consécutives pendant une plus longue par exemple :

 

------
 --
     --
Ton algo donnerait 3 tâches simultanées pour la 1ère tâche, alors qu'il y en a au maximum que 2 simultanées.


Message édité par cybertom87 le 01-06-2008 à 21:47:45
Reply

Marsh Posté le 01-06-2008 à 21:47:00   

Reply

Marsh Posté le 01-06-2008 à 23:29:03    

exact :jap: autant pour moi

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed