2009-10-08 7 views
1

J'essaie de mettre en œuvre une application qui coordonne plusieurs utilisateurs qui planifient des ressources exclusives. Les données de planification doivent conserver une cohérence forte sur un réseau avec un seul nœud maître. Les ressources planifiées peuvent être quelque chose d'une salle de conférence à un travailleur sur un site de travail.Application de planification de ressources

Nous supposons que la salle de conférence ne peut pas être planifiée pour deux réunions à la fois et qu'un travailleur ne peut pas être sur deux sites de travail en même temps. La logique métier de l'application ne doit pas autoriser un utilisateur à "surbooker" une ressource. Ce que je n'arrive pas à comprendre, c'est comment représenter les données de sorte que si deux ou plusieurs utilisateurs fonctionnent simultanément sur le planning, et qu'il y ait des conflits, l'une des mises à jour s'annulera.

La seule solution que j'ai vu jusqu'ici est de suivre les intervalles de temps pour chaque ressource d'exclusion. Ainsi, si la salle de conférence est utilisée à intervalles de 5 minutes et qu'elle est programmée entre 9 h et 9 h 30, les créneaux horaires de 5 minutes correspondants pour 9 h à 9 h 30 renvoient VRAI, tandis que les créneaux non programmés retournent FAUX ou NUL. . La transaction DB extrait alors l'objet de la salle de conférence du magasin, vérifie tous les intervalles de temps et abandonne si la mise à jour est en conflit avec les intervalles de temps existants.

Cependant, cela semble être très grand, très rapide. Peut-être que cela pourrait être ramassé? En outre, l'un des objectifs de la conception est de prendre en charge la granularité variable, de sorte que certains objets seront programmés sur une base minute par minute alors que d'autres peuvent être sur une base quotidienne, et cette conception de données ne supporte pas très bien.

Actuellement, j'essaie d'implémenter ceci sur Google App Engine en utilisant Python, mais je serais vraiment intéressé de voir des solutions plus générales à ce problème. Tout ce que j'ai trouvé avec Googling est la planification des tâches récurrentes, ou des algorithmes qui effectuent des opérations ponctuelles pour construire automatiquement des horaires optimisés.

+0

Une autre solution possible consiste à stocker un "verrou" de ressource dans le magasin de données. puis demander aux clients d'acquérir un verrou de manière asynchrone avant de présenter la planification à l'utilisateur sous une forme accessible en écriture. Jusqu'à ce qu'un verrou soit acquis par le client, la planification est en lecture seule.Ceci sérialise efficacement les opérations et permet à la logique métier d'être déplacée vers le client, mais le problème sera alors de déterminer les limites supérieures de contention de ressources qui seraient acceptables. –

Répondre

3

Vous ne souhaitez effectuer le suivi que des heures de début et de fin pour chaque ressource d'exclusion. Le stockage de données dans votre problème est en fait la partie la plus facile - la partie hard (er) crée des requêtes pour rechercher des conflits dans les intervalles de temps.

Si ma logique est correcte après 21 heures d'attente, le code de pseudo suivant devrait vérifier les conflits de réunion.

# Set up your proposed meeting 
proposed.start = <thursday, 1pm> 
proposed.end = <thursday, 2pm> 

# Look for meetings that intersect with or straddle proposed meeting 
conflicts = <SELECT * FROM meeting WHERE 
      meeting.start BETWEEN proposed.start AND proposed.end OR 
      meeting.end BETWEEN proposed.start AND proposed.end OR 
      meeting.start <= proposed.start AND meeting.end >= proposed.end> 


if conflicts.length > 0: 
    # We have a conflict! 
+1

Malheureusement, le moteur de l'application ne prend pas en charge la requête que vous proposez. La partie la plus délicate est qu'elle ne permet que le filtrage des inégalités sur une propriété. En outre, je ne pense pas qu'il permette encore des requêtes OU. Vous pouvez contourner ceci (la plupart du temps) en décomposant la requête en trois parties - "meeting.start entre proposed.start AND proposed.end" et "meeting.end BETWEEN proposed.start AND proposed.end" sont tous deux valides tels quels. Mais la dernière clause devra être modifiée pour ne pas utiliser 2 filtres d'inégalité. http://code.google.com/appengine/docs/java/datastore/queriesandindexes.html#Restrictions_on_Queries –

+1

De peur que je ne sonne trop nitpicky, je tiens à ajouter que l'idée générale résout bien le problème sans les frais généraux de stockage données pour chaque emplacement possible pour chaque ressource possible. –

+0

Cette requête semble correcte, mais comme l'a indiqué Peter, il faudrait travailler pour utiliser la banque de données App Engine. Cela devrait être possible, mais je devrai m'y pencher. –

1

Pour optimiser automatiquement un calendrier d'une école ou une université (ou même d'autres problèmes) jeter un oeil sur les outils Java suivants:

TimeFinder, UniTime ou Drools Solver

Le problème avec l'interaction de l'utilisateur n'est pas aussi facile à résoudre que vous l'avez expliqué, car il pourrait y avoir d'autres violations de contraintes (les horaires peuvent être beaucoup plus compliqués). En premier lieu, je ne permettrais aux horaires que d'accéder aux données de l'horaire ou d'en modifier les données. Deuxièmement, je créerais une solution indépendante pour chaque calendrier, puis j'optimiserais cette solution avec les outils proposés ci-dessus. Les solutions peuvent ensuite être stockées dans la base de données et le calendrier peut les utiliser pour optimiser davantage le programme ou pour le comparer à d'autres solutions.

Questions connexes