Slumpa rotationsschema för anställda på en arbetsplats

Trädvy Permalänk
Medlem
Plats
Växjö
Registrerad
Dec 2004

Slumpa rotationsschema för anställda på en arbetsplats

Jag har tidigare rotat i det här men kommer ingen vart! Jag har en situation som ser ut som följande (med följande kriterier som måste uppnås):

En arbetsplats med X antal avdelningar, som rymmer olika många anställda beroende på vad det är för avdelning.
Ett varierande antal anställda, vissa kan ju vara sjuka, lediga osv.
Man vill inte vara på samma avdelning 2 dagar i rad.

Jag vill kunna trycka på en knapp som genererar schemat för nästkommande dag.

Är enda/smidigaste sättet att ge varje anställd en tabell med vilka preferenser den har mot varje avdelning?
Så om Anställd 1 har varit på Avdelning 2 idag så får den "0" för Avdelning 2 som testas i koden för morgondagen.
Och om den rent fysiskt klarar av uppgifterna och inte har varit på Avdelning 2 dagen innan så får den värde "1" istället.

Och man loopar alla möjliga kombinationer (miljontals skulle jag gissa att det blir) genom att testa alla möjliga kombinationer av utfall, och ger varje "match" en "poäng" och kollar i slutändan vilken/vilka kombinationer som gav flest poäng?

Finns det någon som kan hjälpa mig med kod? Jag har fastnat helt.

Men jag tänker att man vill:

loop(antal avdelningar) { loop(antal platser på avdelning) { loop(antal anställda) { kolla preferenser mot avdelning ge poäng till anställd/utfall i en array fortsätt "loopa i loopen" tills alla avdelningar och platser är testade } } }

Trädvy Permalänk
Medlem
Plats
::1
Registrerad
Feb 2014

@RobinJacobsson: 1. Är detta en skoluppgift? Frågar då jag ser i din historik att du postat om att du vill skola om dig till utvecklare.
2. Vilket språk ska de vara i?
3. Vill du ha färdig kod, eller vill du att vi kommer med tips och idéer på hur du kan lösa de?

Trädvy Permalänk
Medlem
Plats
Växjö
Registrerad
Dec 2004

@InaneG: Nej, jag fick precis en Teamleader-roll på jobbet som bland annat innebär att sätta scheman, så detta är egentligen bara en jakt på en så smidig lösning som möjligt för att slippa sitta och generera scheman/pussla "för hand". Jag har väldigt grundläggande kunskaper i C#, så en färdig lösning för just mitt ändamål är ju det jag i slutändan strävar efter.

Men jag förstår om ni inte orkar sätta er och baka ihop det jag söker...

Jag kan tänka mig att det behövs en tabell (om man nu använder MySQL) där varje anställd har kolumner för varje avdelning som dom är kompatibla med. Typ

0 = passar inte på avdelningen/kan inte jobba där pga fysiska svårigheter el liknande
1 = funkar på avdelningen men föredrar den inte
2 = fullt kompatibel med avdelningen

och sedan räknar man ihop poängen för alla anställda och alla kombinationer för alla avdelningar och föredragsvis blir det den kombinationen där alla anställda matchar avdelningen med 2 poäng.

Trädvy Permalänk
Medlem
Plats
Småland, långt ute i mörka skogen.
Registrerad
Maj 2018

Kanske det skulle vara läge för en genetisk algoritm? Detta är en lite mer komplex variant av "The Traveling Salesman Problem." Googla "TSP genetic algorithm." Genetiska algoritmer kan vara mycket effektiva för att söka av stora "lösningsvolymer" med många dimensioner. Nackdelen är att man inte kan vet om man verkligen har hittat den optimala lösningen.

Du har individer och avdelningar.

Du sätter kostnader på hur en avdelning är bemannad. För lågt bemannad avdelning ger hög kostnad. Samma sak för högt bemannad.

Du sätter också kostnader på alla individer för arbete på varje avdelning. Mycket hög kostnad om det skall undvikas. Kanske stigande ju fler dagar man tidigare arbetat på samma avdelning. Eller efter individens preferenser. Du kan också sätta andra kostnader. Kanske A vill jobba ihop med B men inte med C? Kanske A gillar att börja tidigt men B sent? Kanske C vill jobba helger? (Kostnader kan vara både positiva och negativa.)

