πρόβλημα προγραμματισμού εργασιών

ψήφοι
8

Δουλεύω σε μια εφαρμογή όπου θα πρέπει να προγραμματίσετε αυτόματα θέσεις εργασίας για τα μέλη της σε ένα περιστρεφόμενο πρόγραμμα. Δεν είμαι πολύ καλός στο να εξηγεί τους κανόνες, τόσο εδώ είναι μερικά στοιχεία για να βοηθήσει:

Θέσεις: Ένας τίτλος θέσης εργασίας, με κανόνες, όπως κάθε Δευτέρα και Τετάρτη κάθε εβδομάδα.
Κατηγορίες: Μια σειρά από θέσεις
Ομάδες: Ένα άλλο σύνολο των θέσεων. Οι θέσεις της ίδιας ομάδας δεν μπορούν να αποδοθούν στα ίδια μέρα
Μέλη: Οι χρήστες αναλαμβάνουν θέσεις σε συγκεκριμένη ημερομηνία.

Για κάθε ημερομηνία του μήνα, τα μέλη αναλαμβάνουν θέσεις (τόσο σε αύξουσα σειρά). Εάν ένα μέλος έχει εκχωρηθεί σε μια θέση σε μια κατηγορία, την επόμενη φορά που μια θέση στην ίδια κατηγορία έρχεται το επόμενο μέλος αλφαβητικά (ή η αρχή της λίστας) παίρνει ανατεθεί π.χ..

Μέλη: Μ1, Μ2, Μ3, Μ4
θέσεις στην κατηγορία C1: P1, P2, P3
Μέλη σε θέση P1: Μ1, Μ2, Μ3, Μ4
Μέλη σε θέση P2: Μ1, Μ2, Μ3
Μέλη σε θέση P2: Μ1, Μ3, M4

Αν Μ1 έχει εκχωρηθεί για την P1, P2, αν θα επακολουθήσει, M2 θα ανατεθεί. Ένα πρόσθετο στρώμα της πολυπλοκότητας εισάγεται όπου και αν P3 έρχεται την επόμενη αντ 'αυτού, Μ3 παίρνει ανατεθεί. Το σύστημα πρέπει να παρακολουθείτε το γεγονός ότι Μ2 «παραλείπεται» και να εκχωρήσετε Μ2 επόμενη εάν είναι διαθέσιμο, στη συνέχεια, να εκχωρήσετε M4 επόμενη, ή περιμένετε μέχρι να πάρει σε μια θέση όπου Μ2 είναι διαθέσιμο (αυτό γίνεται επιπλέον πολύπλοκο όταν υπάρχουν πολλά «παραλείφθηκε «μέλη).

Ένα μέλος θα πρέπει επίσης να παραλείπεται αν έχει δηλώσει ότι δεν θα είναι διαθέσιμο κατά την ημερομηνία αυτή. Το σύστημα θα πρέπει να δοθεί προτεραιότητα στο παραλειφθεί μέλη, κατά κάποιο τρόπο την αναγνώρισή τους όταν έρχονται και, στη συνέχεια, μεταβείτε στο επόμενο λογικό πρόσωπο στη λίστα. Παράκαμψη ισχύει και για τις ομάδες λόγω ημερομηνία συγκρούσεις.

Έχω ήδη μια προσωρινή [και βρώμικο] λύση που καταλαβαίνω πια, ακόμη κι αν έχω πολλά σχόλια σε αυτό που εξηγούν κάθε βήμα. αδυναμίες του είναι στην αντιμετώπιση των παραλειφθεί μέλη.

Εάν επρόκειτο να κωδικοποιήσει αυτό τον τρόπο μπορείτε να κάνετε για αυτό; Είμαι εφαρμογή αυτή σε PHP, αλλά ψευδοκώδικα θα λειτουργεί τόσο καλά.

Δημοσιεύθηκε 19/12/2009 στις 11:20
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
1

uff. εγώ δεν θα ακολουθήσει την περιγραφή, αλλά σε παρόμοιες περιπτώσεις έχω χρησιμοποιήσει SQL για να λύσει αυτό το είδος του προβλήματος. αν χρησιμοποιείτε php υποθέτω έχετε SQL διαθέσιμο.

