Plánování problém Job

hlasů
8

Pracuji na aplikaci, kde musím automaticky plánování úloh pro členy na střídavém rozvrhu. Nejsem moc dobře vysvětlit pravidla, takže tady některé údaje, které vám pomohou out:

Pozice: název pracovní pozice s pravidly, jako jsou pondělí a ve středu týdně.
Kategorie: A soubor pozic
Skupiny: Další sada pozic. Pozice ve stejné skupině nemohou být zařazeny na stejný den
poslanci: Uživatelé přiřazeny k pozicím k určitému datu.

U každé datum v měsíci, členové jsou přiřazeny pozic (jak ve vzestupném pořadí). Je-li člen přiřazen do polohy v jedné kategorii, příště pozice ve stejné kategorii přijde, další člen abecedně (nebo začátek seznamu) dostane přiděleno např.

Uživatelé: M1, M2, M3, M4
Pozice v kategorii C1: P1, P2, P3
členové v poloze P1: M1, M2, M3, M4
členů v poloze P2: M1, M2, M3
členů v poloze P2: M1, M3, M4

Pokud M1 je určen pro P1, P2, pokud přijde příště, M2 bude přidělena. Dodatečná vrstva složitosti je představena, kde v případě, P3 přijde příště namísto M3 dostane přidělen. Systém má sledovat skutečnost, že M2 byl ‚přeskočí‘ a přiřadit M2 next-li k dispozici, pak přiřadit M4 vedle, nebo počkat, až se dostane do pozice, kde je k dispozici M2 (to se stává navíc složitější, když existuje mnoho ‚přeskočeno členové).

Člen bude také přeskočit, pokud mu naznačila, že nebude k dispozici k tomuto datu. Systém potřebuje umístit prioritu vynecháním členy nějak identifikovat je, když přijdou a pak přejít na další logické osoby v seznamu. Skákání platí i pro skupiny z důvodu aktuální soubojů.

Už mám dočasné [a chaotický] řešení, které jsem již pochopit, i když mám spoustu připomínek v něm vysvětluje každý krok. Jeho nedostatky jsou v jednání s vynecháním členy.

Pokud jste se chystá kódovat to, jak byste to? Já jsem se provádí tato v PHP, ale pseudocode bude fungovat stejně dobře.

Položena 19/12/2009 v 11:20
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
1

uff. Nemám tě následovat popis, ale v podobné situaci jsem použil SQL, jak vyřešit tento druh problému. Pokud používáte PHP Myslím, že máte sql k dispozici.

Co bych navrhnout dělá, je najít způsob ukládání těchto informací do souboru tabulek a pak pracovat, co SQL dotaz vám dává odpověď, kterou chcete. často je to mnohem jednodušší dělat v SQL, než je tomu v procedurálním jazyku.

Pro Vynechané části, například, můžete mít sloupec, který zaznamenává, kdy byl někdo naposledy přidělen a poté pořadí tím, že (takže si vybrat člověka, který nebyl přiřazen po dlouhou dobu). alternativně, mohli byste mít na to, kolikrát přeskočí jako sloupec a objednávky, které.

Odpovězeno 19/12/2009 v 13:09
zdroj uživatelem

hlasů
6

Moje řešení: Musíte mít prioritní fronta (která je k dispozici v PHP pod SplPriorityQueue). Prioritní fronta vám prvky s sestupném pořadí důležitosti (řazeny podle hodnoty, nejmenší hodnota má nejvyšší prioritu).

Každý člen dostane přiřazenou hodnotu. Tato hodnota je číslo ASCII s n číslicemi (můžete použít 8 míst pro pohodlí), naplněných nulami až n pozic. Poté, co že jste připojit název. Také přidat každému členovi dostupné pozice

Tak (n = 5):

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

To usnadňuje třídit podle priority členů a jména.

Příprava:

Slunečný den. Ty jsou načítání přiřazené polohy a kategorie, pro daný den. Každý člen je vložen na dlouhém seznamu. Každý člen, který se nezobrazuje na práci není načten, ale dostane se jeho hodnota snížila o minus dva. Bob tu není, takže jeho nová hodnota dostane 99997Bob. To znamená, že Bob bude vybrán automaticky příště. Všichni ostatní členové získat jejich hodnota snížila o mínus jedna.

Polohy přidělené pro daný den jsou mapovány (použití SplObjectStorage):

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

Mapa obsahuje pouze ty pozice, které musí být přiděleny v tento den. Po

Filter: Musíte se podívat do skupin a odstranit všechny pozice na mapě, která nemůže být přiřazen tento den. Váš popis skupina je trochu nejasné.

Přiřadit:

  • Můžete si vybrat pozici přiřadit
  • Získat seznam členů, které lze zaplnit pozici
  • Odebrat k dispozici členy ze seznamu a dát je do prioritní fronta
  • Přiřadit pozici výpisem () z prioritní fronta (správné přiřazení se provádí automaticially). Každý člen, který je přiřazen vůli získává svou hodnotu zvýšenou o jedno (SO na snížení a zvýšení hladin, jestli jste tady a pracovat). Pokud jste zde a nejsou přiřazeny polohy jakéhokoliv důvodu, máte malou pokutu ve výši jednoho. Pokud si to tady, dostanete pokutu ve výši dva.
  • Po dokončení dát zbývající členy na seznamu znovu, zrušte PQueue a pokračovat v další úkol.

Upozornění:

  • Musíte být opatrní, že existuje stále dost lidí, pro pozici.
Odpovězeno 02/01/2010 v 16:10
zdroj uživatelem

hlasů
0

Toho, co vím je, že jsou ‚m‘ členové a ‚N‘ pozice.

Kategorie: skupina pozic - člen, který je přiřazen o jednu pozici v kategorii nemůže mít jiný?

Skupina: skupina pozic - pozice ve stejné skupině musí být přiřazena v různých dnech.

Poslední věc, a Pozice má seznam členů, kteří jej vyplnit.

Při pohledu na tento z dat struktury hlediska dát členy v propojeném seznamu - každý člen má mít další seznam [polohy, den], že se nakonec přiřazena. Pak se pro každou pozici, mají seznam odkazů na členy, které mohou zaplnit tuto pozici. Implementovat kategorie jako jiné seznamu odkazů na pozici, na které kategorie se nachází.

Skutečná přiřazení: mají denní čítač = 0, a iterovat pozic. U každé poloze P, iterovat členy, které ji může naplnit. Člen M může zaplnit pozici, pokud:

  • Libovolné polohy se naplnil P2 nesdílí kategorii P.
  • Libovolné polohy se naplnil P2 den = daycounter nesdílí skupinu s P.

Kdyby se může zaplnit pozice, [poloha, den] Dvojice se přidává k členu, a uzel na člena je přesunuta na konec seznamu (to je důvod, proč jsou nezbytné odkazy - všechny odkazy jsou stále platné, přestože uzel přemístěn). Tím je zajištěno, že ‚přeskočí‘ členové jsou uvedeny nejvyšší prioritu, a členové, kteří nedosáhli dostaly druhou nejvyšší prioritu.

Jakmile je pozice obsazena, přejděte na další pozici. Pokud pozice sdílí skupinu s poloze již vyčleněny, přeskočit, iterace všech pozic, dokud můžete přiřadit libovolný počet pozic, jak se můžete v den 1. Poté, zvýšit denní počítadlo a opakujte pro den 2. To by mělo dát maximálního přiřazení (nejsou jisti maxima) pro všechny úlohy.

Tip: při pohybu člena na konec seznamu členů, aby se předešlo nutnosti procházet seznam, zachovat odkaz na konec - pro příští pozici, budete muset začít od začátku stejně, takže není žádný bod, procházejí celá věc.

Odpovězeno 02/01/2010 v 18:16
zdroj uživatelem

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