Sedan kan en lösning kodas som en vektor med avdelningar där varje avdelning har en vektor med arbetsplatser.

Inledningsvis skapas en start-generation av lösningar med ett (stort?) antal slumpade lösningar där individer placeras ut slumpmässigt i vektorerna.

En värderingsfunktion används för att beräkna kostnaden för varje lösning.

De bästa lösningarna väljs ut slumpmässigt (bias/selektionstryck) och rekombineras med varandra för att bilda en ny generation av lösningar. Någon form av "crossover". Så att två lösningar ABCD och abcd kombineras och bildar ABcd och abCD. Eller AbCd och aBcD.

Ibland är något av "barnen" en något lite bättre lösning än "föräldrarna". Det barnet får då genom selektionstrycket större sannolikhet att användas vid nya rekombinationer. En form av riktad evolution. Man kan även införa "mutationer". Ibland (sällan) byta plats på två slumpade individer i samma lösning.

Och så håller man på en stund med att ta fram nya generationer av lösningar tills totalkostnaden tycks ha blivit minimerad. Och därefter har man (förhoppningsvis) en bra bemanningsplan för nästa dag.

Förenkling:

Vänd på det hela. Ha en enda vektor där varje position är en av individerna + några obemannade platser. Fördela alla tillgängliga positioner på avdelningar slumpmässigt och starta algoritmen med en hel generation av slumpade lösningar. Då blir det nästan exakt en TSP och en normal "standard" TSP crossover kan användas. Exempelvis passar en PMX-crossover bra här.

http://www.rubicite.com/Tutorials/GeneticAlgorithms/Crossover...

Börja med att koda en enkel TSP med PMX. Sedan vet du mer om hur du kan gå vidare.

Edit:
Jag kollade lite och hittade en rätt avancerad TSP PMX-cross-over i C++ som jag skrev 2004:

(Sol är vector<int>)

// Use the tours in a and b to create new in c and d using random PMX // This version of PMX is optimized for large problems // (many cities) using lookup tables into the solutions. // It's possible to unroll some loops as well for even more speed. // PMX = Partially matched/mixed(?) crossover. void Tsp::crossover(const Sol &a, const Sol &b, Sol &c, Sol &d) { assert(a.size() == b.size()); const int n = a.size(); // static to avoid realloc every call static std::vector<int> lookup_c; static std::vector<int> lookup_d; lookup_c.resize(n); lookup_d.resize(n); c.resize(n); d.resize(n); // Create lookup tables and initialize c and d for(int i = 0; i != n; i++) { c[i] = a[i]; lookup_c[c[i]] = i; d[i] = b[i]; lookup_d[d[i]] = i; } // Crossover random sequence of at least n / 4 and at most 3/4 * n cities const int start = irand(n); const int end = start + (n / 4) + irand(n / 2); // Do the PMX for(int i = start; i != end; i++) { const int j = i % n; // i mod n const int posb = lookup_c[b[j]]; std::swap(c[posb], c[j]); lookup_c[c[posb]] = posb; const int posa = lookup_d[a[j]]; std::swap(d[posa], d[j]); lookup_d[d[posa]] = posa; } }

Linux och Android

Trädvy Permalänk
Medlem
Registrerad
Jul 2008

A: Lista på alla avdelningar
B: Lista på alla anställda
- Med data per anställd vilken "preferens" för en avdelning den anställda har

Algoritm:

