Job scheduling probleem

stemmen
8

Ik ben bezig met een applicatie waar ik moet automatisch banen voor de leden te plannen op een roterend schema. Ik ben niet zo goed in het uitleggen van de regels, dus hier is een aantal gegevens om te helpen:

Posities: Een functie, met regels als maandag en woensdag wekelijks.
Categorieën: Een reeks posities
groepen: Een andere reeks posities. Posities in dezelfde groep kan niet worden toegewezen op dezelfde dag
Leden: Gebruikers toegewezen aan posities op een bepaalde datum.

Voor elke datum in de maand, worden de leden toegewezen aan posities (zowel in oplopende volgorde). Indien een lid naar een positie wordt toegekend in één categorie, de volgende keer dat een positie in dezelfde categorie komt, het volgende lid alfabetisch (of het begin van de lijst) wordt toegewezen bv.

Leden: M1, M2, M3, M4
Posities in categorie C1: P1, P2, P3
leden in Positie P1: M1, M2, M3, M4
leden in positie P2: M1, M2, M3
leden in positie P2: M1, M3, M4

Als M1 is toegewezen voor P1 als P2 daarna komt, M2 zal worden toegewezen. Een extra laag van complexiteit wordt geïntroduceerd waar als P3 daarna komt in plaats daarvan, M3 krijgt toegewezen. Het systeem heeft voor het bijhouden van het feit dat de M2 ​​was 'overgeslagen' en wijs M2 volgende indien beschikbaar, dan M4 volgende toewijzen, of wacht tot het wordt om een ​​positie waar M2 is beschikbaar te houden (dit wordt bovendien complex als er veel 'overgeslagen 'leden).

Een lid zal ook worden overgeslagen als hij heeft aangegeven dat hij zal niet beschikbaar zijn op die datum. Het systeem moet prioriteit geven aan overgeslagen leden, een of andere manier te identificeren wanneer ze komen en dan naar de volgende logische persoon in de lijst. Skipping geldt ook voor groepen als gevolg van datum botsingen.

Ik heb al een tijdelijke [en rommelig] oplossing, die ik niet meer begrijpen, zelfs al heb ik veel reacties daarin uitleggen elke stap. De zwakke punten zijn in de omgang met de overgeslagen leden.

Als je gaat coderen dit hoe zou je dan doen? Ik doe dit implementeren in PHP, maar pseudocode zou zo goed werken.

De vraag is gesteld op 19/12/2009 om 11:20
bron van user
In andere talen...                            


3 antwoorden

stemmen
1

uff. i do not volgen beschrijving, maar in soortgelijke situaties die ik heb gebruikt sql om dit soort problemen op te lossen. als u gebruik maakt php Ik denk dat je moet sql beschikbaar.

wat ik zou willen voorstellen doen is het vinden van een manier van het opslaan van deze informatie in een reeks tabellen en vervolgens uit te werken wat sql-query geeft je het antwoord dat je wilt. heel vaak is het een stuk eenvoudiger om te doen in sql dan in een procedurele taal.

het overgeslagen deel, bijvoorbeeld, dat u misschien een kolom die registreert wanneer iemand voor het laatst toegekend, en vervolgens bestelling door dat hebben (zodat je de persoon die niet is toegewezen voor een lange tijd te selecteren). Als alternatief kunt u het nummer te hebben vaak overgeslagen als een kolom en orde door die.

antwoordde op 19/12/2009 om 13:09
bron van user

stemmen
6

Mijn oplossing: Je hebt een PriorityQueue (die verkrijgbaar is in PHP onder SplPriorityQueue). De PriorityQueue geeft u elementen met afnemende prioriteit (naargelang hun waarden, de kleinste waarde heeft de hoogste prioriteit).

Elk lid krijgt een toegewezen waarde. Deze waarde is een ASCII-getal met n cijfers (je zou kunnen gebruiken 8 cijfers voor het gemak), gevuld met nullen tot n posities. Daarna voegt u de naam. U kunt ook toevoegen aan elk lid van de beschikbare posities

Dus (n = 5):

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

Dit maakt het gemakkelijk om leden door prioriteit en naam sorteren.

Voorbereiding:

Een zonnige dag. U bent het ophalen van de toegewezen posities en een categorie voor een bepaalde dag. Elk lid wordt geladen op een lange lijst. Elk lid dat is niet te zien op het werk is niet geladen, maar krijgt zijn waarde daalde met min twee. Bob is hier niet, zodat de nieuwe waarde krijgt 99997Bob. Dit betekent dat Bob automatisch wordt gekozen voor de volgende keer. Alle andere leden krijgen hun waarde daalde met min één.

De posities toegewezen voor een bepaalde dag worden in kaart gebracht (gebruik SplObjectStorage):

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

De kaart bevat alleen de posities die deze dag moet worden toegewezen. Na de

Filter: U moet opzoeken van de groepen en eventuele posities op de kaart, die niet op deze dag kunnen worden toegewezen verwijderen. Je groep beschrijving is een beetje onduidelijk.

Toewijzen:

  • U kiest zelf de positie toe te wijzen
  • Krijg lijst van de leden die de positie kunnen invullen
  • Verwijder beschikbare leden van de lijst en leg ze in de PriorityQueue
  • Wijs de positie van extract () uit PriorityQueue (juiste toewijzing wordt automatisch achtereenvolgend gedaan). Elk lid dat is toegewezen, krijgt de waarde verhoogd met één (dus de afname en verhogen het niveau te komen als u hier en zijn te werken). Als je hier en niet zijn toegewezen aan een positie voor welke reden dan ook, krijg je een kleine boete van één. Als je hier niet, krijg je een boete van twee.
  • Na voltooiing, zet overblijvende leden op de lijst opnieuw, schakelt u het PQueue en ga verder met de volgende opdracht.

Voorbehoud:

  • Je moet voorzichtig zijn dat er altijd genoeg mensen voor een positie.
antwoordde op 02/01/2010 om 16:10
bron van user

stemmen
0

Wat ik begrijp is dat er 'm' leden en 'n' posities.

Categorie: een groep van posities - een lid dat één positie in de categorie is toegewezen kan niet een ander hebben?

Groep: een groep van posities - posities in dezelfde groep moet worden toegewezen op verschillende dagen.

Laatste ding, een positie heeft een lijst van de leden die het kunnen vullen.

Bekijken dit vanuit een gegevensstructuur oogpunt, zet de leden in een gekoppelde lijst - elk lid een extra lijst [positie, dag] dat uiteindelijk toegewezen hebben. Vervolgens wordt voor elke positie, hebben een lijst van verwijzingen naar de leden die die positie kan vullen. Implementeer categorieën een andere lijst van verzoeken om een ​​standpunt ten aanzien van welke categorieën is in.

De werkelijke opdracht: heb een dag counter = 0 en doorloopt de posities. Voor elke positie P, doorloopt mede dat kan vullen. Onderdeel M kan het bekleden indien vullen:

  • Elke positie die hij heeft gevuld P2 niet een categorie met P. delen
  • Elke positie die hij heeft gevuld P2 met dag = dagteller niet een groep met P. delen

alle verwijzingen zijn nog steeds geldig, hoewel het - als hij de positie, de [positie, dag] pair wordt toegevoegd aan het lid, en het knooppunt van het lid wordt verplaatst naar het einde van de lijst (dit is de reden waarom verwijzingen noodzakelijk zijn kan vullen knooppunt verplaatst). Dit zorgt ervoor dat de 'overgeslagen' leden krijgen de hoogste prioriteit, en de leden die niet werden bereikt, kregen na hoogste prioriteit.

Zodra een vacature is ingevuld, ga dan naar de volgende positie. Indien de positie van een groep met een al toegewezen positie deelt, overslaan, iteratie door alle posities totdat u zoveel posities kunt toewijzen zoals u kunt op dag 1. Dan verhogen de dagteller en herhaal voor dag 2. Deze moet geven een maximale opdracht (niet zeker over maximum) voor alle opdrachten.

Tip: bij het verplaatsen van een lid aan het einde van de ledenlijst, om te voorkomen dat u de lijst doorlopen, een verwijzing te houden tot het einde - voor de volgende positie, moet je om te beginnen vanaf het begin toch, dus er is geen punt gaan door het hele ding.

antwoordde op 02/01/2010 om 18:16
bron van user

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