Job planlegging problem

stemmer
8

Jeg jobber med et program der jeg trenger å automatisk planlegge jobber for medlemmer på en roterende tidsplan. Jeg er ikke veldig flink til å forklare reglene, så her er noen data for å hjelpe ut:

Posisjoner: En jobbtittel, med regler som mandager og onsdager ukentlig.
Kategorier: Et sett med stillinger
grupper: et annet sett av posisjoner. Posisjoner i samme gruppe kan ikke tildeles på samme dag
Medlemmer: Brukere som er tildelt posisjoner på en gitt dato.

For hver dato i måneden, medlemmer tilordnet posisjoner (både i stigende rekkefølge). Dersom et medlem er tildelt en stilling i én kategori, neste gang en stilling i samme kategori kommer opp, neste medlem alfabetisk (eller begynnelsen av listen) blir tildelt f.eks.

Medlemmer: M1, M2, M3, M4
posisjoner i kategori C1: P1, P2, P3
medlemmer i posisjon P1: M1, M2, M3, M4
medlemmer i posisjon P2: M1, M2, M3
medlemmer i posisjon P2: M1, M3, M4

Hvis M1 er tildelt for P1, hvis P2 kommer etterpå, M2 vil bli tildelt. Et ekstra lag av kompleksitet er innført der hvis P3 kommer etterpå i stedet, blir M3 tildelt. Systemet har å holde styr på det faktum at M2 ble 'hoppet over' og tildele M2 neste hvis tilgjengelig, deretter tildele M4 neste, eller vente til det blir til en posisjon hvor M2 er tilgjengelig (dette blir også komplisert når det er mange 'hoppet over 'medlemmer).

Et medlem vil også bli hoppet over hvis han har signalisert at han ikke vil være tilgjengelig på denne datoen. Systemet må prioritere hoppet medlemmer, liksom identifisere dem når de kommer opp og deretter hoppe til neste logiske personen på listen. Hoppe gjelder også grupper på grunn av dato sammenstøt.

Jeg har allerede en midlertidig [og rotete] løsning som jeg ikke lenger forstår selv om jeg har mange kommentarer i det som forklarer hvert trinn. Sine svakheter er i håndteringen hoppet over medlemmer.

Hvis du skulle kode dette hvordan ville du gå om det? Jeg implementere dette i PHP, men pseudo ville fungere også.

Publisert på 19/12/2009 klokken 10:20
kilden bruker
På andre språk...                            


3 svar

stemmer
1

uff. jeg ikke følge deg beskrivelse, men i lignende situasjoner jeg har brukt sql for å løse denne typen problem. hvis du bruker php jeg antar du har sql tilgjengelig.

det jeg vil foreslå å gjøre er å finne en måte å lagre denne informasjonen i et sett av tabeller og deretter jobbe ut hva sql spørring gir deg svaret du ønsker. ganske ofte det er mye enklere å gjøre i sql enn det er i en prosessuell språk.

for den hoppet over en del, for eksempel, kan du ha en kolonne som registrerer når noen sist ble tildelt, og deretter bestille ved at (slik at du velger den personen som ikke har fått tildelt i lang tid). Alternativt kan du ha flere ganger hoppet som en søyle og orden av det.

Svarte 19/12/2009 kl. 12:09
kilden bruker

stemmer
6

Min løsning: Du trenger en PriorityQueue (som er tilgjengelig i PHP henhold SplPriorityQueue). Den PriorityQueue gir deg elementer med synkende prioritet (sortert etter verdier, har den minste verdien høyeste prioritet).

Hvert medlem får tildelt en verdi. Denne verdien er en ASCII tall med n sifre (du kan bruke 8 siffer for enkelhets skyld), fylt opp med nuller til N stillinger. Etter at du tilføye navnet. Du kan også legge til hvert medlem de tilgjengelige stillinger

So (n = 5):

  • M1 verdi: 99999Albert P1, P2, P3
  • M2 verdi: 99999Susi P1, P2
  • M3 verdi: 99999Bob P1, P3