Markera alla anställda (B) som tillgängliga
För varje avdelning (A):
- Ta tillgängliga alla anställda (B), sortera dem i preferensordning för avdelningen
- Plocka anställd med högst poäng till alla platser på avdelningen är fyllda, markera anställd som upptagen vid varje tillfälle
- Sänk värdet på preferens för den aktuella anställda på den tilldelade avdelningen med X (och därmed minska risken att hen får samma avdelning nästa gång.
Spara resultatet som schema för aktuell dag, upprepa algoritm per dag som önskas.

Naturligtvis kommer du få tilldelningar som inte är optimala, men det är enklare än att beräkna miljoner eller miljarder kombinationer.
https://sv.wikipedia.org/wiki/Fakultet_(matematik)

data, representation av värden, text etc. lämpad för överföring, tolkning eller bearbetning av människor eller maskiner.
dator, digital automatisk beräkningsmaskin som styrs av ett i dess minne lagrat program.

Trädvy Permalänk
Medlem
Plats
Växjö
Registrerad
Dec 2004
Skrivet av Adoby:

Kanske det skulle vara läge för en genetisk algoritm?...

Jag har inte kommit riktigt så långt, så jag har svårt att tolka din kod.
Om du vill och har tid så får du gärna anpassa den efter mitt problem. Isåfall fortsätter jag gärna via PM!

Skrivet av Strepto:

A: Lista på alla avdelningar...

Jag tänker såhär:

loop(antal_avdelningar) loop(välj anställda vars preferens matchar antal_avdelningar och anställd != upptagen) sätt anställd som matchat (mot aktuell avdelning i första loopen) som upptagen } }

Men det blir ju fel eftersom alla avdelningar rymmer olika antal anställda.

Avdelning 1 rymmer 7 st.
Avdelning 2 rymmer 4 st.
Avdelning 3 rymmer 1 st.
Avdelning 5 rymmer 5 st.
Avdelning 6 rymmer 4 st.
Avdelning 7 rymmer 2 st.

Trädvy Permalänk
Medlem
Plats
Twilight Zone
Registrerad
Nov 2001

Fast utgår ni inte ifrån väldigt statiska förutsättningar nu. I verkligheten kommer det finnas massor med andra variabler.
Någon Vabbar, någon är sjuk, någon är på semester. Någon blir sjuk under dagen, några byter pass pga tandläkaren osv osv.

Visst man kan köra manuell handpåläggning efteråt men man kommer inte komma in i och bli bra på schemaläggning om man utgår ifrån automatiska hjälpmedel hela tiden. Speciellt i början.

Mitt råd är att köra manuellt och få in en feel för personalen och hur de önskar att jobba.

Skickades från m.sweclockers.com

Trädvy Permalänk
Medlem
Plats
Växjö
Registrerad
Dec 2004

@SuperNova: Ja där har du en värdefull poäng. Men om man bortser från det så är ett hjälpmedel ett bra sätt att slumpa ut en grund i vilket fall.

Och vad gäller sjukfrånvaro eller att man tex byter under halva dagen påverkar ju inte utfallet för nästa dag. Däremot är det ju bra om man kan välja vilka anställda som ska ingå i en schemagenerering innan man genererar det.

Trädvy Permalänk
Medlem
Plats
Småland, långt ute i mörka skogen.
Registrerad
Maj 2018

Den kod jag visade är på allra lägsta nivå. De allra innersta looparna i en genetisk algoritm. Den kombinerar två lösningar och skapar två nya.

I grunden handlar detta om att hitta en optimal sekvens av heltal. Det gör TSP också. Därför är det bra att börja med en TSP. Det blir enklare. Sedan kan exakt samma principer användas för att leta efter den optimala bemanningsplanen.

En annan luring är hur lagligt det är. Det handlar om att registrera folk, vad de gör och vilka preferenser de har. Kan det bli problem?

Sedan ser jag detta mest som ett intressant och knepigt problem. Jag höll på med denna typ av programmering för drygt 10 år sedan. Beställningsjobb. Jag har ingen aning vad det blev av det. Produktionsplanering. Liknade detta lite.

Linux och Android

Trädvy Permalänk
Medlem
Plats
Småland, långt ute i mörka skogen.
Registrerad
Maj 2018

Här visar jag hur bemanningsplaner kan kodas som en sekvens av heltal.

// Employee cost per section typedef vector<int> TEmployeeCost; // Position cost if staffed or unstaffed typedef pair<int, int> TPositionCost; // A position stores section no and position cost typedef pair<int, TPositionCost > TPosition; // All availible employees vector<TEmployeeCost> vEmployee; // All possible positions with section and costs for staffed/unstaffed vector<TPosition> vPosition; /* * Encoding of solution: * * Solution[index of employee in vEmployee] = index of position in vPosition; */ typedef vector<int> TSolution; // Parent generation solutions vector<TSolution> vParent; // Child generation solutions vector<TSolution> vChild

