Szeregowanie zadań

głosy
8

Pracuję nad aplikacji gdzie potrzebne do automatycznego planowania pracy dla członków na obracającym się harmonogramu. Nie jestem bardzo dobry w wyjaśniając zasady, tak oto niektóre dane, aby pomóc:

Pozycji: tytuł pracy, z zasadami, takimi jak poniedziałki i środy w tygodniu.
Kategorie: zestaw pozycji
grup: Kolejny zestaw pozycjach. Pozycje z tej samej grupy nie można przypisać tego samego dnia
Członków: Użytkownicy przypisane do pozycji w danym dniu.

Na każdy dzień w miesiącu, członkowie są przypisane do stanowisk (zarówno w porządku rosnącym). Jeżeli członek jest przypisany do pozycji w jednej kategorii, następnym razem, gdy stanowisko w tej samej kategorii pojawia się, następnym członkiem alfabetycznie (lub początek listy) zostaje przydzielony np.

Użytkowników: M1, M2, M3, M4
Pozycje w kategorii C1: P1, P2, P3
członków w pozycji P1: M1, M2, M3, M4
Członków w pozycji P2: M1, M2, M3
Członków w pozycji P2: M1, M3, M4

Jeśli M1 jest przypisany do P1, P2, gdy przychodzi następny, M2 zostanie przypisany. Dodatkowa warstwa złożoności wprowadza gdzie jeśli P3 będzie dalej zamiast M3 zostanie przydzielony. System musi śledzić na fakt, że M2 „pomijane” i przypisać M2 obok jeśli są dostępne, a następnie przypisać M4 obok, albo czekać, aż dojdzie do sytuacji, w której M2 jest dostępny (to staje się dodatkowo skomplikowane, gdy istnieje wiele „pominięty 'członków).

Członek będzie również pominięty gdyby wskazał on nie będzie dostępna w tym dniu. System musi stawiać nacisk na pominiętych członków, jakoś je zidentyfikować, kiedy nadejdzie, a następnie przejść do następnego logicznego osoby na liście. Pomijanie odnosi się także do grup ze względu na aktualne starć.

Mam już tymczasowy [i niechlujny] rozwiązanie, które już nie rozumieją, chociaż mam wiele uwag wyjaśniających w nim każdy krok. Jego słabości są w kontaktach z pomijaniem członków.

Jeśli jechaliśmy do kodu to jak byś się do tego zabrać? I 'm wykonawczych to w PHP, ale pseudokod będzie działać jak również.

Utwórz 19/12/2009 o 11:20
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
1

uff. Nie śledzę cię opisem, ale w podobnych sytuacjach Użyłem sql do rozwiązywania tego rodzaju problemu. jeśli używasz php Chyba masz sql dostępne.

co proponuję robić to znalezienie sposobu przechowywania tych informacji w zestaw tabel, a następnie wypracowanie co zapytań SQL daje odpowiedź chcesz. często jest to dużo prostsze do zrobienia w SQL, niż jest w języku proceduralnym.

dla pominiętego części, na przykład, może masz kolumnę, która rejestruje kiedy ktoś ostatni przypisany, a następnie zamówienie przez to (tak, aby wybrać osobę, która nie została przypisana przez długi czas). Alternatywnie, można mieć liczbę razy pomijane jako kolumny i porządku przez to.

Odpowiedział 19/12/2009 o 13:09
źródło użytkownik

głosy
6

Moje rozwiązanie: Potrzebny jest kolejka priorytetowa (który jest dostępny w PHP pod SplPriorityQueue). Kolejka priorytetowa daje elementy z pierwszeństwem zstępującej (klasyfikowane według wartości, najmniejszą wartość ma najwyższy priorytet).

Każdy członek dostaje przypisaną wartość. Ta wartość jest liczbą ASCII z n cyfr (można użyć 8 cyfr dla wygody), wypełnionych zerami do pozycji N. Po tym dołączyć nazwę. Możesz również dodać do każdego członka dostępne pozycje

SO (n = 5):

  • Wartość M1: 99999Albert P1, P2, P3
  • wartość M2: 99999Susi P1, P2
  • Wartość M3: 99999Bob P1, P3

To sprawia, że ​​łatwo uporządkować członków według priorytetu i nazwy.

Przygotowanie:

Słoneczny dzień. Jesteś pobierania przypisane pozycje i kategorię dla danego dnia. Każdy członek jest ładowany na długiej liście. Każdy członek, który nie jest wyświetlany na pracę nie jest załadowany, ale ją wartość zmniejszyła się o minus dwa. Bob nie ma, więc jego nowa wartość staje 99997Bob. Oznacza to, że Bob zostanie wybrana automatycznie następnym razem. Wszyscy inni członkowie uzyskać ich wartość zmniejszyła się o minus jeden.

Pozycje przypisane do określonego dnia są odwzorowane (użyj SplObjectStorage):

P1-> M1, M2, M3, M4 itp P2-> etc.

Mapa zawiera tylko te pozycje, które muszą być przypisane ten dzień. Po

Filtr: Musisz patrzeć grup i usuwać pozycje na mapie, który nie może być przypisany ten dzień. Twój opis grupa jest nieco niejasna.

Przydzielać:

  • Wybrać pozycję przypisać
  • Uzyskać listę członków, które może wypełnić pozycję
  • Usuń z listy dostępnych elementów i umieścić je w kolejka priorytetowa
  • Przypisać pozycji przez (ekstrakt) z kolejka priorytetowa (prawidłowe przyporządkowanie odbywa się, automatycznie). Każdy członek, który jest przypisany woli staje się jego wartość wzrosła o jedną (tak zmniejszyć lub zwiększyć poziomy, jeśli jesteś tu i pracy). Jeśli jesteś tutaj, a nie przypisane do pozycji z jakiegokolwiek powodu, masz małą karę jednego. Jeśli nie tutaj, można dostać karę dwóch.
  • Po zakończeniu umieścić pozostałych członków na liście ponownie wyczyść PQueue i przejść do następnego zadania.

Ostrzeżenia:

  • Musisz być ostrożny, że nie zawsze są wystarczająco dużo osób na stanowisko.
Odpowiedział 02/01/2010 o 16:10
źródło użytkownik

głosy
0

Co rozumiem, jest tam są członkami „m” i „n” pozycji.

Kategoria: grupa stanowisk - członek, który jest przypisany jedną pozycję w kategorii nie może mieć innego?

Grupy: grupa pozycji - pozycje w obrębie jednej grupy musi być przypisana na różnych dniach.

Ostatnią rzeczą, Pozycja zawiera listę członków, którzy mogą go wypełnić.

Patrząc na to z punktu widzenia struktury danych widzenia umieścić członków w połączonej listy - każdy element musi mieć dodatkową listę pozycji, [dzień], że są one ostatecznie przypisany. Następnie, dla każdej pozycji, mają wykaz odniesień do elementów, które mogą wypełnić tę pozycję. Wdrożenie kategorie jak innej listy referencji na stanowisko co do której kategorii się znajduje.

Rzeczywista zadanie: przeciwdziałają dzień = 0, a iterację pozycji. Dla każdej pozycji P, iterację członków, które może wypełnić. Człon M może zająć miejsce w przypadku:

  • Każda pozycja ma on wypełniony P2 nie podziela kategorię P.
  • Każda pozycja ma on wypełniony P2 z dnia = daycounter nie podzielił grupę P.

Jeśli uda mu się zająć miejsce, w [pozycja, dzień] Para jest dodawana do członka, a węzeł państw zostaje przesunięty na koniec listy (dlatego odniesienia są niezbędne - wszystkie odniesienia są nadal aktualne, mimo że węzeł przeniesiony). Gwarantuje to, że „pominięty” członkowie otrzymują najwyższy priorytet, a członkowie, którzy nie osiągnęli otrzymali kolejny najwyższy priorytet.

Gdy pozycja jest wypełniony, należy przejść do następnej pozycji. Jeśli pozycja dzieli grupę ze stanowiska już przypisany, pomiń go, iteracja wszystkich pozycjach, aż można przypisać dowolną liczbę stanowisk, jak można w dniu 1. Następnie zwiększamy licznik dni i powtórzyć za dzień 2. To powinno dać maksymalny przydział (nie wiem o maksimum) dla wszystkich zadań.

Wskazówka: podczas przemieszczania członka do końca listy członków, aby zapobiec konieczności przechodzenia do listy, zachować odniesienie do końca - do następnej pozycji, trzeba zacząć od początku i tak, więc nie ma sensu przechodzi cała rzecz.

Odpowiedział 02/01/2010 o 18:16
źródło użytkownik

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