Dette gjør det enkelt å sortere medlemmer etter prioritet og navn.

Forberedelse:

En solrik dag. Du henter de tildelte stillinger og en kategori for en gitt dag. Hvert medlem er lastet på en lang liste. Hvert medlem som ikke vises på arbeid er ikke ladd, men får sin verdi redusert med minus to. Bob er ikke her, så det nye verdien blir 99997Bob. Dette betyr at Bob vil bli valgt automatisk neste gang. Alle andre medlemmer får sin verdi redusert med minus én.

Stillingene er tildelt en bestemt dag er kartlagt (bruk SplObjectStorage):

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

Kartet inneholder kun de stillingene som må tilordnes denne dagen. Etter

Filter: Du må se opp gruppene og slette posisjoner på kartet som ikke kan bli tildelt denne dagen. Din gruppe beskrivelse er litt uklart.

Tildele:

  • Du velger posisjon til å tildele
  • Få oversikt over medlemmer som kan fylle stillingen
  • Fjern tilgjengelige medlemmer fra listen, og sette dem inn i PriorityQueue
  • Tildel stilling av ekstrakt () fra PriorityQueue (korrekte angivelse er gjort automaticially). Hvert medlem som er tildelt vilje får sin verdi økte med en (Så nedgangen og øke nivåene ut om du er her og jobber). Hvis du er her og ikke tilordnet en posisjon uansett grunn, får du en liten straff på ett. Hvis du ikke er her, får du en straff på to.
  • Etter ferdigstillelse, sette gjenværende medlemmene på listen igjen, fjerne PQueue og fortsette med neste oppgave.

Advarsler:

  • Du må være forsiktig at det alltid er nok folk for en stilling.
Svarte 02/01/2010 kl. 15:10
kilden bruker

stemmer
0

Hva jeg forstår er at det er 'M' medlemmer og 'n' posisjoner.

Kategori: en gruppe av posisjoner - et medlem som er tildelt en plass i kategorien kan ikke ha en annen?

Gruppe: en gruppe av posisjoner - stillinger i samme gruppe må tilordnes på ulike dager.

Siste ting, har en posisjon en liste over medlemmer som kan fylle den.

Ser vi på dette fra en datastruktur synspunkt, sette elementene i en lenket liste - hvert medlem har til å ha en ytterligere liste over [posisjon, dag] at de er endelig tildelt. Deretter for hver posisjon, har en liste over referanser til medlemmene som kan fylle den posisjonen. Implementere kategorier som en liste med referanser til en stilling som til kategorier som den er i.

Den egentlige oppgaven: ha en dag teller = 0, og iterere gjennom posisjonene. For hver posisjon P, iterere gjennom delene som kan fylle den. Et medlem M kan fylle stillingen dersom:

  • Enhver stilling han har fylt P2 deler ikke en kategori med P.
  • Enhver stilling han har fylt P2 med dagen = daycounter deler ikke en gruppe med P.

Hvis han kan fylle stillingen, den [stilling, dag] paret er lagt til medlem, og medlemmet node flyttes til slutten av listen (dette er grunnen til at referanser er nødvendig - alle referansene er fortsatt gyldig selv om node beveget). Dette sikrer at 'hoppet' medlemmer får høyeste prioritet, og medlemmene som ikke ble nådd fikk nest høyest prioritet.

Når en stilling blir fylt, gå til neste posisjon. Hvis posisjonen deler en gruppe med en stilling som allerede er tildelt, hoppe over det, gjentar gjennom alle posisjonene før du kan tildele så mange stillinger som du kan på dag 1. Deretter øke dagtelleren og gjenta for dag 2. Dette bør gi deg en maksimal oppgave (ikke sikker på om maksimum) for alle jobbene.

Tips: Når du flytter et medlem til slutten av medlemslisten, for å hindre å måtte krysse listen, holde en referanse til slutt - for den neste posisjon, må du starte fra begynnelsen uansett, så det er ingen vits å gå gjennom hele greia.

Svarte 02/01/2010 kl. 17:16
kilden bruker

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