Ändrade manned till staffed. Politisk korrekthet for the win!

Linux och Android

Trädvy Permalänk
Medlem
Plats
Växjö
Registrerad
Dec 2004
Skrivet av Adoby:

Den kod jag visade är på allra lägsta nivå.

En annan luring är hur lagligt det är. Det handlar om att registrera folk, vad de gör och vilka preferenser de har. Kan det bli problem?

Sedan ser jag detta mest som ett intressant och knepigt problem.

Ja, jag kan bara grunderna i C# efter lite youtube-videos och så. Har även skrivit ett forum i PHP för längesen men annars är jag helt "okunnig" och om jag ska vara ärlig så förstår jag inte riktigt din kod.

Vad gäller om det är lagligt eller inte så kommer det bara att användas av oss som har behörighet till informationen, dvs vi som sätter schemat manuellt. Men det kanske inte är tillåtet att behandla uppgifterna digitalt ändå?

Och ja, jag ser det också som ett intressant problem eftersom ju fler loopar jag skapar och ju närmre man tror att man är en lösning så dyker det alltid upp nya problem. Därför testade jag att lägga ut en krok här igen och det verkar inte bättre än att jag kanske behöver be om en mer fullständig kod.

Trädvy Permalänk
Medlem
Registrerad
Mar 2015

Det låter inte så svårt, det är en tvådimensionell matris. Problemet är ju vad som händer om det finns fler eller färre anställda än avdelningsbehoven. I en perfekt värld är det bara enkel kombinatorik och det är inga problem att testa all lösningar och poängsätta dessa. Nu är ju inte världen perfekt...

Har man lite konkreta exempeldata kan det vara lättare för att se storleken på problemet, intervaller på godkända antal personer per avdelning, kan någon tvingas vara ledig etc. Generellt är människor grymt bra på schemaläggning jämfört med datorer och jag får lite känslan av att du vill skjuta över ansvaret på dålig schemaläggning... Det är svårt, alla kan inte bli nöjda¨som människa kan du "känna" om person x behöver lite extra stöd att få sin "önskade" avdelning eller att person Y inte bryr sig så mycket, och en hel hoper andra mjuka variabler på det.

Trädvy Permalänk
Medlem
Plats
Växjö
Registrerad
Dec 2004

Det är sant. Men målet är att alla ska rotera och att ingen ska behöva vara på samma avdelning flera dagar i rad. Men sätter man en högre upplösning på kompabilitet mot avdelning tex 0, 1, 2 (kan ej, kan, kan och föredrar stark) så kan man ju anpassa efter önskemål istället för bara 0, 1 (kan ej, kan).

Det ska alltid vara fullt bemannat, skulle någon/några saknas så vore ju ett fint alternativ att kunna välja avdelning där man föredrar att frånvarande saknas på, dvs minst viktigt att ha full bemanning på.

Skickades från m.sweclockers.com

Trädvy Permalänk
Medlem
Plats
Småland, långt ute i mörka skogen.
Registrerad
Maj 2018

I mina TPosition går det fint att lägga in olika värden för minimibemanning, önskad bemanning, överbemanning och maxbemanning per avdelning. Detta görs genom att sätta olika kostnader ifall en viss positionen är bemannad eller inte. De positioner som utgör minimibemanning sätts till mycket hög kostnad om de inte är bemannade. Man kan lägga in kanske fem sådana positioner, och då har man en minimibemanning på fem satt. Sedan kan man lägga till några med låg kostnad oavsett bemanning, så har man önskad bemanning. Och några platser med hög kostnad vid bemanning, då tillsätts de platserna bara om det är många närvarande och inga andra platser obemannad. Och man kan ha olika nivåer på kostnader för olika avdelningar om något behöver prioriteras extra. Kundservice, ordermottagning och fakturering exempelvis. Så kan algoritmen mer "elastiskt" hitta bra lösningar och bemanningen tillåtas variera oförutsett.

En sådan här bemanning bör nog inte vara absolut styrande. Den kan mycket väl kompletteras genom personal byter plats med varandra eller liknande. Bara minimibemanning klaras. Ett bra styrsystem lämnar utrymme för människan.

Linux och Android

