Inleiding Van harte welkom in de wereld van de logistiek. Zin om je onder te dompelen in de voorraadproblematiek en je te laten meeslepen in een planningsavontuur? Deze inleiding is alvast een voorsmaakje van wat je nog allemaal te wachten staat…. Je wenkbrauwgefrons bij het lezen van de titel sprak boekdelen. Waarover gaat dit werk en wat wil die moeilijke titel zeggen? Laten we hem opsplitsen in twee delen. Ten eerste onderzoeken we ‘het gedrag van een reeks scheduling heuristieken’ en ten tweede passen we dit toe ‘in een semi-process manufacturing omgeving’. Dit is dus geen zuiver theoretisch werk, alles wordt ook in de praktijk gebracht m.b.v. een casestudie. Ons ‘uitverkoren’ bedrijf is Agfa-Gevaert. De opdracht bestaat erin om hun emulsiefabriek efficiënt tegen eindige capaciteit te plannen. Momenteel gebeurt dit nog manueel. Via een logische redenering willen we tot een aanbeveling komen voor een planningstrategie, specifiek toegepast op de problematiek van Agfa. Figuur 0.1 toont de gevolgde weg bij het aanpakken van deze uitdaging. Hoofdstuk 1 brengt ons eerst in de sfeer met een korte geschiedenisschets van Agfa. Vervolgens verdiepen we ons in het productie- en planningsproces. Het algemene filmproductieproces wordt beschreven en gaandeweg verfijnd naar de aanzetlijnen van de afdeling ‘Bereidingen’ waar de emulsies worden gecreëerd. Met de Agfa-visie in het achterhoofd zijn we klaar om de literatuur te doorpluizen. Hoofdstuk 2 vormt de theoretische fundamenten waarop we onze experimenten verder bouwen. Na een algemene situering van de mogelijke planningsactiviteiten, komen de begrippen ‘scheduling’ en ‘sequencing’ gedetailleerd aan bod. Door de theorie wat te herschikken en logisch na te denken ontwikkelen we zelfs een nieuw algoritme. Om de planning van orderlijsten gemakkelijk te simuleren hebben we nood aan een computerinstrument. Daarom ontwerpen we in hoofdstuk 3 eerst een schedulingsengine. Daarna gaan we van start met een eerste fase van experimenten. Aan de hand van enkele fictieve orderlijsten met verschillende karakteristieken voorspellen we het gedrag van onze schedulingsengine. De klemtoon van deze experimenten ligt op: 1
•
de productie plannen tegen het gevraagde levertijdstip
•
minimaliseren van het aantal orders dat te vroeg wordt geproduceerd
Met dit beperkt onderzoek zijn we in staat om een aantal regels te selecteren die goed presteren op Agfa-criteria. De eigenlijke planning van de aanzetlijnen begint in hoofdstuk 4. Dit gebeurt op basis van representatieve productieopdrachten en procesbeschrijvingen van Agfa. We bouwen verder op de geselecteerde regels van hoofdstuk 3 maar slaan beetje bij beetje onze eigen planningsweg in. De regels worden getuned met een bijkomende dimensie: de voorraadwaarde. Met wat creativiteit minimaliseren we het kapitaal dat in de voorraden kruipt. In hoofdstuk 5 komen we tot een aanbeveling voor Agfa. Onze planningsrit eindigt daar, maar de weg voor verder onderzoek ligt open.
2
HOOFDSTUK 1
HOOFDSTUK 2
Inzicht verwerven in het productie-
Literatuuronderzoek
en planningsproces van Agfa Klemtoon: •
Agfa-Gevaert: -
Algemeen Belgische afdeling
sequencing -
Het productieproces
•
Het filmproductieproces Het bereidingsproces Het aanzetproces De aanzetlijnen E27 bottleneck installatie
beoordelingscriteria van een organisatie prestatiefactoren opsomming prioriteitsregels
scheduling -
forward scheduling backward scheduling bottleneck scheduling
THEORIE
Onderzoek naar het gedrag van een reeks schedulings heuristieken
PRAKTIJK
In een semi-process manufacturing omgeving, case: Agfa-Gevaert
HOOFDSTUK 3 Ontwikkeling generieke schedulingsengine: -
Programmeren van ontwikkeld bottleneck algoritme/bestaand forward algoritme Simulatie van planning orderlijsten mogelijk
Eerste fase van experimenten: Begrijpen van het gedrag van schedulingsengine -
Karakteristieken van orderlijsten Experimenten: Klemtoon: Te laat? / Te vroeg? Gedrag van regels
HOOFDSTUK 4 Tweede fase van experimenten: Planning van de aanzetlijnen van Agfa -
Klemtoon: voorraadwaarde?
HOOFDSTUK 5 Besluit thesis: aanbeveling voor Agfa Suggesties voor verder onderzoek Fig 0.1: Opbouw thesis
3
DOEL THESIS
Hoofdstuk 1 Agfa-Gevaert in een notendop 1.1
Algemene informatie over Agfa-Gevaert
Agfa, de ‘Aktiengesellschaft für Anilinfabrikation’ werd gesticht in 1867 nabij Berlijn, Duitsland. De onderneming ontwikkelde en produceerde aanvankelijk kleurstoffen, en later radiografische en fotografische film. In 1898 bracht Agfa als eerste de dubbelzijdige röntgenfilm op de markt. In 1894 zette een jonge fotograaf, Lieven Gevaert, een ‘fotoproducten’-zaak op in Antwerpen, België. Dankzij zijn geautomatiseerde begietingstechnologie voor de productie van fotopapier, breidde Gevaert zijn familiezaak uit tot een internationaal bekende onderneming. De twee bedrijven, slechts op 200 km van elkaar verwijderd, kwamen in 1964 overeen om samen te smelten. De nieuwe groep kreeg de naam “Agfa-Gevaert” en was voor 50% in bezit van Bayer en 50% van de holding Gevaert. De zilvercrisis aan het einde van de jaren '70 zette de Groep onder grote financiële druk. Zilver was immers de belangrijkste grondstof voor lichtgevoelig materiaal. In 1981 nam Bayer de Agfa-Gevaert Groep over. Maar in 1999 werd Agfa-Gevaert als een zelfstandige onderneming op de beurzen van Brussel en Frankfurt genoteerd. De Agfa-Gevaert Groep heeft een jaarlijkse omzet van meer dan 4,6 miljard €, die gerealiseerd wordt via 40 verkooporganisaties en 120 lokale verdelers wereldwijd. De Groep heeft ongeveer 19 000 medewerkers. Er zijn productievestigingen in de hele wereld met lokaal georganiseerde verkoopondersteuning voor een snelle levering en service. Sinds de fusie tussen Agfa en Gevaert in 1964 heeft Mortsel zich geconcentreerd op het bedienen van de gezondheidszorg, de grafische industrie en een aantal kleinere nichemarkten, terwijl Agfa in Leverkusen zich heeft gefocust op fotografie.
4
Het bedrijf wil gaandeweg afstappen van het verkopen van film en chemicaliën en zal zich meer en meer gaan omvormen tot een serviceorganisatie met als hoofdactiviteiten de verkoop van medische netwerken en van drukkerijsoftware. Zo wordt vandaag in de gezondheidszorg al 17% van de inkomsten door services gegenereerd. Dit mede door de recente acquisities van softwarebedrijven actief in de medische sector. Sinds november 2004 volgen Mortsel en Leverkusen gescheiden wegen. De Duitse tak, gespecialiseerd in de amateurfotografie, is nu een aparte firma onder de naam AgfaPhoto: Ook Agfa ondergaat een ingrijpend transformatieproces. Agfa wenst zich tegen het einde van 2006 op te splitsen in twee juridisch gescheiden entiteiten. Een eerste bedrijf zal zich specialiseren in grafische toepassingen. Het wenst door de groei in inkten en inktjetmaterialen haar positie als marktleider te behouden. Een tweede bedrijf richt zich tot de gezondheidszorg en evolueert meer en meer tot een leverancier van hospitaal IT-systemen.
1.2
De afdeling van Agfa-Gevaert in België, Mortsel
Sinds de beursintroductie in 1999 is Mortsel de hoofdzetel van de Groep. Het is tegelijk één van de voornaamste vestigingen voor productie en onderzoek gebleven. Naast het Corporate Center zijn ook de hoofdkantoren van de Business Groups HealthCare en Graphic Systems en van de wereldwijde serviceafdelingen zoals IT, Logistiek, Human Resources en R&D in Mortsel gevestigd. Verkoop en service aan Belgische klanten gebeurt via de verkooporganisatie in Kontich, een paar kilometer van Mortsel. Vandaag telt Mortsel ongeveer 4 600 medewerkers. Een groot deel daarvan werkt in de filmproductie: productie van polyesterfilm, het begieten van de film met lichtgevoelige chemische lagen, versnijden en verpakken, en dat 24 uur per dag, 7 dagen op 7. Mortsel produceert ook chemicaliën en software. Meer dan 95% van de totale productie wordt uit België geëxporteerd.
5
1.3
Het productieproces
Agfa ontwikkelt, produceert en verkoopt analoge en digitale oplossingen voor het maken, verwerken en reproduceren van beelden. Beelden die bedoeld zijn voor de gezondheidszorg, voor drukwerk en fotografie maar ook voor een aantal andere grote gebieden, zoals de micrografie en de filmwereld. Hoewel ze 95% van hun omzet realiseren in business-to-business-markten, spelen ze ook een rol in ons dagelijkse leven. Agfa is een wereldleider in al zijn activiteiten. Of we nu een krant lezen, onze favoriete vakantiefoto's bekijken of een ziekenhuis bezoeken, Agfa heeft er waarschijnlijk iets mee te maken. Het is belangrijk om het productieproces volledig te begrijpen vooraleer we kunnen beginnen plannen. Na een bedrijfsbezoek van de productieafdeling te Mortsel in oktober 2004 was ik dan ook in staat om alles beter in zijn context te plaatsen. In deze
paragraaf
zal
ik
eerst
een
algemeen
kader
geven
van
het
filmproductieproces en gaandeweg inzoomen tot de aanzetlijnen die we willen plannen.
1.3.1
Het filmproductieproces
Het productieproces om een fotografische film te maken bestaat uit meerdere fabricagestappen zoals te zien is in fig 1.1. In de voorbereidende afdelingen, de basisafdelingen, maakt men fotografische emulsies en grondlagen. Deze beide worden samengevoegd in het coatingproces, waarbij een fotografische emulsie wordt gegoten op een grondlaag. Deze productiestap gebeurt in een gietzaal en is procesgeoriënteerd. Het levert een beperkt aantal tussenproducten op: de masterrolls. Deze tussenproducten zijn de input voor fabrieken die instaan voor de afwerking of ze worden onmiddellijk doorverkocht aan onafhankelijke afwerkeenheden. De laatste productiestap is flowshop georiënteerd en zal de tussenproducten versnijden in een groot aantal eindproducten. Agfa heeft ongeveer 200 verschillende coatingtypes, waarvan elk wordt gekenmerkt door hun eigen specifieke fotografische eigenschappen. De eindafwerking zal deze tussenproducten verwerken tot ongeveer 10 000 verschillende eindproducten. Masterrolls worden onmiddellijk verkocht of worden 6
afgewerkt
tot
rechthoekige
formaten
en
verpakkingseenheden.
Het
afwerkingsproces heeft verschillende afwerkingslijnen, elk met een eindige capaciteit. Productie van Afwerking
emulsies coating Productie van
Voorraad
grondlagen
afgewerkte
Voorraad halfafgewerkte
Transport naar
producten: masterrolls
onafhankelijke
producten
afwerkingseenheden
Fig 1.1: het productieproces
In de volgende paragraaf zal ik meer vertellen over het bereidingsproces. De productie van emulsies is hier een onderdeel van.
1.3.2
Het bereidingsproces
De afdeling ‘Bereidingen’ staat in voor de aanmaak van chemische componenten. De ‘subafdelingen Bereidingen’ binnen Agfa zijn: •
Facpro, Chemische componenten (gevestigd in Westerloo-Heultje)
•
PCF, Productie centrum ontwikkel chemicaliën (Gevaert 8 - Wilrijk)
•
BG1, Bereidingen (emulsies en dispersies) Groep 1 (Gevaert 1 - Mortsel), vroeger EB1 genoemd
•
BG2, Bereidingen Gevaert 2 (Gevaert 5 - Mortsel), vroeger EB2 genoemd
De afdeling BG1 staat in voor de aanmaak van emulsies of dispersies. Het onderscheid tussen de twee is het al of niet aanwezig zijn van zilvernitraat (opgelost zilver) in de bereiding. Emulsies bevatten zilver en de bereiding moet dus in het donker gebeuren. Dispersies kunnen in witlicht-omstandigheden geproduceerd worden. BG1 is de afdeling waar de emulsies/dispersies aangezet (gecreëerd) en gerijpt worden. Nadien worden deze emulsies ofwel in een (tussen) voorraadmagazijn opgeslagen ofwel in een tankwagen vloeibaar geleverd aan de gietzalen. BG2 is de afdeling waar de emulsies gietklaar worden gemaakt. Deze afdeling is dan ook in de onmiddellijke nabijheid van de gietzalen gevestigd. Tabel 1.1 geeft een overzicht van de activiteiten binnen de afdelingen BG1 en BG2. 7
Tabel 1.1: de activiteiten binnen de verschillende afdelingen afdeling
historisch begrip
activiteiten
emulsies
dispersies
BG1 (EB1)
eerste dag
aanzetten
x
x
tweede dag
rijpen
1 tot n aanzetten per rijper
-
derde dag
gietklaar maken
x
-
BG2 (EB2)
Mijn thesis zal zich focussen op de activiteiten binnen BG1 en meer specifiek op het maken van de planning van de aanzetlijnen. De emulsies bevatten een zeker zilvergehalte (naargelang de soort emulsie). Agfa verbruikt zo’n 1 100 ton zilver per jaar. Eén kilo emulsie heeft ongeveer een waarde van 20 €. Hun gemiddelde emulsievoorraad bedraagt nu om en bij de 270 ton (waarde in 2004). Door efficiënter te plannen, willen we vooral deze voorraadwaarde aanpakken. De activiteiten binnen de afdeling BG1, aanzetten en rijpen van de emulsie, worden gedetailleerd beschreven in de paragraaf 1.4 en 1.5. Om nu al een idee te krijgen van het bereidingsproces, is het handig om fig 1.2 te bestuderen. Deze vereenvoudigde voorstelling toont het recept van de bereiding van een emulsie.
+
= H2O
zout
=
+ Ag-metaal
HNO3
=
AgNO3
+
+ gelatine
zoutoplossing
AgNO3
zoutoplossing
emulsie
Fig 1.2: het emulsie bereidingsproces
8
1.4
Deelstappen binnen het aanzetproces
1.4.1
Afmeten van de soluties
Het afmeten van de soluties gebeurt hoofdzakelijk automatisch, heel uitzonderlijk zal men dit manueel uitvoeren. Bij het automatisch afmeten worden in de solutieof doseerketels een aantal soluties gedoseerd. Nadien worden deze solutieketels op de juiste temperatuur gebracht.
1.4.2
Aanzetten
Tijdens de aanzetfase ledigen de verschillende doseerketels zich in een bepaalde volgorde en op bepaalde tijdstippen in de aanzetketel. Het inloopdebiet is gegeven: dit kan constant of variabel zijn in de tijd. Gedurende de aanzetfase wordt de temperatuur van de ketel onder controle gehouden. Deze temperatuur kan variëren in de tijd, naargelang het recept. Het roeren in de ketel is in deze fase zeer belangrijk
voor
de
vorming
van
de
zilverhalogenidekorrels. De roersnelheid is gegeven en is tijdsafhankelijk. Ook kan de
Fig 1.3: een aanzetketel
soort roerder, die vooraf in de ketel geplaatst wordt, volgens het recept veranderen.
1.4.3
Neerslaan
Het neerslaan heeft als doel overtollige zouten en water uit de emulsie te verwijderen. De emulsie wordt overgepompt naar een neerslagketel waar nadien een neerslagmiddel wordt toegevoegd. Tijdens het inlopen van het neerslagmiddel wordt er geroerd in de ketel. Hierna stopt het roerwerk en kan de uitgevlokte emulsie op de bodem van de ketel bezinken. Na het bezinken worden de overtollige zouten en het water afgezogen en weggepompt.
9
1.4.4
Wassen
De wasfase verwijdert uiteindelijk de nog resterende zouten. Hierbij wordt een door de computer ingestelde hoeveelheid water aan de emulsie toegevoegd. Na enkele minuten omroeren, bezinkt de emulsie opnieuw, waarna het zouthoudende water wordt afgeheveld. Deze cyclus zal zich naargelang de formule een aantal keer herhalen. Na de wasfase kan de emulsie via een koppelstation overgepompt worden Fig 1.4: de wasfase
naar de wachtende rijpketel.
De verschillende deelstappen van het aanzetproces worden nog eens schematisch voorgesteld in fig 1.5.
Afmeten van de resoluties
aanzetten
neerslaan
wassen
Fig 1.5: de verschillende deelstappen binnen het aanzetproces
BG1 beschikt over vier aanzetlijnen, elk met hun eigen specifieke configuratie. •
E28 (wordt binnenkort uit gebruik genomen)
•
E22 die voornamelijk vloeibaar levert aan de gietzalen
•
E26 niet-bottleneck installatie
•
E27 bottleneck installatie 10
Deze thesis bespreekt de belangrijkste emulsie-aanzetlijnen (E22, E26, E27). De emulsie-aanzetlijn E28 wordt in de nabije toekomst afgebouwd. Daar de thesis zich richt op het plannen van emulsie-aanzetlijnen, worden de dispersieaanzetlijnen hier niet vermeld. Tabel 1.2: de aanzetlijnen en hun capaciteit lijn E22 E26 E27
aanzetketel (liter) 1 x 2700 1 x 2700 1 x 2700
neerslagketel (liter) 2 x 3000 1 x 3600
wasketel (liter) 2 x 3000 2 x 3000
neerslag en wasketel (liter)
3 x 3500
De opdracht van de thesis is onder andere de voorraadwaarde aanpakken. Ruwweg kunnen we de voorraad zilver van 270 ton (waarde 2004) als volgt verdelen: •
70 ton vanuit E28
•
25 ton vanuit E22
•
75 ton vanuit E26
•
100 ton vanuit E27
Aangezien de E27 een bottleneck installatie is, zullen we onze aandacht op deze aanzetlijn spitsen. Een installatie wordt een bottleneck installatie genoemd als er zich capaciteits- (of andere) beperkingen voordoen. Het principe is gebaseerd op de Theory of Constraints (TOC, E.M. Goldratt). Deze theorie is samengevat in appendix A. Als principe geldt dat elk gewonnen tijdstip op de bottleneck resulteert in meer afgewerkte producten en uiteindelijk in meer winst. Tijd winnen op een niet-bottleneck installatie heeft geen toegevoegde waarde. Een niet-efficiënte planning van niet-bottleneck installaties leidt altijd tot hogere voorraden. De E27 is een bottleneck omdat een aantal emulsies enkel op deze installatie kunnen worden geproduceerd. Door de sluiting van E28 verhuizen bovendien een aantal emulsies naar de E27 en E26. Deze emulsies hebben vaak een lange duurtijd wegens hun bijzonder trage aanzetformules. Bovendien wordt de medische afdeling geplaagd door kwaliteitsproblemen (onstabiele aanzetformules) en de kwaliteit van de E27 is steeds beter dan die uit de E26. Dus als men moet uitwijken van de E27 naar de E26 door capaciteitsproblemen, wordt dit door de medische visie nauwelijks aanvaard. Vaak is men dan verplicht om twee rijpers uit de E27 te laten komen en die dan te mengen met één rijper uit de E26. Ze kunnen
11
dus een beetje afwijken van hun bottleneck installatie, maar veel vrijheden hebben ze niet.
E26
Aanzetketel
INSTALLATIE
(2700 liter)
Neerslagketel (3600 liter)
Wasketel (3000 liter)
Set van rijpketels Fig 1.6: voorbeeld van een aanzetlijn: E26
Figuur 1.6 toont de verschillende deelstappen voor de E26 aanzetlijn. Na de aanzetfase wordt de emulsie naar de rijpketels gebracht voor het rijpproces.
1.5
Deelstappen binnen het rijpproces
Afhankelijk van het aantal emulsies voegt men 1 tot N aanzetten samen in een rijpketel. Een chemisch rijpproces wordt gestart. De emulsie gaat men na de wasfase terug herdispergeren in gelatine. Deze emulsie zal gedurende enkele uren op temperatuur worden gehouden. Tevens worden tijdens die periode rijpstoffen, bijvoorbeeld op basis van zwavel, toegevoegd. Men beïnvloedt de
Fig 1.7: controlepaneel rijpproces
rijpsnelheid door de temperatuur en de zuurtegraad te sturen. Het rijpingsproces wordt nauwgezet gecontroleerd. Op 12
regelmatige tijdstippen wordt een staal genomen. Na stolling wordt dit staal belicht en ontwikkeld. Men volgt de evolutie van de densiteitopbouw. Wanneer de optimale rijping is bereikt, wordt de rijping afgebroken en voegt men bewaarmiddelen toe. De emulsie wordt dan in zwarte zakken gepompt en gestold om dan in emulsiekelders (een ruimte op 4°C) te stockeren. Soms voegt men al enkele gietsoluties toe voor het stollen. We spreken dan over een verlengde tweede dag. In een recente evolutie naar 'fastmoving' worden emulsies onmiddellijk na de rijper (Just In Time) via een tankwagen naar de gietzalen geleverd. We spreken hier van vloeibaar leveren. Daar de emulsies slechts gedurende
een
beperkte
tijd
in
de
tankwagen mogen blijven (staantijd) is een nauwgezette planningsafstemming tussen de
gietzalen
en
de
emulsiebereiding
Fig 1.8: vloeibaar leveren
noodzakelijk. BG1 beschikt over een set van rijpketels •
twee ketels van 1300 liter
•
één ketel van 2500 liter
•
twee ketels van 4500 liter
•
zeven ketels van 7500 liter
Fig 1.9: een rijpketel
De productiereeksgrootte Het rijpproces bepaalt de productiereeksgrootte. De reeksgrootte wordt namelijk bepaald door het aantal aanzetten in een rijper maal het aantal kg per aanzet. Tabel 1.3 heeft een voorbeeld van een productiereeksgrootte. Tabel 1.3: voorbeelden van de productiereeksgrootte soort emulsie DUPRONEEN DUPRONTWEE AGITOM
Aanzetten/rijper 3 2 6
aantal kg/aanzet 1149,7 1149,9 1505
13
reeksgrootte = aantal kg/rijper 3449,1 2299,8 9030
1.6
Besluit
De korte geschiedenis van Agfa toont aan dat we te maken hebben met een groot beursgenoteerd bedrijf met vele activiteiten en productieafdelingen. De Belgische afdeling te Mortsel speelt een belangrijke rol in de filmproductie. Mijn thesis focust zich op de planning van de E27 aanzetlijn. Deze lijn is een bottleneck productielijn binnen het bereidingsproces van de filmproductie. Tijdens de aanzetfase worden emulsies aangemaakt.
De
verschillende soorten
emulsies bevatten
een
hoeveelheid zilver. Door een efficiëntere planning van deze bottleneck installatie willen we onder andere de zilvervoorraad minimaliseren.
14
Hoofdstuk 2 Sequencing en scheduling
2.1
Situering van het probleem
Alvorens ons op de planning van de aanzetlijnen van Agfa te gooien, is het noodzakelijk eerst de literatuur door te nemen. Dit hoofdstuk moet de inspiratie vormen voor onze latere experimenten. Aan de hand van deze verworven literatuurinzichten moet het mogelijk zijn om zelf een specifieke planning voor Agfa op te maken. Daarbij zal de literatuur op ons probleem worden geprojecteerd en verder aangevuld worden met persoonlijke accenten. We zullen uiteindelijk onze eigen planningsweg inslaan, maar daarvoor moeten we eerst de basis goed begrijpen. Bij het opzetten van een planning moeten we in eerste plaats de vraag met het aanbod verzoenen. Niet alleen wat betreft volume en tijd maar ook wat betreft kwaliteit. Als de vraag naar een product of dienst is bepaald dan moet een bedrijf kunnen voorzien in deze behoefte. Planning- en controleactiviteiten moeten de specifieke noodzaak bepalen aan arbeid (mensen), uitrusting (machines) en materiaal die nodig is om een product te maken of een dienst te leveren. Om dit te doen hebben we nood aan vier activiteiten: 1. loading 2. sequencing 3. scheduling 4. opvolging en controle Deze termen worden vaak met elkaar verward. In de spreektaal, en zelfs in sommige handboeken, gebruiken we ze door elkaar. Enige uitleg is nodig. Figuur 2.1 geeft alvast een overzicht van de wisselwerking tussen deze vier verschillende activiteiten. Loading houdt zich bezig met het toewijzen van taken aan werkcentra. Sequencing bepaalt de exacte volgorde van alle taken op de toegewezen machine. Scheduling zal alles inplannen in een tijdsschema en tenslotte moet de echte status van het order opgevolgd en gecontroleerd worden op de werkvloer. 15
WANNEER?
Scheduling
Sequencing
Loading
VOLGORDE?
HOEVEEL?
Opvolging en controle WERKELIJKHEID = PLANNING?
Fig 2.1: de noodzakelijke planning - en controleactiviteiten
Om een algemeen beeld te geven van alle verschillende planningsactiviteiten, bespreken we deze eerst elk afzonderlijk in het kort. Daarna worden in paragraaf 2.2 en 2.3 uitgebreid de begrippen sequencing en scheduling behandeld. Loadingactiviteiten en opvolging en controle zijn belangrijke stappen bij het opmaken van een planning, maar ze moeten minder uitgespit worden voor het onderzoek van mijn thesis.
2.1.1
Loading
De hoeveelheid werk die aan een bepaald werkcentrum wordt toegewezen, kunnen we omschrijven als loading. We willen het werk laten uitvoeren met de meest efficiënte bedrijfsmiddelen. Het gebruik van de bedrijfsmiddelen voor een specifieke taak kan technologisch zijn opgelegd of door de omsteltijd efficiëntie bepaald, maar het kan ook historisch zijn gegroeid, of door persoonlijke voorkeur zijn bepaald.
Plannen tegen eindige of oneindige capaciteit? Bij het inplannen van taken moeten we rekening houden met de eindige capaciteit van een werkcentrum. ‘Finite loading’ of ‘plannen tegen eindige capaciteit’ is een methode die werk toewijst tot aan een bepaalde limiet. Deze limiet is een schatting van de 16
beschikbare capaciteit van het werkcentrum. We moeten het begin- en eindtijdstip voor de productie van de verschillende orders bepalen. Dit doen we op basis van de lengte van de planningshorizon en de capaciteitslimieten van de werkkrachten en de werkplaats. ‘Infinite loading’ of ‘plannen tegen oneindige capaciteit’ zal bij het toewijzen van taken aan een werkcentrum geen beperking stellen op het aantal te aanvaarden orders, maar houdt er wel rekening mee. Een complexe organisatie kan uit afzonderlijke afdelingen bestaan, elk met hun verschillende capaciteiten en met een variërende mix van te produceren producten. Deze vormen beperkingen van de capaciteitslimieten bij finite loading en
maken
de
berekeningen
heel
complex.
Er
is
een
aanzienlijke
computerberekeningstijd nodig. Vele bedrijven gebruiken daarom een planning tegen oneindige capaciteit. Een ervaren planner zal dan het resultaat interpreteren en hij kan inschatten welke belastingen haalbaar zijn. Bij fundamenteel zwaar belaste periodes kan hij vooruit produceren, uitwijken naar een andere machine, overladen door gebruik te maken van overuren of desnoods moet hij extern aankopen.
2.1.2
Sequencing
De verschillende werkcentra zijn beladen met jobs. Nu moeten we beslissen in welke volgorde we de opeenvolgende taken zullen uitvoeren. Het exacte volgordenummer van een taak op de toegewezen machine bepalen, noemen we sequencing. De prioriteiten in de volgorde van de orders steunen vaak op een bepaalde set van regels. Welke regel in aanmerking komt voor een probleem, is afhankelijk van de beoogde toepassing. We moeten daarom eerst goed weten op welke criteria we de planning willen beoordelen. Voor de meting van deze beoordelingscriteria hebben we prestatie-indicatoren nodig. Exacte, eenvoudige, ondubbelzinnig meetbare maar toch nauwkeurige indicatoren zullen de performantie van de planning moeten bepalen. Het toewijzen van taken is verschillend als we met één, twee of meerdere machines te maken hebben. Maar één ding staat vast: de volgordebeslissing van één taak beïnvloedt rechtstreeks de timing van de andere taken. 17
2.1.3
Scheduling
Als we de volgorde van de uitvoering van de taken hebben bepaald, dan kunnen we een schema opstellen met het start- en eindtijdstip voor de productie van elke taak. Dit noemen we scheduling. Deze planning is meestal de laatste fase voor de eigenlijke productie aanvangt. Scheduling geeft het verband tussen het volume en de tijd weer. Zo toont bijvoorbeeld het uurschema van bussen dat er veel frequenter en meer bussen worden ingezet tijdens de piekmomenten. De busplanning toont het tijdstip waarop elke bus zou moeten aankomen op elke stopplaats van het traject. Werkschema’s worden gebruikt wanneer de planning moet verzekeren dat aan de klantenvraag kan worden voldaan. Soms kunnen we het werk niet plannen op korte termijn, bijvoorbeeld in een serviceomgeving waar klanten toekomen in een willekeurige volgorde.
2.1.4
Opvolging en controle
Nadat een planning is opgesteld, moeten we elke activiteit opvolgen om te verzekeren dat alle geplande activiteiten ook daadwerkelijk plaatsvinden. Elke afwijking van de planning kan worden rechtgezet door op één of andere manier in te grijpen, wat meestal een stukje herplannen zal betekenen. Figuur 2.2 illustreert een
eenvoudig
controlemodel.
De
output
van
een
werkcentrum
wordt
gecontroleerd en vergeleken met de vooropgestelde planning. Afwijkingen van deze planning worden in rekening gebracht door het herplannen van een bepaalde activiteit en op de werkvloer worden acties ondernomen die moeten verzekeren dat de nieuwe planning opnieuw succesvol kan worden uitgevoerd. Het kan natuurlijk altijd gebeuren dat er opnieuw afwijkingen ontstaan. Dan moeten we nog eens onze controlecirkel doorlopen. We kunnen de controle zien als een proces. We benadrukken de herhaling van de planningstaak. We bereiden de planning voor, we observeren de werkelijke uitvoering ervan en we zullen opnieuw plannen als
onzekere
gebeurtenissen
werkelijkheid
worden
(de voorspelling van
klantenorders worden echte klantenorders, geplande resultaten worden echte resultaten, …). Daarna moeten we opnieuw de uitvoering van onze planning opvolgen.
18
INPUT
TUSSENKOMSTEN
ORGANISATIE
PLANNING
OUTPUT
OPVOLGING PLANNING
VERGELIJKEN HERPLANNEN
Fig 2.2: een eenvoudig controlemodel
De gegevens verzameld door deze controleactiviteiten zijn van belang om de juiste procestijden te kennen. Als de procestijden binnen de planningslogica onjuist zijn, hebben we ofwel een onderbeladen planning ofwel een overladen planning. Bij een onderbeladen planning schatten we de tijden te lang in. In de werkelijkheid gebeurt alles veel efficiënter en onbewust plannen we dus als het ware lucht in. We laten de capaciteit onderbenut en we maken het de mensen op de werkvloer te gemakkelijk. Wanneer we echter te kort ingeschatte tijden gebruiken, is onze planning te vol. Wat volgens onze planning realistisch is, is in werkelijkheid niet haalbaar voor de werkvloer. Een gulden middenweg vinden werkt het meest motiverend op de werkvloer.
2.2
Sequencing
In deze paragraaf zullen we inzoomen op de tweede planningsactiviteit: ‘sequencing’. Nadat de taken beladen zijn op een werkcentrum door het loadingsproces, moeten we nog de volgorde van de uit te voeren taken bepalen. Welke taak heeft voorrang op de andere wachtende taken om als volgende te worden uitgevoerd? We hebben een volgorderegel nodig die dat moet bepalen. De prioriteiten van de verschillende taken steunen op een set van regels. Maar in welke volgorde wíllen we de taken uitvoeren? Elk bedrijf beoordeelt zijn organisatie immers op een verschillende manier volgens het streven naar zijn eigen visie. Sommige bedrijven zullen daarom één bepaalde regel gebruiken, 19
terwijl andere bedrijven een andere regel prefereren. Dit naargelang hun beoordelingscriteria. Als de criteria bepaald zijn dan hebben we nog maatstaven nodig om ze te meten. Deze maatstaven moeten concreet, ondubbelzinnig, eenvoudig maar toch nauwkeurig meetbaar zijn. Naargelang we te maken hebben met één, twee of meerdere machines zullen we andere regels moeten bekijken.
2.2.1
Beoordelingscriteria
Vooraleer we beginnen met de opsomming van de meest gebruikte volgorderegels in de literatuur, gaan we eerst in op de beoordelingscriteria. Om de bruikbaarheid van een volgorderegel voor onze planning te beoordelen, moeten we eerst weten wat we willen bereiken. Wat is voor onze organisatie belangrijk? De meeste beoordelingscriteria kunnen onderverdeeld worden in drie categorieën: betrouwbaarheid, snelheid en kost. Enkele criteria zullen uiteraard tot meerdere categorieën behoren, maar om niet constant in herhaling te vallen, hebben we ze geplaatst bij de meest doorslaggevende categorie. De lijst hieronder geeft enkele mogelijke criteria weer om een planning te beoordelen. De lijst is niet volledig, maar bevat de voornaamste, meest gebruikte criteria. Snelheid verhogen = tijden minimaliseren •
Snelle leveringstijden Tegenwoordig moet alles sneller gaan. Klanten willen zo vlug mogelijk hun bestelde producten ontvangen. Het leveringstijdstip is het tijdstip waarop de producten kunnen worden geleverd. Het eindtijdstip van het order moet deze limiet kunnen halen. due date = leveringstijdstip
completion time = eindtijdstip
•
De gemiddelde doorlooptijd van een order minimaliseren Het levertijdstip van een order wordt aan een klant beloofd door een schatting te maken van de doorlooptijd. Wanneer de doorlooptijd kort is, dan kunnen we een vroeg levertijdstip beloven. Wanneer deze te lang is, dan moeten we met een ontkoppelpunt werken in de voorraadketen en voorraden aanleggen. Dit om aan de vooropgestelde klantenservice te voldoen. De doorlooptijd verminderen betekent: de tijd die een order 20
doorbrengt in de fabriek, vanaf het lanceren van het order totdat het order wordt geleverd, minimaliseren. flow time = doorlooptijd = tijd die order doorbrengt in de fabriek = eindtijdstip order − tijd lancering order Soms rekenen we met een gewogen duurtijd. Dan zal men de duurtijd met een factor vermenigvuldigen om belangrijke (meestal dure) taken te bevoordelen. gewogen duurtijd = cost weighted flow time
De doorlooptijd wordt typisch opgebouwd uit 4 elementen: doorlooptijd procestijd = × lotgrootte + omsteltijd + verplaatsingstijd + wachttijd stuk flow time =
run time × lot size + setup time + move time + queue time part
Om de doorlooptijden te reduceren, moeten we één van deze elementen aanpakken. •
De gemiddelde procestijd van alle jobs bij een bepaalde machine minimaliseren. De procestijd is de tijd nodig om een bepaalde taak af te handelen op een machine. process time = run time = operation time = procestijd
•
De totale procestijd van alle jobs bij een bepaalde machine minimaliseren make span = totale procestijd
•
De omsteltijden minimaliseren De omsteltijd van een order is de tijd nodig om een machine klaar te maken voor het nieuwe order. setup time = omsteltijd
Dit kan bijvoorbeeld een wisseling van een matrijs inhouden. Door een slimme volgorde van taken kunnen we de omsteltijden vaak reduceren. •
De wachttijden minimaliseren Het is alom bekend dat een order meer dan 80% van zijn tijd in een doorsnee fabriek doorbrengt met wachten. Wachten voor een machine, wachten op andere te produceren onderdelen … . Wanneer een order staat
21
te wachten, brengt het geen geld op voor de organisatie, enkel kosten. Deze wachttijden moeten dus zo minimaal mogelijk gehouden worden. waiting time = queue time = wachttijd Betrouwbaarheid verhogen •
Beperken van variabiliteit van het leveringstijdstip Een bedrijf wil vermijden dat de beloofde leveringstermijn wordt overschreden. De betrouwbaarheid van hun leveringstijden moet zo hoog mogelijk zijn om het vertrouwen van de klant niet te schaden.
•
De reactietijden minimaliseren De reactietijd van een organisatie is de tijd die een bedrijf nodig heeft om een spoedorder, een speciaal order, … te produceren. Hoe snel kan een bedrijf reageren op onvoorziene omstandigheden? Is het in staat alles snel en gemakkelijk te produceren?
Kosten minimaliseren •
De planningskosten minimaliseren De planningskosten worden onder andere bepaald door het gemiddelde aantal orders in het systeem. Het is altijd gemakkelijker om met enkele grote orders te werken dan met vele kleintjes. Toch zullen grote orders vaak een grote voorraad hebben zodat deze de kosten terug opdrijven. Ook de aard van het order speelt een rol: nieuwe of speciale orders vragen meer inspanning dan routineorders.
•
De voorraadkosten minimaliseren De voorraadkosten bestaan uit drie elementen: de voorraad grondstoffen, de voorraad halffabricaten en de voorraad eindproducten. voorraadkosten = kosten voorraad grondstoffen + kosten voorraad halffabricaten + kosten voorraad eindproducten supply costs = cost of supply raw materials + cost of supply work − in − process − goods (WIP ) + cost of supply end products WIP = work − in − process − goods = voorraad halffabricaten
22
Deze voorraden moeten in een magazijn of op de werkvloer opgestapeld worden. Dat vraagt opslagkosten. Bovendien kunnen deze voorraden vervallen en beschadigd worden wat nog meer kosten veroorzaakt. Maar aan de andere kant moet een bedrijf kunnen anticiperen op onvoorziene omstandigheden. De voorraden vormen een zekere buffer tegen deze onvoorziene gebeurtenissen. •
De productiekosten minimaliseren = gebruik machines maximaliseren productiekosten = bewerkingskosten + omsteltijdkosten operation costs = manipulation costs + setup costs
Het is normaal dat we de capaciteit van dure installaties en gereedschap zoveel mogelijk willen benutten. We zullen de leegloop van machines proberen te vermijden. •
De
loonkosten
minimaliseren
=
het
gebruik
van
het
personeel
maximaliseren Het
personeel
moet
worden
betaald.
Daarom
zullen
we
deze
personeelsleden zo optimaal mogelijk gebruiken. Het is niet verantwoord dat de operatoren niets staan te doen of dat mensen werk verrichten waarvoor ze niet zijn opgeleid. Hieraan gekoppeld kunnen we ook proberen de dure overuren van het personeel te minimaliseren. Het is duidelijk dat deze doelstellingen vaak met elkaar in conflict liggen. We kunnen
bijvoorbeeld
onze
leveringstijdstippen
beter
nakomen
als
de
werkplaatscapaciteit minder intensief wordt gebruikt. Dan is het namelijk mogelijk de capaciteit uit te breiden wanneer we in leverproblemen zouden geraken. Wanneer we meer capaciteit gebruiken kunnen we de doorlooptijd reduceren. Er zullen meer orders tegelijk worden geproduceerd, wat minder wachttijden geeft. Als extra jobs worden toegewezen aan een werkcentrum, dan zullen ze langere doorlooptijden krijgen, maar de capaciteit wordt beter benut en misschien kan de levertermijn worden verbeterd. Aan de andere kant zijn er ook criteria die elkaar positief beïnvloeden. Bij het minimaliseren van het aantal orders in het systeem door enkele grote orders te produceren, zullen de omsteltijden gereduceerd worden. Wanneer we de WIPvoorraad verhogen of verlagen, dan zal de gemiddelde doorlooptijd in dezelfde
23
richting
veranderen.
De
wet
van
Little
heeft
dit
verband
weer:
gemiddelde voorraad = volume × gemiddelde doorlooptijd
Tabel 2.1 vat de beoordelingscriteria nog eens kort samen. In de tabel werd geen onderscheid meer gemaakt op basis van kosten, snelheid en betrouwbaarheid, maar wel op basis van minimalisatie of maximalisatie criteria. Tabel 2.1: de beoordelingscriteria Minimalisatie criteria gemiddelde doorlooptijd van alle orders
flow time
gemiddelde doorlooptijd, gewogen met de operation cost
cost weighted flowtime
gemiddelde procestijd van alle orders
processing time
langste doorlooptijd van alle orders
make span
gemiddelde omsteltijden voor een order
set-up time
de gemiddelde wachttijd per taak over alle orders
waiting time
de gemiddelde levertijd van alle orders
due time
variabiliteit van levertijd
due time variability
gemiddeld aantal orders in het systeem
average number of orders
voorrraad halfafgewerkte producten
Work-in-Process-Voorraad (WIP)
som van de bewerkingskost en omstelkost van elke taak
operation cost
Maximalisatie criteria leversnelheid
due speed
procentueel gebruik van capaciteit van alle machines
machine capacity utilization
procentueel gebruik van capaciteit personeel
operator capacity utilization
Nu weten we al hoe we onze organisatie kunnen beoordelen, maar we moeten deze criteria nog omzetten in meetbaren maatstaven: de prestatie-indicatoren.
2.2.2
Prestatie-indicatoren
Voor alle doelstellingen uit de vorige paragraaf moeten we een exacte prestatieindicator vinden. Zo kunnen we meten in hoeverre de doelstellingen worden behaald. De indicatoren moeten “COEN” zijn (Concreet, Ondubbelzinnig, Eenvoudig en Nauwkeurig). De meeste doelstellingen zijn op zich al een indicator. Als we bijvoorbeeld de wachttijden willen verbeteren, dan kunnen we dit gemakkelijk nagaan door de wachttijden te meten. Maar hier en daar duiken problemen of meerdere interpretaties op. Het is zelfs zo dat voor bepaalde doelstellingen er meerdere, soms concurrerende indicatoren bestaan. Vooraf moet 24
duidelijk zijn welke maatstaf we zullen hanteren om de doelstelling van de planning te beoordelen. Het levertijdstip: We kunnen simpel voldoen aan het levertijdstip, de due date, op een ja of nee basis. due date = het beloofde levertijdstip
Meer nauwkeurig is dat we deze doelstelling meten volgens de laattijdigheid, de lateness. De einddatum, completion time, is het tijdstip waarop het order de werkplaats kan verlaten. De lateness is het verschil in tijd tussen de einddatum en het levertijdstip. Het kan zowel een positieve als een negatieve waarde hebben, want een order kan te vroeg of te laat worden geproduceerd. completion time = tijdstip waarop het order de werkplaats verlaat lateness = completion time − due date lateness gemiddelde lateness = aantal orders Wanneer men echter zwaar tilt aan het te laat leveren van producten, rekenen we vooral met het begrip tardiness. Tardiness wordt gebruikt wanneer een job afgewerkt is na zijn beloofde levertijdstip. Het heeft dus steeds een positieve waarde. tardiness = Max(0 , completion time − due date ) tardiness gemiddelde tardiness = aantal orders
Als de job te vroeg wordt geproduceerd, dan wordt deze nog voor een tijd in voorraad gehouden. Dit brengt dan opnieuw voorraadkosten met zich mee, wat ook niet gewenst is. De tijd van opslag is de tijd tussen het levertijdstip en de einddatum. We noemen dit ook nog earliness. earliness = Min(0 , completion time − due date ) earliness gemiddelde earliness = aantal orders
Wanneer we nu de gemiddelde lateness berekenen, kunnen de vroege jobs dan de late jobs goedpraten? Is te vroeg produceren ook helemaal niet gewenst? Bestaat er zoiets als de maximum te late leverdatum? Maximum lateness = de uiterste nog te aanvaarden lateness
25
Nog een alternatief bestaat erin de afwijking van het leveringstijdstip te bekijken tegenover de echte einddatum. Hierbij is de doelstelling de variatie van lateness te minimaliseren om de leverbetrouwbaarheid te waarborgen tegenover de klanten. We stellen ons wel de vraag of we het criterium levertijdstip kunnen gebruiken in een MRP planning waar we constant de levertijdstippen aanpassen aan het MRP systeem.
latenessi = completion timei − due datei n = het aantal bestudeerde orders lateness =
∑ lateness
i
i
n
afwijking lateness =
∑ (lateness
i
− lateness
)
2
i
n
De doorlooptijd: Dezelfde problemen komen boven water wanneer we rekenen met de doorlooptijd, de flow time. Is het meetcriterium de gemiddelde doorlooptijd, de variatie van de doorlooptijd of de maximum doorlooptijd? Moeten we een gewichtsfactor toekennen aan de doorlooptijd gerelateerd met de geldwaarde van het product om zo kortere doorlooptijden voor duur werk/dure producten te bevoordelen tegenover goedkope producten?
flow timei = completion timei − tijdstip i order wordt gelanceerd op werkvloer n = het aantal bestudeerde orders Maximum flow time = de uiterste nog te aanvaarden flow time flow time =
∑ flow time
i
i
n
afwijking flow time =
∑ ( flowtime
i
− flow time
)
2
i
n
De totale afwerkingstijd: In een statische omgeving rekenen we met de make span. Dit is de langste doorlooptijd van alle orders gezien vanuit onze planningshorizon. In een dynamische omgeving kunnen we hier niet meer mee rekenen, want de
26
hoeveelheid aan orders verandert voortdurend. We spreken van een ‘rollende planningshorizon’. make span = tijdstip afwerking laatste taak − starttijd eerste taak Totale voorraad: Het is belangrijk de voorraad zo minimaal mogelijk te houden. Toch moeten we kunnen voorzien in onvoorziene omstandigheden. totale voorraad = geplande ontvangsten van alle artikelen + beschikbare voorraad van alle artikelen
De benutting van een werkcentrum: De benutting van een werkcentrum kent dezelfde problemen. Zijn we geïnteresseerd in de benutting van alle werkcentra of enkel van geselecteerde centra? Waarop baseren we deze selectie? En hoe meten we die benutting? Bemerk ook dat wanneer we in een omgeving met eindige capaciteit werken, de leveringstijdstippen aangepast moeten worden aan de capaciteitsbeperkingen. Dit betekent dat de benutting van het werkcentrum een doorwegende logistieke doelstelling zal zijn. benutting =
productieve werktijd totale beschikbare werktijd
Het toekennen van meetcriteria aan een probleem is heel belangrijk voor de planner. Ten eerste omdat deze hem moeten helpen de resultaten te interpreteren en beslissingen te maken. Ten tweede moeten deze stroken met de beleidsvoering van het bedrijf. Ze moeten in overeenstemming zijn met de doelstellingen die het bedrijf nastreeft. We zullen de uitvoeringscriteria bekijken die gebruikt worden in verschillende industrieën en dan deze eruit nemen die echt belangrijk zijn voor ons bedrijf.
2.2.3
Sequencing op één machine
De hoofdtaak van sequencing is de volgorde van de verschillende uit te voeren taken bepalen. Een machine kan zich op elk ogenblik met slechts één taak bezighouden. We moeten de verschillende uit te voeren taken rangschikken volgens prioriteiten. Deze prioriteiten worden bepaald aan de hand van de 27
opgestelde meetcriteria. De prioriteit van een bepaalde taak wordt dus niet alleen bepaald door de eigenschappen van deze taak, maar vooral door de eigenschappen relatief tegenover de andere taken. Prioriteitsregels zijn regels die bepalen welke taak als volgende taak wordt uitgevoerd. Het zijn logische regels om te bepalen welke beschikbare job we moeten selecteren voor productie in een bepaald machinecentrum. Het gebruik van prioriteitsregels zorgt ervoor dat de planningsbeslissingen opeenvolgend worden gemaakt en niet allemaal in één keer. En elke sequencing beslissing voor één taak beïnvloedt de timing van alle andere taken. Onderzoek naar het plannen op een enkele machine is vooral gebaseerd op het statische probleem. Hoe kunnen we het best een vaste set van jobs plannen op één machine wanneer alle jobs beschikbaar zijn bij het starten van de schedulingsperiode? Verder veronderstellen we dat de omsteltijden onafhankelijk zijn van de volgorde van de jobs. In de literatuur zijn waslijsten regels verschenen. Ik geef een klein overzicht van de belangrijkste: priority sequencing rules = heuristics = dispatching rules = prioriteitsregels
Regels bepaald door het toeval: Random (R) Neem om het even welke taak in de wachtrij om als volgende te produceren. Alle jobs hebben dus een gelijke waarschijnlijkheid om als volgende job te worden uitgevoerd. Deze regel wordt veel gebruikt als benchmark voor de andere regels. First Come, First Serve (FCFS) - First In, First Out (FIFO) De taken worden uitgevoerd in de volgorde zoals ze zijn toegekomen in het werkcentrum. Dit noemen we First In, First Out (FIFO). De regel wordt ook vaak First Come, First Serve (FCFS) genoemd. De volgende job waar we aan beginnen, is de volgende in de rij. Deze regel wordt vooral gewaardeerd omwille van zijn eerlijkheid. Daarom wordt deze veel gebruikt in de dienstensector (zoals bij de slager of de bank). Het is ook een eenvoudige, snelle regel. Deze regel is niet zo goed wanneer er een relatief grote job in de wachtrij staat. Deze zal de andere ophouden.
28
First Come, Last Serve (FCLS) - Last In, First Out (LIFO) Last In, First Out (LIFO) is een methode van opeenvolging die meestal gebruikt wordt uit praktische overwegingen. Bijvoorbeeld is het gemakkelijker om een lift uit te laden op basis van een LIFO basis, want meestal is de ingang van de lift meteen ook de uitgang. Maar dit is niet de meest gebruikte benadering. Patiënten in ziekenhuizen bijvoorbeeld, kunnen razend worden wanneer ze zien dat hun medische gegevens op een stapel worden toegevoegd in de volgorde van toekomende patiënten. Dit betekent dat de dokter eerst de patiëntgegevens van de top van de stapel neemt. De patiënten worden behandeld in omgekeerde volgorde van hun toekomen. LIFO heeft een omgekeerd effect op leversnelheid en leverbetrouwbaarheid. De volgorde steunt niet op kwaliteit, flexibiliteit of kostredenen. Daarom zal de regel niet goed werken bij deze beoordelingcriteria. Customer priority sequencing (CP) Taken worden soms uitgevoerd op basis van de klantenprioriteit. Deze werkwijze laat toe een order van een belangrijke of ontevreden klant uit te voeren voor de andere orders, ongeacht het tijdstip van aankomst bij werkcentra. Deze aanpak wordt in de praktijk veel gebruikt bij bedrijven met een onevenwichtig klantenbestand, bestaande uit enkele grote, zeer belangrijke klanten. Banken bijvoorbeeld geven belangrijke klanten de voorrang op andere. Gelijkaardig zullen ontevreden klanten van een hotel met zorg behandeld worden omdat hun geklaag een omgekeerd effect kan hebben op de perceptie van andere klanten. Erger nog, hulpdiensten moeten vaak gebruik maken van hun oordeel omtrent de nood van de ontvangen oproep. De opeenvolging van taken op basis van het klantenbestand zorgt er vaak voor dat ‘grote-volume’ klanten een hoge graad van service krijgen, maar dat ten koste van de service van vele andere klanten. Dit kan de gemiddelde prestatie doen verminderen wanneer bestaande work flows worden onderbroken voor orders van belangrijke klanten. Het is duidelijk dat deze werkwijze de kwaliteit en de productiviteit van de organisatie vermindert. Ze zijn overal minder efficiënt.
29
Regels gebaseerd op de duurtijd: Shortest Processing Time (SPT) We kunnen de jobs ook rangschikken volgens hun duurtijd. Voeren we de taken uit in oplopende duurtijd, dan spreken we van Shortest Processing Time (SPT). Sommige handboeken noemen deze regel Shortest Operation Time (SOT). Deze regel wordt het meest in de praktijk gebruikt wegens zijn groot aantal voordelen: -
Eenvoudige regel
-
De WIP-voorraad wordt gereduceerd
-
De gemiddelde doorlooptijd per job wordt geminimaliseerd
-
De gemiddelde joblateness wordt beperkt
-
Het gemiddelde aantal jobs wordt geminimaliseerd
-
Meestal worden bedrijven in bepaalde periodes met cashtekorten geplaagd. In deze situaties is het handig om de job met de kortste procestijd in de rij als volgende te produceren. Deze jobs kunnen dan vlug gefactureerd worden en cash genereren. Langere jobs, die meer tijd vragen, kunnen niet zo vlug cash opbrengen
De regel heeft echter ook één groot nadeel: -
Jobs met een relatief lange procestijd moeten lang wachten. Het gevaar bij dynamisch plannen is dan ook dat deze nooit aan bod komen. Dit kan orders van grote klanten in gevaar brengen.
Shortest Weighted Processing Time (SWPT) De job met de relatief kortste procestijd is de volgende om te worden geproduceerd. De factor waarmee de gewone procestijd wordt vermenigvuldigd, kan afhankelijk zijn van de waarde van het product, de procestijd in volgende werkcentra, ... . Longest Processing Time (LPT) Onder bepaalde omstandigheden kan het noodzakelijk zijn de taken met de langste duurtijd eerst uit te voeren. Dit heeft het voordeel dat een werkstation gedurende een lange tijd in gebruik is. Want relatief korte taken nemen veel tijd in beslag telkens er moet worden overgeschakeld van de ene job naar de andere.
30
Wanneer het personeel de druk voelt om het efficiënte gebruik van de machine hoog te houden, is deze regel aantrekkelijk. Het gebruik van de machine zal inderdaad hoog zijn (en daardoor de kost relatief laag). Maar de regel houdt geen rekening met leversnelheid, leverbetrouwbaarheid of flexibiliteit. Integendeel, de regel werkt al deze factoren tegen. Least Work Remaining (LWR) Deze regel is een uitbreiding van de SPT regel. Maar in plaats van de procestijd nodig voor een specifieke activiteit bij één bepaald werkcentrum, werken we met de procestijd tot de taak volledig is uitgevoerd. De procestijden in de volgende processtappen zijn hier ook van belang. We nemen de som van alle procestijden voor de verschillende nog niet gedane bewerkingen van een uit te voeren order. Wanneer bijvoorbeeld de volgorde van de verschillende orders bepaald wordt door de SPT regel, kan een order met een korte procestijd op de ene machine, maar een lange procestijd op de volgende machine, heel lang wachten bij deze volgende machine vooraleer het order daar aan bod kan komen wanneer deze machine ook via SPT werkt. De WIP-voorraad wordt onnodig verhoogd. Of erger nog, dat de job onmiddellijk (wegens geen andere orders in de wachtrij) wordt uitgevoerd op machine twee. Daardoor kan een hele wachtrij van andere orders die vlug door machine één stroomden ontstaan. De WIP-voorraad is opnieuw ongewild heel hoog. De LWR voorkomt deze problemen. We krijgen een mooi gebalanceerde werkverdeling over de verschillende machines. Een groot nadeel van deze regel is dat hij geen rekening houdt met levertijden. Bovendien vraagt de regel veel rekentijd omdat alle
processtappen
worden beschouwd.
De
rekencomplexiteit overtreft vlug de eenvoud van de regel. Fewest Operations Remaining (FOR) Nog een variant op de SPT regel, de Fewest Operations Remaining houdt rekening met het aantal taken dat nog moeten worden uitgevoerd na het werkcentrum.
31
Regels gebaseerd op het levertijdstip: Earliest Due Date (EDD) Prioriteiten opstellen op basis van due date betekent dat we het werk zullen rangschikken
volgens
het
levertijdstip,
onafhankelijk
van
de
grootte
of
belangrijkheid van het order. De job met het vroegste levertijdstip wordt eerst ingepland. Bijvoorbeeld bij een kopiedienst in een kantoorgebouw, zal men vragen wanneer de kopieën moeten klaar zijn. De volgorde van de te nemen kopieën wordt bepaald volgens het levertijdstip. Deze regel kan goed van pas komen als we werken met criteria die te maken hebben met joblateness. De regel verbetert in het algemeen de betrouwbaarheid van het leveren en de gemiddelde leversnelheid. Daartegenover staat dat deze regel geen optimale productiviteit levert, omdat vaak een meer efficiënte opeenvolging van taken, de totale kost doet verminderen. Maar de regel is heel flexibel als er nieuwe, dringende jobs aankomen bij een werkstation. Critical Ratio (CR) De jobs worden gesorteerd volgens een kritische verhouding die de dringendheid van de job meet. Deze verhouding drukt uit hoe dicht de job bij zijn leveringsdatum zit. Degene met de kleinste waarde, moet het eerst worden verwerkt. time remaining work remaining ( due date − current time ) CR = processing time CR =
We voelen aan dat deze regel vooral gebaseerd is op de leverbetrouwbaarheid. De job die het meest dringend moet worden uitgevoerd, zal eerst aan bod komen. Wanneer de CR < 1 , zit de job al achter op schema en kan de leveringsdatum niet meer gehaald worden. Bij een CR = 1 kan de job nog net op tijd het vooropgestelde leveringstijdstip halen. Met een CR > 1 hebben we nog reservetijd. Indien we deze jobs onmiddellijk zouden uitvoeren, zijn ze voor hun levertijdstip klaar. Slack Time (ST) Slack Time is een variant op de EDD regel die de som van omsteltijd en procestijd aftrekt van de tijd die nog overblijft tot aan het levertijdstip van de job. De bekomen 32
waarde noemen we de slack. De jobs worden verwerkt in de volgorde volgens de kleinste waarde van de slack. ST = due date − current date − setup time − processing time Slack Time Per Operation (ST/O) Dit is een uitbreiding op de ST regel. We gaan nu nog eens de slack delen door het aantal overblijvende operaties. De volgorde van de jobs wordt opnieuw bepaald door de kleinste waarde. ST/O =
ST aantal overblijvende jobs
Order Slack (OS) De gewone ST regel rekent alleen maar met gegevens van het huidige werkcentrum. Met de Order Slack regel houden we ook rekening met de operaties die nog moeten volgen.
OS = due date − current date − ∑ setup times − ∑ processing times Regels gebaseerd op de machinebenutting: Next Queue (NQ) NQ is gebaseerd op de machinebenutting. Het idee is om de wachtrijen van de stations te bekijken waar de jobs na het werkcentrum naartoe moeten en om de job te selecteren die naar de kleinste volgende wachtrij (gemeten in uren of misschien in aantal jobs) gaat. Least Set-up (LSU) De opeenvolging van jobs kan ook bepaald worden door de omsteltijden van de verschillende operaties. In sommige firma’s kan een groot aandeel van de omsteltijd gereduceerd worden door een betere opeenvolging van de jobs doorheen het werkcentrum. Deze omsteltijdbesparingen zullen natuurlijk enkel tot stand komen wanneer we een goed ontwikkelde database hebben. Bemerk dat deze regel expliciet de afhankelijkheid tussen de omsteltijd en de jobvolgorde veronderstelt. Op deze manier wordt de capaciteitsbenutting gemaximaliseerd.
33
Physical constraints (PC) Het kan zijn dat de fysische beperkingen van de gebruikte materialen de prioriteit van het uit te voeren werk bepalen. Zo zal men bijvoorbeeld in een fabriek waar men gebruik maakt van verven, lichtere kleuren voor de donkere inplannen. Wanneer een volledige batch is afgewerkt, is de volgende ietsje donkerder dan de vorige. Gelijkaardig bepalen de fysische beperkingen van de gebruikte gereedschappen
in sommige
gevallen
de
volgorde.
Bijvoorbeeld
in de
papierindustrie moeten de snijmachines worden ingesteld op de breedte van het gewenste papierformaat. Het is gemakkelijker en sneller werken wanneer de breedte-instellingen oplopend of dalend gebeuren dan wanneer we telkens voor een willekeurige waarde de instellingen moeten veranderen. De mix van taken kan eveneens de prioriteit van de jobs bepalen. Wanneer men bijvoorbeeld stof in verschillende vormen en maten moet snijden, kunnen de overschotten van de ene taak gebruikt worden voor de andere taak. Daarom moeten we jobs die fysisch samen passen, samen plannen om afval te reduceren. De lijst van regels is niet volledig. Veel andere regels, vaak varianten en combinaties van deze regels, zijn bestudeerd. Tabel 2.2 toont een overzicht. De meest gebruikte en belangrijkste zijn in het vet geplaatst: SPT, EDD, ST en CR. Onze experimenten in hoofdstuk 3 en 4 zijn gebaseerd op deze vier regels. We moeten er ook eens over nadenken of we altijd dezelfde regel moeten gebruiken op elk werkstation. We zouden bijvoorbeeld een plan kunnen opstellen waar we SPT gebruiken bij een bottleneck en sommige EDD regels bij machines stroomafwaarts. Ofwel zouden we de regels kunnen aanpassen naargelang de wachtrijgrootte of naargelang hoeveel werk voor of achter is op schema. Een andere kwestie in het gebruik van opeenvolgingregels is hun gebruikskost. Sommige regels (zoals R, FCFS, SPT, EDD, FOR) zijn eenvoudig uit te voeren, omdat deze niet meer informatie vragen dan over de job zelf. Andere regels (zoals CR, LWR, ST, ST/O) vragen meer inspanning. Bovendien moeten we tijdsafhankelijke vergelijkingen maken. De SO, NQ en LSU regels vergen zelfs nog meer complexe informatie: de opstopping van de volgende werkstations of een omsteltijdkostenmatrix voor alle jobs die op dat moment aanwezig zijn in het werkstation. 34
Tabel 2.2: samenvatting van de prioriteitsregels afkorting naam
sortering gebaseerd op
R
Random
willekeurig
FCFS
First Come First Serve
volgorde van toekomen
FIFO
First In First Out
volgorde van toekomen
FCLS
First Come Last Serve
volgorde van toekomen
LIFO
Last In First Out
volgorde van toekomen
CP
Customer priority sequencing
klantenprioriteit
SPT
Shortest Processing Time
duurtijd
SWPT
Shortest Weighted Processing Time gewogen duurtijd
LPT
Longest Processing Time
duurtijd
LWR
Least Work Remaining
duurtijd van alle nog uit te voeren taken
FOR
Fewest Operations Remaining
aantal nog uit te voeren taken
EDD
Earliest Due Date
levertijdstip
CR
Critical Ratio
levertijdstip, duurtijd, kritische verhouding
ST
Slack Time
levertijdstip, duurtijd, slack
ST/O
Slack Time Per Operation
slack per aantal overblijvende operaties
OS
Order Slack
slack van alle nog uit te voeren taken
NQ
Next queue
wachtrijen bij volgende machines
LSU
Least Set-up
omsteltijden
PC
Physical constraints
fysische beperkingen van de taken
Een recente evolutie is de combinatie van twee prioriteitsregels. Hierbij gaan we alternerend gebruik maken van bijvoorbeeld SPT en FIFO. SPT is de hoofdregel, maar als de lateness toeneemt, plannen we gedurende korte tijd via de FIFO regels, om de werkposten als het ware op te kuisen. Een andere combinatie is SPT met CR te combineren en aldus de voordelen van deze regels te combineren.
2.2.4
Sequencing op twee machines
Als we een lijst van jobs op twee machines moeten sorteren dan moeten we beide machines plannen zodanig dat ze alle twee het best voldoen aan om het even welk criterium. Wanneer we de make span willen minimaliseren, speelt de volgorde van de jobs een belangrijke rol. Johnson ontwikkelde een regel om de make span in een twee-machine-probleem te reduceren. Om de regel toe te passen, moet aan enkele voorwaarden worden voldaan. De jobs moeten dezelfde volgorde van activiteiten hebben en alle jobs moeten beschikbaar zijn bij de start van het plannen. De procestijden moeten gekend en constant zijn. De procestijden 35
(daarin tellen we de omsteltijden mee) moeten bovendien onafhankelijk zijn van de volgorde. En tot slot kan de grootte van een lot niet worden opgesplitst. Regel van Johnson •
Selecteer de job met de kortste procestijd op machine één of machine twee. Als het een tijd is van machine één, plan deze job dan eerst. Als het een tijd is van machine twee, plan deze job dan laatst in de serie van jobs die moeten verwerkt worden. Verwijder deze job uit de lijst voor verdere volgordebeslissingen.
•
Selecteer dan de job met de volgende kortste procestijd, en herhaal de vorige stap. Als het terug machine één is, plan dan deze job als volgende in de rij. Wanneer het de tweede machine betreft, plan het dan zo dicht mogelijk tegen de laatste.
•
Herhaal dit totdat alle jobs gepland zijn.
Alles wordt duidelijk als je fig 2.3 bekijkt. Er zijn zes jobs die we in willekeurige volgorde kunnen uitvoeren. Als we kijken naar de kleinste procestijd, dan komt deze voor bij job B. Aangezien de procestijd bij het afdrukken voorkomt, plaatsen we de job als eerste. De tweede kleinste procestijd komt voor bij het inbinden van job D. Omdat de procestijd overeenkomt met de tweede activiteit, het inbinden, plaatsen we de job helemaal achteraan in de rij. De volgende taak die in aanmerking komt is job A. Opnieuw gaat de procestijd samen met het inbinden. We plaatsen de job zo dicht mogelijk voor de laatste. Enzoverder… Nadat we alle taken hebben overlopen, krijgen we een volgorde. Het inplannen op het schema (schedulingtaak) moet de tijd nog in rekening brengen. Zo zie je dat job B pas op machine twee kan beginnen als hij machine 1 heeft verlaten. We voelen aan dat deze regel de totale afwerkingstijd zal reduceren. In het begin gebeuren de kleine korte bewerkingen. Die gaan vlug van machine één naar machine twee, machine twee is dus slechts voor korte tijd leeg. Op het einde gebeurt het omgekeerde. Terwijl machine één al haar opdrachten heeft uitgevoerd, moet machine twee enkel nog korte opdrachten vervullen en is dus ook gauw klaar.
36
PROCESTIJD VAN DE VERSCHILLENDE TAKEN A
AFDRUKKEN (sec) 60
B
35
65
C
65
59
D
60
40
E
50
60
F
55
70
B
AFDRUKKEN
E
F
B
INBINDEN
0
INBINDEN (sec) 45
50
C
A
E
F
100
150
D
C
200
A
D
250
Fig 2.3: De regel van Johnson
2.2.5
Sequencing op N machines
We nemen als voorbeeld één machine die vijf verschillende taken moet uitvoeren. Elk van deze vijf taken kan als eerste worden uitgevoerd, de volgende taak zal één van de vier overblijvende zijn, enzoverder … Dit betekent dat er: 5 × 4 × 3 × 2 × 1 = 120 verschillende
schema’s
kunnen
worden
opgesteld.
Algemeen betekent dit dat voor n verschillende jobs er n! verschillende manieren zijn om de jobs in te plannen. Nu kunnen we ook de invloed beschouwen als er in dezelfde situatie meer dan één verschillende type van machine bestaat. Als we proberen de omsteltijden te minimaliseren op beide machines, dan bestaat er geen reden waarom de volgorde op machine één dezelfde zou zijn als op machine twee. Als we twee opeenvolgende taken onafhankelijk van elkaar beschouwen dan zijn er: 120 × 120 = 14 400 planningen van de twee machines met vijf taken mogelijk. In het algemeen kunnen we het aantal mogelijke planningen als volgt berekenen:
aantal mogelijke planningen = (n! ) met n = aantal taken en m = aantal machines m
37
Het planningsschema zal bovendien nog wijzigen als we nog meer jobs toevoegen. Een probleem met meer dan enkele taken of enkele machines plannen, vraagt algauw een complexe verwerking zelfs met de moderne computers. In de praktijk komt het erop neer dat er vaak vele miljoenen schema’s bestaan, zelfs voor een relatief klein werkcentrum. Daardoor proberen we niet de ‘optimale’ oplossing te vinden, maar eerder een ‘aanvaardbare’ oplossing. Opnieuw zullen we prioriteitsregels moeten toepassen voor elke wachtrij bij de verschillende werkcentra. Daarbij kan het gebeuren dat niet op elke machine dezelfde regel wordt gebruikt.
2.3
Scheduling
2.3.1
Algemeen
Er bestaan veel manieren om het probleem van scheduling te benaderen en op te lossen. Voor we dieper in het onderwerp scheduling graven, is het handig om eerst een korte situering te geven. We kunnen het begrip scheduling omschrijven als een plan waarop de tijd, die nodig is om alle orders te voltooien, is aangeduid. De definitie suggereert dat we moeten denken dat een schedule een serie van opeenvolgende stappen, een routing weergeeft. De gedetailleerde planning of schedule heeft enkele inputs nodig: •
de
volgorde
van
de
verschillende
taken
en
de
noodzakelijke
volgordebeperkingen (sequencing) •
een schatting van de tijd voor elke taak
•
de nodige middelen en capaciteit voor elke operatie (loading)
Meestal is een planning een moeilijk optimalisatieprobleem, zeker wanneer het aantal jobs en het aantal machines oploopt. We moeten namelijk rekening houden met de verschillende vermogens en capaciteiten van elke machine.
38
2.3.2
Gantt chart
De meest gebruikte methode van plannen, is het gebruik maken van een Gantt chart. Het is een eenvoudig middel dat de tijd voorstelt als een balkje op een kaart. Meestal is de kaart zelf gemaakt uit lange plastieken balken waar gekleurde papieren kunnen worden opgeplakt. Zo kan men aantonen wat er gebeurt met een taak of een werkstation. De start- en eindtijdstippen van de verschillende taken kunnen worden weergegeven op de kaart en soms duidt men ook de echte vooruitgang van de job aan. Figuren 2.4 en 2.5 tonen twee Gantt charts van een kleine meubelzaak. Figuur 2.4 is een ‘job progress Gantt chart’. Deze geeft aan wanneer elke taak gepland is om te worden gestart en te worden beëindigd. De graad van voltooiing van de taak is ook aangeduid. De echte tijd toont dan aan of een taak voor, achter of op schema is. In ons geval is de tafel al voltooid alhoewel dat pas gepland was voor het einde van de volgende dag. De planken zijn echter achter op schema. Aan de keukenonderdelen is men nog niet begonnen, want deze zijn pas later ingepland. Figuur 2.5 illustreert een andere Gantt chart die kan gebruikt worden door deze meubelzaak. Deze keer duidt het de activiteiten aan die in elk werkstation worden uitgevoerd. We kunnen zien dat de planken zijn opgehouden in de afdeling houtbewerkingen. De Gantt charts geven een eenvoudige visuele controle van wat er zou moeten gebeuren en wat er werkelijk aan het gebeuren is. Ze kunnen gebruikt worden om alternatieve planningen uit te testen. Zeker wanneer gekleurde verschuifbare stukken papier worden gebruikt, kan men gemakkelijk alternatieve planningen voorstellen. Natuurlijk kan men in geen geval de Gantt chart gebruiken om een probleem te optimaliseren. Het vergemakkelijkt slechts de ontwikkeling van alternatieve planningen door effectief alles te visualiseren.
39
ma
di
woe
do
vrij
ma
di
ma
di
tafels planken keuken bed
Planning taak Echte vooruitgang taak
Werkelijke tijd
Fig 2.4: Gantt chart met de vooruitgang van de verschillende taken
ma
houtbewerkingen
assemblage
afwerking
verven
di
T
B
woe
do
vrij
P
K
T
P
B
T
P
B
K
T
Planning taak
K
Werkelijke tijd
Echte vooruitgang taak
Niet productieve tijd
Fig 2.5: Gantt chart voor de verschillende werkcentra
2.3.3
Shop structuur: job shop versus flow shop
Belangrijk bij de bespreking van schedule technieken is de flow van het product. We kunnen deze flow op twee manieren indelen. Als de jobs altijd dezelfde weg volgen doorheen het productieproces, altijd dezelfde opeenvolging van machines doorlopen, dan spreken we van flow shop. Wanneer de producten een verschillende processtroom volgen, dan doorlopen ze de machines in een verschillende volgorde. We spreken hier van job shop. Vooral producten gemaakt volgens de wensen van de klant behoren tot deze categorie. Elk product heeft als het ware een unieke routing. De jobs gaan van het ene
40
werkcentrum naar het andere in een behoorlijke willekeurige volgorde en de bewerkingstijd voor elke job aan een werkcentrum is heel variabel. De complexiteit en de beperkingen van het scheduling probleem is verschillend bij een flow shop en job shop. Merk ook op dat elk probleem een geval apart is. Het is niet zo dat een systeem dat goed werkt in een shop met 10 werkcentra ook goed zal werken in een systeem met 100 werkcentra. Daarvoor moet onder andere de shopstructuur dezelfde zijn, maar echter ook het percentage capaciteitsbenutting, enz ...
2.3.4
Productstructuur
Vooraleer je begint een schema op te stellen, moeten we het productieproces goed begrijpen. We moeten onder andere de productstructuur definiëren. Een belangrijke vraag is of de routing van het product bestaat uit enkele onderdelen ofwel uit een geassembleerde routing. De kwestie is of het schedulingsprobleem alleen rekening zal moeten houden met individuele jobs of ook rekening moet houden met een overeenkomstige set van jobs. De aanpak is volledig anders wanneer we een geassembleerde lijn hebben. Dan moeten we ervoor zorgen dat alle onderdelen klaar zijn op hetzelfde tijdstip: het assemblagetijdstip. Een ander aandachtspunt in de bespreking is het bestaan van een alternatieve routing voor het product. Ontwerp en onderhoud van alternatieve routes kan veel werk vragen. Bovendien kunnen de beslissingsregels, wanneer deze alternatieve routes moeten worden gebruikt, complex zijn. Aan de andere kant kunnen deze alternatieve routes ons helpen om onze jobs goed en op tijd uit te voeren. Als een werkcentrum is overladen en een ander onderbeladen, kan een alternatieve routing helpen om de afgesproken leveringstermijn, de doorlooptijd of benutting van het werkcentrum te halen. Tot slot hebben we nog het gebruik van operatieoverlapping. Als we een job kunnen starten in een werkcentrum alvorens hij is voltooid op het vorige werkcentrum, dan kunnen we de scheduling performantie verbeteren. Overlapping is een vorm van scheduling waarbij de flexibiliteit wordt verhoogd. Maar dit gebeurt niet zonder enige kosten. Het is noodzakelijk om goede informatie te hebben over 41
de tijdsvereisten van elke operatie. Je kan enkel opeenvolgende operaties starten als je zeker bent dat het volgende werkcentrum niet plots zonder werk komt te zitten. Als operatie 2 minder tijd vraagt dan operatie 1, dan kan de job enkel starten aan operatie 2 wanneer er een voldoende lange wachtrij bestaat. De grootte van het lot speelt hierbij een rol. Bij productieoverlapping zijn de lotgroottes niet langer vast, maar variabel doorheen het proces. Voor de meeste scheduling toepassingen gebruikt men een vaste lotgrootte die niet verandert doorheen de routing. Toch heeft het gebruik van variabele lotgroottes ook al zijn performantievruchten afgeworpen. De jobs kunnen één voor één verwerkt worden, we spreken dan over unit processing of we kunnen de jobs samen verwerken als een batch: batch processing.
2.3.5
Statisch versus dynamisch plannen
Het productieproces van een lijst met jobs kan op verschillende manieren worden gestart. Wanneer we spreken over statische scheduling, worden de jobs vrijgegeven aan de werkvloer op tijdstip 0. Het statische probleem werkt met een vaste set van jobs die we moeten schedulen totdat ze allemaal uitgevoerd zijn. We gaan ervan uit dat de hele set van jobs gelijktijdig toekomen op de werkplaats en alle werkcentra beschikbaar zijn op dat tijdstip. De meeste statische onderzoeken gebruiken het criterium van minimale make span. Dit is de minimale tijd nodig om alle jobs in the shop te voltooien. Naarmate de omvang van het aantal operaties toeneemt, wordt het systeem ingewikkelder. We maken dan gebruik van prioriteitsregels. Dynamische scheduling is een proces dat blijft doorlopen, nieuwe jobs worden constant aan het systeem toegevoegd. De criteria die hier gebruikt worden zijn gemiddelde doorlooptijd, gemiddelde WIP, het aantal jobs in het systeem of de benutting van het machinepark. Voor het oplossen van deze problemen kunnen we verschillende prioriteitsregels gebruiken. Maar wanneer het probleem te complex wordt, nemen we best onze toevlucht tot simulatie.
2.3.6
Horizontaal versus verticaal plannen
Een werkcentrum vullen job per job noemen we verticaal plannen. We kijken naar elk werkcentrum apart en beslissen zo welke job we als volgende uitvoeren. De
42
prioriteitsregels werken op deze basis. Maar we kunnen ook horizontaal plannen. In dit geval worden alle activiteiten van de job met de hoogste prioriteit eerst gepland. Daarna gaan we de job plannen met de volgende prioriteit, enz. ... . Deze horizontale benadering kan lege gaten veroorzaken in de planning. Dit gebeurt wanneer een machine op bepaalde tijdstippen even niet moet draaien, ook al zijn er jobs aanwezig, omdat een andere job zal arriveren met een hogere prioriteit.
2.3.7
Forward scheduling
De literatuur besteedt het meeste aandacht aan forward scheduling. Forward scheduling betekent dat we beginnen werken vanaf het moment dat het werk toekomt in het werkstation. De jobs worden sequentieel uitgevoerd vanaf een beginpunt = het referentietijdstip. De voordelen van forward planning zijn onder andere: •
Goed gebruik van de werkuren van de arbeiders: arbeiders starten altijd met een taak om bezig te blijven
•
Flexibiliteit: het overschot in tijd staat toe onverwachte taken op te vangen
Het nadeel is dat sommige taken op voorhand worden geproduceerd en op voorraad komen te liggen. We komen hier later uitgebreid op terug.
2.3.8
Backward scheduling
In een backward planning beginnen we te werken aan een taak op het laatst mogelijke moment om te voorkomen dat de job te laat komt. We gaan dus uit van het eindtijdstip van de job en plannen achteruit. Backward scheduling komt eerder voor in MRP gebaseerde systemen waarbij het productieproces uit meerdere sequentieel uit te voeren operaties bestaat. Gebaseerd op het beloofde levertijdstip van het klantenorder en de gemiddelde productie-, wacht- en transporttijden van de operaties, kan het systeem voor elk order de start- en einddatum bepalen. We rekenen dus terug (backward) vertrekkende van het levertijdstip. De voordelen van een backward planning zijn onder andere: •
Lagere materiaalkosten: de materialen worden niet verbruikt zolang het niet moet, daardoor stellen we het toevoegen van waarde uit tot op het laatste moment
43
•
Minder blootgesteld aan risico wanneer de klant wijzigingen aanbrengt in de planning
•
Focust het werk op het aan de klant beloofde levertijdstip
Het nadeel van deze werkwijze kan optreden als we bij de berekening van de start- en einddata geen extra flexibiliteit inbouwen, we te nipt plannen. De joblijst zal vaak niet realiseerbaar zijn. In theorie steunen de MRP en JIT planningen op een backward planning: enkel produceren wanneer het nodig is. Zo zijn bijvoorbeeld taken van een JIT-systeem, zoals de naam doet vermoeden, ‘just in time’ gepland. In de praktijk berekenen we de tijdstippen met veel te grote marges, daarom is niet elke taak gepland op het laatst mogelijke tijdstip.
2.3.9
Bottleneck scheduling
Bottleneck scheduling is gebaseerd op de Theory of constraints (TOC, Goldratt). Om niet te ver uit te weiden in deze paragraaf is deze theorie kort samengevat in appendix A. De focus ligt op het inplannen van de werkcentra waar capaciteits- (of andere) beperkingen voorkomen. Als principe geldt dat elk gewonnen tijdstip op de bottleneck resulteert in meer afgewerkte producten en uiteindelijk in meer winst. Tijd winnen op een niet-bottleneck installatie heeft geen toegevoegde waarde. Een niet-efficiënte planning van deze installaties leidt altijd tot hogere voorraden. Bulldozer scheduling Een typische vorm van bottleneck scheduling is Bulldozer Scheduling. Deze schedulingstechniek maakt een planning op m.b.v. het principe van een bulldozer. De techniek gaat als volgt: •
Bereken door middel van backward schedulen, vanaf het levertijdstip, de laatst mogelijke plandatum voor elke taak, en dit voor één machine. Meestal is het zo dat meerdere taken op hetzelfde ogenblik op dezelfde machine zijn ingepland: Goldratt noemt dit de ruines.
44
•
Zoals een bulldozer kunnen we nu de taken verschuiven. Dit kan gebeuren op verschillende manieren. Eerst en vooral moeten we een keuze maken of we beginnen met de laatste taak aan het einde van de planningshorizon of bij de eerste taak aan het begin van de planningshorizon. We kunnen m.a.w. voorwaarts of achterwaarts schuiven. In elk geval verzetten we de bovenste taken naar de eerstvolgende open plaatsten een niveau lager. We herhalen dit tot alle taken achter elkaar zijn ‘gevallen’. De machine voert dan slechts één taak tegelijk meer uit. Een bijkomende variant is dat we de taak schuiven tussen de volgende taak van een onderliggend niveau. We komen dus tot vier varianten voor deze techniek: 1. Voorwaarts, niet tussenvoegen 2. Voorwaarts, tussenvoegen 3. Achterwaarts, niet tussenvoegen 4. Achterwaarts, tussenvoegen
•
Bij achterwaarts schuiven kan het gebeuren dat enkele taken voor het huidige tijdstip (begin van onze planningshorizon) zijn ingepland. Om dit te corrigeren schuiven we alle taken op tot we aan het begin van onze planningshorizon staan. Bij voorwaarts schuiven kunnen er enkele onnodige gaten ontstaan in de planning. Daardoor wordt de productie van enkele taken zonder reden uitgesteld. We schuiven ook hier alle taken op tot aan het begin van onze planningshorizon zodat we geen gaten meer hebben in de planning.
Beetje te ingewikkeld op het eerste zicht? Geen paniek, fig 2.6 geeft een voorbeeld van elke techniek. De beginsituatie is telkens hetzelfde. Alle taken worden voor hun due date ingepland. Nu moet de machine meerdere taken tegelijk uitvoeren zoals bijvoorbeeld taak B, C en D op tijdsblok 5. We nemen dus onze bulldozer en gaan schuiven. Bij voorwaarts schuiven beginnen we bovenaan van links naar rechts te schuiven, bij achterwaarts schuiven bovenaan van rechts naar links. Als je de taken niet wenst tussen te voegen, vallen de taken in het gepaste gat van de onderstaande lagen wanneer er plaats genoeg is. Ze kunnen dus enkel taken laten vallen als er voldoende plaats is. Bij tussenvoegen zullen we de taken tussen twee onderliggende taken duwen. We voegen de taak gewoon tussen de twee onderliggende taken. 45
ACHTERWAARTS NIET TUSSENVOEGEN
VOORWAARTS NIET TUSSENVOEGEN
A
A
B
D
D
C
C
D
D
B C
C
A
A
B
B
D
D
D
D
A
A
B
B
D
D
D
D
A
A
B
B
D
D
D
D
C
C
C
D
A
A
B
D
C
C
A
A
B
B
A
A
B
B
A
B
B
C
C
D
A
C
D
B
D
C
A
B
B
B
B
A
A
B
B
D
D
D
C
C
C
A
A
D
D
D
D
C
D
C
D
C
ACHTERWAARTS TUSSENVOEGEN D
D
D
D
D
C
D
D
D
D
D
D
C B
C
C
C
A
D
B C
A
D
D
C
VOORWAARTS TUSSENVOEGEN D
D
A
D
D
D
D
D
D
D
A
A
D
D
A
A
D
B
B
D
C
B
B
D
D
A
A
C
C
B
B
D
D
D
D
A
A
C
C
D
C
B
B
Fig 2.6: bulldozer scheduling
2.3.10
Bottleneck planning in onze schedulingsengine
Het in deze thesis ontwikkelde algoritme is een variant op de techniek ‘achterwaarts niet tussenvoegen’ van bulldozer scheduling. Er zijn wel twee grote verschilpunten. Ten eerste gaan we alle taken ‘één voor één’ inplannen in plaats van ze allemaal tegelijk te bekijken. De volgorde van de in te plannen taken wordt bepaald volgens een prioriteitsregel (sequencing). Vervolgens plannen we ze één voor één in. De prioriteiten van de orders spelen een belangrijke rol. De orders die eerst worden ingepland, beschikken over de meeste vrije ruimte. Naarmate we verdergaan met plannen, is er steeds minder ruimte over. De orders met lagere prioriteit moeten zich meer en meer aanpassen aan de nog beschikbare ruimte.
46
Het tweede verschilpunt met bulldozerscheduling is de extra intelligentie die we hebben toegevoegd aan het algoritme. Bij achterwaartse bulldozer scheduling kan het gebeuren dat een job voor de planningshorizon terecht komt. In de laatste stap verschuiven we alle jobs een beetje naar voor tot de jobs in de planningshorizon terecht komen. Jobs die voor hun leverdatum waren ingepland, komen nu te laat. In het nieuwe algoritme zullen we een job niet onmiddellijk voor het begin van de planningshorizon inplannen. Eerst wordt de som van de gepasseerde vrije ruimte bepaald. Indien deze som groter of gelijk is aan de ruimte nodig om de job in te plannen, dan kunnen we deze job inplannen net voor zijn due date en daarbij de andere jobs naar voor schuiven. Indien de som niet groot genoeg is, plaatsen we de job toch voor het begin van de planningshorizon. We gaan niet meer schuiven tot alle jobs na het begin van de planningshorizon komen. Het lijkt ons redelijker dat de planner deze jobs dan manueel nog ergens tussenplant en dat enkel deze te laat komen. Ofwel kan hij deze jobs uitvoeren op een alternatieve routing of eventueel de jobs uitbesteden. Figuur 2.7 toont een voorbeeld. De volgorde van de in te plannen jobs wordt bepaald door de EED regel. Job A heeft de vroegste due date en wordt ingepland vlak voor deze datum. Job B is de volgende in de rij. Bij het inplannen van job C, zien we dat job B en C tegelijk op de machine staan gepland. We moeten dus schuiven. Job C kan nog binnen de planningshorizon worden gepland. Job D is de volgende in de rij. Job D heeft een duurtijd van 4 blokjes. En bij het schuiven zien we dat job D voor het begin van de planningshorizon zal terechtkomen. Maar de som van lege gaten bedraagt 4 blokjes. We kunnen de job dus voor alle andere plaatsen en daaropvolgend de jobs samen verschuiven tot net voor de due date van job D. Als we dit vergelijken met bulldozer scheduling, achterwaarts niet tussenvoegen, dan zou job D eerst voor de planningshorizon vallen. In een laatste stap zou deze naar voor geduwd worden tot het begintijdstip. Job C en A die voor hun due date stonden ingepland, schuiven mee. Beiden komen te laat. Door die verschuivingen zou ook job B nog beetje verschuiven en ook te laat komen. Job A, B en C komen dus niet meer op tijd en job D is veel te veel op voorhand geproduceerd. In ons
47
ontwikkeld algoritme daarentegen komen alle jobs net op tijd, alleen job B moet een beetje op voorhand worden geproduceerd. Het spreekt voor zich dat de sorteervolgorde (bepaald door sequencing) van de aangeboden jobs in dit algoritme een belangrijke rol speelt. Als de grootste jobs eerst worden ingepland, hebben die de meeste kans om nog over vrije ruimte te beschikken. De gaten worden gaandeweg kleiner, maar de jobs ook. Bij een overladen planning kunnen deze kleine jobs echter verschuivingen veroorzaken. Indien de kleinste jobs eerst worden ingepland, kunnen de laatste grote jobs het moeilijk hebben om nog vrije ruimte te vinden. Hierdoor zullen er veel meer verschuivingen zijn. Het grote voordeel is dat de grootste jobs net voor hun due date ingepland geraken.
A
A
A
A
A
A
B
A
A
B
B
C
C
C
C
C
C
D
C
D
C
D
D
C
C
C
C
A
A
B
C
C
C
C
A
A
B
D
D
C
C
C
C
A
A
D
D
D
B
D
Fig 2.7: bottleneck scheduling
48
D
D
2.4
Besluit: theorie toepassen op probleem Agfa
Dit hoofdstuk heeft ons de basisprincipes geleerd van de activiteiten die moeten gebeuren bij een planning. We hebben onze aandacht vooral besteed aan ‘sequencing’ en ‘scheduling’. Bij ‘sequencing’ was het belangrijk om beoordelingscriteria op te stellen. Om deze te meten hebben we prestatie-indicatoren nodig. Als we dit samensmelten met hoofdstuk 1, bekomen we de belangrijkste beoordelingscriteria van Agfa: a. Op tijd leveren van de emulsies (som te late orders minimaliseren) b. Niet te veel op voorhand produceren indien niet nodig (som te vroege orders minimaliseren) c. Kapitaal dat in zilvervoorraden kruipt minimaliseren (som voorraadwaarde minimaliseren) We moeten een selectie maken van sorteringsregels die we willen beschouwen in de volgende hoofdstukken. We kiezen voor DD, PT, ST en CR omdat deze de basisregels zijn. De andere zijn eerder afgeleiden. We hebben in paragraaf 2.3.10 zelf een bottleneckalgoritme ontworpen om aan het eerste beoordelingscriterium te kunnen voldoen. Want de theorie rond ‘scheduling’ bood geen waterdichte oplossing om altijd op tijd te leveren. Het theoretisch gedeelte zit er op. Nu is het aan ons om deze principes te gebruiken en zelf aan het plannen te beginnen. In hoofdstuk 3 zullen we eerst wat experimenten doen. De bedoeling is voeling te krijgen met de wisselwerking tussen
de
gebruikte
prioriteitsregels
van
sequencing
en
de
gebruikte
schedulingstechnieken. De opdracht van hoofdstuk 3 is het plangedrag onder controle te krijgen en mogelijks te voorspellen.
49
Hoofdstuk 3 Het gedrag van onze schedulingsengine
3.1 3.1.1
De opbouw en werking van onze engine Inleiding: de huidig planningsstrategie van Agfa
Bij de uitwerking van een planningsalgoritme voor Agfa moeten we ons baseren op hun huidige planningsstrategie. Het is de bedoeling om de emulsiefabriek efficiënt tegen eindige capaciteit te plannen. Dit gebeurt momenteel nog manueel. Men plant enkel de aanzetlijnen van de emulsiefabriek, zodat we te maken hebben met het ‘één-enkele-machine-probleem’ uit paragraaf 2.2.3 van de literatuurstudie. Er wordt statische scheduling toegepast: één maal per week zal men de planning een week verder uitzetten. Alle orders zijn dus bij het begin van de planning aanwezig. Zoals beschreven in hoofdstuk 1 zit er een grote hoeveelheid
zilver
verwerkt
in
het
productieproces.
Een
belangrijk
beoordelingscriterium van de planning zal de minimalisatie van de WIP-voorraad zijn. Men wenst de orders zo dicht mogelijk bij hun due date te plannen zodat er zo weinig mogelijk zilvervoorraad nodig is. Daarnaast moet de planning uiteraard de beloofde leveringstermijn nakomen. Men wil niet dat orders te laat komen. De beoordelingscriteria worden: •
som dagen te vroeg
•
som dagen te laat
•
som van de voorraadwaarde
We gaan ons concentreren op de E27 aanzetlijn. Dit is een bottleneck installatie. We zullen o.a. met het ontwikkelde bottleneck algoritme van paragraaf 2.3.10 werken. De manuele planning werkt nu nog als volgt: men kijkt eerst naar de jobs die het dichtst liggen in de planningshorizon en men plant daar de grootste job eerst in. Om alles gemakkelijk te simuleren ontwikkelen we in 3.1.3 een schedulingsengine. Deze kan ons helpen om gemakkelijk orderlijsten te laten plannen. Onze schedulingsengine zal kijken naar de performantie van de huidige
50
planning van Agfa tegenover andere in de literatuur bestaande regels, maar ook tegenover zelf ontwikkelde regels. In paragraaf 3.1.2 zal ik eerst de opbouw en de werking van onze engine uitleggen. In paragraaf 3.2 komen de eerste experimenten aan bod. Op het einde van deze paragraaf zou duidelijk moeten worden hoe onze engine werkt. Beetje bij beetje wordt het ook mogelijk om het gedrag van onze engine te voorspellen. In een eerste fase van experimenten probeer ik vooral het gedrag van de engine onder de knie te krijgen. In hoofdstuk 4 gaan we nog een stap verder. De tweede fase van experimenten legt zich specifiek toe op de Agfa-orders. Bij het bestuderen van orderlijsten van de E27 aanzetlijn, moet het mogelijk worden om het gedrag te voorspellen. Enkele experimenten moeten dit bevestigen. Nu moeten we de voorraadwaarde nog onder de knie krijgen. Is dit mogelijk door een slimme sorteringsvolgorde? Of moeten we nog een extra voorraaddimensie aan het probleem koppelen?
3.1.2
Werking van de schedulingsengine
Het doel van onze engine was een generieke engine aan te bieden. Generiek wil zeggen dat afhankelijk hoe de inputdata worden aangeboden je een ander schedulingsgedrag kunt toepassen. De volgorde van de inputdata is dus belangrijk en steunt op de prioriteitsregels besproken in hoofdstuk 2. Elke regel zorgt voor een andere planning en dus een ander gedrag. Binnen onze engine zijn er twee scheduling technieken: 1. forward scheduling 2. backward/bottleneck scheduling Bij forward scheduling worden alle orders na elkaar ingepland vertrekkende van het begin van onze planningshorizon. De volgorde van de orders hangt enkel af van het sorteringsalgoritme gebruikt bij de inputdata. In fig 3.1 is een voorbeeld gegeven van een joblijst. De data werden gesorteerd volgens oplopende PT. De resulterende forward planning zie je op de Gantt chart. Het is duidelijk dat alle jobs veel te vroeg worden geproduceerd. Geen enkele job komt te laat in dit voorbeeld.
51
Naam
duurtijd
due date
Job A
1
4
Job B
2
12
Job C
3
14
Job D
4
17
Job E
5
18
Job F
6
25
5 A
B
B
C
C
10 C
D
D
D
20
15
D
E
E
E
E
E
F
F
F
F
F
25 F
Due date
Due date
Due date
Due date
Due date
Due date
job A
job B
job C
job D
job E
job F
Fig 3.1: forward scheduling
Bij backward/bottleneck scheduling baseren we ons op de due date van het order. Wanneer we de gemiddelde productietijden en transporttijden kennen, kunnen we de duurtijd van het order bepalen. We beginnen achterwaarts de duurtijd in te plannen vertrekkende van het beloofde leveringstijdstip. Ons algoritme, ook al beschreven in paragraaf 2.3.10, gaat echter nog verder. Je kan het beschouwen als een variant op het bottleneck bulldozer schedulen. Alle taken worden één voor één ingepland. De volgorde van inplannen wordt opnieuw bepaald door een prioriteitsregel toegepast op de inputdata. Elk order wordt net voor zijn due date ingepland. Is er niet genoeg ruimte of staat er al een ander order ingepland, dan gaan we schuiven naar voor tot we een groot genoeg gat vinden in onze planning. Indien de job voor de planningshorizon dreigt te belanden, moeten we twee gevallen onderscheiden: a) Als de som van de vrije ruimte gepasseerd groter is dan de duurtijd van onze job, dan kunnen we de job nog voor zijn due date plaatsen. Enkele andere orders worden een beetje naar voor geduwd. b) Is de som van de vrije ruimte niet groot genoeg, dan vliegt de job voor het begin van de planningshorizon. Voor deze job moet een andere oplossing worden gevonden: alternatieve routing, uitbesteden, … . Het spreekt voor zich dat de sorteervolgorde van de inputdata een belangrijke rol zal spelen. Deze volgorde bepaalt namelijk welke jobs eerst worden ingepland, welke eerst zullen verschuiven, … .
52
Een typische eigenschap van het ontwikkelde bottleneckalgoritme is dat geen enkele job te laat zal komen. Dit komt de Agfa beoordelingscriteria ten goede. In fig 3.2 werd de joblijst uit fig 3.1 gepland volgens het bottleneckalgoritme. De sortering is gemaakt op basis van oplopende DD. Elke job wordt apart ingepland. Job A
wordt als eerste voor zijn due date geplaatst.
Job B
heeft ook nog plaats genoeg voor zijn due date.
Job C
overlapt met job B, daarom schuiven we job C voor job B.
Job D
heeft opnieuw genoeg ruimte voor zijn due date.
Job E
vindt geen enkel gat vrije ruimte dat groot genoeg is. Job E dreigt voor de planningshorizon te vallen. Maar de duurtijd van job E (5 blokjes) is even groot als de som van de vrije gaten (5 blokjes). We plaatsen job E dus voor alle andere en verschuiven vervolgens tot we net voor zijn due date komen.
Job F
kan zonder verschuiven voor zijn due date worden geplaatst.
Alle jobs komen opnieuw op tijd. In vergelijking met fig 3.1 werden er minder jobs op voorraad geproduceerd. Omdat het handmatig uitvoeren van een sequencing en scheduling veel werk vraagt, hebben we een schedulingsengine ontworpen. Dankzij dit ontwikkelde computerinstrument besparen we veel tijd. Het is een handige tool die ook later in verder onderzoek te Agfa kan gebruikt worden. De schedulingsengine is een set van excel-, csv- en Visual Basic-bestanden. Deze bestanden kunnen gemakkelijk op een PC worden gebruikt. Je kunt ze terugvinden op de bijgevoegde CD-ROM. In de volgende paragraaf wordt er meer uitleg gegeven over de opbouw van de schedulingsengine.
53
Naam
duurtijd
due date
Job A
1
4
Job B
2
12
Job C
3
14
Job D
4
17
Job E
5
18
Job F
6
25
5
10
15
20
25
5
10
15
20
25
15
20
25
15
20
25
15
20
25
20
25
20
25
20
25
A
Due date job A A
B
B
Due date job B
5 A
10
C
B
B
C
C
Due date
5
job C
10
A
C
C
C
B
B
Due date
5
job C
10
A
C
C
C
B
B
D
D
D
D Due date
15 5
10
A
C
C
C
B
B
job D
E
E
E
E
D
D
D
D
E
Due date
5 A
C
C
10 C
B
B
D
D
job E
15 D
D
E
E
E
E
E
Due date
5 A
C
C
10 C
B
B
D
D
job E
15 D
D
E
E
E
E
E
F
F
F
F
F
F
Due date
Fig 3.2: bottleneck scheduling
job F
54
3.1.3
Opbouw van onze schedulingsengine
De ontworpen schedulingsengine kunnen we opnieuw onderverdelen in de vier planningsactiviteiten: 1. loading: joblijsten opmaken 2. sequencing: prioriteiten van de orders bepalen 3. scheduling: forward of bottleneck planning uitvoeren 4. opvolging en controle: analyse van de resultaten via een semi-automatisch interpretatie-instrument doen
LOADING
JOBLIJSTEN OPMAKEN Joblist.exe
SEQUENCING
SORTEREN VOLGENS EEN PRIORITEITSREGEL Joblist.csv
SCHEDULING
SCHEDULINGS ENGINE
Foward schedulen
Bottleneck schedulen
Jobkopie.csv
Jobseq.csv
OPVOLGING EN CONTROLE ANALYSE
Jobschrijf.csv
Jobanalyse.csv
Fig 3.3: overzicht van de opbouw van onze schedulingsengine
55
Ik zal de opbouw van onze schedulingsengine bespreken volgens de indeling van fig 3.3. Alle inputbestanden moeten worden opgeslagen op je PC onder de map c:\schedul. De outputbestanden zal je ook in deze map terugvinden. Alles kan worden teruggevonden op de bijgevoegde CD-ROM. Loading: joblijsten opmaken Bronbestand: joblist.xls De te bestuderen joblijst moet eerst in een excelfile terecht komen. Een voorbeeld van zo’n file zie je in tabel 3.1. In de eerste kolom komt de naam van het order. Zo kunnen we later gemakkelijk het order terugvinden. In de tweede kolom staat de duurtijd van het order. De due date plaatsen we in de derde kolom. De vierde kolom geeft het aantal kg zilver weer in de emulsie. Voorlopig houden we hier nog geen rekening mee en plaatsen we alle cellen op de waarde nul. Het gebruik van deze kolom zal aan bod komen in hoofdstuk 4. De andere kolommen zijn eerder dummykolommen en kunnen eventueel weggelaten worden. Ze bevatten geen noodzakelijke inputgegevens voor de uitvoering van de schedulingsengine, maar kunnen wel de gegevens voor een sorteervolgorde van de inputfile bevatten. Een eerste dummykolom is een kolom met een soort sluiter. Dit komt van pas bij het kopiëren naar joblist.csv en wordt in de volgende alinea uitgelegd. Nog ander dummykolommen kunnen kolommen met de slack time en critical ratio zijn. In hoofdstuk 4 zullen deze nog aangevuld worden met kolommen met een voorraaddimensie. Tabel 3.1: joblist.xls JL_JOB
JL_DUURUUR
JL_DUE_UUR
JL_AZ_VDL
JL_SLUITER
Job A Job B Job C
JL_SLACK
JL_CRITICAL RATIO
1
4
0
S
3
3
2
12
0
S
10
5,5
3
14
0
S
11
4,333333
Job D
4
17
0
S
13
4
Job E
5
18
0
S
13
3,4
Job F
6
25
0
S
19
4
Sequencing: prioriteiten van de orders bepalen Het joblist.xls bestand kunnen we vervolgens sorteren volgens een bepaald criterium. We selecteren de betrokken velden en via de standaardwerkbalk “Data
56
– Sorteren – sorteren op” kiezen het gewenste sorteercriterium. In ons voorbeeld kunnen we sorteren volgens •
Duurtijd oplopend
•
Duurtijd aflopend
•
Due date oplopend
•
Due date aflopend
•
Slack time oplopend
•
Slack time aflopend
•
Critical ratio oplopend
•
Critical ratio aflopend
Opslaan als joblist.csv Vervolgens slaan we de betrokken velden op als joblist.csv in de map c:\schedul. “Bestand – opslaan als – opslaan als – CSV (gescheiden door een lijstscheidingsteken)”. Dit is nodig omdat we in Visual Basic werken met csvbestanden. Het kan zijn dat jouw computer hierna enkele meldingen heeft, maar daar moet je je niets van aantrekken en gewoon op ‘OK’ drukken. Wanneer onze
57
programma’s operationeel zouden worden gebruikt, kan men dit nog optimaliseren en rechtstreeks in de excelbestanden gaan werken. Enige programmeerkennis is dan vereist. Scheduling: het forward of het bottleneck algoritme uitvoeren Start de VBA applicatie In de map c:\schedul moeten drie bestanden worden gekopieerd. 1. Scheduling_forw_backw.vbw
(visual basic project)
2. Scheduling_forw_backw.vbp
(visual basic project)
3. scheduling_f_w.frm
(visual basic form file)
Open c:\schedul\scheduling_forw_backw.vbp. Je kan het programma starten door op Run – Start te drukken. Of rechtstreeks door op het driehoekje te klikken in de werkbalk.
Er verschijnen nu drie actieknoppen. 1. Forward:
uitvoeren
van
een
forward
scheduling 2. Bottleneck: uitvoeren van onze variant op bottleneck scheduling 3. End: om het programma te verlaten De linked list De schedulingsengine is geprogrammeerd in Visual Basic. De code voor het forward en bottleneck algoritme steunt op het principe van de linked list. In een linked list worden alle elementen in een bepaalde volgorde in een rij gestoken. Deze volgorde wordt bepaald door het gebruikte sorteringsalgoritme in de inputfile joblist.csv. De geheugenplaatsen noemen we linked list elementen of knooppunten. De linked list elementen worden vervolgens aan elkaar gelinkt door pointers te gebruiken. De elementen worden zo aan elkaar gekoppeld als schakels van een ketting. 58
Elk element bevat enkele datagegevens: •
een dataveld dat de gegevens voor het gebruik bijhoudt. In ons algoritme zijn dit: job_id, job_duur en job_due_date.
•
velden voor pointers die de elementen binden aan de andere. De jobs krijgen een bepaalde volgorde toegewezen in de planningshorizon.
Ik situeer alles eens in de context van ons opgesteld algoritme. De gebruikte pointers zijn: •
S_rec: geeft een nummer aan de jobs in de volgorde zoals die werden gesorteerd in joblist.csv. Dit wordt dus uitsluitend bepaald door de prioriteitsregels.
•
S_prev_ptr: is het nummer van de job die voor deze job ingepland staat, deze pointer verwijst naar de s_rec van de voorafgaande job.
•
S_next_ptr: is het nummer van de job die na deze job komt, deze pointer verwijst naar de s_rec van de volgende job.
In ons schedulingsalgoritme plannen we de jobs sequentieel in. Bij het begin hebben we twee data: het begintijdstip van onze planningshorizon en het eindtijdstip. De linked list ziet er als volgt uit: s_rec s_prev_ptr s_next_ptr s_jobid 1
1
2
BEGIN
2
1
2
EINDE
De jobvolgorde: BEGIN EINDE
Als we de eerste job inplannen, komt deze tussen het begin en het einde van de planningshorizon. Ons algoritme zal de pointers dus veranderen. Na het BEGIN komt nu job A, de s_next_ptr van BEGIN wordt 3, enzovoort…. s_rec s_prev_ptr s_next_ptr s_jobid 1
1
3
BEGIN
2
3
2
EINDE
3
1
2
Job A
De jobvolgorde volgens de pointers wordt: BEGIN Job A EINDE
59
Als we alle jobs inplannen ziet de linked list er als volgt uit: s_rec s_prev_ptr s_next_ptr s_jobid 1
1
3
BEGIN
2
8
2
EINDE
3
1
5
Job A
4
5
6
Job B
5
3
4
Job C
6
4
7
Job D
7
6
8
Job E
8
7
2
Job F
Daaruit kunnen we afleiden dat de jobs zo zijn ingepland: BEGIN Job A Job C Job B Job D Job E Job F EINDE
De volledige code van onze algoritmes zoals geprogrammeerd in het Visual Basic programma kan je vinden in appendix B. Door onze schedulingsengine te laten uitvoeren hebben we twee outputfiles gemaakt: jobkopie.csv en jobseq.csv. Je kan ze opnieuw terugvinden in de map c:\schedul. Output: jobkopie.csv Met dit bestand hebben we de controle of de inputgegevens correct werden ingelezen. Maar voor verdere verwerking hebben we dit bestand niet meer nodig. Het is enkel een controlebestand. De datarecord toont een volgnummer, de jobnaam, de duurtijd, de due date en het aantal liter zilver in de emulsie. Ze worden allemaal van elkaar gescheiden door een “/”- teken. Tabel 3.2: jobkopie.csv 1/Job A/1/4/0 / 2/Job B/2/12/0/ 3/Job C/3/14/0/ 4/Job D/4/17/0/ 5/Job E/6/18/0/ 6/Job F/5/25/0/
Output: jobseq.csv Dit is onze belangrijkste outputfile. Hij beschrijft de jobsequentie volgens het principe van de linked list. Met behulp van dit bestand is het mogelijk om een Gantt-chart op te stellen.
60
Het csv-bestand kan in excel als tekstbestand worden geopend en nadien als jobseq.xls worden opgeslagen zoals je kunt zien in tabel 3.4. Tabel 3.3: jobseq.csv s_rec;s_prev_ptr;s_next_ptr;s_jobid;j_job_due;s_job_duur;s_job_star;s_job_end;s_prev_spa;s_next_spa;s_vdl 1; 1; 3;BEGIN; 1; 0; 0; 0; 0; 2;0; 2; 8; 2;EINDE; 51; 0; 50; 50; 25; 0;0; 3; 1; 5;Job A
; 4; 1; 2; 2; 1; 0;0
4; 5; 6;Job B
; 12; 2; 6; 7; 0; 0;0
; ;
5; 3; 4;Job C
; 14; 3; 3; 5; 0; 0;0
;
6; 4; 7;Job D
; 17; 4; 8; 11; 0; 0;0
7; 6; 8;Job E
; 18; 6; 12; 17; 0; 2;0
8; 7; 2;Job F
; 25; 5; 20; 24; 2; 25;0
; ; ;
Tabel 3.4: jobseq.xls s_rec s_prev_ptr s_next_ptr s_jobid j_job_due s_job_duur s_job_star s_job_end s_prev_spa s_next_spa s_vdl 1
1
3 BEGIN
1
0
0
0
0
2
0
2
8
2 EINDE
51
0
50
50
25
0
0
3
1
5 Job A
4
1
2
2
1
0
0
4
5
6 Job B
12
2
6
7
0
0
0
5
3
4 Job C
14
3
3
5
0
0
0
6
4
7 Job D
17
4
8
11
0
0
0
7
6
8 Job E
18
6
12
17
0
2
0
8
7
2 Job F
25
5
20
24
2
25
0
De titels van de verschillende kolommen betekenen: S_rec
het volgnummer bepaald door de prioriteitsregels
S_prev_ptr
de previous pointer toont aan welk order voor het order is ingepland
S_next_ptr
de next pointer duidt aan welk order volgt op het order
S_jobid
dit is de jobnaam zoals ingegeven in joblist.xls
J_job_due
de leverdatum van het order zoals ingegeven in joblist.xls
S_job_duur
de duurtijd van het order zoals ingegeven in joblist.xls
S_job_star
de startdatum van het ingeplande order
S_job_end
de einddatum van het ingeplande order
S_prev_spa
de previous space geeft aan of er voor het order een lege ruimte in de planning voorkomt
S_next_spa
de next space geeft aan of er na het order een lege ruimte in de planning voorkomt. Bij de laatste job zien we de ruimte tot het einde van de gekozen planningshorizon
61
S_vdl
het aantal liter zilver in het order aanwezig zoals ingegeven in joblist.xls
Als we de joblist sorteren volgens s_job_star dan krijgen we een duidelijk beeld van de tijdsplanning. Dit doen we door op “Data – Sorteren – sorteren op – s_job_star – oplopend” te drukken. Tabel 3.5: gesorteerde joblijst van jobseq.xls s_rec s_prev_ptr s_next_ptr s_jobid j_job_due s_job_duur s_job_star s_job_end s_prev_spa s_next_spa s_vdl 1
1
3
BEGIN
1
0
0
0
0
2
0
3
1
5
Job A
4
1
3
3
2
3
0
5
3
4
Job C
14
3
4
6
0
0
0
4
5
6
Job B
12
2
7
8
0
0
0
6
4
7
Job D
17
4
9
12
0
0
0
7
6
8
Job E
18
5
13
17
0
1
0
8
7
2
Job F
25
6
19
24
1
0
0
2
8
2
EINDE
26
0
25
25
0
0
0
Opvolging en controle: analyse van de resultaten In de map c:\schedul moeten opnieuw drie bestanden worden gekopieerd. 1. analyse.vbw
(visual basic project)
2. analyse.vbp
(visual basic project)
3. analyse.frm
(visual basic form file)
Jobseq.csv Het analyseprogramma maakt gebruik van het bestand jobseq.csv. Dit bestand werd in de vorige stap opgemaakt door onze schedulingsengine. Er moet dus eerst een planning worden opgemaakt vooraleer je de performantie ervan kan meten. Wat logisch is… Start de VBA applicatie Open c:\schedul\analyse.vbp. Druk nu op “Run – Start”. Of klik rechtstreeks op het driehoekje in de werkbalk. Er verschijnen twee knoppen: 1. Start analyse: voor het opstarten van de analyse 2. Stop analyse: voor het afsluiten van de analyse
62
De code van het visual basic analyseprogramma kan je opnieuw terugvinden in appendix B. Door onze analyse te laten uitvoeren hebben we twee outputfiles gemaakt: jobschrijf.csv en jobanalyse.csv. Je kan ze opnieuw terugvinden in de map c:\schedul. Output: jobschrijf.csv Deze file heeft geen analytische waarde. Het is louter om te controleren of de datagegevens juist werden ingelezen. De file is een handig controlemiddel wanneer er zich een probleem zou voordoen. Output: jobanalyse.csv In deze file vind je de analyse van onze planning terug. Bij de planning van de E27 aanzetlijn, is het belangrijk om op tijd te leveren, de flow time te beperken en vooral de voorraad onder controle houden. Ook het aantal jobs dat uiteindelijk voor de planningshorizon terecht zijn gekomen is belangrijk. Want voor deze jobs moet een andere planningsoplossing worden gevonden. Daarom gaan we bij de analyse onderstaande criteria gebruiken om de performantie van de planning te bepalen: •
som van de flow time van de joblijst
•
gemiddelde flow time
•
som te laat
•
gemiddeld te laat
•
som te vroeg
•
gemiddeld te vroeg
•
som van de voorraadwaarde
•
gemiddelde voorraadwaarde
•
aantal jobs voor de planningshorizon
Op basis van deze resultaten kan het gebruikte algoritme beoordeeld worden. De resultaten hangen dus af van de sorteervolgorde van je inputfile en van de gebruikte toepassing (forward of backward). Tabel 3.6 toont de analyse van ons voorbeeld. 63
Tabel 3.6: jobanalyse.csv job_id
job_duur
flow_time
telaat
tevroeg
liter_vdl
Voorraadwaarde
Job A
1
3
0
0
0
0
Job C
3
9
0
7
0
0
Job B
2
17
0
3
0
0
Job D
4
29
0
4
0
0
Job E
5
46
0
0
0
0
Job F
6
70
0
0
0
0
---------------
---------------
---------------
---------------
---------------
---------------
---------------
som
174
0
14
0
gemiddelde
29
0
2.33
0
voorhorizon
0
3.2
Eerste fase experimenten: begrijpen van het gedrag van de schedulingsengine
De bedoeling van deze paragraaf is het begrijpen van het gedrag van de schedulingsengine. Kunnen we het gedrag gaan voorspellen? Met welke prioriteitsregels bepalen we de beste volgorde van de inputdata om een zo goed mogelijk resultaat te krijgen? In paragraaf 3.2 heb ik gewerkt met fictieve orderlijsten. Ik zal een eerste schifting maken in de prioriteitsregels en schedulingsalgoritmes. In hoofdstuk 4 leg ik de aandacht volledig op de Agfaorderlijsten.
3.2.1
Karakteristieken van de orderlijsten
Om het gedrag van de schedulingsengine te begrijpen, moeten we een aantal joblijsten opmaken. Deze joblijsten kunnen we dan sorteren volgens een bepaalde prioriteitsregel
en
vervolgens
laten
schedulen
door
ons
forward
of
bottleneckalgoritme. Met behulp van onze analysetool kunnen we de resultaten gemakkelijk met elkaar vergelijken. Deze resultaten kunnen uiteenlopend zijn, afhankelijk van de kenmerken van de joblijst. Elke lijst verschilt van een andere door welbepaalde karakteristieken. Resultaten voor één type lijst kunnen niet zomaar veralgemeend worden voor een ander type van lijsten. Om de performantie van de verschillende orderlijsten te meten t.o.v. elkaar, moeten we eerst de karakteristieken van de orderlijsten bekijken. Het belangrijkste criterium is de “drukte” van de ingeplande orders. Hoeveel orders overlappen en hoeveel
64
plaats is er over? Dit kunnen we berekenen door gebruik te maken van enkele parameters van de verschillende jobs van een orderlijst:
Als
•
duurtijd
•
due date we
deze
parameters
combineren
komen
we
tot
volgende
joblijstkarakteristieken: % vrije ruimte = 1 −
∑ duurtijd
jobi
i
laatste due date in order
% overlapping jobs =
∑ tijd i
jobi overlapt met andere
∑ duurtijd
job j
j
De vrije ruimte (VR) bepaalt hoeveel plaats er over is als alle jobs na elkaar zouden geplaatst worden tegenover de due date van het laatste order. De overlapping van de jobs (OV) berekent het percentage van de duurtijd van de jobs dat overlapt met een andere. In fig 3.4 wordt een voorbeeld gegeven. De vrije ruimte is daar ongeveer 33% en de overlapping van de jobs bedraagt 42% van hun totale duurtijd.
Naam
duurtijd
due date
Job A
3
6
Job B
4
14
Job C
2
14
Job D
2
19
Job E
3
21
A
A
VR = 1 − OV =
A
B
B
5
10
C
C
B
B
(3 + 4 + 2 + 2 + 3) = 0,33 21
6 = 0,42 (3 + 4 + 2 + 2 + 3)
D
D E
15
E
E
20
Due date
Due date
Due date
Due date
job A
job B en job C
job D
job E
Fig 3.4: karakteristieken van joblijsten: de vrije ruimte (VR) en de overlapping van de jobs
We zullen in deze paragraaf de invloed van deze twee karakteristieken bekijken. 65
Er werden 15 experimenten gedaan. Telkens werd een joblijst opgesteld waarbij het percentage vrije ruimte en percentage overlapping jobs varieert. De verschillen tussen de experimenten kan je zien in tabel 3.7. Tabel 3.7: design van experimenten eerste fase % overlapping % vrije ruimte
0
25
50
75
100
0
experiment 1
experiment 4
experiment 7
experiment 10
experiment 13
25
experiment 2
experiment 5
experiment 8
experiment 11
experiment 14
50
experiment 3
experiment 6
experiment 9
experiment 12
experiment 15
Ik heb in mijn eerste fase experimenten de belangrijkste prioriteitsregels van hoofdstuk 2 met elkaar vergeleken: PT, DD, ST en DD. Telkens kon ik deze ook nog in oplopende of aflopende volgorde nemen. Vervolgens heb ik ook beide schedulingsalgoritmes gebruikt. Zo komen we tot een groot aantal mogelijkheden. Tabel 3.8 vat deze combinaties samen. We hebben er in totaal 16. aantal combinaties = 4 ( prioriteitsregels ) × 2 ( sortering ) × 2 ( schedulingsalogoritme ) = 16 Tabel 3.8: aantal mogelijkheden gebruikt tijdens eerste fase van experimenten
SEQUENCING
SCHEDULING
3.2.2
PRIORITEITSREGEL SORTERING FORWARD PT AFLOPEND X OPLOPEND X DD AFLOPEND X OPLOPEND X ST AFLOPEND X OPLOPEND X CR AFLOPEND X OPLOPEND X
BOTTLENECK X X X X X X X X
Resultaten van de eerste fase experimenten
Met behulp van de beschreven schedulingsengine werden de 15 joblijsten op de 16 mogelijke combinaties getest. De resultaten van al deze experimenten kan je terugvinden in appendix C. De beste resultaten werden aangeduid met groen, de onaanvaardbare resultaten met rood.
66
Tabel 3.9 toont voor alle experimenten het beste resultaat. Wanneer we al eens vluchtig naar deze resultaten kijken, zien we dat een forward planning niet goed presteert. Dit wordt nog duidelijker als we de tabel 3.10 bestuderen. In deze tabel worden de beste resultaten weergegeven per combinatie sequencing/scheduling. De regel met de hoogste populatie geeft de beste resultaten. Op deze tabel zie je nog beter dat een goede performantie zelden voorkomt bij een forward scheduling. En als dat al eens het geval is, bestaat er ook een bottleneckvariant met even goede resultaten. Uit tabellen 3.9 en 3.10 kunnen we ook de beste regels voor de eerste fase van experimenten afleiden: bottleneck schedulen gecombineerd met aflopende CR, DD of ST. Tabel 3.9: beste resultaten eerste fase experimenten, ingedeeld volgens OV en VR
ST oplopend
ST aflopend CR aflopend
DD oplopend
100 bottleneck
DD aflopend/oplopend
75 bottleneck
bottleneck
ST aflopend/oplopend
50
ST oplopend
forw
DD oplopend
DD oplopend
CR aflopend
bottleneck
DD aflopend
CR aflopend
bottleneck
DD aflopend
bottleneck
ST aflopend/oplopend
bottleneck
DD aflopend/oplopend
PT oplopend bottleneck
bottleneck
PT aflopend/oplopend
25
CR aflopend
CR aflopend/oplopend forw
0
PT aflopend/oplopend DD aflopend/oplopend
25 bottleneck
0
%VR
bottleneck
%OV
PT oplopend CR oplopend
DD oplopend
CR aflopend/oplopend
DD aflopend
DD aflopend CR aflopend
bottleneck
ST aflopend/oplopend
bottleneck
DD aflopend/oplopend
ST aflopend bottleneck
50
bottleneck
PT aflopend/oplopend
ST aflopend CR aflopend
CR aflopend/oplopend
Uit tabel 3.10 zouden we kunnen afleiden dat CR aflopend/bottleneck de beste regel is. Als we beter kijken naar de resultaten in appendix C, dan zien we dat deze combinatie inderdaad vaak de beste is. Maar als de regel niet de beste is, dan scoort deze regel ook helemaal slecht. In experiment 8 en 10 komen er zelfs jobs voor de planningshorizon terecht. De combinatie DD aflopend/bottleneck scoort ook heel goed. Deze regel heeft vooral goede resultaten bij weinig overlappende jobs. Naarmate de overlappingen groter worden (>50 %) laat de regel het soms afweten. In hoofdstuk 4 zullen de 67
karakteristieken van de Agfa-joblijsten tonen dat deze regel een belangrijke rol speelt. De overlappingen van de Agfa-joblijsten zijn namelijk niet zo groot. Ook de ST aflopend/bottleneck combinatie geeft mooie resultaten. Deze eerste fase experimenten zijn natuurlijk een beperkt onderzoek. Het is enkel de bedoeling algemene besluiten te vinden en een eerste richting van onderzoek aan te geven aan hoofdstuk 4. Je ziet duidelijk dat forward schedulen helemaal niet in aanmerking zal komen voor de joblijsten van Agfa. Dit komt door het algoritme zelf. Bij forward schedulen plakken we alle jobs na elkaar vanaf het begin van de planningshorizon. Het algoritme houdt geen rekening met de due date van een order. Om toch nog enigszins te voldoen aan de due date, kunnen we de prioriteiten bepalen m.b.v. DD, ST of CR. Maar dan houdt de regel helemaal geen rekening met te vroeg produceren. Alles wordt sequentieel uitgevoerd en alle orders worden dus na elkaar geplakt. Naarmate er meer vrije ruimte in de orderlijsten voorkomt, gaan de jobs minder te laat komen, maar veel meer te vroeg. Tabel 3.10: beste resultaten van eerste fase experimenten, ingedeeld volgens prioriteitsregel en gebruikte scheduling FORWARD PRIORITEITSREGEL PT
PT
DD
DD
Nr OV VR exp
AFLOPEND
OPLOPEND
AFLOPEND
OPLOPEND
BOTTLENECK
FORWARD PRIORITEITSREGEL
Nr exp
OV
VR
1
0
0
Nr exp
OV
VR
1
0
0
2
0
3
0
25
2
0
25
50
3
0
1
50
0
0
7
50
0
2
0
25
9
50
50
3
0
50
12
75
50
14
100
25
1
0
0
15
100
50
2
0
25
1
0
0
3
0
50
2
0
25
4
25
0
3
0
50
1
0
0
4
25
0
2
0
25
6
25
50
3
0
50
8
50
25
7
50
0
ST
ST
CR
Nr OV VR exp
BOTTLENECK
AFLOPEND
OPLOPEND
AFLOPEND
1
0
0
9
50
50
9
50
50
1
0
0
1
0
0
11
75
25
4
25
0
2
0
25
12
75
50
3
0
50
13
100
0
4
25
0
14
100
25
15
100
50
1
0
0
2
0
25
3
0
50
5
25
25
10
75
0
14
100
25
CR
68
OPLOPEND
Bij een bottleneck planning, scoren alle sorteringsregels maximaal als er geen overlapping is van de jobs. Alle jobs komen op tijd en geen enkele moet op voorhand geproduceerd worden. Dit is meer dan logisch door de opbouw van ons algoritme en opbouw van de joblijsten. Laten we meer en meer jobs overlappen, dan moeten er orders op voorhand geproduceerd worden. Welke jobs er moeten verschuiven hangt af van het sorteringsalgoritme, maar ook van de drukte van de joblijst. Er is een soort hefboommechanisme in het algoritme. Dit wordt geïllustreerd in fig 3.5. Bij normale drukte kunnen de jobs nog altijd gaten vinden voor de eerdere ingeplande jobs. De jobs moeten op voorhand worden geproduceerd. We moeten ervoor zorgen dat deze op voorhand geproduceerde jobs geen hoge waarde hebben en dat de tijd die ze op voorhand worden geproduceerd, beperkt blijft. Bij een drukke joblijst gebeurt het dat er geen plaats meer is voor bijkomende jobs. Dan kan deze job ofwel de andere allemaal verschuiven ofwel wordt hij helemaal vooraan nog voor de planningshorizon geplaatst. Als hij de andere allemaal verschuift, moeten we ervoor zorgen dat dit maar gebeurt over een kleine duurtijd en dat de verschoven jobs niet veel waarde hebben. Als de job echter nog voor de planningshorizon vliegt, is het belangrijk dat er een alternatieve routing kan gevonden worden. Het aantal jobs dat voor deze horizon terecht komt, moet dus beperkt blijven. Naarmate de jobs meer gaan overlappen en minder vrije ruimte hebben, komt dit fenomeen meer voor. Het hefboommechanisme tussen het verschuiven van jobs met lage prioriteit of het verschuiven van jobs met hoge prioriteit wordt dus bepaald door de karakteristieken van de orderlijsten: •
OV: overlapping van de jobs
•
VR: vrije ruimte tussen de jobs
69
OVERLAPPING ? JA
NEE
Er zal een job moeten verschuiven
Job kan voor zijn due date worden ingepland, er verschuift niets GEEN ENKELE JOB HOEFT
VRIJE RUIMTE ?
TE VERSCHUIVEN
Is er plaats voor de overlappende job?
JA
NEE
De job komt voor een job met hogere prioriteit
JOB MET LAGERE VRIJE RUIMTE ?
PRIORITEIT VERSCHUIFT NAAR VOOR IN PLANNING
Is de som van lege gaten in de planning tot begintijdstip > duurtijd job?
JA
HEFBOOMMECHANISME
NEE
De job komt voor zijn due date
De job komt voor de
en verschuift enkele jobs met
planningshorizon terecht
hogere prioriteit JOBS MET HOGERE PRIORITEIT
ALTERNATIEVE ROUTING ZOEKEN
VERSCHUIVEN NAAR VOOR IN PLANNING
VOOR JOB MET LAGERE PRIORITEIT
Fig 3.5: bottleneck hefboommechanisme: verschuiving jobs bepaald door OV en VR
3.2.3
Eigenschappen van de regels
Tot slot lijkt het me nuttig om de verschillende combinaties scheduling/sequencing eens te ontrafelen. De onderstaande inzichten werden niet alleen verkregen door de experimenten van de eerste fase, maar ook door andere, niet bijgevoegde experimenten. Naarmate ik meer met de regels ging spelen, kwam ik tot enkele conclusies. Door nog meer na te denken over de natuurlijke structuur van de regels, kon ik er eigenschappen gaan op plakken.
70
Forward planning Duurtijd PT oplopend Aangezien de kleine jobs eerst worden gepland, krijgen we een snelle doorstroom van de jobs. Maar we houden geen rekening met de due date, grote bestellingen (grote klant?) worden pas laatst gepland. De kans om te laat te komen bij een volle planning is dus reëel. Hoe minder vrije ruimte er is, hoe meer jobs te laat komen. Hoe meer vrije ruimte, hoe meer jobs er op voorhand worden geproduceerd. Over het algemeen komen enkele grote orders te laat, de kleine liggen op voorraad. Deze voorraad kan hoge waarden aannemen. In de experimenten van dit hoofdstuk werd wel nog geen rekening gehouden met gewogen duurtijd. De kleinste jobs worden eerst ingepland, dus deze kleine komen allemaal heel vlug op voorraad te liggen en dat voor lange tijd. Dit verklaart de hoge waarden. Wanneer we met gewogen duurtijd zouden werken, zou deze waarde op een lager niveau komen liggen. Maar het is duidelijk dat zelfs deze waarde nog te hoog ligt. Samengevat: sorteren op oplopende duurtijd is goed als we de flow time laag wil houden, maar we kunnen deze regel zeker niet gebruiken als te vroeg of te laat leveren belangrijke beoordelingscriteria zijn. PT aflopend Als de grote jobs eerst worden ingepland, krijgen we het omgekeerde effect. Grote bestellingen (grote klanten?) worden eerst afgehandeld. Deze grote jobs vertragen de kleine jobs. Kleine jobs moeten namelijk lang blijven wachten tot ze aan bod komen. De regel houdt opnieuw geen rekening met de due date van het order. Vele kleine taken komen te laat. Grote orders komen op voorraad te liggen. We zien in appendix C dat deze regel op alle criteria heel slecht scoort.
Due date DD oplopend Hetgeen het eerst moet worden geleverd, wordt het eerst afgewerkt. De regel is heel efficiënt om niet te laat te produceren. Omdat alle taken onmiddellijk na elkaar worden gepland, kan het zijn dat alle taken iets te vroeg worden
71
geproduceerd. De voorraden lopen op naarmate er meer vrije ruimte in de orderlijsten voorkomt. DD aflopend Onlogische regel: wat laatst moet worden geleverd, het eerst produceren. Dit zou alleen leiden tot hoge voorraden en te late leveringen. In de experimenten van appendix C zien we duidelijk de heel slechte resultaten.
Slack time slack = due date − nu − duurtijd Een grote slack komt voor bij late due date en/of kleine duurtijd. Een kleine slack komt voor bij vroege due date en/of grote duurtijd. ST oplopend De taak met de kleinste absolute speling in tijd komt eerst. Bij een realistische planning komen er dus geen taken te laat. Taken die te vroeg worden geproduceerd kunnen een grote duurtijd hebben, maar aangezien de slack klein is, liggen ze niet lang op voorraad. In alle vijftien experimenten, uitgezonderd in experiment 10, wordt er evenveel of minder op voorhand geproduceerd dan forward DD oplopende planning. Het kan wel gebeuren dat er een taak te laat komt, maar dat is vrij beperkt in omvang. ST aflopend Onlogische regel: hetgeen de meeste absolute speling heeft in tijd om geproduceerd te kunnen worden, het eerst produceren. Dit zou alleen leiden tot hoge voorraden en massa’s te late leveringen. In de experimenten zien we duidelijk de slechte resultaten.
Critical Ratio De taak die relatief in tijd het meest dringend moet gebeuren, staat eerst gepland. Deze regel houdt rekening met op tijd leveren én met de duurtijd van de taak. De CR wordt gevormd door CR =
(due date − nu ) duurtijd
Een grote CR komt tot stand bij late due date en/of kleine duurtijd. Een kleine CR komt tot stand bij een vroege due date en/of grote duurtijd. 72
CR oplopend Bij een volle planning zullen er veel taken te laat komen, de grote taken hebben namelijk gauw een kleine CR. Zo kunnen grote taken met late due date voor kleine taken met kleine due date komen. De regel scoort in alle experimenten minder goed dan DD oplopend of ST oplopend. CR aflopend Onlogische regel: de jobs die de meeste relatieve tijdspeling hebben om geproduceerd te kunnen worden, het eerst produceren. Dit zou alleen leiden tot hoge voorraden en te late leveringen.
Bottleneck planning: In ons bottleneck algoritme wordt er al rekening gehouden met de due date. Dit komt ons op tijd leveren dus ten goede. Er komen nooit jobs te laat want bij een onrealistische drukke planning komen de jobs voor de planningshorizon terecht. De jobs worden wel in een bepaalde volgorde aangeboden om ingepland te worden. Bij overlappende taken speelt deze volgorde van belang. Welke taak naar voor wordt verschoven, wordt bepaald door: •
De planningsvolgorde van de taken
•
de overlapping en vrije ruimte in de orderlijst
Bij het inplannen kan het zijn dat de som van de lege tussenruimtes groot genoeg is. Dan kan de job toch nog voor zijn due date worden ingepland, maar die zal wel andere jobs naar voor duwen. Bij een overvolle planning zullen deze ruimtes niet groot genoeg zijn en wordt de job helemaal vooraan ingepland. Duurtijd PT oplopend Wanneer we de kleine jobs eerst inplannen, blijven er grote tussenruimtes over. Maar beetje bij beetje worden die tussenruimtes kleiner. De laatste grote jobs zullen het moeilijk vinden om nog vrije tussenruimtes te vinden. Bij een normale planning zullen die grote taken net voor hun due date kunnen worden ingepland. Er gebeuren dan wel veel verschuivingen van de kleinere. Bij een overvolle planning, kan er zelfs geen vrije ruimte meer kan gevonden worden. De grote job
73
vliegt naar het begin van de planning. Een grote job lang op voorraad leggen is echter ongewenst. In de experimenten zien we dat deze regel over het algemeen niet goed scoort. PT aflopend As we de grootste jobs eerst inplannen, palmen deze eerst de vrije ruimte in. De lege tussenruimten worden gaandeweg kleiner. Ook de in te plannen jobs worden geleidelijk kleiner zodat er weinig problemen zijn. Soms zal een kleintje (bij normale planning) een grote job doen verschuiven naar voor. De verschuivingen worden wel alsmaar kleiner aangezien de jobs kleiner worden. Is de planning overvol, dan kan het zijn dat het kleintje geen plaats meer vindt tussen de jobs en helemaal vooraan in de planning terecht komt. Gelukkig is het maar een kleine job die op voorraad ligt. We zien in de experimenten dat naarmate er meer overlappingen voorkomen, de regel slechtere resultaten heeft. Dit komt door de verschuivingen.
Due date Aangezien ons algoritme al rekening houdt met de due date, is dit een speciale sorteervolgorde. DD oplopend De jobs met de kleinste due date worden hier eerst ingepland. We beginnen in te plannen aan het begin van onze planningshorizon en gaan geleidelijk verder in de toekomst. De eerste taken die moeten worden geleverd, worden eerst voor hun due date ingepland. Bij een gewone planning kan het gebeuren dat bij een overlapping enkele taken een beetje naar voor worden geschoven. Daardoor worden er taken te vroeg geproduceerd. Hoe voller de planning, hoe meer taken er zullen verschuiven. Want de vrije ruimtes zijn dan kleiner. Bij een overvolle planning, komt de job helemaal voor de planningshorizon. De sortering volgens oplopende due date gevolgd door een bottleneck scheduling komt ongeveer overeen met de huidige planningsstrategie van Agfa. DD aflopend De jobs met de grootste due date worden eerst ingepland. We beginnen dus achteraan te plannen in onze planningshorizon en schuiven zo geleidelijk naar voor met de planning. Dit lijkt op het eerste zicht in te gaan tegen onze intuïtie. 74
Normaal gezien gaan we van start bij het begin en gaan zo verder. Nu wordt alles omgedraaid, we beginnen achteraan. Jobs met dezelfde due date moeten een bijkomende sorteervolgorde krijgen. In de eerste fase van experimenten werd hier nog niet verder op ingegaan. Verder maakt het geen verschil uit of we met een overvolle of normale planning te maken hebben, alle nieuwe jobs schuiven toch altijd naar voor als ze overlappen met eerder ingeplande taken. De verschuivingen zullen klein zijn. Daarom scoort de regel heel goed zoals je kan zien in tabellen 8 en 9. Deze, op het eerste zicht tegen onze intuïtie gaande, regel vormt dan ook de beginnende denkpiste van hoofdstuk 4.
Slack slack = due date − nu − duurtijd
Een grote slack komt voor bij late due date en/of kleine duurtijd Een kleine slack komt voor bij vroege due date en/of grote duurtijd ST oplopend De taak die absoluut in tijd het meest dringend geproduceerd moet worden, wordt eerst ingepland voor zijn due date. Een kleine slack betekent dat er niet veel absolute ruimte meer is om te verschuiven. Deze regel is een combinatie van oplopende due date en aflopende duurtijd. De regel zal dus ook alle voor- en nadelen van die combinatieregels hebben. Bij een gewone planning zullen overlappende taken de eerder dringende taken nog wat meer naar voor schuiven. Deze worden dan wat vroeger geproduceerd en een tijdje op voorraad gelegd. Bij een overvolle planning komen minder dringende taken helemaal vooraan in de planning. Als dit gebeurt bij taken met een late due date en kleine duurtijd, worden kleine taken lang op voorraad gehouden. ST aflopend De absoluut minst dringende taken worden eerst ingepland. Deze regel kan gezien worden als een combinatie tussen aflopende DD en oplopende PT. Bij verschuivingen komen deze absoluut minst dringende taken nog meer naar voor. Dat kan omdat deze nog veel plaats op verschuiven hebben.
75
Critical ratio CR =
(due date − nu ) duurtijd
Een grote CR komt tot stand bij late due date en/of kleine duurtijd. Een kleine CR komt tot stand bij een vroege due date en/of grote duurtijd. CR oplopend De taak die relatief in tijd het meest dringend geproduceerd moet worden, wordt eerst ingepland voor zijn due date. Een kleine CR betekent dat er niet veel ruimte meer is om te verschuiven. Deze regel is een combinatie van oplopende due date en aflopende duurtijd. De regel zal dus ook alle voor- en nadelen van die combinatieregels hebben. Bij een gewone planning zullen overlappende taken de eerder dringende taken nog wat meer naar voor schuiven. Deze worden dan wat vroeger geproduceerd en een tijdje op voorraad gelegd. Bij een overvolle planning komen relatief minder dringende taken helemaal vooraan in de planning. Vaak zullen dit echter kleine taken zijn, hun due date kan wel laat zijn zodat ze te veel naar voor worden geschoven en veel te vroeg op voorraad komen te liggen. CR aflopend De relatief minst dringende taken worden eerst ingepland. Deze regel kan gezien worden als een combinatie tussen aflopende due date en oplopende duurtijd. Bij verschuivingen komen deze minst dringende taken nog meer naar voor. Dat kan omdat deze nog veel plaats op verschuiven hebben.
3.2.4
Besluit
Als we ons baseren op de huidige planningsstrategie van Agfa, is het duidelijk dat we de forward planning achterwege moeten laten: •
alle jobs moeten op tijd komen, bij een forward planning is dit niet gegarandeerd
•
Bij een forward planning worden de jobs vaak te vroeg geproduceerd omdat er geen gaten worden gelaten in de planning
We zullen het forward algoritme daarom niet meer beschouwen in hoofdstuk 4. Het is namelijk niet te verantwoorden bij Agfa dat er jobs te laat zouden komen.
76
Tevens moet de voorraad beperkt blijven. Een forward planning scoort op beide criteria veel slechter dan de bottleneck planning. Dankzij ons ontwikkelde bottleneck algoritme zal geen enkele job te laat komen. Het kan wel zijn dat er jobs voor de planningshorizon worden gepland. Dat is dan een teken voor ons dat het niet mogelijk is om aan de leveringstijden te voldoen. Deze orders worden dan opgevangen door een alternatieve routing. Als we volgens oplopende of aflopende PT/bottleneck werken, plannen we willekeurig jobs in onze planningshorizon in. Er kunnen veel storingen voorkomen. Het schuifgedrag is onvoorspelbaar. We kwamen tot een verwonderlijke conclusie dat sorteren op DD aflopend volgens ons bottleneck algoritme heel goede resultaten geeft. Een eerder tegen de intuïtie gaande regel blijkt een goede performantie te hebben. We zullen in hoofdstuk 4 nog verder ingaan op deze regel. De manuele planning binnen Agfa gebeurt ongeveer volgens een sortering op oplopende DD en vervolgens op aflopende PT. We zullen deze regel vergelijken met de andere. In hoofdstuk 4 zullen we beginnen met de experimenten met Agfajoblijsten. Eerst zullen we nog alle sorteringsvolgordes in rekening brengen, maar gaandeweg zullen we verfijnen naar de beste. Het wordt ook tijd om eens naar de voorraadwaarden te kijken van onze planning.
77
Hoofdstuk 4 Tweede fase experimenten: de aanzetlijnen van Agfa
4.1
Statisch schedulen
In hoofdstuk 4 moeten we verder gaan met de beste combinatie van alle sequencing/scheduling mogelijkheden. We laten de forward planning volledig achterwege. De theorie zal nu getoetst worden aan bestaande orderlijsten van Agfa. Het zijn er vijf in het totaal met elk ongeveer 110 orders. Tabel 4.1 toont de karakteristieken van de vijf lijsten. De vrije ruimte bedraagt gemiddeld 33,4% en de overlapping van de jobs 51,8%. Tabel 4.1: karakteristieken van de Agfa-orderlijsten Nr lijst 1 2 3 4 5 gemiddelde
aantal orders VR (%) OV (%) 118 25 49 120 33 54 91 37 52 119 37 58 106 35 46 110,8
33,4
51,8
Op basis van hoofdstuk 3 konden we al een ruwe selectie maken van prioriteitsregels en schedulingsalogritmes. We bouwen voort op de regels die goed presteren om op tijd te leveren en niet te veel op voorhand te produceren. Maar we gaan nog een stapje verder: in dit hoofdstuk moet het mogelijk zijn om ook de voorraad te minimaliseren. Daarvoor maken we gebruik van bijkomende inputdata: het aantal liter opgelost zilver in de emulsies. Deze gegevens worden in het Agfajargon “VDL” genoemd, genaamd naar de man die dit proces op punt stelde “Van Duinslaegher Liquid”.
1 liter opgelost zilver in de emulsie = 1 liter VDL = 1 liter AgNO3 1 liter VDL = 1 kg VDL = 0,635 kg zilver 1 liter VDL = 98 euro ≈ 100 euro De voorraadkost van de emulsie wordt voornamelijk bepaald door de hoeveelheid opgelost zilver. Er is ongeveer een lineaire relatie tussen het aantal liter VDL en het corresponderende gewicht van de emulsie. Wij gebruiken als schatting van de
78
voorraadwaarde het aantal liter zilver dat er in de emulsie zit vermenigvuldigd met het aantal uren dat de emulsie op voorraad moet liggen:
voorraadwaarde job = aantal liter zilver in emulsie × uren te vroeg som voorraadwaarde = ∑ voorraadwaarde jobi i
We kunnen dus de voorraadwaarde van de emulsie aan de hand van bovenstaande formule berekenen. Om de echte gemiddelde voorraadwaarde te bepalen, moeten we delen door de lengte van de tijdshorizon. Het maakt echter niets uit om een vergelijking te maken tussen de verschillende sorteringsregels. We zullen dan ook de voorraadwaarde bekijken volgens de definitie hierboven. Deze voorraadwaarde vormt een bijkomend criterium in het meten van de performantie. Dus worden de regels beoordeeld op: •
som uren te laat
•
som uren te vroeg
•
som voorraadwaarde
•
hoeveel orders komen er voor de planningshorizon terecht
De volgende paragrafen zijn opgebouwd volgens mijn gevolgde redenering. Ze schetsen ook het denkproces gedurende de periode dat ik aan de thesis heb gewerkt.
4.1.1
Gewone sorteringsregels
Om te beginnen heb ik alle sorteringsregels, die overbleven na hoofdstuk 3, uitgevoerd op de verschillende Agfa-orderlijsten. Zowel de oplopende als aflopende sortering. We moeten onmiddellijk een tweede sortering toevoegen. Dit slaat op het feit dat door een eerste sortering sommige jobs dezelfde gegevens hebben. Bij een sortering op duurtijd bijvoorbeeld hebben verschillende jobs dezelfde duurtijd. Als we deze jobs met dezelfde duurtijd nogmaals sorteren volgens een tweede criterium, krijgen we een unieke sortering. Tabel 4.2 geeft een overzicht van de gebruikte regels. De resultaten van de vijf Agfa-lijsten zijn te vinden in appendix D1. Deze eerste resultaten geven al enkele duidelijke indicaties. Bij de sortering volgens de CR komen veel jobs voor de planningshorizon terecht. Als het slechts enkele jobs betreft, kunnen we dat nog aanvaarden. Maar wanneer 79
het aantal jobs voor de horizon te groot wordt, is het moeilijk om een alternatieve routing te blijven vinden voor alle jobs, … . Tabel 4.2: gebruikte sorteringsregels BOTTLENECK 1ste SORTERING 2de SORTERING
BOTTLENECK 1ste SORTERING 2de SORTERING
PT
aflopend
PT
oplopend
DD
aflopend
DD
oplopend
DD DD VDL VDL DD DD VDL VDL
aflopend oplopend aflopend oplopend aflopend oplopend aflopend oplopend
ST
aflopend
ST
oplopend
PT PT VDL VDL PT PT VDL VDL
aflopend oplopend aflopend oplopend aflopend oplopend aflopend oplopend
CR
aflopend
CR
oplopend
PT PT VDL VDL PT PT VDL VDL
aflopend oplopend aflopend oplopend aflopend oplopend aflopend oplopend
PT PT VDL VDL PT PT VDL VDL
aflopend oplopend aflopend oplopend aflopend oplopend aflopend oplopend
Verder zien we dat een sortering volgens aflopende DD goede resultaten geeft. Dit was ook te verwachten. Als we de karakteristieken van de Agfa-joblijsten bekijken, zien we dat deze vallen in de categorie VR tussen 25% en 50% en OV ongeveer 50%. Tabel 3.9 (hoofdstuk 3) voorspelt dat een sortering volgens aflopend DD goede resultaten moet geven bij orderlijsten met deze karakteristieken. Als we tabel 4.3 bekijken met de beste resultaten, dan zien we dat deze regel (aflopende DD) de beste is in vier van de vijf lijsten. En dit is zowel op te vroeg produceren als op de minimale voorraadwaarde. Enkel lijst 1 geeft betere resultaten wanneer we sorteren op een aflopende ST. Tabel 4.3: beste resultaten bij sortering volgens gewone sorteringsregels Lijst 1 2 3 4 5
TE VROEG 1ste SORTERING 2de SORTERING ST aflopend PT oplopend VDL oplopend DD aflopend PT oplopend DD aflopend PT oplopend DD aflopend PT oplopend DD aflopend PT oplopend
80
VOORRAADWAARDE 1ste SORTERING 2de SORTERING ST aflopend VDL aflopend DD DD DD DD
aflopend aflopend aflopend aflopend
VDL VDL VDL PT
aflopend aflopend aflopend oplopend
We hameren nogmaals op de filosofie van sorteren op aflopende DD. Als je het bottleneck algoritme gebruikt, plan je de jobs één na één in voor hun levertijdstip. Als de jobs aangeboden worden volgens aflopende DD begin je achteraan de planningshorizon in te plannen. Bij een overlapping van jobs schuiven deze naar voor. Aangezien er nog een groot gat is voor deze jobs, gebeuren er geen grote verschuivingen. Bij de andere regels is dit niet zo. Wanneer we bijvoorbeeld de jobs sorteren volgens duurtijd, worden de jobs verspreid ingepland over de planningshorizon. Als er dan overlappende jobs voorkomen, kan het zijn dat deze ver naar voor moeten schuiven om een groot genoeg gat te vinden. Er gebeuren vele verschuivingen en bekomen slechte resultaten. Dit is duidelijk te zien in appendix D1. Als we nu verder gaan op de sortering volgens aflopende DD, moeten we ook kijken naar de tweede sortering. Welke job wordt eerst behandeld bij jobs met gelijke due date? Welke job kan voor zijn due date worden ingepland en welke moet op voorhand worden geproduceerd bij overlappingen? Het is de bedoeling om een zo minimaal mogelijke voorraadwaarde te hebben. We moeten dus de bepaling van de voorraad onder de loep nemen. Maar welk criterium is het beste om als tweede sortering te nemen? We kunnen de jobs volgens aflopende PT sorteren. Dan komen de grote jobs dicht bij hun due date en de kleintjes schuiven op. Het gevolg is wel dat de kleine jobs lang moeten wachten. We kunnen de jobs volgens oplopende PT sorteren. Dan komen de kleine jobs voor hun due date terecht. De grote jobs schuiven even naar voor en dat over een beperkte tijdsduur (de duur van de kleinere vooraf ingeplande jobs). Maar de grote jobs, zijn meestal de duurste… . We kunnen de prioriteiten van de overlappende jobs ook volgens de waarde van de job bepalen. Als we sorteren volgens aflopende VDL komen de duurste jobs het dichtst bij hun due date te staan. Maar de natuur van de dure jobs zegt dat deze vaak de langste procestijd hebben, zodat de andere overlappende jobs lang op voorhand moeten worden geproduceerd. In elk geval moeten we rekening houden met de zilverhoeveelheid in de emulsie. In de volgende paragraaf bekijken we de waarde van een job.
81
4.1.2
Aantal liter opgelost zilver in de emulsie: VDL
We kunnen de jobs volgens hun zilverwaarde sorteren. Als we volgens aflopende VDL sorteren, komen de duurste jobs bij een bottleneckplanning dicht bij hun due date. De minder dure moeten wat naar voor schuiven om plaats te maken voor de dure. Als we naar de resultaten kijken in appendix D2 zien we dat voor lijst 1 er een voorraadreductie is van 24%! De andere lijsten geven geen betere resultaten voor de voorraad. Maar de resultaten liggen dicht bij de beste bekomen in de vorige paragraaf. We kunnen dus stellen dat deze sortering algemeen ook goed scoort. We kunnen nu ook het omgekeerde proberen en sorteren op oplopende VDL. Maar onze intuïtie zegt ons dat het niet logisch is om de minder dure dichter bij hun due date in te plannen en de duurdere op voorhand te produceren. Dit leidt tot een hoge voorraadwaarde. De resultaten van deze sortering in appendix D2 bevestigen dat. Toch moeten we eens verder denken over de aflopende VDL sortering. Hoe komt het dat de voorraadwaarde niet meer is gereduceerd? Als we de dure jobs dicht bij hun due date inplannen, dan komen toch enkel de minder dure jobs op voorraad te liggen bij overlapping? Wel, daar zit een addertje onder het gras. We geven een voorbeeld: JOB_ID
PT
VDL
JOB A
20
500
JOB B
5
1000
Het is niet wenselijk om job A, met lange duurtijd maar met weinig waarde, lang in voorraad te houden, want dan tikt de voorraadwaarde ook aan. Job A met een duurtijd van 20 uur en waarde van 500 VDL op voorraad leggen, is duurder dan Job B met een duurtijd van 5 uur en waarde van 1000 VDL. Maar in een aflopende VDL sortering krijgt job A toch een lagere prioriteit dan job B. We moeten dus rekening houden met zowel de zilverwaarde als de duurtijd van een job.
82
4.1.3
Gewogen duurtijd
Zoals in vorige paragraaf aangehaald, kunnen we beter beide factoren combineren. We kunnen met een gewogen duurtijd rekenen.
gewogen duurtijd job A = duurtijd job A × VDL job A Als we sorteren op aflopende of oplopende gewogen duurtijd krijgen we helemaal geen verbetering. Dat valt ook te verwachten aangezien we terug in het wilde weg inplannen op onze tijdshorizon. Deze regel wijkt niet zoveel af van de structuur van aflopende/oplopende gewone PT sortering. We hebben niet echt een controle op het verschuivingsgedrag. Appendix D3 toont de slechte resultaten. Wanneer we echter op aflopende DD sorteren met een bijkomende sortering volgens aflopende gewogen duurtijd dan is het resultaat te vergelijken met de beste resultaten van andere sorteringen. De resultaten voor lijst 3 (appendix D3) zijn zelfs beter. Maar ook hier zien we nog altijd geen grote verbetering. Hoe komt dat toch?
4.1.4
Crossing duurtijd
De voorraadwaarde van een order wordt bepaald door het aantal uren dat een job te vroeg staat ingepland vermenigvuldigd met het aantal opgelost zilver in de bereiding. voorraadwaarde job = aantal liter opgelost zilver in emulsie × uren te vroeg voorraadwaarde job = aantal liter VDL × uren te vroeg
Een job wordt te vroeg geproduceerd wanneer hij gehinderd wordt door een andere “belangrijkere” job die tegelijk op dezelfde aanzetlijn staat gepland. De job zal de duurtijd die de andere job vraagt op voorhand worden geproduceerd. Een tweede sortering zouden we kunnen doen aan de hand van duurtijd of aantal liter VDL of beide gecombineerd in gewogen duurtijd. Maar daar zitten we nu net mis! Ik probeer het eens uit te leggen. Als we 2 jobs met dezelfde due date hebben, moeten we een tweede sortering doen. We willen zo weinig mogelijk voorraadkosten. Nu denken we veel te veel dat de voorraadkost evenredig is met de gewogen duurtijd.
83
gewogen duurtijd job A = duurtijd job A × gewicht VDL job A gewogen duurtijd jobB = duurtijd jobB × gewicht VDL jobB Maar daar zit onze redeneringsfout! Want: gewogen duurtijd job A = duurtijd jobB × gewicht VDL job A gewogen duurtijd jobB = duurtijd job A × gewicht VDL jobB
Hoe kom ik daarbij? Wel, als we job A niet voor zijn due date inplannen, dan komt job B daar te staan en job A zal de duurtijd van B opschuiven naar voor. Job A zal te vroeg worden geproduceerd.
te vroeg job A = duurtijd jobB Omgekeerd, als we job A wel inplannen voor zijn due date, moet job B opschuiven naar voor. Job B zal de duurtijd van job A moeten wachten.
te vroeg jobB = duurtijd job A Een voorbeeld: 2 jobs, de ene heeft een duurtijd van 8 uur, de ander 20 uur. De ene heeft respectievelijk een VDL-waarde van 1500, de andere 2800. JOB_ID PT DD
VDL
J044
8
480 1500
J049
20 480 2800
Hoe bepalen we nu de voorraadwaarde? Als J044 eerst wordt ingepland, dan is de voorraadwaarde = 8 × 2800 = 22400 Als J049 eerst wordt ingepland, dan is de voorraadwaarde = 20 × 1500 = 30000 We moeten onze sortering dus niet laten afhangen van duurtijd of VDL, maar van deze kost. De voorraadkost van job A wordt dus niet alleen door de duurtijd en VDL van job A bepaald, maar ook door duurtijd en VDL van job B (die dezelfde due date heeft). Deze sortering heeft uiteraard een belangrijke consequentie: de rekenmoeilijkheid! Neem nu bijvoorbeeld 4 jobs met dezelfde due date… In de volgende tabellen probeer ik de laagste voorraadkost uit te rekenen. In de tabel is een kostenmatrix weergegeven. Hoeveel kost het om een job met bepaalde VDL waarde (horizontaal) voor een bepaalde duur (verticaal) in voorraad te houden? Een cel van de kostenmatrix komt dus overeen met
84
element kostenmatrix [rij A kolom B ] = duurtijd [ job A ] × VDL [ jobB ] JOB_ID
PT
DD
VDL
SLUITER
J076
6
336
3752,5
S
J053
5
336
1200
S
J056
8
336
1250
S
J090
15
336
360
S
Kostenmatrix JOB_ID
J076
J053
J056
J090
PT \ VDL
3752,5
1250
1200
360
6
x
7500
7200
2160
8
30020
x
9600
2880 1800
5
18762,5
6250
x
15
56287,5
18750
18000
x
Som voorraad1
105070
32500
34800
6840
Som voorraad2
48782,5
13750
16800
Som voorraad3
18762,5
Som voorraad4
0
Totale voorraad
27790
7200
Als we de kolommen van onze kostenmatrix optellen dan weten we hoeveel het kost om de job als eerste te produceren. Hij moet te vroeg worden geproduceerd met
te vroeg =
∑ duurtijd
andere overlappende jobs
Deze som staat in de eerste rij onder de kostenmatrix (som voorraad1). We nemen de laagste kost. In ons voorbeeld is dit J090 met 360 liter VDL. De voorraadkost om J090 als eerste te produceren is 6840 (liter VDL uur) en J090 zal de duurtijd van de andere jobs op voorhand worden geproduceerd. Deze job zal dus alle andere jobs voorafgaan. Aangezien deze als eerste op voorhand zal worden geproduceerd, kunnen we van de voorraadkost van de andere overblijvende jobs deze voorraadkost aftrekken. De andere jobs moeten namelijk de duurtijd van J090 niet op voorhand worden geproduceerd. som voorraad 2 overblijvende jobs = som voorraad1
overblijvende jobs
− ( duurtijd J 090 × zilverwaardeoverblijvende jobs )
= som voorraad1
overblijvende jobs
− som voorraad1 J 090
Deze waarde komt in de tweede rij onder de kostenmatrix (som voorraad2). Nu zien we dat de laagste kost deze is van de job J056 met 1250 liter VDL. J056 moeten we dus als tweede op voorraad produceren. We kunnen terug van de overblijvende jobs de voorraadkost van rij 2 aftrekken (som voorraad3). Enz…
85
Als eindresultaat zien we dat we eerst J090, J056, J053 en dan J076 schedulen. De voorraadkosten zijn dan minimaal en bedragen: totale voorraadkost = 0( J 076 ) + 13750( J 053 ) + 7200( J 056 ) + 6840( J 090 ) = 27790 Zo is de kostenoptimalisatie gebeurd. We houden met alle factoren rekening. We sorteren dus eerst volgens aflopende DD en vervolgens kijken we bij gelijke DD welke volgorde van de jobs de minste kosten met zich meebrengt. We moeten deze berekeningen doen voor alle vijf de joblijsten. Het vraagt veel rekenwerk om altijd die kostenoptimalisatie door te voeren. De resultaten zijn te zien in appendix D4. Voor alle lijsten met uitzondering van lijst 1 geeft deze regel de beste resultaten tot nu toe! Bij lijst 1 geeft de sortering volgens aflopende ST nog betere resultaten. Hoe komt het dat deze regel dan toch nog beter scoort dan deze volgens crossing duurtijd? Toeval door verschuiven naar voor toe? Moeten we nog verder redeneren? Iets over het hoofd gezien? Paragraaf 4.2 gaat hier verder op in. Het heeft te maken met het statische karakter van onze sorteringen.
4.1.5
Gewogen VDL
De rekenmoeilijkheid van crossing duurtijd is een belangrijk nadeel. De crossing duurtijd van een job is afhankelijk van gegevens van andere jobs. Met de hand kost het je algauw een uur om een joblijst van 120 jobs te sorteren. We zouden een slim programma moeten schrijven om dit automatisch te laten genereren. Maar dit valt buiten het onderzoek van deze thesis. We gaan op zoek naar andere gelijkaardige regels. We moeten ermee rekening houden dat dure jobs die te lang duren, de andere minder dure jobs te lang ophouden. We kunnen rekening houden met aflopende gewogen VDL. Met gewogen VDL van een job bedoelen we het quotiënt van de zilverwaarde en de duurtijd van de job. gewogen VDL =
VDL duurtijd
De resultaten van de sortering volgens DD aflopend / gewogen VDL aflopend geven voor drie lijsten nog betere resultaten dan vorige paragraaf, zoals te zien in appendix D5. De resultaten van de andere twee lijsten liggen in dezelfde lijn van
86
de vorige. Dat is een opluchting! We kunnen dus met gemak de vorige regel van ons lijstje vegen en vervangen door deze minder arbeidsintensieve regel.
4.1.6
Resultaten statische scheduling
Als we alle regels naast elkaar plaatsen, dan zien we in tabel 4.4 de regels met de beste
performantie
voor
alle
joblijsten.
Tevens
werd
de
bijhorende
voorraadwaarde gegeven. Tabel 4.4: regel en bijhorende voorraadwaarde met beste performantie voor de Agfa-joblijsten Lijst 1ste SORTERING 1 VDL aflopend 2 3 4 5
DD DD DD DD
aflopend aflopend aflopend aflopend
BESTE VOORRAADWAARDE 2de SORTERING waarde voorraad (liter VDL uren) PT oplopend 2693902 DD oplopend gewogen VDL aflopend 2361353 crossing duurtijd aflopend 2262685 gewogen VDL aflopend 2181937 gewogen VDL aflopend 2258369
We moeten de regels vergelijken met de huidige planning bij Agfa. De manuele planning werkt nu nog als volgt: men kijkt eerst naar de jobs die het dichtst liggen in de planningshorizon en men behandelt ‘over het algemeen’ de grootste jobs eerst. Agfa plant dus volgens oplopende DD, erna houdt men rekening met het ‘gewicht van de job’. Dit is echter een menselijke interpretatie. Bij heel dure emulsies met een kleine duurtijd, zal men deze toch dicht voor hun due date inplannen. Vermoedelijk zijn de Agfa regels ofwel DD oplopend/PT aflopend ofwel DD oplopend/VDL aflopend. Als compromis tussen beide regels kunnen we DD oplopend/gewogen VDL aflopend nemen. Dit geeft een goed beeld van hoe het er nu nog loopt. Tabel 4.5 geeft de voorraadwaarde van deze regel bij alle bestudeerde joblijsten. Tabel 4.5: regel en bijhorende voorraadwaarde huidige planning van de Agfa-joblijsten VOORRAADWAARDE HUIDIGE PLANNING AGFA Lijst 1ste SORTERING 2de SORTERING waarde voorraad (liter VDL uren) 1 DD oplopend gewogen VDL aflopend 3772267 2 DD oplopend gewogen VDL aflopend 3035728 3 DD oplopend gewogen VDL aflopend 4013433 4 DD oplopend gewogen VDL aflopend 3829262 5 DD oplopend gewogen VDL aflopend 4477133
87
We zien een opvallend verschil! De cijfers zelf zeggen ons misschien niet veel, maar in tabel 4.6 wordt ook de procentuele voorraadreductie weergegeven. We mogen trots zijn op onszelf als we deze cijfers zien. Een gemiddelde voorraadreductie van 37%. Tabel 4.6: waarde voorraadreductie Lijst 1 2 3 4 5
VERSCHIL BESTE PLANNING - HUIDIGE PLANNING waarde voorraad (liter VDL uren) procentuele verbetering -1078365 -0,28587 -674375 -0,22215 -1750748 -0,43622 -1647325 -0,43019 -2218764 -0,49558
gemiddelde
-1473915,4
-0,374
Deze resultaten zijn het gevolg van alle beste regels tot nu toe gevonden, specifiek toegepast op de verschillende joblijsten. Als we echter één regel moeten selecteren, lijkt het me logisch om deze te nemen volgens aflopende DD gevolgd door aflopende gewogen VDL. Deze regel gaf voor drie van de vijf lijsten het beste resultaat, voor lijst 3 gaf de regel goede resultaten, maar niet de beste. Lijst 1 is een buitenbeentje. Maar ook hier scoort de regel matig. De voorraadwaarden horende bij deze regel zijn te vinden in tabel 4.7. Tabel 4.8 geeft weer dat we hier een gemiddelde voorraadreductie kunnen halen van 28%. Dit is nog altijd een grote waarde. Tabel 4.7: voorraadwaarde bij sortering volgens aflopende DD/gewogen VDL Lijst 1 2 3 4 5
1ste SORTERING DD aflopend DD aflopend DD aflopend DD aflopend DD aflopend
aflopende DD/gewogen VDL 2de SORTERING waarde voorraad (liter VDL uren) gewogen VDL aflopend 3972490 gewogen VDL aflopend 2361353 gewogen VDL aflopend 2756334 gewogen VDL aflopend 2181937 gewogen VDL aflopend 2258369
Tabel 4.8: voorraadreductie bij sortering volgens aflopende DD/gewogen VDL Lijst 1 2 3 4 5 gemidddelde
VERSCHIL BESTE PLANNING - HUIDIGE PLANNING waarde voorraad (liter VDL uren) procentuele verbetering 200223 0,05308 -674375 -0,22215 -1257099 -0,31322 -1647325 -0,43019 -2218764 -0,49558 -1119468
-0,28161
88
Let wel op! De huidige planning geeft voor lijst 1 betere resultaten dan onze voorgestelde regel DD aflopend/gewogen VDL aflopend. Hoe komt het nu dat deze regel geen verbetering geeft voor alle lijsten? Dit heeft te maken met het statische karakter van ons sorteringsalgoritme. Paragraaf 4.2 geeft meer uitleg. De voorraadwaarde die werd gebruikt in de tweede fase van experimenten is eerder een indicatie van de voorraadwaarde. Wij gebruiken: voorraadwaarde = aantal liter opgelost zilver in de eumulsie × aantal uren te vroeg voorraadwaarde = VDL × te vroeg Om nu de geldwaarde van de voorraad te berekenen, kunnen we inderdaad stellen dat de waarde van opgelost zilver de belangrijkste kost is van de emulsie. Er is een ± lineaire relatie tussen het aantal liter VDL en het gewicht van de corresponderende emulsie. Als in alle tests dezelfde voorraadbepaling wordt gebruikt, gaat een lineaire vergelijking op. Om de echte gemiddelde voorraadwaarde te bepalen moeten we delen door de lengte van de tijdshorizon. Het maakt echter niets uit om een vergelijking tussen de verschillende sorteringsregels te kunnen maken. Want door de opbouw van onze bottleneck schedulingsalgoritme zal de tijdshorizon van een joblijst gelijk zijn aan de grootste due date die erin voorkomt. We kunnen volledigheidshalve een nieuwe definitie voor de voorraad vermelden: aantal liter opgelost zilver in de emulsie × aantal uren te vroeg lengte van de tijdshorizon VDL × te vroeg voorraadwaarde = lengte van de tijdshorizon
voorraadwaarde =
We hebben in onze tweede fase van experimenten de E27 bottleneck installatie bestudeerd. In 2004 kwamen de emulsies van 4 lijnen. De voorraad van 270 ton kunnen we ruwweg als volgt verdelen: •
E28 (wordt binnenkort uit gebruik genomen) : 70 ton
•
E22 (die voornamelijk vloeibaar levert aan de gietzalen en dus weinig bijdraagt): 25 ton
•
E26: 75 ton
•
E27: 100 ton
89
Enkel voor een bottleneck installatie hoopt de voorraad zich op zoals in appendix A wordt uitgelegd (Theory of Constraints). We nemen die 100 ton dus als uitgangspunt. Als we effectief de voorraad zouden plannen volgens de beste regels besparen we 37 ton. Bij de aflopende DD/aflopende gewogen VDL regel besparen we 28 ton.
besparing beste regels = 37% × 100 ton = 37 ton besparing aflopende DD / aflopende gewogen VDL = 28% × 100 ton = 28 ton Als we dit willen uitdrukken in geldwaarde, dan moeten we die waarden vermenigvuldigen met de waarde van de emulsie. 1 kg emulsie = 20 euro
De voorraadreductie bedraagt dan 740 000 € als we in staat zouden zijn om telkens de beste regel te gebruiken. Bij de aflopende DD/aflopende gewogen VDL regel besparen we 560 000 €.
besparing beste regels = 37 ton × 20euro = 740 000 euro besparing aflopende DD / aflopende gewogen VDL = 28 ton × 20 euro = 560 000
90
4.2
Dynamisch schedulen
Bij het bestuderen van de resultaten van lijst 1 kwamen we tot de vaststelling bij dat de sortering volgens aflopende DD/aflopende gewogen VDL hier niet de minimale voorraad opleverde. Toen we effectief de joblijsten gingen vergelijken, kwamen we tot een nieuwe vaststelling. We gaan uit van een voorbeeld: JL_JOB JL_DUURUUR JL_DUE_UUR JL_AZ_VDL JOB A
22
50
500
JOB B
5
38
1050
Bij het inplannen volgens aflopende due date wordt JOB A voor JOB B behandeld. JOB A komt voor zijn due date terecht. JOB B overlapt met JOB A en moet een beetje naar voor schuiven in de planning.
voorraadwaarde JOB A = 0
voorraadwaarde JOB B = (38 − [50 − 22] ) × 1050 = 10500
Wat gebeurt er nu als we eerst JOB B inplannen? JOB B komt voor zijn due date terecht. JOB A overlapt met JOB B en moet naar voren schuiven. JOB A komt ((50-38) + 5) dagen te vroeg. JOB B komt op tijd.
voorraadwaarde JOB A = ( [50 − 38 ] + 5 ) × 500 = 8500 voorraadwaarde JOB B = 0 De voorraadwaarde blijkt minder groot als we JOB A voor JOB B plaatsen! Met DD aflopend/aflopende gewogen VDL sortering keken we alleen maar naar de jobs die dezelfde due date hebben, we moeten echter kijken naar alle jobs die overlappende zijn om tot een kostenminimalisatie te komen. We moeten een dynamisch sorteringsalgoritme vinden dat rekening houdt met deze factoren.
4.2.1
Dynamisch sorteringsalgoritme
Sorteer de joblijst eerst volgens DD aflopend. Herhaal daarna de stappen uit fig 4.1 tot alle jobs een prioriteit hebben gekregen. We bepalen de prioriteiten aan de hand van de invloed die een bepaalde volgorde van jobs heeft op de voorraadwaarde. Telkens gaan we een kostenoptimalisatie doorvoeren op een subgroepje van overlappende jobs. De jobs worden zo systematisch in een 91
gesorteerde joblijst geplaatst. Daarna kan een gewone bottleneck scheduling worden toegepast.
STAP 1
Zoek job met grootste DD gegevens volgens ons algoritme
JOB X STAP 2
Zijn er jobs met gelijke DD als JOB X volgens ons algoritme?
JA • • •
STAP 3
NEE •
Voer een kostenanalyse uit Verander de datagegevens Ga terug naar stap 1
Zijn er jobs met
DD job > (DD JOB X − PTJOB X )
JA • • •
Ga naar stap 3
volgens ons algoritme?
NEE •
Voer een kostenanalyse uit Verander de datagegevens Ga terug naar stap 1
•
Plaats JOB X met zijn originele (!!) datagegevens in de gesorteerde joblijst Ga terug naar stap 1
Fig 4.1: dynamisch sorteringsalgoritme
4.2.2
Voorbeeld
Ik illustreer mijn algoritme met een fragment uit een joblijst. JOB_ID J01 J02 J03
PT 15 3 11
DD 50 47 40
VDL 500 1500 750
STAP 1: Zoek job met grootste DD: J01 STAP 2: Zijn er jobs met gelijke DD als J01? Nee, ga naar STAP 3 STAP 3: kijk of er jobs voorkomen met
92
DD job > (DD J 01 − PTJ 01 ) DD job > (50 − 15) DD job > 35 Ja, J02 en J03 •
Voer een kostenanalyse uit. 3
21 J02
3
24 J03
3
3
3
35 J01
3
3
3
3
3
3
1
1
1
1
1
50
1
1
1
1
2
2
2
1
1
1
1
1
1
Due date J03
Due date J02
Due date J01
40
47
50
21 J03
32 J02
35 J01
50
voorraadkost J01 = 0
voorraadkost J 01 = 0
voorraadkost J03 = (40 − 35 )× 750 = 3750
voorraadkost J03 = (40 − 32 )× 750 = 6000
voorraadkost J02 = (47 − 24 )×1500 = 34500
TOTAAL = 0 + 18000 + 6000 = 24000
TOTAAL = 0 + 34500 + 3750 = 38250
14 J01
29 J03
40
44 J02
voorraadkost J02 = (47 − 35 )×1500 = 18000
47
14 J03
29 J01
44 J02
47
voorraadkost J01 = (50 − 29 ) × 500 = 10500
voorraadkost J01 = (50 − 44 ) × 500 = 3000
voorraadkost J02 = 0
voorraadkost J02 = 0
voorraadkost J03 = 0
voorraadkost J03 = (40 − 29 ) × 750 = 8250
TOTAAL = 10500 + 0 + 0 =10500
TOTAAL = 300 + 0 + 825 0 =11250
11 J01
11 J02
26 J02
29 J03
40
14 J01
29 J03
40
voorraadkost J01 = (50 − 26 ) × 500 = 12000
voorraadkost J01 = (50 − 29 ) × 500 = 10500
voorraadkost J03 = 0
voorraadkost J03 = 0
TOTAAL = 12000 + 27000 + 0 = 39000
TOTAAL = 10500 + 49500 + 0 = 60000
voorraadkost J02 = (47 − 29 ) × 1500 = 27000
voorraadkost J02 = (47 − 14 ) × 1500 = 49500
De volgorde met de laagste kosten is 14 J01
29 J03
40
44 J02
93
•
Verander de datagegevens
JOB_ID PT DD J02 3 47 J03 11 40 J01 15 29
•
VDL 1500 750 500
Ga terug naar STAP 1
STAP 1: Zoek job met grootste DD: J02 STAP 2: Zijn er jobs met gelijke DD als J02? Nee, ga naar STAP 3 STAP 3: kijk of er jobs voorkomen met DD job > (DD J 02 − PTJ 02 ) DD job > (47 − 3) DD job > 44 Nee •
Plaats J02 in de gesorteerde joblijst
•
Ga terug naar STAP 1
STAP 1: Zoek job met grootste DD: J03 STAP 2: Zijn er jobs met gelijke DD als J03? Nee, ga naar STAP 3 STAP 3: kijk of er jobs voorkomen met DD job > (DD J 03 − PTJ 03 ) DD job > (40 − 11) DD job > 29
Nee •
Plaats J03 in de gesorteerde joblijst
•
Ga terug naar STAP 1
STAP 1: Zoek job met grootste DD: J01 STAP 2: Zijn er jobs met gelijke DD als J01? Nee, ga naar STAP 3 STAP 3: kijk of er jobs voorkomen met DD job > (DD J 01 − PTJ 01 ) DD job > (29 − 15) DD job > 14
Nee •
Plaats J01 in de gesorteerde joblijst
•
Ga terug naar STAP 1
94
Alle jobs zijn nu gerangschikt volgens het dynamisch sorteringsalgoritme. De gesorteerde joblijst: JOB_ID J02 J03 J01
PT
DD 3 11 15
VDL 47 1500 40 750 50 500
De resultaten: Als we de joblijst sorteren volgens het dynamisch sorteringsalgoritme gevolgd door een bottleneckplanning dan is de performantie: te vroeg = 21 voorraadwaarde = 10500
Als we dit vergelijken met sortering volgens aflopende DD/bottleneck: te vroeg = 20 voorraadwaarde = 24000
De voorraadwaarde is kleiner volgens het dynamisch sorteringsalgoritme.
4.2.3
Verklaring dynamisch sorteren
Het dynamisch sorteren houdt er rekening mee dat overlappende jobs met verschillende DD elkaar toch kunnen beïnvloeden. Soms is het beter om een job nog meer naar voor te schuiven zodat een duurdere job met DD dicht in de buurt net voor zijn DD kan worden ingepland. Wanneer we sorteren volgens aflopende DD houden we hier geen rekening mee. Het dynamisch schedulen heeft wel enkele rekenkundige moeilijkheden. We moeten rekening houden met de impact die alle verschuivingen kunnen hebben op voorafgaande jobs. Soms is een optimalisatie in een subgroep van jobs niet meer optimaal wanneer we de gehele groep van jobs bekijken. In het voorbeeld van de vorige paragraaf kunnen we bijvoorbeeld nog een job aan de joblijst toevoegen. Stel dat er nog een job J04 bijkomt met een duurtijd van 4, een DD van 35 en VDL-waarde van 2500. JOB_ID
PT
DD
VDL
J01
15
50
500
J02
3
47
1500
J03
11
40
750
J04
4
35
2500
Als we deze groep optimaal zouden moeten sorteren, is het duidelijk dat J04 best zo dicht mogelijk bij zijn DD wordt geplaatst. Dit wegens zijn grote VDL-waarde. 95
De vorige suboptimalisatie zal hier niet meer gelden. Ons dynamisch sorteringsalgoritme kan dus enkel worden toegepast op een groep jobs met lokale onafhankelijkheid. Je voelt zelf wel aan dat dit een rekenkundig moeilijk probleem is. Figuur 4.2 toont het aantal mogelijke gevallen met 3 jobs. Telkens gaat men na of de gevormde subgroep invloed heeft op de andere voorafgaande jobs. Wanneer deze onafhankelijk zijn, dan vormt men een nieuwe subgroep.
job met hoogste prioriteit # subgroep1 = 1 Invloed op job met lagere prioriteit?
JA
NEE
# subgroep1 = 2
# subgroep1 = 1 # subgroep2 = 1
e
e
job met 2 hoogste prioriteit
job met 2 hoogste prioriteit
Invloed op job met lagere prioriteit?
JA
# subgroep1 = 3
Invloed op job met lagere prioriteit?
NEE
JA
NEE
# subgroep1 = 2
# subgroep1 = 1
# subgroep1 = 1
# subgroep2 = 1
# subgroep2 = 2
# subgroep2 = 1 # subgroep3 = 1
Fig 4.2: aantal mogelijke combinaties lokale afhankelijkheid van 3 jobs
De kostenoptimalisatie door ons dynamisch sorteringsalgoritme moet telkens gebeuren op de verschillende subgroepen. Deze subgroepen beïnvloeden (overlappen) de andere jobs niet. Het eindresultaat is de beste sorteervolgorde voor een minimale voorraadwaarde. Het is duidelijk dat dit probleem te veel rekenwerk vraagt. Figuur 4.2 toont de verschillende mogelijkheden voor een joblijst met 3 jobs. We zien dat er zich 4 verschillende gevallen kunnen voordoen. Als we een joblijst van N jobs bekijken zijn er maar liefst 2N mogelijkheden. Dit allemaal programmeren valt buiten het domein van deze thesis, maar het kan een suggestie zijn voor verder onderzoek.
96
4.3
Besluit
De huidige productieplanning binnen Agfa kan nog heel wat worden verbeterd. Het is niet mogelijk om met mijn programmeerervaring en huidige computersnelheid een optimale oplossing te vinden. Daarvoor moeten we dynamisch gaan sorteren en schedulen zoals in paragraaf 4.2. Ik kan echter wel een suggestie doen voor een aanvaardbare oplossing. Om de rekenmoeilijkheid
te
beperken
houden
we
ons
bij
de
statische
schedulingstechnieken van paragraaf 4.1. Deze paragraaf heeft duidelijk aangetoond dat we tegen onze intuïtie moeten durven denken. In plaats van vooraan bij het begin van de planningshorizon jobs in te beginnen plannen, blijkt dat een omgekeerde aanpak veel betere resultaten geeft. Door de jobs op aflopende DD te sorteren, beperken we de voorraadwaarde. Dit is vooral te danken aan het voorspelbaar schuifgedrag wegens de opbouw van deze regel. Jobs met een gelijke DD sorteren we onderling best volgens een gewogen VDL sortering.
97
Hoofdstuk 5 Besluit thesis en suggesties voor verder onderzoek 5.1
Besluit thesis
Het is tijd om de balans op te maken tussen het geleverde werk en de bekomen resultaten. Het doel van mijn thesis was de emulsiefabriek van Agfa efficiënt te plannen tegen eindige capaciteit. Ben ik daar nu in geslaagd? Bij het bestuderen van de emulsiefabriek hebben we gekozen om ons toe te leggen op de aanzetlijnen. De rest van het filmproductieproces kan namelijk gemakkelijk volgen. Eén aanzetlijn trok onze aandacht: de E27. De installatie blijkt een bottleneck te zijn binnen het productieproces. Alle inspanningen gingen dus verder naar deze E27. Agfa heeft drie belangrijke beoordelingscriteria om de performantie van een planning te meten: 1. alle orders moeten op tijd kunnen worden geleverd 2. niet te veel op voorhand produceren als dat niet nodig is 3. het kapitaal dat in de voorraad kruipt minimaliseren De literatuur vormde een eerste aanzet om alles wat met planning te maken heeft te doorpluizen. Algauw kwamen we bij twee belangrijke planningsactiviteiten terecht: ‘sequencing’ en ‘scheduling’. De literatuur gaf ons voorbeelden van forward, backward en bottleneck plannen. Als we deze op ons probleem projecteerden, zagen we de nood aan een nieuw algoritme. We moesten kunnen garanderen op tijd te leveren en zo ontwikkelden we zelf een ander bottleneck algoritme. Aan het eerste beoordelingscriterium van Agfa, op tijd leveren, kon worden voldaan. Daarna ontwikkelden we ook een schedulingsengine waarmee we een eerste fase van experimenten aanvingen. Uit de literatuur haalden we een selectie van prioriteitsregels (DD, PT, ST en CR). De wisselwerking van deze met het forward en backward algoritme werd onder de loep genomen. Uit de resultaten bleek dat we de forward planning achterwege moesten laten als we aan het tweede beoordelingscriterium van Agfa wilden voldoen: niet te veel op voorhand produceren als het niet nodig is. We ontdekten ook de bijzondere opbouw van een bottleneck scheduling waarbij de sortering gedaan wordt volgens aflopende DD. We kregen het verschuifgedrag van overlappende jobs zo meer onder controle
98
aangezien we systematisch plannen, te starten op het einde van onze planningshorizon. Met deze inzichten op zak begonnen we aan een tweede fase van experimenten. We moesten nog proberen voldoen aan het derde beoordelingscriterium van Agfa: het kapitaal dat in de voorraad kruipt minimaliseren. Allerlei verschillende sequencingregels werden getest in een bottleneck planning door gebruik te maken van een simulatie van bestaande orderlijsten van de E27. Als we van elke orderlijst de beste regel nemen, komen we tot een voorraadreductie tegenover hun huidige planning van gemiddeld 37%. Als we dan toch één regel moeten selecteren die het best scoort over alle orderlijsten heen, kiezen we voor de aflopende DD gevolgd door gewogen VDL sortering in een bottleneck planning. Met deze planningsmethode krijgen we een gemiddelde voorraadreductie van 28%. Om dit uit te drukken in geldwaarde hebben we respectievelijk 740˙000 € en 560˙000 € uitgespaard per jaar op deze bottleneck installatie. Onze planning voldoet aan alle criteria en we mogen dus spreken van een succes. We zijn tevreden over deze theoretische resultaten, maar we moeten ook een beetje relativeren. Daarom nog even je aandacht voor een volgende paragraaf met bijkomende suggesties voor verder onderzoek.
5.2
Suggesties voor verder onderzoek
Eerst en vooral werd alles nu netjes op papier gezet, maar de volgende stappen liggen bij Agfa zelf. Ik hoop dan ook van harte dat mijn thesis een aanzet zal zijn tot verbeteringen bij het plannen in Agfa. Deze thesis kan gebruikt worden als basispiste om een denkproces in gang te zetten om verbeteringen aan te brengen in hun huidige planning. Ik reik enkele theoretische theorieën aan, zij moeten deze nu in de praktijk brengen. Ten tweede wil ik nogmaals wijzen op het feit dat het niet mogelijk is om met mijn programmeerkennis en de huidige computersnelheid de ‘optimale’ oplossing te vinden. Sorteringsregels geven wel een ‘aanvaardbare’ oplossing. Er is dus nog altijd ruimte voor verbetering. Het dynamisch schedulen kan bijvoorbeeld nog betere resultaten geven dan de gebruikte statische variant. Deze wijze van schedulen zou mogelijks nog interessante resultaten kunnen opleveren.
99
Appendix A Theory of constraints Bottleneck scheduling is gebaseerd op de Theory of constraints (TOC, Goldratt). De focus ligt hier op het inplannen van de werkcentra waar capaciteit (of andere) beperkingen voorkomen. Als principe geldt dat elk gewonnen tijdstip op de bottleneck resulteert in meer afgewerkte producten en uiteindelijk in meer winst. Tijd winnen op een niet-bottleneck installatie heeft geen toegevoegde waarde. Niet-efficiënte planning van deze installaties leidt altijd tot hogere voorraden. Theory of constraints (TOC) The goal, Goldratt Eli Goldratt is de grondlegger van de Theory Of Constraints (TOC). Samen met Jeff Cox probeerde hij de aandacht van het brede publiek voor de TOC te trekken in zijn eerste boek ''The Goal'', geschreven in een romanvorm. Alex Rogo, bedrijfsleider, kampt met ernstige problemen: levertermijnen worden niet nagekomen, de kwaliteit van de producten laat te wensen over, de voorraad goederen in bewerking blijft maar stijgen, ... . Toevallig ontmoet hij zijn oude vriend, Jonah, die door het stellen van vragen ook voor de lezer een denkproces op gang brengt over de principes van de TOC en aldus alle problemen van de baan ruimt. Goldratt komt uit de planningswereld. Zijn grootste zorg ligt in een vlotte doorstroming van de materialen. Bij het plannen van de verschillende orders, leerde hij dat steeds dezelfde machines met een beperkte capaciteit voor vertragingen in de productieketen zorgden. Hij noemde deze knelpunten ''constraints'' of ''bottleneck machines''. Bij het plannen moest deze ''bottleneck machines'' op een andere manier benaderd worden dan de ''niet-bottleneck machines''. De kerngedachte van TOC ligt dan ook in een optimaal gebruik van de knelpunten.
Het doel van de onderneming In ''The Goal'' wordt vooreerst het doel van een onderneming in vraag gesteld. Aandeelhouders stellen geld ter beschikking met de bedoeling in de toekomst geld terug te verdienen. Het doel van de onderneming is geld (liquiditeiten) genereren. ''The goal is to make money, now as in the future.'' De doelstelling van een bedrijf mag zich dus niet beperken tot het maken van winst, tegelijk is het genereren van een inkomende geldstroom uitermate belangrijk. Volgens Goldratt moet een onderneming m.a.w. niet alleen rendabel zijn, maar moet ze ook nastreven dat zo weinig mogelijk liquide middelen worden vastgelegd in voorraden en andere activa. Om dat te bewerkstelligen stelt Goldratt een aantal variabelen voor die bij de besluitvorming permanent moeten worden bewaakt, de TOC maatstaven ''throughput'', ''inventory'' en ''operating expenses''.
100
TOC maatstaven Om te meten hoeveel geld een onderneming in een bepaalde periode heeft voortgebracht, voert Goldratt het begrip ''throughput'' in. Throughput wordt gedefinieerd als het verschil tussen de verkopen en de materiaalkosten (grondstoffen) van die verkopen. ''Throughput is the rate at which the system generates money through sales.'' Om producten te produceren zijn echter productiemiddelen nodig. TOC onderscheidt hier twee categorieën: inventory en operating expenses. Met inventory wordt bedoeld: de voorraad goederen in bewerking, gereed product, grondstoffen, hulpstoffen, ... maar ook de materieel vaste activa zoals machines, gebouwen, ... De vaste activa vertegenwoordigen als het ware een voorraad productie-uren. ''Inventory is all the money the system invests in purchasing things the system intends to sell.'' De operating expenses tenslotte kunnen we omschrijven als de kosten van de verkochte goederen, exclusief de materiaalkost. ''Operating expenses is all the money the system spends in turning inventory into throughput.'' Voorbeelden van de operating expenses zijn: personeelskosten van de arbeiders, bedienden, kaderleden, energie, hulpstoffen, werkingskosten algemene leiding en secretariaat, ... De onderneming wordt dus beschouwd als een geldgenererend systeem: ''The company is a money-making machine.'' De operating expenses vertegenwoordigen het geld dat in de onderneming gaat. De inventory zijn geldmiddelen die voorlopig vastliggen binnen den onderneming. En de throughput meet het geld dat uit het ondernemingsproces komt.
€ INPUT
GELDMAKENDE MACHINE Operating
inventory
€ OUTPUT throughput
expenses
Fig A.1: de maatstaven binnen TOC
Het is nu de taak van het management om zoveel mogelijk throughput te realiseren bij een minimale inventory en met zo weinig mogelijk operating expenses. ''A good money-making machine is one with a high throughput, low inventory and low operating expenses.'' Acties die niet de throughput verhogen of de inventory verminderen of de operating expenses doen dalen, zijn waardeloos en helpen de onderneming niet vooruit. Dergelijke acties verbeteren het finaal resultaat (the bottom line) immers niet. Voorbeelden hiervan zijn: produceren op voorraad, reductie van omsteltijden op een niet-knelpunt machine...
101
Goldratt's ''ongoing improvement plant'' Goldratt geeft in zijn TOC 5 fasen aan waardoor we moeten lopen om ''ongoing improvement'' (voortdurende verbeteringen) te realiseren. Goldratt noemt ze ook nog de ''five steps to success''. De vijf fasen in de bewoordingen van Goldratt zelf: 1. Identify the system’s contraints 2. Exploit the contraints 3. Subordinate everything else to the above decision 4. Elevate the system's constraint 5. If, in the pervious steps, a constraint has been broken, then go back to step one. But do not allow inertia to cause a system's constraint. In de eerste stap moet de ''constraint'' binnen de onderneming worden vastgesteld. Een constraint kunnen we definiëren als: alles wat de onderneming belet een hogere performantie te bereiken bij het nastreven van het doel. Goldratt bedoelt hiermee zowel een fysisch knelpunt (b.v. een machine) als een politiek binnen de onderneming in de zin van ''de ordergrootte voor onderdeel X bedraagt 10 stuks''. Eens de constraint of bottleneck gekend is, moet de onderneming alles in het werk stellen om die beperking weg te werken. De bottleneck bepaalt immers de throughput van de totale fabriek. Of in beeldspraak gezegd, de sterkte van de ketting wordt bepaald door de sterkte van de zwakste schakel. Het wegwerken kan dikwijls enige tijd in beslag nemen. Ondertussen is het zinvol om de constraint zo goed mogelijk te benutten: een bottleneck machine mag bijvoorbeeld nooit stilstaan. Kwaliteitscontrole gebeurt best vóór het knelpunt want ''one hour lost in the bottleneck, is one hour lost for the whole system.'' Bovendien moet de productie in de hele fabriek afgestemd worden op dit knelpunt. Het opdrijven van de bezetting in een non-bottleneckafdeling leidt alleen maar tot hogere tussenvoorraden, die ondertussen onderhevig zijn aan veroudering of beschadiging. Bovendien kunnen de verwerkte grondstoffen ondertussen voor niets anders meer gebruikt worden. Hoge tussenvoorraden zijn trouwens niet bevorderlijk voor de kwaliteit van de producten: het duurt een hele tijd vooraleer de volgende afdeling de halffabrikaten verder bewerkt en eventuele kwaliteitsproblemen opmerkt. Tussenvoorraden zorgen er ook voor dat de totale doorlooptijd wordt verlengd. Van de klant wordt dan verwacht dat hij de definitieve orders ook weken op voorhand vastlegt, wat dikwijls onrealistisch is. Daardoor voeren de klanten later nog wijzigingen in hun bestellingen door. Van bepaalde onderdelen zijn er dan in het kader van de nieuwe gegevens te veel geproduceerd en van
andere
onderdelen
dan
weer
te
weinig,
wat
de
doorlooptijd
verlengt
en
de
leveringsbetrouwbaarheid ondergraaft. Om al deze redenen zijn hoge tussenvoorraden absoluut te vermijden. Fase 4 van Goldratt's ongoing improvement houdt in dat we de constraint zelf aanpakken. Het knelpunt wordt weggewerkt en zo kan men bijkomende throughput genereren. Voorbeelden zijn:
102
werken in meerdere ploegen, investeren in bijkomende eenheden van de constraint, oude machines weer uit de kelder halen, ... Tenslotte waarschuwt Goldratt in fase 5 ervoor dat de onderneming niet mag blijven stilstaan bij het gerealiseerde. De vijf stappen moeten continu doorlopen worden. Na stap 5 moeten we terugkeren naar stap 1. Daarin ligt precies het element van ''ongoing improvement''.
TOC is een manier van denken geworden, die bijzonder geschikt is voor het korte termijn optimaliseren van de bestaande capaciteit drum, rope, buffer Het drum, rope, buffer concept komt ook van de TOC. Het is een idee dat ons helpt om te beslissen waar precies bij controle in een organisatie onze aandacht moet liggen. In de meeste productieomgevingen is het zo dat niet alle werkstations even zwaar belast zijn. Dit betekent dat een deel van het proces zich waarschijnlijk zal gedragen als een “bottleneck” in de work flow doorheen het proces. Goldratt argumenteert dat de bottleneck in ons proces het controlepunt van het hele proces wordt. Hij noemt het de drum, omdat het de beat van de rest van de stroom aangeeft. Omdat het niet voldoende capaciteit heeft, moet de bottleneck de hele tijd werken. Daarom moet je ervoor zorgen dat er steeds een buffer werkvoorraad aanwezig is net voor de bottleneck om te verzekeren dat de bottleneck steeds voorzien is van werk. Een bottleneck bepaalt de output van de fabriek. Tijd verloren op de bottleneck, zal de output beïnvloeden van de hele fabriek. Het is dus niet van belang om voor de bottleneck op volle capaciteit te produceren, zo bouw je enkel een voorraad op. Daarom is er een zekere vorm van communicatie nodig tussen de bottleneck en de input van het proces om ervoor te zorgen dat de activiteiten voor de bottleneck niet meer produceren dan strikt noodzakelijk. Deze communicatie noemt men de rope.
activiteit A
activiteit B
activiteit C
activiteit D
Bottleneck buffervoorraad
Rope: communicatietouw Controleert de voorafgaande productiestappen
Fig A.2: het “drum, buffer en rope” concept
103
De drum heeft de beat aan
activiteit E
Appendix B Visual basic code Dim k_jobid As String
Source forward & backward
Dim v_act_ptr As Integer
scheduling
Dim s_act_ptr As Integer
‘ Om in array vanaf 1 te beginnen tellen en niet vanaf 0
' Met deze array vormt men de interne linked list. In
Option Base 1
deze linked list komt de planning terecht nadien wordt deze weggeschreven naar een output file
' Declaratie van variabelen Public om ze in meer dan in
Dim Ar_act_ptr(250) As Integer
procedure te kunnen gebruiken
Dim Ar_prev_ptr(250) As Integer
Dim StrJob As String
Dim Ar_next_ptr(250) As Integer
Dim StrKopie As String
Dim Ar_job_duur(250) As Integer
Dim i, j, p, q As Integer
Dim Ar_job_star(250) As Integer
Dim hulp As String
Dim Ar_job_end(250) As Integer
Dim Intpositie As Integer
Dim Ar_next_spa(250) As Integer
Dim ZoekChar As String
Dim Ar_prev_spa(250) As Integer
Public pr_horizon As String
Dim Ar_jobid(250) As String
Public horizon As Integer
Dim Ar_jobdue(250) As Integer
Dim SeqStr As String
Dim m_jobid As String
Dim visual As Integer
Dim m_duur As Integer
' indien waarde 0 dan geen internal displays
Dim m_due As Integer
' indien waarde 1 dan stops en displays
Public maxjob As Integer
' Met deze arrays wordt de ingelezen Private Sub Backward_Click()
' jobinfo bijgehouden Dim Arjobid(250) As String * 12
visual = 0
Dim Arjobduur(250) As String * 12
Call prompt_horizon
Dim Arjobdue(250) As String * 12
Call Lees_input
Dim Arjobvdl(250) As String * 12
Call Backward_va_Proc(maxjob)
Dim StopInt As Integer
Call Schrijfrecords
Dim Stopvlag As String
Call Sluit_output
Dim h_act_ptr, h_prev_ptr, h_next_ptr As Integer
End Sub
Dim h_job_duur, h_job_star, h_job_end As Integer Dim h_next_spa, h_prev_spa As Integer
Private Sub End_Click()
Dim h_jobid As String
Unload Me
Dim k_act_ptr, k_prev_ptr, k_next_ptr As Integer
End Sub
Dim k_job_duur, k_job_star, k_job_end As Integer Dim k_next_spa, k_prev_spa As Integer
104
Private Sub Forward_Click()
If Intpositie > 0 Then '” ;” komt nog voor in de string
visual = 0
hulp = Left(StrJob, Intpositie - 1)
Call prompt_horizon
StrJob = Right(StrJob, Len(StrJob) - Intpositie)
Call Lees_input Call Forward_Proc(maxjob)
Select Case StopInt
Call Schrijfrecords
Case 1 Arjobid(i) = hulp
Call Sluit_output
Case 2 Arjobduur(i) = hulp Case 3 Arjobdue(i) = hulp
End Sub
Case 4 Arjobvdl(i) = hulp Case 5 StopInt = 999
Private Sub prompt_horizon()
End Select
waar_in_prog.Text = "Vraag naar lengte horizon"
Else
pr_horizon = InputBox("Geef Horizon", "Horizon",
StopInt = 999
10000, 1400, 2000)
End If
horizon = Val(pr_horizon)
StopInt = StopInt + 1
End Sub
Loop StrKopie = Str(i) + "/" + Arjobid(i) + "/" + Arjobduur(i) +
Private Sub Lees_input()
"/" + Arjobdue(i) + "/" + Arjobvdl(i) + "/"
ZoekChar = ";"
Print #2, StrKopie
waar_in_prog.Text = "Openen van I/O kanalen"
maxjob = i
Open "c:\schedul\joblist.csv" For Input As #1
Else
Open "c:\schedul\jobkopie.csv" For Output As #2
End If
Open "c:\schedul\jobseq.csv" For Output As #3
i=i+1
waar_in_prog.Text = "Initialisatie van de arrays"
Loop
Call Initarrays
End Sub
waar_in_prog.Text = "Aanmaak begin/einde linked list" Call BeginEndRec(horizon)
Private Sub Initarrays()
waar_in_prog.Text = "Lezen van de records in joblist.csv en kopieren naar jobkopie.csv"
StopInt = 1
i=0
Do While StopInt < 251 Arjobid(StopInt) = Left("
Do Until EOF(1) Line Input #1, StrJob If i >= 1 Then
Arjobduur(StopInt) = Left("
", 12)
Arjobdue(StopInt) = Left("
", 12)
Arjobvdl(StopInt) = Left("
'titelrecord niet lezen en string lezen en naar arrays
StopInt = StopInt + 1
brengen
Loop
StopInt = 1
End Sub
Do While StopInt < 999 Intpositie = InStr(1, StrJob, ZoekChar)
Private Sub BeginEndRec(horizon)
105
", 12)
", 12)
SeqStr = "s_rec" + ";" + "s_prev_ptr" + ";" +
' Lezen van de tweede positie
"s_next_ptr" + ";" + "s_jobid” + “;” + “j_job_due” + “ ;“ +
h_act_ptr = Ar_act_ptr(2)
s_job_duur” + “;” + “s_job_star;" + ”s_job_end”+ “;” +
h_prev_ptr = Ar_prev_ptr(2)
“s_prev_spa;s_next_spa” + ”;" + "s_vdl"
h_next_ptr = Ar_next_ptr(2)
Print #3, SeqStr
h_job_duur = Ar_job_duur(2) h_job_star = Ar_job_star(2)
Ar_act_ptr(1) = 1
h_job_end = Ar_job_end(2)
Ar_prev_ptr(1) = 1
h_prev_spa = Ar_prev_spa(2)
Ar_next_ptr(1) = 2
h_next_spa = Ar_next_spa(2)
Ar_jobid(1) = "BEGIN"
h_jobid = Ar_jobid(2)
Ar_jobdue(1) = 1 Ar_job_duur(1) = 0
If visual = 1 Then
Ar_job_star(1) = 0
pr_dummy = InputBox("maxjob", "maxjob", maxjob,
Ar_job_end(1) = 0
1400, 200)
Ar_prev_spa(1) = 0
End If
Ar_next_spa(1) = Str(horizon)
If maxjob > 250 Then maxjob = 250
Ar_act_ptr(2) = 2
End If
Ar_prev_ptr(2) = 1
i=1
Ar_next_ptr(2) = 2
Do While i <= maxjob
Ar_jobid(2) = "EINDE"
If visual = 1 Then
Ar_jobdue(2) = horizon + 1
waar_in_prog.Text = "loop op i <= maxjob , i = " + Str(i)
Ar_job_duur(2) = 0
pr_dummy = InputBox("waarde i", "waarde i", i, 1400,
Ar_job_star(2) = Str(horizon)
200)
Ar_job_end(2) = Str(horizon) Ar_prev_spa(2) = Str(horizon)
End If
Ar_next_spa(2) = 0
m_jobid = Arjobid(i)
End Sub
m_job_duur = Val(Arjobduur(i))
Private Sub Backward_va_Proc(maxjob)
j=i+2
m_job_due = Val(Arjobdue(i)) Ar_jobid(j) = m_jobid
' Lezen van de eerste positie
Ar_job_duur(j) = m_job_duur
k_act_ptr = Ar_act_ptr(1)
Ar_jobdue(j) = m_job_due
k_prev_ptr = Ar_prev_ptr(1)
Ar_act_ptr(j) = j
k_next_ptr = Ar_next_ptr(1) k_job_duur = Ar_job_duur(1)
If i = 1 Then Stopvlag = "N"
k_job_star = Ar_job_star(1)
' zoeken naar de waarde van de vorige en volgende job
k_job_end = Ar_job_end(1)
p=1
k_prev_spa = Ar_prev_spa(1)
q=1
k_next_spa = Ar_next_spa(1)
Do While Stopvlag = "N"
k_jobid = Ar_jobid(1)
' pr_dummy = InputBox("Geef dummy", "dummy", p)
106
If Ar_job_end(p) + Ar_next_spa(p) >= m_job_due Then
h_act_ptr = Ar_act_ptr(j)
Stopvlag = "J"
h_prev_ptr = Ar_prev_ptr(j)
j=p
h_next_ptr = Ar_next_ptr(j)
Else p = Ar_next_ptr(p)
h_job_duur = Ar_job_duur(j)
End If
h_job_star = Ar_job_star(j)
q=q+1
h_job_end = Ar_job_end(j)
If visual = 1 Then
h_prev_spa = Ar_prev_spa(j)
waar_in_prog.Text = "loop op : p =" + Str(p) + "waarde
h_next_spa = Ar_next_spa(j)
q=" + Str(q)
h_jobid = Ar_jobid(j)
End If
'j terug op i + 2 zetten j=i+2
If q > 10000 Then Stopvlag = "J" ' Inbouwen van een extra stopconditie zodat
End If
' een oneindige loop vermeden wordt
' k_job_end duidt het einde van de vorige job aan.
End If
h_job_star duidt het begin van de volgende job aan
Loop
' pr_dummy = InputBox("k_job_end + k_next_spa", "dummy", k_job_end + k_next_spa)
' pr_dummy = InputBox("Terugkeerwaarde", "dummy", j) bij terugkeer uit deze routine is j gelijk aan de id van
If k_job_end + k_next_spa >= m_job_due Then
de vorige record
' er is plaats genoeg na de vorige job nu nog testen of
k_act_ptr = Ar_act_ptr(j)
de job wel voor zijn due-date kan
s_act_ptr = j
' pr_dummy = InputBox("Geef dummy", "dummy",
k_prev_ptr = Ar_prev_ptr(j)
k_jobid + "/" + m_jobid, 1400, 2000)
k_next_ptr = Ar_next_ptr(j)
If k_job_end + m_job_duur < m_job_due Then
k_job_duur = Ar_job_duur(j)
' job kan voor zijn due date ingepland worden
k_job_star = Ar_job_star(j)
Ar_prev_ptr(j) = k_act_ptr
k_job_end = Ar_job_end(j)
Ar_next_ptr(j) = k_next_ptr
k_prev_spa = Ar_prev_spa(j)
Ar_job_star(j) = m_job_due - m_job_duur
k_next_spa = Ar_next_spa(j)
Ar_job_end(j) = m_job_due - 1
k_jobid = Ar_jobid(j)
Ar_prev_spa(j) = Ar_job_star(j) - 1 - k_job_end
'de h waarden komen met volgende record overeen
Ar_next_spa(j) = h_job_star - Ar_job_end(j) – 1
j = k_next_ptr
' waarde van laatst toegevoegde record
If j = 0 Then
h_act_ptr = j
pr_dummy = InputBox("volgende record", "volgende
' naar de vorige record j = k_act_ptr
record", j, 1400, 200)
Ar_next_ptr(j) = h_act_ptr
End If
Ar_next_spa(j) = Ar_job_star(h_act_ptr) - Ar_job_end(j)
If j > maxjob + 2 Then
-1
pr_dummy = InputBox("volgende record", "volgende
' naar de volgende record
record", j, 1400, 200)
j = k_next_ptr
End If
Ar_prev_ptr(j) = h_act_ptr
107
Ar_prev_spa(j) = Ar_job_star(j) - Ar_job_end(h_act_ptr)
Ar_prev_spa(h_act_ptr) = Ar_job_star(h_act_ptr) -
-1
Ar_job_end(j) - 1 ' Nu positioneren op s_act_ptr en vandaar een loop
Else
naar het begin of naar de de stopconditie Alles schuift
' job kan niet voor zijn due-date ingepland raken
naar voor stopconditie bereikt indien er ergens nog een
Call Zoekvoorgaand(k_act_ptr, m_job_duur)
vrije ruimte kan gelaten worden
'waarde k_act_ptr is de record die voorafgaand
p = s_act_ptr
' voldoende plaats heeft
h_act_ptr = j
If k_act_ptr = 1 Then
' link leggen in de vorige record
' Indien men op BEGIN staat kan het zijn dat er toch
Ar_next_ptr(p) = j
geen plaats is. Daar Plaknetvoor werkt redenerend
Stopvlag = "N"
naar de prev_spa. Nu in de linked list één positie
Do While Stopvlag = "N"
verder zetten
If Ar_jobid(p) = "BEGIN" Then Stopvlag = "J"
k_act_ptr = Ar_next_ptr(k_act_ptr)
Else 'pointers reeds ok, dus daar geen actie If
If Ar_prev_spa(k_act_ptr) >= m_job_duur Then
Ar_job_end(p)
-
Ar_prev_spa(p)
' pr_dummy = InputBox("Begin", "Voldoende plaats",
Ar_job_star(h_act_ptr) Then Stopvlag = "J"
k_act_ptr)
' eveneens de stopconditie bereikt
Call Plaknetvoor(k_act_ptr, m_job_duur)
' voorafgaand is er ruimte over
Else
'
'pr_dummy = InputBox("Begin", "Onvoldoende plaats",
ar_prev_spa(p)", Ar_prev_spa(p))
pr_dummy
=
InputBox("Dummy",
<
"Waarde
Ar_prev_spa(p) = Ar_prev_spa(p) - _
k_act_ptr)
(Ar_job_end(p) - Ar_job_star(h_act_ptr) + 1)
'pr_dummy = InputBox("Plakduedate", "Vorige rec",
Ar_next_spa(p) = 0
Ar_jobid(s_act_ptr))
Ar_job_star(p)=Ar_job_star(h_act_ptr) - Ar_job_duur(p)
' h_act_ptr = volgende record
Ar_job_end(p) = Ar_job_star(h_act_ptr) – 1
h_act_ptr = Ar_next_ptr(s_act_ptr)
Else ' voorafgaand is er geen ruimte over
'pr_dummy = InputBox("Plakduedate", "Volgende rec",
Ar_job_star(p)=Ar_job_star(h_act_ptr) - Ar_job_duur(p)
Ar_jobid(h_act_ptr))
Ar_job_end(p) = Ar_job_star(h_act_ptr) - 1
'pr_dummy = InputBox("Plakduedate", "Start Volgende
Ar_prev_spa(p) = 0
rec", Ar_job_star(h_act_ptr))
Ar_next_spa(p) = 0
' eerst de nieuwe record plakken
End If
Ar_prev_ptr(j) = s_act_ptr
h_act_ptr = p
Ar_next_ptr(j) = Ar_next_ptr(s_act_ptr)
p = Ar_prev_ptr(p)
Ar_job_star(j) = m_job_due - m_job_duur
End If
Ar_job_end(j) = m_job_due - 1
Loop
Ar_prev_spa(j) = 0
End If
Ar_next_spa(j) = Ar_job_star(h_act_ptr) - Ar_job_end(j)
Else
-1
' pr_dummy = InputBox("Terugkeer", "k_act_ptr",
' eerst naar de volgende record gaan daar link leggen
k_act_ptr)
Ar_prev_ptr(h_act_ptr) = j
Call Plaknetvoor(k_act_ptr, m_job_duur) End If
108
End If
'pr_dummy
Else
Ar_prev_spa(p))
End If
=
InputBox("prev_spa",
"prev_spa",
If Ar_jobid(p) = "BEGIN" Then Stopvlag = "J"
i=i+1
k_act_ptr = p
Loop
End If
End Sub
If Ar_prev_spa(p) >= m_job_duur Then Stopvlag = "J" k_act_ptr = p
Private Sub Schrijfrecords()
Else p = Ar_prev_ptr(p)
j=1
End If Loop
Do While j <= maxjob + 2
End Sub
StrSeq = Str(Ar_act_ptr(j)) + ";" StrSeq = StrSeq + Str(Ar_prev_ptr(j)) + ";"
Private Sub Plaknetvoor(k_act_ptr, m_job_duur)
StrSeq = StrSeq + Str(Ar_next_ptr(j)) + ";" StrSeq = StrSeq + Ar_jobid(j) + ";"
Ar_prev_ptr(j) = Ar_prev_ptr(k_act_ptr)
StrSeq = StrSeq + Str(Ar_jobdue(j)) + ";"
v_act_ptr = Ar_prev_ptr(k_act_ptr)
StrSeq = StrSeq + Str(Ar_job_duur(j)) + ";"
Ar_next_ptr(j) = k_act_ptr
StrSeq = StrSeq + Str(Ar_job_star(j)) + ";"
Ar_job_star(j) = Ar_job_star(k_act_ptr) - m_job_duur
StrSeq = StrSeq + Str(Ar_job_end(j)) + ";"
Ar_job_end(j) = Ar_job_star(k_act_ptr) - 1
StrSeq = StrSeq + Str(Ar_prev_spa(j)) + ";"
Ar_prev_spa(j) = Ar_prev_spa(k_act_ptr) - m_job_duur
StrSeq = StrSeq + Str(Ar_next_spa(j)) + ";"
Ar_next_spa(j) = 0
If j > 2 Then
' nu in record k_act_ptr de link naar de record
StrSeq = StrSeq + Arjobvdl(j - 2) + ";"
' die er juist voor kwam instellen uiteraard is er geen
Else StrSeq = StrSeq + "0;"
prev_spa daar job er juist voor plakt
End If
Ar_prev_ptr(k_act_ptr) = j
Print #3, StrSeq
Ar_prev_spa(k_act_ptr) = 0
j=j+1
' nu in de record die voor de nieuw toegevoegde staat
Loop
eveneens de link leggen Ar_next_ptr(v_act_ptr) = j
End Sub
Ar_next_spa(v_act_ptr) = Ar_next_spa(v_act_ptr) m_job_duur
Private Sub Zoekvoorgaand(k_act_ptr, m_job_duur) ' pr_dummy = InputBox("Zoekvoorgaand", "k_jobid",
End Sub
k_jobid, 1400, 2000) ' de k-waarden duiden de job aan die nadien niet
Private Sub Sluit_output()
voldoende plaats had misschien is er wel plaats voor
waar_in_prog.Text = "Afsluiten v/d I/O kanalen"
Stopvlag = "N"
Close #1
p = k_act_ptr
Close #2
Do While Stopvlag = "N"
Close #3
'pr_dummy = InputBox("Jobid", "Jobid", Ar_jobid(p))
waar_in_prog.Text = "Einde - Wachten op new action"
109
End Sub
Ar_next_spa(k_act_ptr) = 0 Ar_next_ptr(k_act_ptr) = j
Private Sub Forward_Proc(maxjob)
' naar de volgende record gaan
' Lezen van de eerste positie
Ar_prev_spa(h_act_ptr) = h_prev_spa - m_job_duur h_prev_spa = h_prev_spa - m_job_duur
k_act_ptr = Ar_act_ptr(1)
Ar_prev_ptr(h_act_ptr) = j
k_prev_ptr = Ar_prev_ptr(1)
' de k variabelen gelijk stellen aan de net
k_next_ptr = Ar_next_ptr(1)
' ingeplande record
k_job_duur = Ar_job_duur(1)
k_act_ptr = j
k_job_star = Ar_job_star(1)
k_prev_ptr = Ar_prev_ptr(j)
k_job_end = Ar_job_end(1)
k_next_ptr = Ar_next_ptr(j)
k_prev_spa = Ar_prev_spa(1)
k_job_duur = Ar_job_duur(j)
k_next_spa = Ar_next_spa(1)
k_job_star = Ar_job_star(j)
k_jobid = Ar_jobid(1)
k_job_end = Ar_job_end(j)
' Lezen van de tweede positie
k_prev_spa = Ar_prev_spa(j)
h_act_ptr = Ar_act_ptr(2)
k_next_spa = Ar_next_spa(j)
h_prev_ptr = Ar_prev_ptr(2) h_next_ptr = Ar_next_ptr(2)
k_jobid = Ar_jobid(j)
h_job_duur = Ar_job_duur(2)
i=i+1
h_job_star = Ar_job_star(2)
Loop
h_job_end = Ar_job_end(2)
End Sub
h_prev_spa = Ar_prev_spa(2) h_next_spa = Ar_next_spa(2)
Source analysetool
h_jobid = Ar_jobid(2) i=1
' declaratie van de variabelen
Do While i <= maxjob
Dim StrJobseq As String
m_jobid = Arjobid(i)
Dim i, k, volgende, j As Integer
m_job_duur = Val(Arjobduur(i))
Dim ZoekChar As String
m_job_due = Val(Arjobdue(i))
Dim hulp As String
j=i+2
Dim plaats As Integer
Ar_jobid(j) = m_jobid
Public aantal_jobs As Integer
Ar_job_duur(j) = m_job_duur
Dim Intpositie As Integer
Ar_jobdue(j) = m_job_due
Dim StopInt As Integer
Ar_act_ptr(j) = j
Dim StrKopie As String
Ar_job_star(j) = k_job_end + 1
Dim job_prioriteit(250) As String * 12
Ar_job_end(j) = k_job_end + m_job_duur
Dim job_voor(250) As String * 12
Ar_prev_spa(j) = 0
Dim job_achter(250) As String * 12
Ar_next_spa(j) = k_next_spa - m_job_duur
Dim job_id(250) As String * 12
Ar_prev_ptr(j) = k_act_ptr 'h_prev_ptr
Dim job_duur(250) As String * 12
Ar_next_ptr(j) = k_next_ptr
Dim job_due(250) As String * 12
' naar de vorige record gaan
110
Dim job_start(250) As String * 12
Line Input #1, StrJobseq
Dim job_einde(250) As String * 12
If i >= 1 Then
Dim plaats_voor(250) As String * 12
'string lezen en naar arrays brengen
Dim plaats_achter(250) As String * 12
StopInt = 1
Dim job_vdl(250) As String * 12
Do While StopInt < 999
Dim flow_time(250) As Double
Intpositie = InStr(1, StrJobseq, ZoekChar)
Dim tevroeg(250) As Double
If Intpositie > 0 Then
Dim telaat(250) As Double
' ; komt nog voor in de string
Dim voorraadwaarde(250) As Double
hulp = Left(StrJobseq, Intpositie - 1)
Dim jobnaam(250) As String
StrJobseq
Dim jobduur(250) As Double
=
Right(StrJobseq,
Len(StrJobseq)
-
Intpositie)
Dim jobvdl(250) As Double
Select Case StopInt
Dim aantalvoorhorizon As Integer
Case 1 job_prioriteit(i) = hulp
Dim som_flow_time As Double
Case 2 job_voor(i) = hulp
Dim gemiddelde_flow_time As Double
Case 3 job_achter(i) = hulp
Dim som_tevroeg As Double
Case 4 job_id(i) = hulp
Dim gemiddeld_tevroeg As Double
Case 5 job_due(i) = hulp
Dim som_telaat As Double
Case 6 job_duur(i) = hulp
Dim gemiddeld_telaat As Double
Case 7 job_start(i) = hulp
Dim som_voorraad As Double
Case 8 job_einde(i) = hulp
Dim gemiddelde_voorraad As Double
Case 9 plaats_voor(i) = hulp
Dim str_print As String
Case 10 plaats_achter(i) = hulp
Dim titels As String
Case 11 job_vdl(i) = hulp
Dim str_analysesom As String
Case 12 StopInt = 999
Dim str_analysegemiddeld As String
End Select Else
Private Sub Command1_Click()
StopInt = 999
Call lees_jobseq
End If
Call analyse
StopInt = StopInt + 1
Call geef_resultaten
Loop
End Sub
'ter controle eens afdruk van ingelezen gegevens
Private Sub lees_jobseq()
StrKopie = Str(i) + "/" + job_prioriteit(i) + "/" +
bijgevoegd job_voor(i) + "/" + job_achter(i) + "/" + job_id(i) + "/" +
Open "c:\schedul\jobseq.csv" For Input As #1
job_duur(i) + "/" + job_due(i) + "/" + job_start(i) + "/" +
Open "c:\schedul\jobschrijf.csv" For Output As #3
job_einde(i)
Call Initarrays
+
"/"
+
plaats_voor(i)
plaats_achter(i) + "/" + job_vdl(i) + "/" Print #3, StrKopie
ZoekChar = ";"
aantal_jobs = i - 2
i=0
Print #3, Str(aantal_jobs)
Do Until EOF(1)
111
+
"/"
+
Else
' we voeren de analyse uit tot de volgende job de
End If
tweede job is van jobseq.csv want we weten dat dit de
i=i+1
job EINDE is
Loop
Do Until volgende = 2
Close #1
flow_time(k)
Close #3
Val(job_einde(volgende))
jobvdl(k) = Val(job_vdl(volgende)) + job_id(volgende)
", 12)
If
", 12)
job_due(StopInt) = Left("
", 12)
job_start(StopInt) = Left("
", 12) ", 12)
plaats_achter(StopInt) = Left("
", 12)
<
0)
Then
' zo kunnen we onmiddellijk in onze analysetool de jobs vinden
die
voor
onze
planningshorizon
staan
ingepland, deze zijn aangeduid met een "!!!" voor hun job_id
", 12)
plaats_voor(StopInt) = Left("
(Val(job_start(volgende))
aantalvoorhorizon = aantalvoorhorizon + 1
", 12) ", 12)
job_vdl(StopInt) = Left("
If (Val(job_start(volgende)) < 0) Then jobnaam(k) = "!!!"
", 12)
job_duur(StopInt) = Left("
job_einde(StopInt) = Left("
+
jobduur(k) = Val(job_duur(volgende))
Do While StopInt < 251
job_id(StopInt) = Left("
1)
jobnaam(k) = job_id(volgende)
StopInt = 1
job_achter(StopInt) = Left("
-
som_flow_time = som_flow_time + flow_time(k)
Private Sub Initarrays()
job_voor(StopInt) = Left("
flow_time(k
If (Val(job_start(volgende)) < 0) Then flow_time(k) = 0
End Sub
job_prioriteit(StopInt) = Left("
=
If Val(job_due(volgende)) <= Val(job_einde(volgende)) Then
telaat(k)
=
Val(job_einde(volgende))
-
Val(job_due(volgende)) + 1
", 12)
som_telaat = som_telaat + telaat(k)
StopInt = StopInt + 1
tevroeg(k) = 0
Loop
ElseIf
End Sub
Val(job_due(volgende))
>
Val(job_einde(volgende)) Then
Private Sub analyse()
tevroeg(k)
=
Val(job_due(volgende))
-
Val(job_einde(volgende)) - 1
' de jobs moeten worden gesorteerd volgens hun
voorraadwaarde(k)
prioriteit. Daarvoor werd de variabele “volgende”
tevroeg(k)
aangemaakt. In jobseq.csv is de eerste job START.
If
volgende = Val(job_achter(1))
voorraadwaarde(k) = 0
' nemen we gewoon als variabele volgende de job die
som_tevroeg = som_tevroeg + tevroeg(k)
na START komt
telaat(k) = 0
k=1
som_voorraad = som_voorraad + voorraadwaarde(k)
flow_time(0) = 0
End If
som_telaat = 0
k=k+1
som_tevroeg = 0
volgende = Val(job_achter(volgende))
som_voorraad = 0
Loop
aantalvoorhorizon = 0
112
=
Val(job_vdl(volgende))
(Val(job_start(volgende))
<
0)
*
Then
gemiddelde_flow_time
=
Round(som_flow_time
/
Print #2, str_analysegemiddeld
aantal_jobs, 2)
str_print
gemiddeld_tevroeg
=
Round(som_tevroeg
/
=
";"
Print #2, str_print
gemiddeld_telaat = Round(som_telaat / aantal_jobs, 2)
Close #2
=
Round(som_voorraad
/
End Sub
aantal_jobs, 2)
Private Sub Command2_Click()
End Sub
Unload Me
Private Sub geef_resultaten()
End Sub
Open "c:\schedul\jobanalyse.csv" For Output As #2 titels = "job_id" + ";" + "job_duur" + ";" + "flow_time" + ";" + "telaat" + ";" + "tevroeg" + ";" + "liter_vdl" + ";" + "voorraadwaarde" Print #2, titels j=1 Do While j <= aantal_jobs str_print = jobnaam(j) + ";" str_print = str_print + Str(jobduur(j)) + ";" str_print = str_print + Str(flow_time(j)) + ";" str_print = str_print + Str(telaat(j)) + ";" str_print = str_print + Str(tevroeg(j)) + ";" str_print = str_print + Str(jobvdl(j)) + ";" str_print = str_print + Str(voorraadwaarde(j))+;" Print #2, str_print j=j+1 Loop str_print = "---------------" + ";" + "---------------" + ";" + "--------------" + ";" + "---------------" + ";" + "---------------" + ";" + "---------------" + ";" + "---------------" Print #2, str_print str_analysesom
"voorhorizon"
Str(aantalvoorhorizon)
aantal_jobs, 2) gemiddelde_voorraad
+
=
";"
+
"som"
+
";"
+
Str(som_flow_time) + ";" + Str(som_telaat) + ";" + Str(som_tevroeg) + ";;" + Str(som_voorraad) Print #2, str_analysesom str_analysegemiddeld = ";" + "gemiddelde" + ";" + Str(gemiddelde_flow_time)
+
";"
+
Str(gemiddeld_telaat) + ";" + Str(gemiddeld_tevroeg) + ";;" + Str(gemiddelde_voorraad)
113
+
";"
+
Appendix C Eerste fase experimenten EXPERIMENT 1
OVERLAPPING
0%
VRIJE RUIMTE
0% JOB_ID
FORWARD
DD ST CR
BOTTLENECK
JOB A
1
2
0
1,00
TE VROEG
voor horizon
JOB B
2
4
1
1,50
AFLOPEND
36
17
0
0
0
JOB C
3
7
3
2,00
OPLOPEND
19
37
0
0
0
JOB D
2
9
6
4,00
AFLOPEND
50
49
0
0
0
JOB E
1
10
8
9,00
OPLOPEND
0
0
0
0
0
JOB F
3
13
9
4,00
AFLOPEND
50
49
0
0
0
JOB G
2
15
12
7,00
OPLOPEND
0
0
0
0
0
JOB H
1
16
14
15,00
AFLOPEND
46
52
0
0
0
JOB I
2
18
15
8,50
OPLOPEND
11
5
0
0
0
JOB J
2
20
17
9,50
JOB_ID
PT
DD
ST
CR
JOB A
4
7
2
1,50
SORTERING
ST CR
OVERLAPPING
0%
VRIJE RUIMTE
25% BOTTLENECK
TE LAAT
TE VROEG
TE LAAT
TE VROEG
voor horizon
JOB B
5
14
8
2,60
AFLOPEND
23
59
0
0
0
JOB C
2
16
13
7,50
OPLOPEND
26
132
0
0
0
JOB D
3
20
16
6,33
AFLOPEND
43
125
0
0
0
JOB E
2
23
20
11,00
OPLOPEND
0
60
0
0
0
JOB F
3
27
23
8,67
AFLOPEND
43
125
0
0
0
JOB G
3
30
26
9,67
OPLOPEND
0
60
0
0
0
JOB H
1
31
29
30,00
AFLOPEND
39
139
0
0
0
JOB I
5
37
31
7,20
OPLOPEND
9
51
0
0
0
JOB J
2
41
38
20,00
JOB_ID
PT
DD
ST
CR
EXPERIMENT 3
OVERLAPPING
0%
VRIJE RUIMTE
50%
FORWARD SORTERING PT DD ST CR
CR
TE LAAT
FORWARD
DD
ST
TE VROEG
EXPERIMENT 2
PT
DD
TE LAAT
SORTERING PT
PT
BOTTLENECK
JOB A
2
6
3
2,50
TE LAAT
TE VROEG
TE LAAT
TE VROEG
voor horizon
JOB B
3
11
7
3,33
AFLOPEND
55
159
0
0
0
JOB C
2
14
11
6,50
OPLOPEND
0
174
0
0
0
JOB D
1
17
15
16,00
AFLOPEND
64
191
0
0
0
JOB E
3
21
17
6,67
OPLOPEND
0
151
0
0
0
JOB F
5
34
28
6,60
AFLOPEND
64
191
0
0
0
JOB G
5
40
34
7,80
OPLOPEND
0
151
0
0
0
JOB H
4
52
47
12,75
AFLOPEND
55
197
0
0
0
JOB I
3
58
54
19,00
OPLOPEND
9
145
0
0
0
JOB J
2
61
58
30,00
114
EXPERIMENT 4
OVERLAPPING
25%
VRIJE RUIMTE
0%
FORWARD SORTERING PT DD ST CR
BOTTLENECK
CR
TE VROEG
voor horizon
JOB A
3
5
1
0
13
0
JOB B
2
6
3
2,50
OPLOPEND
16
49
0
39
0
JOB C
1
7
5
6,00
AFLOPEND
62
59
0
7
0
JOB D
3
10
6
3,00 5,50
OPLOPEND
0
7
0
7
0
JOB E
2
12
9
AFLOPEND
62
64
0
37
0
JOB F
4
18
13
4,25
OPLOPEND
1
5
0
7
0
JOB G
1
16
14
15,00
AFLOPEND
46
66
0
39
0
JOB H
4
22
17
5,25
OPLOPEND
30
14
0
13
0
JOB I
1
23
21
22,00
JOB J
3
25
21
8,00
JOB_ID
PT
DD
ST
CR
JOB A
4
6
1
1,25
OVERLAPPING
25%
VRIJE RUIMTE
25% BOTTLENECK
TE LAAT
TE VROEG
TE LAAT
TE VROEG
voor horizon
JOB B
1
5
3
4,00
AFLOPEND
33
35
0
8
0
JOB C
3
11
7
3,33
OPLOPEND
24
88
0
22
0
JOB D
2
12
9
5,50
AFLOPEND
52
92
0
5
0
JOB E
4
16
11
3,75
OPLOPEND
0
26
0
8
0
JOB F
1
18
16
17,00
AFLOPEND
49
94
0
22
0
JOB G
3
20
16
6,33
OPLOPEND
1
24
0
8
0
JOB H
3
27
23
8,67
AFLOPEND
41
96
0
38
0
JOB I
2
29
26
14,00
OPLOPEND
17
28
0
8
0
JOB J
1
31
29
30,00
JOB_ID
PT
DD
ST
CR
JOB A
2
3
0
1,00
SORTERING
ST CR
1,33
TE LAAT
33
OVERLAPPING
25%
VRIJE RUIMTE
50%
FORWARD
DD
CR
TE VROEG
EXPERIMENT 6
PT
ST
62
SORTERING
ST
DD
TE LAAT
FORWARD
DD
PT
AFLOPEND
EXPERIMENT 5
PT
JOB_ID
BOTTLENECK
TE LAAT
TE VROEG
TE LAAT
TE VROEG
voor horizon
JOB B
1
4
2
3,00
AFLOPEND
36
84
0
16
0
JOB C
4
13
8
3,00
OPLOPEND
11
121
0
12
0
JOB D
3
15
11
4,67
AFLOPEND
53
128
0
6
0
JOB E
2
22
19
10,50
OPLOPEND
0
83
0
17
0
JOB F
1
27
25
26,00 10,00
AFLOPEND
53
130
0
14
0
JOB G
3
31
27
OPLOPEND
0
83
0
17
0
JOB H
4
34
29
8,25
AFLOPEND
50
141
0
12
0
JOB I
1
35
33
34,00
OPLOPEND
0
70
0
16
0
JOB J
3
37
33
12,00
115
EXPERIMENT 7
OVERLAPPING
50%
VRIJE RUIMTE
0%
FORWARD SORTERING PT DD ST CR
BOTTLENECK
CR
TE LAAT
TE VROEG
voor horizon
JOB B
1
4
2
3,00
0
28
0
JOB C
4
10
5
2,25
OPLOPEND
24
71
0
28
0
JOB D
4
12
7
2,75
AFLOPEND
58
83
0
13
0
JOB E
3
17
13
5,33
OPLOPEND
0
13
0
12
0
JOB F
3
19
15
6,00
AFLOPEND
57
84
0
11
0
JOB G
2
22
19
10,50
OPLOPEND
0
13
0
12
0
JOB H
2
24
21
11,50
AFLOPEND
51
85
0
11
0
JOB I
1
23
21
22,00
OPLOPEND
10
14
0
18
0
JOB J
2
25
22
12,00
JOB_ID
PT
DD
ST
CR
JOB A
1
5
3
4,00
OVERLAPPING
50%
VRIJE RUIMTE
25% BOTTLENECK
TE LAAT
TE VROEG
TE LAAT
TE VROEG
voor horizon
JOB B
2
6
3
2,50
AFLOPEND
55
50
0
12
0
JOB C
3
8
4
2,33
OPLOPEND
13
70
0
10
0
JOB D
2
13
10
6,00
AFLOPEND
61
79
0
9
0
JOB E
1
14
12
13,00
OPLOPEND
0
34
0
10
0
JOB F
4
16
11
3,75
AFLOPEND
58
80
0
14
0
JOB G
4
20
15
4,75
OPLOPEND
0
31
0
11
0
JOB H
3
26
22
8,33
AFLOPEND
48
87
0
23
1
JOB I
3
27
23
8,67
OPLOPEND
20
33
0
12
0
JOB J
1
33
31
32,00
SORTERING
ST CR
2,00
25
OVERLAPPING
50%
VRIJE RUIMTE
50%
FORWARD
DD
CR
2
TE VROEG
EXPERIMENT 9
PT
ST
5
34
SORTERING
ST
DD
2
TE LAAT
FORWARD
DD
PT
JOB A
AFLOPEND
EXPERIMENT 8
PT
JOB_ID
TE LAAT
JOB_ID
PT
DD
ST
CR
BOTTLENECK
JOB A
4
7
2
1,50
10
11,00
TE VROEG
TE LAAT
TE VROEG
voor horizon
JOB B
1
12
AFLOPEND
15
75
0
13
0
JOB C
4
14
9
3,25
OPLOPEND
17
143
0
13
0
JOB D
1
20
18
19,00
AFLOPEND
33
125
0
9
0
JOB E
2
23
20
11,00
OPLOPEND
0
95
0
13
0
JOB F
2
24
21
11,50
AFLOPEND
30
126
0
9
0
JOB G
1
30
28
29,00 15,00
OPLOPEND
0
91
0
13
0
JOB H
2
31
28
AFLOPEND
25
145
0
9
0
JOB I
4
37
32
9,00
OPLOPEND
6
73
0
13
0
JOB J
3
37
33
12,00
116
EXPERIMENT 10
OVERLAPPING
75%
VRIJE RUIMTE
0%
FORWARD SORTERING PT DD ST CR
BOTTLENECK
CR
TE LAAT
TE VROEG
voor horizon
JOB B
3
13
9
4,00
0
59
2
JOB C
2
11
8
5,00
OPLOPEND
6
65
0
46
1
JOB D
4
12
7
2,75
AFLOPEND
43
53
0
38
0
JOB E
1
15
13
14,00
OPLOPEND
0
38
0
32
0
JOB F
1
17
15
16,00
AFLOPEND
37
60
0
62
2
JOB G
4
20
15
4,75
OPLOPEND
0
62
0
35
0
JOB H
1
19
17
18,00
AFLOPEND
24
78
0
67
2
JOB I
3
24
20
7,67
OPLOPEND
36
30
0
59
1
JOB J
4
25
20
6,00
JOB_ID
PT
DD
ST
CR
JOB A
1
17
15
16,00 9,00
OVERLAPPING
75%
VRIJE RUIMTE
25% BOTTLENECK
TE LAAT
TE VROEG
TE LAAT
TE VROEG
voor horizon
JOB B
2
19
16
AFLOPEND
8
92
0
68
0
JOB C
3
21
17
6,67
OPLOPEND
0
126
0
61
0
JOB D
2
22
19
10,50
AFLOPEND
14
115
0
49
0
JOB E
4
25
20
6,00
OPLOPEND
0
109
0
58
0
JOB F
3
26
22
8,33 13,00
AFLOPEND
14
115
0
49
0
JOB G
2
27
24
OPLOPEND
0
109
0
58
0
JOB H
3
29
25
9,33
AFLOPEND
0
125
0
38
0
JOB I
2
30
27
14,50
OPLOPEND
8
93
0
68
0
JOB J
2
31
28
15,00
SORTERING
ST CR
9,00
35
OVERLAPPING
75%
VRIJE RUIMTE
50%
FORWARD
DD
CR
8
TE VROEG
EXPERIMENT 12
PT
ST
10
46
SORTERING
ST
DD
1
TE LAAT
FORWARD
DD
PT
JOB A
AFLOPEND
EXPERIMENT 11
PT
JOB_ID
TE LAAT
JOB_ID
PT
DD
ST
CR
BOTTLENECK
JOB A
2
17
14
8,00
TE VROEG
TE LAAT
TE VROEG
voor horizon
JOB B
1
19
17
18,00 5,00
AFLOPEND
7
81
0
86
0
JOB C
4
21
16
OPLOPEND
0
136
0
46
0
JOB D
3
22
18
7,00
AFLOPEND
13
110
0
53
0
JOB E
2
25
22
12,00
OPLOPEND
0
113
0
48
0
JOB F
1
26
24
25,00
AFLOPEND
10
116
0
44
0
JOB G
1
27
25
26,00
OPLOPEND
0
107
0
54
0
JOB H
4
29
24
7,00
AFLOPEND
4
138
0
44
0
JOB I
3
30
26
9,67
OPLOPEND
4
81
0
85
0
JOB J
3
31
27
10,00
117
EXPERIMENT 13
OVERLAPPING
100%
VRIJE RUIMTE
0% JOB_ID
FORWARD
DD ST CR
JOB A
4
17
12
JOB B
3
16
12
5
AFLOPEND
2
42
0
86
JOB C
2
18
15
8,5
OPLOPEND
6
102
0
63
0
JOB D
1
22
20
21
JOB E
2
19
16
9 6,7
voor horizon 0
AFLOPEND
14
96
0
54
0
OPLOPEND
0
55
0
52
0
JOB F
3
21
17
AFLOPEND
13
99
0
50
0
JOB G
4
23
18
5,5
OPLOPEND
0
51
0
52
0
JOB H
2
24
21
11,5
AFLOPEND
13
108
0
42
0
JOB I
1
25
23
24
OPLOPEND
2
43
0
86
0
JOB J
2
25
22
12
PT
DD
ST
OVERLAPPING
100%
VRIJE RUIMTE
25%
FORWARD
CR
BOTTLENECK
JOB A
1
20
18
19,00
TE VROEG
TE LAAT
TE VROEG
JOB B
2
21
18
10,00
AFLOPEND
5
85
0
92
voor horizon 0
JOB C
1
22
20
21,00
OPLOPEND
0
142
0
62
0
JOB D
3
23
19
7,33 11,50
AFLOPEND
8
104
0
76
0
JOB E
2
24
21
OPLOPEND
0
132
0
62
0
JOB F
3
26
22
8,33
AFLOPEND
7
106
0
73
0
JOB G
4
30
25
7,25
OPLOPEND
0
124
0
70
0
JOB H
3
27
23
8,67
AFLOPEND
0
142
0
62
0
JOB I
4
30
25
7,25
92
0
JOB J
1
30
28
29,00
EXPERIMENT 15
5
85
0
OVERLAPPING
100%
VRIJE RUIMTE
50% JOB_ID
FORWARD SORTERING
DD ST CR
CR
TE LAAT
OPLOPEND
PT
4
BOTTLENECK TE VROEG
SORTERING
ST
CR
TE LAAT
JOB_ID
DD
ST
TE VROEG
EXPERIMENT 14
PT
DD
TE LAAT
SORTERING PT
PT
PT
DD
ST
BOTTLENECK
JOB A
1
37
35
CR 36,00 25,00
TE LAAT
TE VROEG
TE LAAT
TE VROEG
1
26
24
0
151
0
67
voor horizon 0
JOB B
AFLOPEND
JOB C
2
27
24
13,00
OPLOPEND
0
207
0
45
0
JOB D
2
28
25
13,50
AFLOPEND
0
182
0
66
0
JOB E
3
30
26
9,67 10,00
OPLOPEND
0
182
0
66
0
JOB F
3
31
27
AFLOPEND
0
178
0
60
0
JOB G
4
34
29
8,25
OPLOPEND
0
181
0
66
0
JOB H
4
35
30
8,50
AFLOPEND
0
207
0
45
0
JOB I
2
36
33
17,50
OPLOPEND
0
151
0
67
0
JOB J
2
37
34
18,00
118
Appendix D Tweede fase experimenten 1) De gewone sorteringsregels Lijst 1 BOTTLENECK 1ste SORTERING 2de SORTERING PT
aflopend
PT
oplopend
DD
aflopend
DD
oplopend
ST
aflopend
ST
oplopend
CR
aflopend
CR
oplopend
te laat te vroeg voorraad
voor planningshorizon
DD DD VDL VDL DD DD VDL VDL
aflopend oplopend aflopend oplopend aflopend oplopend aflopend oplopend
0 0 0 0 0 0 0 0
4651 8086 7957 8288 4651 4593 4572 4672
4212106 8443231 7036817 7540782 4212106 4448984 4379237 4288653
2 2 3 5 2 2 2 2
PT PT VDL VDL PT PT VDL VDL
aflopend oplopend aflopend oplopend aflopend oplopend aflopend oplopend
0 0 0 0 0 0 0 0
5674 4295 4850 5020 5285 4283 4444 5024
5263678 4063822 4150520 5104812 5305079 3889443 3856188 5364522
3 1 2 2 1 1 1 1
PT PT VDL VDL PT PT VDL VDL
aflopend oplopend aflopend oplopend aflopend oplopend aflopend oplopend
0 0 0 0 0 0 0 0
3680 3656 3680 3656 5128 5128 5128 5128
3578431 3594191 3535407 3594191 5600334 5600334 5512810 5600334
1 1 1 1 1 1 1 1
PT PT VDL VDL PT PT VDL VDL
aflopend oplopend aflopend oplopend aflopend oplopend aflopend oplopend
0 0 0 0 0 0 0 0
7572 7572 7572 7572 7501 7501 7501 7501
3966302 3966302 3966302 3988314 7767432 7767432 7767432 7767432
11 11 11 11 2 2 2 2
Lijst 2 BOTTLENECK 1ste SORTERING 2de SORTERING PT
aflopend
DD DD VDL VDL
aflopend oplopend aflopend oplopend
te laat te vroeg voorraad 0 0 0 0
119
5530 5973 5930 5943
3002327 3664141 3409983 3612676
voor planningshorizon 5 5 5 5
PT
oplopend
DD
aflopend
DD
oplopend
ST
aflopend
ST
oplopend
CR
aflopend
CR
oplopend
DD DD VDL VDL PT PT VDL VDL PT PT VDL VDL
aflopend oplopend aflopend oplopend aflopend oplopend aflopend oplopend aflopend oplopend aflopend oplopend
0 0 0 0 0 0 0 0 0 0 0 0
6946 4606 4626 4606 3614 2662 3586 2688 4344 2982 4268 2985
6911297 5218361 5215222 5218361 2486386 2496438 2448817 2533425 3103348 3174562 3073322 3176271
7 3 3 3 2 3 2 3 3 3 3 3
PT PT VDL VDL PT PT VDL VDL
aflopend oplopend aflopend oplopend aflopend oplopend aflopend oplopend
0 0 0 0 0 0 0 0
2840 2828 2840 2828 4465 4465 4465 4465
2631332 2633063 2631182 2633063 3231294 3231294 3231444 3231294
4 4 4 4 4 4 4 4
PT PT VDL VDL PT PT VDL VDL
aflopend oplopend aflopend oplopend aflopend oplopend aflopend oplopend
0 0 0 0 0 0 0 0
9186 9186 9186 9186 6564 6564 6564 6564
6542462 6542462 6542312 6542462 4105567 4105567 4105717 4105567
15 15 15 15 6 6 6 6
Lijst 3 BOTTLENECK 1ste SORTERING 2de SORTERING PT
aflopend
PT
oplopend
DD
aflopend
DD
oplopend
ST
aflopend
te laat te vroeg voorraad
voor planningshorizon
DD DD VDL VDL DD DD VDL VDL
aflopend oplopend aflopend oplopend aflopend oplopend aflopend oplopend
0 0 0 0 0 0 0 0
4353 4353 4381 4381 2409 2389 2389 2389
3362918 3362918 3378126 3434826 4040756 3711261 3705161 3711261
1 1 1 1 2 2 2 2
PT PT VDL VDL PT PT VDL VDL
aflopend oplopend aflopend oplopend aflopend oplopend aflopend oplopend
0 0 0 0 0 0 0 0
3226 1967 3215 1978 3153 2444 2389 2449
2769366 2750769 2736711 2777324 4047329 4088110 3705161 4118835
1 2 1 2 1 2 2 2
PT PT VDL VDL
aflopend oplopend aflopend oplopend
0 0 0 0
2027 2100 2027 2100
3067859 3190985 3061759 3190985
2 2 2 2
120
ST
oplopend
CR
aflopend
CR
oplopend
PT PT VDL VDL PT PT VDL VDL PT PT VDL VDL
aflopend oplopend aflopend oplopend aflopend oplopend aflopend oplopend aflopend oplopend aflopend oplopend
0 0 0 0 0 0 0 0 0 0 0 0
2409 3339 2409 3339 3610 3610 3610 3610 4339 4339 4339 4339
4040756 3401609 4034656 3407709 7279438 7279438 7273338 7279438 3243915 3243915 3193485 3243915
2 1 2 1 5 5 5 5 1 1 1 1
Lijst 4 BOTTLENECK 1ste SORTERING 2de SORTERING PT
aflopend
PT
oplopend
DD
aflopend
DD
oplopend
ST
aflopend
ST
oplopend
CR
aflopend
CR
oplopend
te laat te vroeg voorraad
voor planningshorizon
DD DD VDL VDL DD DD VDL VDL
aflopend oplopend aflopend oplopend aflopend oplopend aflopend oplopend
0 0 0 0 0 0 0 0
5052 4998 4998 5052 3147 2858 2846 2846
2588913 2547073 2519718 2613548 4803882 4449300 4416090 4416090
0 0 0 0 0 0 0 0
PT PT VDL VDL PT PT VDL VDL
aflopend oplopend aflopend oplopend aflopend oplopend aflopend oplopend
0 0 0 0 0 0 0 0
3904 2341 3851 2392 3663 2868 3559 2893
2511319 2518275 2412165 2628299 3910785 4380765 3779028 4457107
0 0 0 0 0 0 0 0
PT PT VDL VDL PT PT VDL VDL
aflopend oplopend aflopend oplopend aflopend oplopend aflopend oplopend
0 0 0 0 0 0 0 0
2436 2436 2436 2436 3654 3654 3654 3654
2835280 2835280 2823910 2835280 3730150 3730150 3708060 3708060
0 0 0 0 0 0 0 0
PT PT VDL VDL PT PT VDL VDL
aflopend oplopend aflopend oplopend aflopend oplopend aflopend oplopend
0 0 0 0 0 0 0 0
3500 3500 3500 3500 4814 4814 4814 4814
5196450 5196450 5196450 5196450 2426033 2426033 2426033 2426033
1 1 1 1 0 0 0 0
121
Lijst 5 BOTTLENECK 1ste SORTERING 2de SORTERING PT
aflopend
PT
oplopend
DD
aflopend
DD
oplopend
ST
aflopend
ST
oplopend
CR
aflopend
CR
oplopend
te laat te vroeg voorraad
voor planningshorizon
DD DD VDL VDL DD DD VDL VDL
aflopend oplopend aflopend oplopend aflopend oplopend aflopend oplopend
0 0 0 0 0 0 0 0
4298 4301 4301 4301 2798 2810 2810 2802
2689828 2703628 2681517 2709463 4767305 4775705 4761420 4784705
0 0 0 0 0 0 0 0
PT PT VDL VDL PT PT VDL VDL
aflopend oplopend aflopend oplopend aflopend oplopend aflopend oplopend
0 0 0 0 0 0 0 0
3321 2251 3276 2296 4164 3350 3970 3254
2525682 2407166 2444152 2485811 4585028 5181845 4426753 5208360
0 0 0 0 0 0 0 0
PT PT VDL VDL PT PT VDL VDL
aflopend oplopend aflopend oplopend aflopend oplopend aflopend oplopend
0 0 0 0 0 0 0 0
2369 2369 2369 2369 4126 4126 4126 4126
2725791 2725791 2722906 2725791 4038579 4038579 4031206 4038579
0 0 0 0 0 0 0 0
PT PT VDL VDL PT PT VDL VDL
aflopend oplopend aflopend oplopend aflopend oplopend aflopend oplopend
0 0 0 0 0 0 0 0
2798 2798 2798 2798 4302 4302 4302 4302
4767305 4767305 4764420 4767305 2704053 2704053 2704053 2704053
0 0 0 0 0 0 0 0
2) aantal liter zilver in de emulsie: VDL Lijst 1 BOTTLENECK 1ste SORTERING 2de SORTERING VDL
aflopend
VDL
oplopend
PT PT DD DD PT PT DD DD
aflopend oplopend aflopend oplopend aflopend oplopend aflopend oplopend
te laat te vroeg voorraad 0 0 0 0 0 0 0 0
122
4765 4321 4760 4321 4510 4441 4534 4442
2954142 2693902 2947562 2693902 5449641 5375441 5791613 5376491
voor planningshorizon 2 2 2 2 3 3 2 3
Lijst 2 BOTTLENECK 1ste SORTERING 2de SORTERING VDL aflopend PT aflopend PT oplopend DD aflopend DD oplopend VDL oplopend PT aflopend PT oplopend DD aflopend DD oplopend
te laat te vroeg 0 6414 0 6414 0 6075 0 6414 0 5112 0 5159 0 7266 0 5112
voorraad 2939859 2939859 3165222 2939859 5583008 5591878 8073688 5583008
voor planningshorizon 8 8 6 8 5 5 6 5
te laat te vroeg voorraad
voor planningshorizon
Lijst 3 BOTTLENECK 1ste SORTERING 2de SORTERING VDL
aflopend
VDL
oplopend
PT PT DD DD PT PT DD DD
aflopend oplopend aflopend oplopend aflopend oplopend aflopend oplopend
0 0 0 0 0 0 0 0
4183 4183 4180 4183 2553 2559 2884 2553
2837533 2772933 2771779 2837533 4642345 4650815 7163544 4642345
1 1 1 1 2 2 2 2
Lijst 4 BOTTLENECK 1ste SORTERING 2de SORTERING VDL
aflopend
VDL
oplopend
PT PT DD DD PT PT DD DD
aflopend oplopend aflopend oplopend aflopend oplopend aflopend oplopend
te laat te vroeg voorraad 0 0 0 0 0 0 0 0
5013 5003 5008 5008 3490 3308 3545 3308
2522678 2508503 2510503 2510503 5467643 5316174 5607049 5316174
voor planningshorizon 0 0 0 0 0 0 0 0
Lijst 5 BOTTLENECK 1ste SORTERING 2de SORTERING VDL
aflopend
VDL
oplopend
PT PT DD DD PT PT DD DD
aflopend oplopend aflopend oplopend aflopend oplopend aflopend oplopend
te laat te vroeg voorraad 0 0 0 0 0 0 0 0
123
4072 4095 4072 4095 2838 2830 2834 2830
2551177 2567707 2551177 2567707 5047720 5035720 5041720 5035720
voor planningshorizon 0 0 0 0 0 0 0 0
3) gewogen duurtijd Lijst 1 BOTTLENECK 1ste SORTERING 2de SORTERING gewogen duurtijd aflopend
aflopend oplopend aflopend oplopend
0 0 0 0
7003 7003 4707 4707
5148898 5148898 4899592 4899592
2 2 2 2
aflopend gewogen duurtijd aflopend gewogen duurtijd oplopend
0 0
7003 4707
5148898 4899592
2 2
gewogen duurtijd oplopend DD
DD DD DD DD
te laat te vroeg voorraad voor horizon
Lijst 2 BOTTLENECK 1ste SORTERING 2de SORTERING te laat te vroeg gewogen duurtijd aflopend DD aflopend 0 5920 DD oplopend 0 6419 gewogen duurtijd oplopend DD aflopend 0 7683 DD oplopend 0 5115 DD
aflopend gewogen duurtijd aflopend gewogen duurtijd oplopend
0 0
3611 2663
voorraad voor horizon 3157400 5 3449926 5 7191327 10 5556939 3 2483312 2498930
2 3
Lijst 3 BOTTLENECK 1ste SORTERING 2de SORTERING gewogen duurtijd aflopend
aflopend oplopend aflopend oplopend
0 0 0 0
4415 4418 2497 2502
3169512 3170666 4449095 4461595
1 1 2 2
aflopend gewogen duurtijd aflopend gewogen duurtijd oplopend
0 0
3217 1976
2737791 2776244
1 2
gewogen duurtijd oplopend DD
DD DD DD DD
te laat te vroeg voorraad voor horizon
Lijst 4 BOTTLENECK 1ste SORTERING 2de SORTERING gewogen duurtijd aflopend
aflopend oplopend aflopend oplopend
0 0 0 0
4987 4987 3342 3342
2476998 2476998 4878900 4878900
0 0 1 1
aflopend gewogen duurtijd aflopend gewogen duurtijd oplopend
0 0
3783 2303
2380384 2506215
0 0
gewogen duurtijd oplopend DD
DD DD DD DD
te laat te vroeg voorraad voor horizon
124
Lijst 5 BOTTLENECK 1ste SORTERING 2de SORTERING gewogen duurtijd aflopend
aflopend oplopend aflopend oplopend
0 0 0 0
4218 4218 2766 2770
2659867 2659867 4873075 4879075
0 0 0 0
aflopend gewogen duurtijd aflopend gewogen duurtijd oplopend
0 0
3305 2265
2479717 2449196
0 0
gewogen duurtijd oplopend DD
DD DD DD DD
te laat te vroeg voorraad voor horizon
4) crossing duurtijd Lijst 1 BOTTLENECK 1ste SORTERING 2de SORTERING DD
aflopend
te laat te vroeg voorraad
crossing duurtijd aflopend
0
4487
3965660
voor horizon 2
Lijst 2 BOTTLENECK 1ste SORTERING 2de SORTERING te laat te vroeg voorraad DD aflopend crossing duurtijd aflopend 0 3343 2380168
voor horizon 2
Lijst 3 BOTTLENECK 1ste SORTERING 2de SORTERING DD
aflopend
crossing duurtijd
te laat te vroeg voorraad
aflopend
0
3016
2662685
voor horizon 1
Lijst 4 BOTTLENECK 1ste SORTERING 2de SORTERING DD
aflopend
crossing duurtijd
te laat te vroeg voorraad
aflopend
0
3524
2253319
voor horizon 0
Lijst 5 BOTTLENECK 1ste SORTERING 2de SORTERING DD
aflopend
crossing duurtijd
te laat te vroeg voorraad
aflopend
125
0
3061
2318632
voor horizon 0
5) gewogen VDL Lijst 1 BOTTLENECK 1ste SORTERING 2de SORTERING DD
aflopend
gewogen VDL
te laat
aflopend
0
te vroeg voorraad 4418
3972490
voor horizon 1
Lijst 2 BOTTLENECK 1ste SORTERING 2de SORTERING DD
aflopend
gewogen VDL
te laat te vroeg voorraad
aflopend
0
3166
2361353
voor horizon 2
Lijst 3 BOTTLENECK 1ste SORTERING 2de SORTERING DD
aflopend
gewogen VDL
te laat te vroeg voorraad
aflopend
0
2614
2756334
voor horizon 2
Lijst 4 BOTTLENECK 1ste SORTERING 2de SORTERING DD
aflopend
gewogen VDL
te laat te vroeg voorraad
aflopend
0
3118
2181937
voor horizon 0
Lijst 5 BOTTLENECK 1ste SORTERING 2de SORTERING DD
aflopend
gewogen VDL
aflopend
te laat te vroeg voorraad 0
2661
2258369
voor horizon 0
6) huidige planning Agfa: oplopende DD/gewogen VDL Lijst 1 BOTTLENECK 1ste SORTERING 2de SORTERING DD
oplopend
gewogen VDL
aflopend
te laat 0
te vroeg voorraad 4327
3772267
voor horizon 1
Lijst 2 BOTTLENECK 1ste SORTERING 2de SORTERING DD
oplopend
gewogen VDL
aflopend
te laat te vroeg voorraad 0
4094
3035728
voor horizon 3
Lijst 3 BOTTLENECK 1ste SORTERING 2de SORTERING DD
oplopend
gewogen VDL
aflopend
te laat te vroeg voorraad 0
126
2913
4013433
voor horizon 1
Lijst 4 BOTTLENECK 1ste SORTERING 2de SORTERING DD
oplopend
gewogen VDL
aflopend
te laat te vroeg voorraad 0
3238
3829262
voor horizon 0
Lijst 5 BOTTLENECK 1ste SORTERING 2de SORTERING DD
oplopend
gewogen VDL
aflopend
te laat te vroeg voorraad 0
127
3499
4477133
voor horizon 0