ga-staff - genetisk algoritm för bemanning

Permalänk
Medlem

ga-staff - genetisk algoritm för bemanning

Jag skall göra ett program som med hjälp av en genetisk algoritm söker efter en optimal bemanningsplan.

Se denna tråd: https://www.sweclockers.com/forum/trad/1567273-slumpa-rotatio...

Här kommer jag att redogöra för hur det går och förhoppningsvis presentera ett färdigt resultat inom någon vecka.

Jag tror inte att jag behöver någon hjälp, men tar tacksamt emot synpunkter.

Kanske programmet skulle ha ett bättre namn än ga-staff?

Förberedelser:
Jag har en grund att utgå från i form av ett tidigare GA demo-projekt jag skrev för mer än 10 år sedan. Jag tror att jag kan återanvända mycket därifrån. I grunden är det rätt liknande problem.

Här är det gamla ga-tsp: https://github.com/WikiBox/ga-tsp

Här är det nya ga-staff: https://github.com/WikiBox/ga-staff

Än så långe finns det ingen kod för ga-staff, annat än det jag kan återanvända från ga-tsp...

Jag är inte så hemma på github, så detta blir lite träning på det också för mig.

Förberedda ursäkter:
Om jag inte klarar av detta så snabbt så är det bra att ha en del bra ursäkter i beredskap-

"Min gamla laptop har gått sönder. Jag har beställt en ny, men den har inte kommit än."
"Jag har precis fått en ny laptop men jag har problem med att få igång Linux på den."
"Katten kissade på min nya laptop och den går inte att använda längre."

Visa signatur

Linux och Android

Permalänk
Medlem

Nu har jag lagt in källkodsfiler för ga-staff. Jag rensade i gamla ga-tsp och ändrade (eller tog bort) allt om tsp till staff. Jag lät den kod vara kvar som jag tänker återanvända.

Koden kompilerar OK, men gör naturligtvis inget ännu.

Härnäst tänker jag skapa en testfil för input och börja skriva kod för att läsa in och lagra input. Kanske rent av gör en lite programsnurra som kan generera testfiler. Stora och små. Enkla och komplexa.

https://github.com/WikiBox/ga-staff

Visa signatur

Linux och Android

Permalänk
Medlem

Har skrivit kod för att (nästan) göra klassen Staff komplett. staff.h och staff.cpp. Uppdaterat github.

Följande är skrivet och kompilerar, men har inte testats:
Läser in datafil i konstruktorn och lagrar avdelningar, positioner och anställda.
Kan skapa en slumpad lösning.
Kan beräkna poäng på en lösning.
Kan mutera en lösning.

Sedan tidigare kunde jag med PMX skapa nya lösningar som kombinerar delar av redan existerande.

Behöver kunna mata ut lösningar.

Jag har också gjort en testfil-generator som skapar testfiler att hitta optimala bemanningsplaner till.

Visa signatur

Linux och Android

Permalänk
Medlem

Testar och avlusar. Fixat flera uppenbara buggar, men några mindre uppenbara kvar. Men annars verkar det funka. Om det inte kraschar... Har lite problem med att ga-tsp försökte hitta kortaste resan, ga-staff bemanningsplanen med högsta poäng. Bör se om jag kan byta sorteringsordning i datastrukturer eller hantera det på annat sätt. Nu gör jag ett fulhack genom att subtrahera poängen från 100000.

Tidsplanen, att få detta klart inom ett par veckor, kan hålla.

Visa signatur

Linux och Android

Permalänk
Medlem

En lite lurig "bugg".

ga-tsp lagrade sin population av lösningar i en map med sträckan för en rundtur som nyckel. Det var bra för då lagras lösningarna automatiskt sorterade och två identiska lösningar med exakt samma sträcka kan inte lagras. Eftersom sträckan är en double bestående av en summa av en massa kvadratrötter är det osannolikt att två olika lösningar har exakt samma sträcka. Det innebär att kopior av exakt samma lösningar inte lagras i populationen och man undviker därför "inavel" som gör att den genetiska algoritmen fungerar dåligt.

I ga-staff används summor av heltal istället för summor av kvadratrötter. Det innebär att sannolikheten är mycket hög att två olika lösningar har samma poäng. Men eftersom de lagras i en map så accepteras bara en enda lösning med en viss poäng. Istället kommer sämre lösningar, med sämre poäng, att lagras i populationen. Det får den genetiska algoritmen att fungera dåligt. Tanken är att ta vara på bra lösningar och rekombinera dem för att hitta ändå bättre lösningar.

Fix:
Jag kan antingen gå över till en multimap eller göra om poängen till double på ett sätt som gör att olika lösningar sällan kan ha exakt samma poäng.

Jag kommer att testa med att göra poängen till double. Det kommer jag att göra genom att lägga till ett litet värde till varje specificerad heltalspoäng. Kanske mellan 0,001 till 0,01. Och jag gör det på ett sätt som innebär att de första avdelningarna och de första personerna får en liten aning företräde. Det gör också att det inte längre är sannolikt att många lösningar är lika bra. Det blir en kontinuerlig rankning av lösningar. Men fortfarande kan inte lösningar exakt samma poäng lagras i map, men nu är sannolikheten för att lösningar med exakt samma poäng är identiska mycket lägre.

Skickades från m.sweclockers.com

Visa signatur

Linux och Android