Trädvy Permalänk
Medlem
Plats
Växjö
Registrerad
Dec 2004

Tack för dina/era svar men jag blir tyvärr inte klokare och definitivt inte närmre en lösning

Trädvy Permalänk
Medlem
Plats
Uppsala
Registrerad
Dec 2008

Jag brukar alltid skriva samma sak när folk ber om hjälp med programmering:

Hur skulle du göra för att lösa problemet för hand? Om du inte vet hur du skall lösa problemet kan du inte skriva ett program som gör det heller.

Skriv (papper och penna) instruktioner till någon, tänk att du skall förklara för polarens korkade lillebror, hur problemet skall lösas. Torrsimma problemet en gång genom att följa instruktionerna. Blev det bra? I så fall, översätt instruktionerna till lämpligt programspråk, om inte, putsa på instruktionerna och försök igen.

Trädvy Permalänk
Medlem
Registrerad
Nov 2008

Hade en skoluppgift som liknade detta, lösningen vi använde:

https://www.geeksforgeeks.org/maximum-bipartite-matching/

Vilket borde hitta den bästa matchningen. Denna lösningen tar dock inte hänsyn till olika grad av matchning, men det kanske går att bygga vidare på det?

Trädvy Permalänk
Medlem
Registrerad
Feb 2012
Skrivet av RobinJacobsson:

Det är sant. Men målet är att alla ska rotera och att ingen ska behöva vara på samma avdelning flera dagar i rad. Men sätter man en högre upplösning på kompabilitet mot avdelning tex 0, 1, 2 (kan ej, kan, kan och föredrar stark) så kan man ju anpassa efter önskemål istället för bara 0, 1 (kan ej, kan).

Det ska alltid vara fullt bemannat, skulle någon/några saknas så vore ju ett fint alternativ att kunna välja avdelning där man föredrar att frånvarande saknas på, dvs minst viktigt att ha full bemanning på.

Skickades från m.sweclockers.com

0 kan ej
1 kan/vill inte
2 kan/vill

Vi utgår ifrån att 2 används oftast, i perioder måste du använda 1', människor säger upp sig det finns inte så många 2or kvar 1orna prioriteras in i din lista, ni får hög orderingång, beordrad övertid, fler personer säger upp sig. Bemanning eller anställning/nya 0'or kommer in kvar har du några få 1/2'or men massvis av 0'or. Organisationen inser att man måste lära upp folk dom få 1/2'orna som är kvar ska lära upp 0'orna, man behöver tänka om/besluta om man ska använda 0'or i "rotations schemat" parallelt i upplärningsfasen. I det senare fallet fallerar scriptet då det inte längre bygger på kompatibilitet men att se till att man långsiktigt ser till att minimera 0'or

Trädvy Permalänk
Medlem
Plats
Växjö
Registrerad
Dec 2004
Skrivet av lappen81:

...I det senare fallet fallerar scriptet då det inte längre bygger på kompatibilitet men att se till att man långsiktigt ser till att minimera 0'or...

Dom flesta kan nästan alla avdelningar, och om det saknas bemanning så kan man ju generera att schema i vilket fall och använda det som grund. Alla hanterar ju minst 2-3 avdelningar var av 6 st avdelningar totalt, så jag tror inte att det blir en begränsning.

Vad jag vill lösa är

  • En algoritm som placerar ut alla anställda med hänsyn till vart dom var under gårdagen, se till att alla avdelningar fylls (där dom har en viss prioritet, se till att ett par avdelningar är bemannade och lämna isåfall dom "lätta" avdelningarna tomma där man (manuellt) kan ta in hjälp från andra avdelningar).

  • Ett gränssnitt där alla anställda listas från MySQL, samt deras preferenser som man kan ändra.
    Antal avdelningar och hur många dom rymmer.

Jag tänker att för en erfaren programmerare kan väl detta inte ta mer än nån timme att skriva ihop, bortsett från den grafiska biten och databasen?

Trädvy Permalänk
Medlem
Plats
Växjö
Registrerad
Dec 2004
Skrivet av SORRYFORCAPS:

Hade en skoluppgift som liknade detta, lösningen vi använde:

https://www.geeksforgeeks.org/maximum-bipartite-matching/