αυτό που θα πρότεινα να κάνει είναι να βρεθεί ένας τρόπος για την αποθήκευση αυτών των πληροφοριών σε ένα σύνολο πινάκων και στη συνέχεια να εργάζονται έξω ό, τι sql ερώτημα σας δίνει την απάντηση που θέλετε. αρκετά συχνά είναι πολύ πιο απλό να το κάνουμε σε SQL από ό, τι σε μια διαδικαστική γλώσσα.

για την παραλειφθεί μέρος, για παράδειγμα, μπορεί να έχετε μια στήλη που καταγράφει όταν κάποιος τελευταία ανατεθεί, και στη συνέχεια, προκειμένου με αυτό (ώστε να μπορείτε να επιλέξετε το πρόσωπο που δεν έχει εκχωρηθεί για μεγάλο χρονικό διάστημα). Εναλλακτικά, θα μπορούσατε να έχετε τον αριθμό των φορών που παραλείπονται ως στήλη και την τάξη με αυτό.

Απαντήθηκε 19/12/2009 στις 13:09
πηγή χρήστη

ψήφοι
6

Η λύση μου: Χρειάζεται μια ουρά προτεραιότητας (η οποία είναι διαθέσιμη στην PHP κάτω SplPriorityQueue). Η ουρά προτεραιότητας που δίνει στοιχεία με προτεραιότητα φθίνουσα (κατατάσσονται σύμφωνα με τις αξίες, η μικρότερη τιμή έχει την υψηλότερη προτεραιότητα).

Κάθε μέλος παίρνει μια αντιστοιχισμένη τιμή. Αυτή η τιμή είναι ένας αριθμός ASCII με n ψηφία (μπορείτε να χρησιμοποιήσετε 8 ψηφία για λόγους ευκολίας), συμπληρώθηκε με μηδενικά έως n θέσεις. Μετά από αυτό μπορείτε να προσαρτήσει το όνομα. Μπορείτε επίσης να προσθέσετε σε κάθε μέλος τις διαθέσιμες θέσεις

Έτσι (n = 5):

  • τιμή Μ1: 99999Albert P1, P2, P3
  • αξία M2: 99999Susi P1, P2
  • αξία Μ3: 99999Bob P1, P3

Αυτό το καθιστά εύκολο να ταξινομήσετε τα μέλη κατά προτεραιότητα και το όνομα.

Παρασκευή:

Μια ηλιόλουστη μέρα. Είστε ανάκτηση των αποδίδεται θέσεις και μια κατηγορία για μια δεδομένη ημέρα. Κάθε μέλος έχει φορτωθεί σε έναν μακρύ κατάλογο. Κάθε μέλος που δεν εμφανίζεται στην εργασία δεν είναι φορτωμένο, αλλά παίρνει την αξία του μειώθηκε κατά μείον δύο. Bob δεν είναι εδώ, τόσο νέα τιμή του παίρνει 99997Bob. Αυτό σημαίνει ότι ο Bob θα επιλεγεί αυτόματα την επόμενη φορά. Όλα τα άλλα μέλη παίρνουν αξία τους μειώθηκε κατά μείον ένα.

Οι θέσεις εκχωρηθεί για μια συγκεκριμένη ημέρα χαρτογραφηθεί (χρήση SplObjectStorage):

Ρ 1-> Μ1, Μ2, Μ3, Μ4 κλπ Ρ2-> κ.α.

Ο χάρτης περιέχει μόνο τις θέσεις που πρέπει να ανατεθεί αυτή η ημέρα. Μετά το

Φίλτρο: Θα πρέπει να αναζητήσετε τις ομάδες και να διαγράψετε οποιαδήποτε θέση στο χάρτη η οποία δεν μπορεί να αποδοθεί αυτή την ημέρα. Περιγραφή Η ομάδα σας είναι λίγο ασαφές.

Αναθέτω:

  • Μπορείτε να επιλέξετε τη θέση για την εκχώρηση
  • Πάρτε τον κατάλογο των μελών που μπορεί να γεμίσει τη θέση
  • Αφαιρέστε διαθέσιμο μέλη από τη λίστα και τα βάζουμε στην ουρά προτεραιότητας
  • Εκχώρηση τη θέση με εκχύλισμα () από ουρά προτεραιότητας (σωστή αντιστοίχηση γίνεται automaticially). Κάθε μέλος που έχει εκχωρηθεί θέληση παίρνει την αξία του αυξάνεται κατά ένα (Έτσι, τα επίπεδα μείωσης και αύξησης αν είστε εδώ και την εργασία). Εάν είστε εδώ και να τοποθετηθεί σε θέση για οποιοδήποτε λόγο, μπορείτε να πάρετε μια μικρή ποινή του ενός. Σας Αν δεν είναι εδώ, μπορείτε να πάρετε μια ποινή των δύο.
  • Μετά την ολοκλήρωση, βάλτε τα υπόλοιπα μέλη του καταλόγου και πάλι, καταργήστε την PQueue και συνεχίστε με την επόμενη αποστολή.

