Tijdens onze maandelijkse workshops delen we kennis en oefenen we met de toepassing van nieuwe technieken. Deze keer over lineair programmeren: hoe zet je een probleem om in een wiskundig model om het vervolgens te optimaliseren.
5 taarten maakt nog geen developer
Een workshop over de basis van lineair programmeren
Geschreven door Merel
Linear Programming is voor velen van ons nog een onbekende tak van sport. Het idee is vet: schrijf je probleem om in een wiskundig model en laat een programmaatje dat vervolgens optimaliseren. Een goed voorbeeld dat voorbij kwam was hoe je op deze manier de optimale winst kan berekenen voor een patisserie, rekening houdend met kostprijs, bereidingstijd, loon, etc. Een cheesecake levert misschien wel meer op, maar kan zo maar eens veel meer werk zijn dan bijvoorbeeld een goedkopere carrotcake (sidenote: ik heb verstand van software, niet van taarten. Dus misschien levert een cheesecake wel minder op, of is ie sneller om te maken dan een carrot cake, maar ik dwaal af). Ook zaken als productiekosten kan je meenemen. Met wat wiskundige magie stel je hier vervolgens een formule voor op.
Kennismaken met PuLP
Met die formule kun je dan mooi aankloppen bij PuLP, een Python library die precies voor dit soort problemen is ontworpen. Je maakt dan een modelletje, stopt de productie kosten, productie tijd en opbrengst er in. Vervolgens hoef je alleen nog je formule voor maximale winst aan de mix toe te voegen en op play te klikken. Als je het dan goed hebt gedaan, komt het model met de optimale oplossing. Als je het niet goed hebt gedaan, en bijvoorbeeld bent vergeten dat je als taartenbakker ook nog wil slapen en geen werkweek van 80 uur wil draaien, komt er iets uitrollen wat niet perse implementeerbaar is. PuLP doet een hoop voor je, maar je zal toch echt zelf moeten aangeven wat al je eisen zijn.
Door naar de praktijk
Dit was slechts een theoretisch voorbeeld tijdens de presentatie. Helaas voor de taarten bakkers onder jullie, kan ik nu dus niets zeggen over de ideale taarten-strategie om steenrijk te worden. Het daadwerkelijke doel van de workshop was namelijk een stukje pittiger: het automatiseren van onze eigen maandplanning. Als werknemers ontspringen wij de maandelijkse dans van het handmatig maken van deze planning, wat met een groeiende hoeveelheid developers en projecten behoorlijk tijdrovend schijnt te worden. Onze beste bazen vonden het de ideale combinatie: alle developers leren iets over een specifieke programmeer puzzel en tegelijkertijd wordt het maken van de planning een minder grote nachtmerrie.
Ging super goed zeker?
*Insert success story here*
Tijdens de workshop kregen we de kans om te kijken of en hoe we dit voor elkaar konden krijgen. Dan blijkt er een hele hoop te zijn om rekening mee te houden. Zo is het natuurlijk niet de bedoeling om alle developers aan één project te laten werken. Ook moet het model bijvoorbeeld rekening houden met vooraf ingedeelde dagen, zoals afspraken met klanten of mijn vakantie naar Bali. Hoe je dat allemaal in een model stopt... mij niet bellen.
Toevoeging van Bauke
Blijkbaar staan bij lineair programmeren solvers centraal. Optimale winst berekenen voor de verkoop van taarten, rekening houdend met kostprijs, bereidingstijd en bakkersloon? Solvers! Optimaal gebruik van vrachtwagens/chauffeurs berekenen gegeven afstand, rustpauzes en gewicht van lading? Solvers! Of, zoals in deze workshop: optimale bezetting van personeel op basis van projecten, geschiktheid en aanwezigheid? Solvers!
Dat klinkt eenvoudig, maar blijkbaar moet je een solver wel wat meegeven op basis waarvan het iets moet opleveren. En dat is toch niet zo eenvoudig. Je hebt 3 verantwoordelijkheden:
- Het definiëren en kwantificeren van de juiste variabelen. (Wat speelt er allemaal een rol in je optimale berekening - bijvoorbeeld mate van geschiktheid voor een project?)
- Het definiëren van de objectieve functie (Hoe moet het optimale resultaat bereikt worden? - bijvoorbeeld meest optimale match tussen geschiktheid en project)
- Het definiëren van grenzen en beperkingen (Binnen welke kaders moet de berekening gedaan worden? - bijvoorbeeld wie is op welke dag vrij?)
Al snel merk je dat je een variabele mist of een beperking te weinig hebt opgevoerd: In mijn eerste planning werkte iedereen fulltime op hetzelfde project🤔. Misschien toch even een beperking toevoegen dat een project een maximum aantal uren per maand gedraaid kan worden😇. Na enig puzzelen kon ik de solver deze restrictie op laten leggen: nice! Na een uurtje uiteindelijk toch een fraaie planning in elkaar weten te draaien - maar voor een optimaal resultaat mag er nog wel wat aan gesleuteld worden😉.
Key takeaways
- Gratis en maar ook betere (betaalde) solvers zijn beschikbaar voor ingewikkelde lineaire vergelijkingen (thank god)
- Eenvoudig op te zetten/in gebruik te nemen
- Moeilijk volledig en juist te maken