Vilket borde hitta den bästa matchningen. Denna lösningen tar dock inte hänsyn till olika grad av matchning, men det kanske går att bygga vidare på det?

Det räcker med kompatibel eller inte kompatibel.
Däremot undrar jag hur jag optimerar koden så att den hanterar avdelningar som rymmer olika antal anställda?

Skickades från m.sweclockers.com

Trädvy Permalänk
Medlem
Plats
Småland, långt ute i mörka skogen.
Registrerad
Maj 2018

Kan du göra ett program där du samlar in och uppdaterar grund-data?

För alla positioner som kan tillsättas, vilken avdelning det är. Och sedan sätta en poäng på den positionen för hur viktigt att just den positionen är bemannad. Arbetsplatser som utgör minimibemanning ges hög poäng. Kanske +5 till +10. Arbetspositioner som bara bemannas när väldigt många, ovanligt många, är på plats får minuspoäng. Kanske -5 till -10. Arbetsplatser som är bra om de är bemannade en låg poäng, kanske -4 till +4.

Och för varje person som är med i planeringen, poäng per avdelning. Hög poäng om de vill/kan/bör arbeta på den avdelningen. Kanske +2 till +10. Minuspoäng om de inte vill/kan/bör arbeta på den avdelningen. Kanske - 2 till -10. Och låg poäng om det bara är OK. Kanske -1 till +1.

Sedan mata ut detta till en fil.

En rad per avdelning med poäng per position. Första rad för avdelning 1 osv.
En tom rad.
En rad per person med poäng per avdelning. Första rad för person 1 osv.

Kan du göra det, då är detta tillräckligt för att optimera bemanningen med hjälp av en genetisk algoritm. Algoritmen försöker hitta den bemanning som ger den högsta totalpoängen. Det tar kanske någon minut. Beror på antal positioner, avdelningar, personer och hur tydlig poängsättningen är.

Och matar ut resultatet i form av en fil som är bemanningsplanen. En rad per avdelning med personer som bör jobba där. Möjligen flera planer med samma poäng, om så önskas. Förmodligen kommer man att behöva justera poängskalorna för att få ett bra resultat.

Sedan kan din programvara ta denna plan och skriva ut den med namn på avdelningar och på personer. Och spara planen för att hålla reda på vilka som varit på en viss avdelning sist, och uppdatera poängen efter det.

Jag håller på att skriva programmet med den genetiska algoritmen. Får se om det kan bli klart om en eller två veckor. Blir på fritiden. Det blir GPL3. Alltså open-source.

Skickades från m.sweclockers.com

Linux och Android

Trädvy Permalänk
Medlem
Plats
Växjö
Registrerad
Dec 2004

Coolt! Säg till om jag kan bidra, jag kan försöka sätta ihop ett grafiskt gränssnitt om du också kodar i C# / visual studio?

Kan man skicka PM här på swec? Hittade inget sätt att göra det via mobilen iaf.

Skickades från m.sweclockers.com

Trädvy Permalänk
Medlem
Plats
Småland, långt ute i mörka skogen.
Registrerad
Maj 2018

@RobinJacobsson: Ja, gör gärna ett GUI.

Jag kommer att skriva i C++, helt utan GUI. Ren console-app.

Men det jag skriver blir ett helt fristående program som kan ta emot input i form av en fil från ditt GUI, och sedan skicka tillbaka resultatet i form av en annan fil. Se mitt förra inlägg.

Jag skriver mitt program så att det blir rätt generellt för denna typ av planeringsoptimering.

Du kan exempelvis ha en knapp som skapar input till mitt program och sedan exekverar mitt program. Och väntar på resultatet. Om planen inte är bra nog trycker du på knappen igen eller ändrar grunddata i ditt GUI.

Om någon annan vill kan de gärna använda samma input/output för att på annat sätt, med en annan algoritm, leta efter en bra bemanningsplan.

Se också denna nya tråd: https://www.sweclockers.com/forum/trad/1567543-ga-staff-genet...

Linux och Android

Trädvy Permalänk
Medlem
Plats
Växjö
Registrerad
Dec 2004

Jag hade bara en trial-license på Visual Studio. Finns det någon gratis mjukvara du rekommenderar där jag kan bygga en GUI som du kan använda som grund?

