Feladatütemezési probléma

szavazat
8

Dolgozom az alkalmazást, amelyben azt kell ütemezni automatikusan munkahelyeket tagjai rotációs ütemtervet. Nem vagyok túl jó magyarázó szabályok, ezért itt néhány adat, hogy segítsen ki:

Pozíció: A beosztás, a szabályok, mint például hétfőn és szerdán hetente.
Kategóriák: Egy sor pozíciók
Csoportok: A másik meg a pozíciókat. Pozíciók ugyanabban a csoportban nem lehet rendelni az ugyanazon a napon
Tagok: Users beosztásba egy adott napon.

Minden dátum a hónap tagok beosztásba (mindkettő emelkedő sorrendben). Ha egy tag van rendelve a helyzetben egy kategóriában, a következő alkalommal a helyzetben az azonos kategóriába jön létre, a következő elem betűrendben (vagy a lista elején) lesz rendelve pl.

Tagok: M1, M2, M3, M4
pozíciók a C1 kategória: P1, P2, P3
képviselők álláspontja P1: M1, M2, M3, M4
képviselők álláspontja P2: M1, M2, M3
képviselők álláspontja P2: M1, M3, M4

Ha M1 kijelölt P1, P2, ha jön a következő, M2 lesz rendelve. Egy további réteg komplexitás vezetjük, ahol ha P3 jön a következő helyett, M3 lesz hozzárendelve. A rendszer nyomon követheti, hogy az M2 „kimarad”, és adja meg az M2 mellett, ha rendelkezésre áll, akkor rendeljen M4 mellett, vagy várjon, amíg nem lesz egy olyan helyzetbe, ahol M2 elérhető (ez lesz emellett bonyolult, ha sok „kimarad tag).

A tag akkor is kimarad, ha ő jelezte, hogy nem lesz elérhető ezen a napon. A rendszernek szüksége van, hogy prioritást kapjon átugrott tagjai, valahogy azonosítani őket, amikor jönnek, és akkor ugorjon a következő logikus személy a listán. Kihagyása is vonatkozik csoportok miatt a mai napig összecsapások.

Már van egy ideiglenes [és rendetlen] megoldás, amely már nem értem, bár van egy csomó hozzászólás benne elmagyarázza az egyes lépéseket. A gyengeségek kezelése a kihagyott tagjai.

Ha mentek kódolni ezt hogyan megy róla? Én és valósítja meg a PHP, de pszeudokódokra működne is.

A kérdést 19/12/2009 11:20
a forrás felhasználó
Más nyelveken...                            


3 válasz

szavazat
1

uff. én nem követni a leírás, de hasonló helyzetben én használtam sql megoldani az ilyen jellegű probléma. ha használ php azt hiszem van sql elérhető.

amit én javaslom csinál találni a módját az információk tárolására egy táblacsoportban majd dolgozni, hogy milyen SQL lekérdezés megadja a választ, amit akar. gyakran ez egy sokkal egyszerűbb itt sql, mint ez egy eljárási nyelvén.

Az átugrott része, például lehet, hogy egy oszlop, amely rögzíti, amikor valaki utoljára rendelt, majd sorrendben, hogy (úgy, hogy kiválasztja a személy, aki nem rendeltek sokáig). alternatívaként, akkor lehetett volna hányszor kimarad, mint egy oszlop és annak érdekében, hogy az.

Válaszolt 19/12/2009 13:09
a forrás felhasználó

szavazat
6

A megoldás: Szüksége van egy PriorityQueue (ami áll rendelkezésre a PHP alatt SplPriorityQueue). A PriorityQueue ad elemek csökkenő prioritás (rendezve értékek, a legkisebb érték a legmagasabb prioritás).

Minden tag kap egy hozzárendelt érték. Ez az érték egy ASCII n számjegyű (jól jönne 8 számjegy kedvéért), feltöltjük nullákkal n pozíciókat. Ez után hozzáfűzi a nevét. Azt is hozzá, hogy minden egyes tagja a rendelkezésre álló pozíciók

Tehát (n = 5):

  • M1 érték: 99999Albert P1, P2, P3
  • M2 érték: 99999Susi P1, P2
  • M3 érték: 99999Bob P1, P3

Ez megkönnyíti a keresést tagok elsőbbségi és nevét.

Készítmény:

Egy napos nap. Ön letölti a kijelölt helyekre és a kategória egy adott napon. Minden tag feltöltjük egy hosszú listát. Minden tag, aki nem jelenik meg a munka nem terhelt, de lesz az értéke csökkent mínusz kettő. Bob nincs itt, ezért az új értéket kap 99997Bob. Ez azt jelenti, hogy Bob automatikusan kijelölésre kerül a következő alkalommal. Az összes többi tagja kap értékük csökkent mínusz egy.

A pozíciók rendelt egy adott napra vannak leképezve (használatra SplObjectStorage):

P1> M1, M2, M3, M4 stb P2 általános képletű csoport> stb

A térkép tartalmazza csak a pozíció, amelyet hozzá kell rendelni ezen a napon. Azután

Szűrő: Meg kell nézni ki a csoportokat, és törölje a pozíciót a térképen, amely nem lehet rendelni ezen a napon. A csoport leírása egy kicsit homályos.

Hozzárendelni:

  • Ön választja ki a helyzetben, hogy rendelni
  • Get a tagok listáját, amelyek poszt betöltésére
  • Távolítsuk álló tagjai a listából, és tegye őket a PriorityQueue
  • Hozzárendelése a helyzetben kivonat () a PriorityQueue (helyes hozzárendelés történik automaticially). Minden tag, amely hozzá van rendelve akarat kap érték eggyel növekszik (tehát a csökkenés, és növeli meg, ha itt és munka). Ha vannak itt, és nem rendelt helyzetben bármilyen okból, akkor kap egy kis büntetést egy. Ha nem vagy itt, akkor kap büntetést kettő.
  • Befejezése után, tedd megmaradó tagok a listát újra, törölje a PQueue és folytassa a következő feladatra.

Ellenjavallat:

  • Óvatosnak kell lenned, hogy mindig elég ember a helyzetben.
Válaszolt 02/01/2010 16:10
a forrás felhasználó

szavazat
0

Amit értem ott van „m” tagjai és „n” pozíciókat.

Kategória: egy csoport pozíciók - egy tagja, aki hozzá van rendelve egy pozíciót a kategóriában nincs másik?

Csoport: a csoport pozíciók - pozíciók ugyanabban a csoportban kell rendelni különböző napokon.

Az utolsó dolog, egy pozíció van egy lista, akik ki tudják tölteni azt.

Nézzük ezt egy adat-struktúra szempontjából, tegye a tagok egy kapcsolt listán - minden egyes tagnak van egy további listát [pozíció, idő], hogy azok végül rendelve. Ezután minden helyzetben van egy hivatkozás listát a tagokat, hogy töltse ki ezt az álláspontot. Végre kategóriák, mint a másik hivatkozások listáját a helyzetben, hogy melyik kategóriában van.

A tényleges hozzárendelés: van egy nap számláló értéke 0, és halad végig a pozíciókat. Minden P, végighaladni a tagokat, hogy is kitöltheti. A tag M lehet kitölteni a helyzetben, ha:

  • Bármilyen helyzetben ő töltötte P2 nem osztja meg a kategóriát P.
  • Bármilyen helyzetben ő töltötte P2 nap = daycounter nem osztja a csoportot P.

Ha tudja kitölteni a helyzetben, [helyzetbe, nap] pár adunk a tagja, és a tag csomópont átkerül az a lista végére (ezért referenciák szükségesek - az összes hivatkozást továbbra is érvényesek, bár a csomópont áthelyezve). Ez biztosítja, hogy a „kihagyott” tagjai kapják a legnagyobb prioritást, és a tagok, akik nem érték el kaptak következő legmagasabb prioritást.

Ha egy pozíciót töltött, menjen a következő pozícióba. Ha a pozíció osztja a csoportot olyan helyzetbe már hozzá, hagyja azt, ismételve végig a helyzetben, amíg meg lehet rendelni annyi pozíciót, amennyit csak lehet az 1. napon Ezután növeljük az idő számláló és ismételje meg a 2. napon Ez ad maximális megbízás (nem biztos maximum) az összes munkát.

Tipp: Ha egy tag a végén a tagok listáját, hogy megakadályozzák, hogy keresztezik a listában hivatkozást tartanak a végén - a következő helyzetben, meg kell kezdeni az elejétől, úgyhogy nincs értelme megy keresztül Az egész dolog.

Válaszolt 02/01/2010 18:16
a forrás felhasználó

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