[ALGO] Déterminer une date d'affichage

NiClouNiClou Membre

Hello,


Je me retrouve confronté à  un problème de dates et je ne sais pas par ou commencer mon analyse.


J'aimerais afficher un message à  mes utilisateurs en prenant en compte leurs préférences.


Ces préférences sont des périodes d'autorisations et/ou de refus.


 


Exclusion 1: 6 à  8h


Exclusion 2: 10 à  13h


Exclusion 3: 9 à  11h


Exclusion 4: 12 à  14h


 


Inclusion 1: 8h30 à  10h


Inclusion 2: 13h à  15h


Inclusion 3: 11h à  12h


 


Ma problématique est de trouver la prochaine date ou je pourrais afficher mon message qui correspond à  la condition suivante:


- Etre dans aucune des plages d'exclusions


(ET) - être dans l'une des inclusions.


 


Exemple:


- S'il est 7h, mon message s'affichera à  8h30.

- S'il est 10h, mon message s'affichera à  14h.


- S'il est 14h30, mon message s'affichera à  14h30. 


 


 


Merci d'avance pour vos conseils et pistes :)


Réponses

  • colas_colas_ Membre

    Sans considérer les questions de NSDate, je ferai une itération



    pour toutes les dates dispo postérieures à  maintenant,

    si (date Sélectionnée est ok) break ;

    fin pour toutes

    pour tester si un date Sélectonnée est ok, tu refais une itération :



    function dateOK(date)

    BOOL result = YES

    pour toutes dates interdites
    {
    si date est dans date interdite sélectionnée alors {result = NO ; break}
    }

    Comment as-tu structuré des données ? De combien de dates d'inclusion/d'exlcusion disposes-tu ?

  • CéroceCéroce Membre, Modérateur
    mai 2015 modifié #3

    Pourquoi les créneaux d'inclusions ne suffisent-ils pas ?


    On ne peut pas être à  la fois dans un créneau d'inclusion et d'exclusion.


  • Pour simplifier l'algorithme, ce que je ferais c'est créer une structure intermédiaire qui "normalise" les périodes d'inclusion/d'exclusion.


    Ce qui me paraà®t compliqué en l'occurrence c'est que :


    - les périodes d'exclusion peuvent se recouvrir entre elles


    - les périodes d'inclusion peuvent se recouvrir entre elles


    - les périodes d'inclusion et d'exclusion peuvent se recouvrir mutuellement


     


    Ce que j'appelle une structure "normalisée" c'est une structure dans laquelle les périodes d'un type ne se recouvrent plus.


    Par exemple avec ton exemple de périodes d'exclusion, je créerais une structure intermédiaire :


    - Exclusion 1' : 6 à  8h


    - Exclusion 2' : 9 à  14h (qui est la concaténation des périodes 2, 3 et 4)

    Bien sûr, il faudrait recalculer ces périodes "normalisées" à  chaque modification de l'ensemble des périodes d'origine

    Dans ton exemple, les périodes d'inclusion sont déjà  normalisées (1'=1, 2'=2 et 3'=3)

     

    Ensuite il faudrait avoir une structure qui contiennent les périodes d'inclusions expurgées des périodes d'exclusion. Ce qui donnerait :

    - Inclusion 1" : 8h30 à  9h

    - Inclusion 2" : 14h à  15h

    (La période Inclusion 3', disparaitrait car elle est totalement incluse dans la période d'exclusion 2')

     

    Du coup la recherche de la première date valide est beaucoup plus facile si on travaille sur les périodes d'inclusion normalisées et expurgées.

  • JivyJivy Membre

    Salut,


     


    Je suis sur le même projet mais côté Android, du coup j'ai la même problématique en Java.


     


     




    Sans considérer les questions de NSDate, je ferai une itération



    pour toutes les dates dispo postérieures à  maintenant,

    si (date Sélectionnée est ok) break ;

    fin pour toutes

    pour tester si un date Sélectonnée est ok, tu refais une itération :



    function dateOK(date)

    BOOL result = YES

    pour toutes dates interdites
    {
    si date est dans date interdite sélectionnée alors {result = NO ; break}
    }

    Comment as-tu structuré des données ? De combien de dates d'inclusion/d'exlcusion disposes-tu ?




     


    Du coup comment déterminer les dates dispo ? 


    Au niveau de la structure des données, on reçoit des règles de récurrences du serveur. A partir de ces règles (par exemple : tous les 1er lundi du mois, un mois sur deux) on traduit en plages horaires (inclusions ou exclusions). Une fois la liste de toutes les plages, on essaye de trouver la prochaine date disponible qui respecte les conditions.


    Au niveau du nombre de plages, cela peut varier de 1 à  plusieurs centaines selon la complexité.


     


     




    Pourquoi les créneaux d'inclusions ne suffisent-ils pas ?


    On ne peut pas être à  la fois dans un créneau d'inclusion et d'exclusion.




     


    Les créneaux d'inclusions et d'exclusions peuvent se chevaucher, comme dans l'exemple. Et on utilise inclusions et exclusions pour simplifier la règle de récurrence (par exemple si on veut afficher tous les 1er lundi du mois de 8 à  10h, la définition de cette règle est simple (en une règle c'est bon) alors que s'il fallait utiliser que des exclusions, il faudrait 3 règles d'exclusions.


     


     




     


    Pour simplifier l'algorithme, ce que je ferais c'est créer une structure intermédiaire qui "normalise" les périodes d'inclusion/d'exclusion.


    Ce qui me paraà®t compliqué en l'occurrence c'est que :


    - les périodes d'exclusion peuvent se recouvrir entre elles


    - les périodes d'inclusion peuvent se recouvrir entre elles


    - les périodes d'inclusion et d'exclusion peuvent se recouvrir mutuellement


     


    Ce que j'appelle une structure "normalisée" c'est une structure dans laquelle les périodes d'un type ne se recouvrent plus.


    Par exemple avec ton exemple de périodes d'exclusion, je créerais une structure intermédiaire :


    - Exclusion 1' : 6 à  8h


    - Exclusion 2' : 9 à  14h (qui est la concaténation des périodes 2, 3 et 4)

    Bien sûr, il faudrait recalculer ces périodes "normalisées" à  chaque modification de l'ensemble des périodes d'origine

    Dans ton exemple, les périodes d'inclusion sont déjà  normalisées (1'=1, 2'=2 et 3'=3)

     

    Ensuite il faudrait avoir une structure qui contiennent les périodes d'inclusions expurgées des périodes d'exclusion. Ce qui donnerait :

    - Inclusion 1" : 8h30 à  9h

    - Inclusion 2" : 14h à  15h

    (La période Inclusion 3', disparaitrait car elle est totalement incluse dans la période d'exclusion 2')

     

    Du coup la recherche de la première date valide est beaucoup plus facile si on travaille sur les périodes d'inclusion normalisées et expurgées.

     




     


    On y a penser mais le calcul des inclusions sans les plages d'exclusions pose problème, c'est sur ça qu'on bloque.


  • En première approximation (et en travaillant uniquement avec des Zones normalisées et ordonnées) :


     


    - Prendre la date de début (dd) de la première zone d'inclusion (ZI)


    - Déterminer si cette date de début est à  l'intérieur d'une zone d'exclusion (ZE)


    - Si c'est le cas, prendre la date de fin de la période d'exclusion (dd = fin(ZE))


    - Vérifier si (dd) est à  l'intérieur de (ZI)


    - Si ce n'est pas le cas la zone ZI est entièrement exclue, passer à  la zone d'inclusion suivante (reboucler tout en haut)


    - Si on arrive ici, on sait qu'on a une Zone d'inclusion expurgée qui démarre en dd, il faut déterminer la date de fin (df)


    - Comparer la date de fin (df) de la zone d'inclusion (ZI) avec la date de début (de) de la zone d'exclusion suivante (ZE+1)


    - Si df <= de, on peut créer une zone d'inclusion expurgée [dd – df]


    - Sinon, on crée une zone d'exclusion expurgée [dd - de], on fait dd = de et on reboucle à  la troisième ligne (pour prendre en compte le cas d'une zone d'inclusion qui serait scindée par des zones d'exclusion au milieu)

  • colas_colas_ Membre
    Les dates potentielles sont soit :


    - la date actuelle

    - une date de fin de période d'exclusion

    - une date de début de période d'inclusion


    Donc, tu iteres sur ces dates en prenant la première qui est bonne.
Connectez-vous ou Inscrivez-vous pour répondre.