προειδοποιήσεις:

  • Πρέπει να είστε προσεκτικοί ότι πάντα υπάρχουν αρκετοί άνθρωποι για μια θέση.
Απαντήθηκε 02/01/2010 στις 16:10
πηγή χρήστη

ψήφοι
0

Αυτό που καταλαβαίνω είναι ότι υπάρχουν μέλη του «m» και «n» θέσεις.

Κατηγορία: μια ομάδα θέσεις - μέλος που έχει εκχωρηθεί μία θέση στην κατηγορία, δεν μπορεί να έχει άλλο;

Ομάδα: ομάδα θέσεων - θέσεις στην ίδια ομάδα πρέπει να ανατεθεί σε διαφορετικές ημέρες.

Το τελευταίο πράγμα, μια θέση έχει μια λίστα με τα μέλη που μπορούν να το γεμίσει.

Κοιτάζοντας αυτό από ένα σημείο δομή των δεδομένων, βάλτε τα μέλη σε μια συνδεδεμένη λίστα - κάθε μέλος πρέπει να έχει συμπληρωματικό κατάλογο [θέσης, ημέρα] ότι τελικά ανατεθεί. Στη συνέχεια, για κάθε θέση, έχουν μια λίστα με αναφορές στα μέλη που μπορεί να γεμίσει αυτή τη θέση. Εφαρμογή κατηγορίες ως μια άλλη λίστα με τις αιτήσεις για την θέση στην οποία κατηγορίες είναι σε.

Η πραγματική ανάθεση: έχει ένα μετρητή ημέρα = 0, και επαναλαμβάνεται σε τις θέσεις. Για κάθε θέση P, επαναλήψεις μέσω των μελών που μπορούν να το γεμίσει. Ένα μέλος M μπορεί να καλύψει τη θέση, εάν:

  • Κάθε θέση έχει γεμίσει Ρ2 δεν μοιράζονται μια κατηγορία με τον Π
  • Κάθε θέση έχει γεμίσει P2 με την ημέρα = daycounter δεν μοιράζονται μία ομάδα με σ

Αν μπορεί να την πλήρωση της θέσης, η [θέση, ημέρα] ζεύγους προστίθεται στο μέλος, και ο κόμβος του μέλους μετακινείται στο τέλος της λίστας (γι 'αυτό και οι αναφορές είναι απαραίτητες - όλες οι αναφορές εξακολουθούν να ισχύουν ακόμα και αν η κόμβο μετακινηθεί). Αυτό εξασφαλίζει ότι η «παραλείπεται» Τα μέλη δίνεται ύψιστη προτεραιότητα, και τα μέλη που δεν έχουν φτάσει δόθηκε επόμενη υψηλότερη προτεραιότητα.

Μόλις μια θέση είναι γεμάτο, μεταβείτε στην επόμενη θέση. Αν η θέση που μοιράζεται μια ομάδα με τη θέση που έχουν ήδη ανατεθεί, να παραλείψετε, την επανάληψη σε όλες τις θέσεις, μέχρι που μπορείτε να ορίσετε όσες θέσεις όπως μπορείτε να την ημέρα 1. Στη συνέχεια, αυξάνει το μετρητή ημέρας και επαναλάβετε για την ημέρα 2. Αυτό θα σας δώσει η μέγιστη ανάθεση (δεν είναι σίγουρος για το μέγιστο) για όλες τις δουλειές.

Συμβουλή: όταν μετακινείτε ένα μέλος στο τέλος της λίστας μελών, για να μην χρειάζεται να διασχίσει τη λίστα, κρατήστε μια αναφορά στο τέλος - για την επόμενη θέση, θα πρέπει να ξεκινήσετε από την αρχή ούτως ή άλλως, οπότε δεν υπάρχει λόγος να διέρχεται το όλο θέμα.

Απαντήθηκε 02/01/2010 στις 18:16
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more