Trädvy Permalänk
Medlem
Plats
Småland, långt ute i mörka skogen.
Registrerad
Maj 2018

@RobinJacobsson: Vad som helst. Spelar ingen roll för mig. Någon annan kan kanske tipsa?

Varför inte Visual Basic? Borde funka fint för att bygga en GUI. Det är gratis, tror jag?

(Jag använder inte Windows...)

Linux och Android

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av RobinJacobsson:

Jag hade bara en trial-license på Visual Studio. Finns det någon gratis mjukvara du rekommenderar där jag kan bygga en GUI som du kan använda som grund?

Visual Studio är gratis att använda om du använder Community-versionen.

Trädvy Permalänk
Medlem
Plats
Växjö
Registrerad
Dec 2004

Jag upptäckte det efter lite research. Vet inte vilken version jag lyckats få tag på, har på laptopen också men det är nog community!

Skickades från m.sweclockers.com

Trädvy Permalänk
Medlem
Plats
Umeå -> Nordmaling
Registrerad
Jul 2007

Jag har ingen erfarenhet att automatisera schemaläggning, tänkte det kan vara bäst att inleda mitt inlägg med det.

När jag sysslade med schemaläggning tänkte jag inte ens på att automatisera. Med en handfull stationer/avdelningar av olika storlekar (1-15 man vanligtvis) och 50+ anställda spenderade jag kanske 2-15 minuter om dagen på uppgiften. Det fanns fler faktorer som spelade in än OP nämnde, vi arbetade i två skift och ibland fanns yttre faktorer som spelade in som beordrad övertid / behov av ökad produktion osv. Sen hade vi anställda som bara ville vara på en speciell station, andra var lite mer flytande och när tillfälle gavs, vilket var ofta, fick folk hoppa in på de stationer de kunde sämst för att bredda deras kompetens.

Ibland var folk även schemalagda att jobba över skiftbytena, och var de på en station första skiftet kanske de ville byta station. Eller stanna kvar. Ibland jobbade folk båda fulla skiften, så när energi och fokus tryter framåt slutet av andra skiftet kanske de skulle ha en station som var lugnare och mer förlåtande, osv. Schemaändringar skedde ofta, folk behövde sluta tidigare eller komma in senare. Schemabyten skedde regelbundet, och en vecka utan sjukanmälningar var ovanligt (med 50+ anställda motsvarar det mindre än en insjukning per anställd om året, vilket kan anses acceptabelt).

Sen gick folk också i faser, de kunde under en period föredra en avdelning och sen under en annan bli mer intresserad av en annan. Den mänskliga faktorn skulle vara en mardröm att hålla ett auto-program fullt uppdaterad på. Sen kunde skador ha en påverkan också, vilket gjorde att de under en period presterade sämre på ett område men skulle prestera likgiltigt inom ett annat, hade de gipsat armen kanske de inte skulle bära så mycket och hade de stukat foten kanske det vore bäst att de hade en stillasittande position, osv.

Jag lärde mig att det bästa sättet att ta hand om schemaläggningen var att jobba med alla på samtliga stationer, och se själv hur de trivs och presterar. Prata och lära känna dom. Höra vad de föredrar att göra och mer viktigt varför, hur de resonerade. Visste du att du skulle få personalbrist på en avdelning gav det möjlighet att väcka intresse hos folk som föredrog att specialisera på andra områden, då du visste deras grundresonemang. Ibland funkade det, ibland inte, vissa är mer nyfikna på att bredda sin comfort zone än andra helt enkelt.

Hade min chef bett mig automatisera schemaläggningen hade jag inte ens vetat vart jag skulle börja. Det hade varit grymt opraktiskt att hålla koll på alla dessa variabler i ett program, och eftersom programmet inte kan ringa folk och fråga om de ville jobba extra osv så fanns det fortfarande praktiska element som behövde ske manuellt. Och vill du få ett ja på telefon varje gång du behöver extrapersonal, även om personen inte vill, så att ha en god personlig relation med individen var lite av ett krav, så automatiseringen hade inte kunnat hjälpa där heller.

Vi hade två-fas i våran schemaläggning, månads- och dagsscheman. Först sattes tiderna ut på månatlig basis så alla visste när de skulle jobba i god tid. Andra fasen var mer dag-till-dag, där folk den aktuella dagen (eller dagen innan) placeras på sina stationer (vilket jag utgår är den delen OP frågar om, första "fasen" kan automatiseras med riktigt goda resultat då "när" är lättare än "var"). Jag hade några standardmallar för mina dagsscheman, där folk redan var för-utplacerade på sina favoritpositioner, med viss variation, och med de personer de både trivs att jobba med men också är produktivare med pga hur väl de samarbetar; i min erfarenhet är personlighetstyper en verklighet. Vissa dagar kunde jag rentutav använda en mall rakt av, andra dagar behövdes några namn flyttas runt. Automatisering hade inte sparat mig någon tid där. Det var bara vissa dagar som var klustergranater och inget automatiserat program skulle kunna ta hänsyn eller spotta ut ett bra förslag då den inte är medveten om vad som försiggår.

Så även med en automatisering hade jag inte sparat många minuter om dagen (<5 kanske?) och spenderat betydligt mer att bara underhålla systemet med att uppdatera sjukanmälningar och vad det nu kan tänkas vara. Kanske är OP's arbetsplats simplare än så, men då hade standardmallar man använder rakt av varit mindre arbete, och när de behövs uppdateras vet du redan om variablerna och istället för att spendera tid på att informera systemet om dessa variabler spenderas denna tid till att bara uppdatera mallarna direkt. Färre komplikationer. Har OP en stabil arbetsplats är det väl enklast att göra en mall per dag, mån-fre, eller ett rullande n-dagsschema (ex rullande 3-dagsschema) med dessa färdiga standardmallar, och sen spendera nån minut eller två då och då i takt med att folk behöver gå till tandläkaren osv.

Kanske kan automatisering vara en kul grej, men är OP säker på att det finns en tidsbesparing med denna approach? Jag tänker såhär, jag spelade en hel del fotbollmanagerspel i samma veva som jag sysslade med schemaläggningen och det skulle aldrig falla mig i smaken att använda en automatiserad formation/startelva då jag vet vad jag är ute efter, oavsett hur bra jag informerar systemet om allt den ska ta hänsyn till. Sen kommer yttre faktorer in som motståndarlag, bortaplan och dimensioner på planen vilket kan liknas med storbeställningar som kräver mer personal/övertid, sjukskrivningar och what have you. Jag tänker att lite samma situation gäller här.

Lite av ett brev med öppna tankar från någon som inte riktigt vet hur din arbetsplats ser ut.

Trädvy Permalänk
Medlem
Plats
Växjö
Registrerad
Dec 2004

@Raphaei: Självklart, men oavsett sjukdom eller annat så sätter man ju förutsättningarna innan man genererar schemat. Vet jag att du har ont i benet imorgon så sätter jag din preferens för att springa maraton till "0" helt enkelt. Och jag hade ju ändå inte vetat om personen i fråga inte kommer till jobbet imorgon pga sjukdom eller annat så det förändrar inte programmets flexibilitet i mina ögon.

Vi har som sagt helt enkelt flera olika avdelningar som rymmer olika många personer, och alla ska rotera förutom vissa som av olika skäl bara hanterar en station. Och man ska inte hamna på samma station som under gårdagen. Jag ser inga nackdelar med att generera scheman såhär, när det är under så pass enkla former. Programmet gör bara det jag tänker göra, fast utan en större tidsåtgång. Sedan när schemat är genererat så utesluter ju inte det att jag kan justera det manuellt om något skulle bli konstigt. Tanken är bara att det ska underlätta schemaläggningen, inte ersätta den mänskliga faktorn som är (precis som du säger) lika, om inte mer viktig.

Trädvy Permalänk
Medlem
Plats
Växjö
Registrerad
Dec 2004
Skrivet av Adoby:

@RobinJacobsson: Vad som helst. Spelar ingen roll för mig. Någon annan kan kanske tipsa?

Varför inte Visual Basic? Borde funka fint för att bygga en GUI. Det är gratis, tror jag?

(Jag använder inte Windows...)

Jag fick igång Visual Studio... Har du någon mail vi kan fortsätta konversationen på?