Een Hiërarchische Aanpak voor Productieplanning in een...
Transcript of Een Hiërarchische Aanpak voor Productieplanning in een...
Andy Cole
een Chemisch Proces: Casestudie van LanxessEen Hiërarchische Aanpak voor Productieplanning in
Academiejaar 2008-2009Faculteit IngenieurswetenschappenVoorzitter: prof. dr. ir. Hendrik Van LandeghemVakgroep Technische bedrijfsvoering
operationeel onderzoekMaster in de ingenieurswetenschappen: bedrijfskundige systeemtechnieken en
Masterproef ingediend tot het behalen van de academische graad van
Begeleiders: Carles Sitompul, Patrick MissiaenPromotor: prof. dr. El-Houssaine Aghezzaf
Development of a Hierarchical Production Planningin a Chemical Process: Casestudy of Lanxess
Andy Cole
Supervisor(s): prof. dr. El-Houssaine Aghezzaf, Patrick Missiaen
Abstract— A Mixed Integer Linear Programming model is proposed inthis paper that targets the optimal production scheduling for a specificchemical process. The model takes into account all the standard con-straints encountered in production scheduling. There are also some con-straints that are typical for this chemical process such as sequence depen-dent changeovers. The ultimate goal is a production plan that states whathas to be produced every month by using the theory of Hierarchical Pro-duction Planning. The model is applied to a chemical production plant,Lanxess located in Belgium.
Keywords— Hierarchical Production Planning, Time Aggregation,Sequence-Dependent Changeovers, Linear Programming, Optimization,Chemical Process
I. INTRODUCTION
HIERARCHICAL production planning is a well-covereddomain in the literature. Instead of one model, it uses sev-
eral models on different levels. Most of the time, the models arelinked with the different managerial decision areas. The strate-gic or first level looks for the best production planning on a longrolling horizon, typically one year ahead. The following levelsare considered as more operational, more in-depth levels, butover a shorter time span.
Between these levels, there is a need for a carefully thought-out aggregation and disaggregation procedure. The upper levelmakes estimations for the production of large groups of productsover a long time, while the lower level splits these estimationsto the specific products in a shorter time period. This aggrega-tion also means that you need aggregated parameters for productgroups. To make an estimation of these parameters, you oftenneed some iterative procedures between the different levels. Sothis method is not just a top-down approach.
The big advantage of hierarchical production planning is thegain in computational effort because you can solve some smallerproblems instead of one big. On the other hand, due to the splitin different levels, the optimal solution can never be reached.Some accuracy is lost on each level and in the end, you can onlyreach a suboptimal solution. The relatively fast way though tocome to this solution is a big advantage.
II. AIMS
The ultimate aim is to create models in a hierarchical waywhich provides realistic and optimal production estimations fora chemical process. The model ensures that the production goalsare met, while the costs are minimized. The costs include vari-able production costs, inventory costs, changeover costs andshortage costs. The model should also cope with a list of 103
A. Cole is with the Industrial Management Department, Ghent University(UGent), Gent, Belgium. E-mail: [email protected] .
constraints provided by the company. In the end, we shouldhave estimates of the product quantities for each month.
III. SOLUTION
Because of the small amount of products and because none ofthe products can be seen as almost similar, it is not relevant toaggregate the products in groups. We only use the aggregationin time. For the first model, we use a rolling planning horizonfrom 12 months with a planningsbucket of one month, for thesecond model, we use a bucket from one day with a horizon ofone month.
The solution algorithm looks like in figure 1
Fig. 1. Solution algorithm
First, we solve the first phase. This one looks for the cheapestsolution for the coming twelve months and gives the first esti-mates of the product quantities.
Thereafter, phase two checks for each month seperately ifthe proposed estimation is feasible or not. This phase tries tomake a schedule for the whole estimation and minimizes the to-tal makespan.
After the scheduling, the analysis part checks if the makespanis smaller than the available amount of days in that month. If themakespan is smaller, which means that the scheduling is feasi-ble, we verify if there are some days at the end of the monthwhich are not used for the scheduling. If this is the case, wememorise these days and use them for solving problems in an-other month. In the end, we move on to the next month in phase2.
If the makespan is not smaller, it means that the schedulingis not feasible. We try to solve the problem by using the freedays from a month before. If there are no free days availablewe return to phase one and make new estimates for the wholeproduction planning after restricting capacity. The whole storygoes about: ’Are there enough days to schedule the planning inthe month?’, so if we have for example two days in shortage, wego back to phase one and solve it again with a difference on theamount of days for the particular month from two days.
IV. APPLIED TO THE CASE
The most difficult part exists in translating all the restrictionsto the different levels. Most of the restrictions are written indays and tell something about the flow between the products indays. Therefore it is not that easy to make the aggregation to thefirst level, because the only thing we could model at this level isthe flow between two months.
So the main part is the modelling of the first phase in orderto make very accurate estimates, which should avoid a lot ofproblems in the second phase. For the real mathematical part ofthis work, we like to refer to the whole work because it is reallyinteresting to discover how we solved all aggregation problemsexcept for one.
There is one type of restriction that we did not include in themodel. All the restrictions about forbidden days for changeoversare ignored. This is normally a typical restriction for the secondphase, but if it is not managed in the first one, there could be alot of problems in the second one, because the production cam-paigns must wait on the correct day to start a changeover. Thisleads to a lot of capacity losses and with an estimation lookingfor the smallest shortage cost, each capacity loss creates prob-lems in the second phase. Because of implementation difficul-ties we ignored them in the first phase.
V. RESULTS
The first phase works perfectly and gives wonderfull estima-tions. The only disadvantage is the calculation time. At thismoment, starting from three hours or more, you can reach asolution which is very close to an optimal one. In the secondphase, unfortunately, there is a small error. This is no big prob-lem, though, due to the large calculation time of the first phase.The feedback mechanism could not be triggered too much, sothat the calculation time would not boom. That is the reasonwhy the first phase is needed to be as accurate as possible. Sothe first phase could actually be used on his own.
VI. CONCLUSION
At this moment, there are three problems that we do not solve.Firstly, we have the small error in phase two. This is actuallynot a real problem. Secondly, we have the large calculation time
and thirdly, we have ignored the restrictions about the forbiddendays for changeovers.
For the last two problems, We propose to make some adap-tations in the solution algorithm. Instead of checking for eachmonth if the planning is feasible, it’s justifiable to only check thefirst two months, because the planning after these two monthswill certainly change. This adaptation means that there is atmost two times a feedback which implies a great reduction incalculation time.
Second adaption: if we just check the first two months itis allowed to only implement the restrictions about forbiddenchangeovers for the first two months in the first phase.
After implementing these last adaptations, we are sure thatthe output from the hierarchical planning gives great results forthis specific problem.
ACKNOWLEDGMENTS
The author would like to thank prof. dr. E.H. Aghezzaf andP. Missiaen for their much needed and appreciated help.
REFERENCES
[1] Sven Axsater, “Aggregation of product data for hierarchical productionplanning,” Operations Research, vol. 29, no. 4, pp. 744–756, 1981.
[2] Gabriel R. Bitran, Elizabeth A. Haas, and Arnoldo C. Hax, “Hierarchicalproduction planning: A single stage system,” Operations Research, vol.29, no. 4, pp. 717–743, 1981.
[3] Gabriel R. Bitran, Elizabeth A. Haas, and Arnoldo C. Hax, “Hierarchicalproduction planning: A two-stage system,” Operations Research, vol. 30,no. 2, pp. 232–251, 1982.
[4] Gabriel R. Bitran and Arnoldo C. Hax, “Disaggregation and resource al-location using convex knapsack problems with bounded variables,” Man-agement Science, vol. 27, no. 4, pp. 431–441, 1981.
[5] J. Erschler, G. Fontan, and C. Merce, “Consistency of the disaggregationprocess in hierarchical planning,” Operations Research, vol. 34, no. 3, pp.464–469, 1986.
[6] Matthew J. Liberatore and Tan Miller, “A Hierarchical Production Plan-ning System,” INTERFACES, vol. 15, no. 4, pp. 1–11, 1985.
[7] M. M. Qiu and E. E. Burch, “Hierarchical production planning andscheduling in a multi-product, multi-machine environment.,” InternationalJournal of Production Research, vol. 35, no. 11, pp. 3023 – 3042, 1997.
[8] Germaine H. Saad, “Hierarchical production-planning systems: Exten-sions and modifications,” The Journal of the Operational Research Soci-ety, vol. 41, no. 7, pp. 609–624, 1990.
[9] E. Vicens, M. E. Alemany, C. Andrs, and J. J. Guarch, “A design and ap-plication methodology for hierarchical production planning decision sup-port systems in an enterprise integration context,” International Journalof Production Economics, vol. 74, no. 1-3, pp. 5 – 20, 2001.
[10] Gabriel R. Bitran and Arnoldo C. Hax, “On the Design of HierarchicalProduction Planning Systems,” Decision Sciences, vol. 8, no. 1, pp. 28–55, 1977.
i
Voorwoord
In dit voorwoord wil ik in de allereerste plaats mijn promotor prof. dr. El-Houssaine
Aghezzaf bedanken om mij de mogelijkheid aan te bieden deze thesis uit te voeren en om
mij hierin vervolgens te ondersteunen en te begeleiden als geen ander. Dankzij zijn hulp
was ik in staat om deze thesis uit te werken tot wat het geworden is. Bedankt om tijd te
maken voor al mijn ’kleine’ problemen op elk moment van de dag en voor de opbouwende
commentaren.
Ik zou ook nadrukkelijk de heer Patrick Missiaen willen bedanken voor het geduld dat hij
aan de dag heeft gelegd bij elke vraag die ik stelde. De eindeloze emailcorrespondentie over
de probleemsituatie bij Lanxess spreekt hier voor zich. Maar ook bedankt voor de kritische
blik op mijn resultaten om zo tot een correct model te kunnen komen.
De mensen van de vakgroep technische bedrijfsvoering die me geholpen hebben bij andere
technische en niet-technische problemen verdienen ook een dankjewel. Hulp bij het program-
meergedeelte of een vriendelijke goedemorgen als het weer eens veel te vroeg was, waren een
enorme opsteker.
Voorts zou ik graag m’n metgezellen uit de PC-klas van Zwijnaarde willen bedanken. Zon-
der jullie was het daar vrij stil en eenzaam. Bedankt voor de vele droge moppen, de kleine
ironische opmerkingen en de ’feestjes’ overdag. Ze waren een welgekomen bron van afwisse-
ling.
Mijn gezinsleden ben ik onnoemelijk dankbaar voor al hun indirecte en directe aanmoedi-
gingen, voor de talrijke kleine attenties en om mijn thesis taalkundig correct te maken. Alle
kennissen, vrienden, familie die me met net zo veel oprechtheid en vertrouwen ondersteun-
den, bedankt!
En als laatste wil ik mijn vriendin bedanken om me tijdig weer met mijn voeten op de grond
te zetten als ik het allemaal weer te losjes opnam, om me aan te moedigen verder te werken
indien er toch leukere dingen te doen waren en om de momenten zonder thesisgedachten op
te vrolijken.
Andy Cole, 1 juni 2009
Universiteit Gent
Faculteit Ingenieurswetenschappen
Vakgroep Technische Bedrijfsvoering
Verklaring in verband met de toegankelijkheid van de masterproef
Ondergetekende, Andy Cole, afgestudeerd aan de UGent in het academiejaar 2008-2009 en
auteur van de masterproef met als titel:
Een Hierarchische Aanpak voor Productieplanning in een Chemisch Proces:
Casestudie van Lanxess
verklaart hierbij:� dat hij geopteerd heeft voor de hierna aangevinkte mogelijkheid in verband met de
consultatie van zijn masterproef:
❐ de masterproef mag steeds ter beschikking gesteld worden van elke aanvrager;
❐ de masterproef mag enkel ter beschikking gesteld worden met uitdrukkelijke,
schriftelijke goedkeuring van de auteur;
❐ de masterproef mag ter beschikking gesteld worden van een aanvrager na een
wachttijd van x jaar;
✔❐ de masterproef mag nooit ter beschikking gesteld worden van een aanvrager;� dat elke gebruiker te allen tijde gehouden is aan een correcte en volledige bronverwij-
zing.
Gent, 1 juni 2009
Andy Cole
Een Hierarchische Aanpak voor
Productieplanning in een Chemisch
Proces:
Casestudie van Lanxess
door
Andy Cole
Masterproef ingediend tot het behalen van de academische graad van
Master in de ingenieurswetenschappen:
bedrijfskundige systeemtechnieken en operationeel onderzoek
Academiejaar 2008–2009
Promotor: prof. dr. E.-H. Aghezzaf
Begeleiders: P. Missiaen en C. Sitompul
Faculteit Ingenieurswetenschappen
Universiteit Gent
Vakgroep Technische bedrijfsvoering
Voorzitter: prof. dr. ir. H. Van Landeghem
Samenvatting
Hoofdstuk 1 geeft de lezer een algemene indruk van de inhoud van deze masterproef. Inhoofdstuk 2 wordt de context van deze masterproef kort gesitueerd binnen de uitgebreideliteratuur over productieplanning. De probleemstelling van de specifieke case die hier wordtuitgewerkt, komt aan bod in hoofdstuk 3. Hoe de algemene structuur van de oplossing er uitziet wordt in hoofdstuk 4 uiteengezet om vervolgens stuk voor stuk het wiskundige modeluit te werken voor de verschillende onderdelen: hoofdstukken 5, 6, 7 en 8 voor respectievelijkde analyse van de terugkoppeling, de preprocessing stap, level 1 en level 2. Het uiteindelijketoepassen van het model en de correcte werking ervan wordt in hoofdstuk 9 besprokenom dan ook in ditzelfde hoofdstuk conclusies te trekken. Voor de volledigheid worden degegevens waarmee het model wordt getest en de broncode meegegeven in de appendix.
Trefwoorden
hierarchische productieplanning, aggregatie, disaggregatie, wiskundig model, omstellingen,lineair programmeren, optimalisatie
Inhoudsopgave
Voorwoord ii
Overzicht iv
Inhoudsopgave iv
Gebruikte afkortingen ix
Gebruikte Variabelen en Parameters x
Lijst van figuren xviii
Lijst van tabellen xx
1. Inleiding 1
2. Literatuurstudie 4
3. Probleemstelling: De case van Lanxess 8
3.1. Optimalisatiemodel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.2. Automatisering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.3. Productieplanning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.4. Chemisch proces van Lanxess . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.4.1. Schematisch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.4.2. Restricties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.4.3. Bemerkingen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4. Werkelijke model: structuur 13
4.1. Algemene structuur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4.1.1. De theorie achter het wiskundige model . . . . . . . . . . . . . . . . . 16
4.1.2. Probleem: Restricties 88-91 en 96 . . . . . . . . . . . . . . . . . . . . . 19
5. Analyse en terugkoppeling 21
5.1. Ambitieuze plan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
5.2. Radicale plan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
5.3. Intermediaire oplossing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
5.4. Probleem: Restricties 88-91 en 96 . . . . . . . . . . . . . . . . . . . . . . . . . 25
v
Inhoudsopgave vi
6. Preprocessing 26
6.1. Stilstanden ingevoerd door het management . . . . . . . . . . . . . . . . . . . 26
7. Fase 1: Planning 30
7.1. Veel gebruikte notaties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
7.2. Algemene beslissingsvariabelen . . . . . . . . . . . . . . . . . . . . . . . . . . 31
7.3. Flowvoorwaarden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
7.3.1. Vraag versus Aanbod eindproducten . . . . . . . . . . . . . . . . . . . 33
7.3.2. Voldoende productie tussenproducten . . . . . . . . . . . . . . . . . . 35
7.4. Totale kost (1) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
7.4.1. Voorraadkost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
7.4.2. Tekortkosten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
7.5. Stilstanden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
7.5.1. Beslissingsvariabelen in verband met Stilstanden . . . . . . . . . . . . 41
7.5.2. Restricties in verband met Stilstanden . . . . . . . . . . . . . . . . . . 42
7.5.3. Bijdrage van de stilstanden tot de totale kost . . . . . . . . . . . . . . 45
7.6. Productierun . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
7.6.1. Beslissingsvariabelen in verband met Productieruns . . . . . . . . . . 47
7.6.2. Voorwaarden in verband met Productieruns . . . . . . . . . . . . . . . 48
7.7. Stilstanden in combinatie met Productieruns . . . . . . . . . . . . . . . . . . 51
7.8. Voorraadrestricties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
7.8.1. Algemene voorwaarden . . . . . . . . . . . . . . . . . . . . . . . . . . 52
7.8.2. B-voorraad: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
7.8.3. A2-voorraad: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
7.9. Omstellingen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
7.9.1. Beslissingsvariabelen en voorwaarden . . . . . . . . . . . . . . . . . . . 61
7.9.2. Bijdrage tot de totale kost . . . . . . . . . . . . . . . . . . . . . . . . . 63
7.10. Capaciteitsrestricties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
7.11. Totale kost (2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
7.12. Voorwaarden in verband met Tank 3 . . . . . . . . . . . . . . . . . . . . . . . 67
7.13. Straat 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
7.13.1. 70 ton D2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
7.13.2. J- en D2K-productie in blok . . . . . . . . . . . . . . . . . . . . . . . . 74
7.13.3. Beperkt aantal productieruns per jaar . . . . . . . . . . . . . . . . . . 75
7.13.4. H123 in de winter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
7.13.5. Tank 3 leeg na productiecampagne . . . . . . . . . . . . . . . . . . . . 76
7.14. Beginvoorwaarden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
7.15. Overige voorwaarden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
7.15.1. Efficientie productie A1 . . . . . . . . . . . . . . . . . . . . . . . . . . 78
7.15.2. Doorgeven van stilstanden . . . . . . . . . . . . . . . . . . . . . . . . . 79
7.15.3. Minimum afvalwaterdebiet . . . . . . . . . . . . . . . . . . . . . . . . 80
7.15.4. Maximum stilstand installatie 2 . . . . . . . . . . . . . . . . . . . . . . 81
7.15.5. Stilstand tijdens zomervakantie: . . . . . . . . . . . . . . . . . . . . . . 81
Inhoudsopgave vii
7.15.6. Voorkeur M-productie op straat 6 . . . . . . . . . . . . . . . . . . . . 82
7.15.7. Energiekoppeling tussen straat 5 en 6 . . . . . . . . . . . . . . . . . . 82
7.15.8. Voorkeur voor G-productie op straat 3 . . . . . . . . . . . . . . . . . . 83
7.15.9. Voorwaarden in verband met het moment van omstel . . . . . . . . . 84
8. Fase 2: Scheduling 86
8.1. Inputvariabelen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
8.2. Beslissingsvariabelen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
8.3. Doelfunctie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
8.4. Definitie van de makespan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
8.5. Voldoen aan schattingen uit fase 1 . . . . . . . . . . . . . . . . . . . . . . . . 91
8.6. Flowvoorwaarden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
8.6.1. Flow A1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
8.6.2. Flow A2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
8.6.3. Flow tank 3 en 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
8.6.4. Flow tussen rechtstreekse producten . . . . . . . . . . . . . . . . . . . 94
8.6.5. Flow tussen deelproducten . . . . . . . . . . . . . . . . . . . . . . . . 95
8.7. Voorraden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
8.7.1. Minimum voorraden . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
8.7.2. Maximum voorraden tanken . . . . . . . . . . . . . . . . . . . . . . . . 96
8.8. Voorwaarden in verband met Tank 3 en tank 4 . . . . . . . . . . . . . . . . . 96
8.8.1. Tank 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
8.8.2. Tank 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
8.9. Productierun . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
8.10. Stilstanden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
8.10.1. Ingeplande stilstanden door het management . . . . . . . . . . . . . . 101
8.10.2. Stilstanden ingevoerd door het model . . . . . . . . . . . . . . . . . . 101
8.11. Omstellingen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
8.12. Voorwaarden in verband met JD2K-productie . . . . . . . . . . . . . . . . . . 105
8.12.1. D2K-productie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
8.12.2. D2KJ-productie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
8.13. Beginvoorwaarden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
8.14. Overige voorwaarden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
8.14.1. Doorgeven van stilstanden . . . . . . . . . . . . . . . . . . . . . . . . . 107
8.14.2. Minimum afvalwaterdebiet . . . . . . . . . . . . . . . . . . . . . . . . 107
8.14.3. Stilstand tijdens zomervakantie . . . . . . . . . . . . . . . . . . . . . . 108
8.14.4. M-productie op straat 4 . . . . . . . . . . . . . . . . . . . . . . . . . . 108
8.14.5. Resterende voorwaarden . . . . . . . . . . . . . . . . . . . . . . . . . . 109
9. Resultaten en Conclusie 110
9.1. Resultaten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
9.1.1. Fase 1: output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
9.1.2. Fase 1: gedetailleerde bespreking . . . . . . . . . . . . . . . . . . . . . 111
9.1.3. Fase 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Inhoudsopgave viii
9.2. Conclusies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
I. Variabelen van het proces: 122
A. Variabelen productieplanning 123
B. Inputgegevens productieplanning 125
C. Inputgegevens maalplanning 127
D. Gegevens van de laatst beeindigde maand 130
II. Broncode: 132
E. Fase 1: broncode mod-file 133
F. Fase 2: broncode mod-file 154
G. Fase 1 en 2: broncode run-file 167
Bibliografie 174
Gebruikte afkortingen
ix
Gebruikte Variabelen en Parameters
#d2m2 Het aantal dagen beschikbaar in maand m2 voor de tweede fase om de geschatte
hoeveelheden in te plannen. (inclusief ∆Dm2−1)
#dm Het aantal dagen in een maand.
∆Dm2 Parameter die het verband aangeeft tussen opeenvolgende maanden in fase 2.
Indien positief, dan zijn er productiedagen over in maand m2 die eventueel naar een
volgende maand kunnen geschoven worden. Indien negatie, dan zijn er
productiedagen tekort in maand m2.
ADebietp Parameter die het afvalwaterdebiet voor product p vastlegt.
APp Parameter die vastlegt hoeveel productiecampagnes van product p mogelijk zijn op
1 jaar.
D1 Een set van dagen uit fase 2 dat alle dagen bevat van de vorige maand m2 − 1.
D1 := ∀d ∈ {1, . . . ,#d2m2−1}
D12 Een set van dagen uit fase 2 dat alle dagen bevat van zowel de huidige maand m2
als van de vorige maand m2 − 1. D12 := ∀d ∈ {1, . . . ,#d2m2−1 + #d2m}
D2 Een set van dagen uit fase 2 dat alle dagen bevat van de huidige maand m2.
D2 := ∀d ∈ {#d2m2−1 + 1, . . . ,#d2m}
dagenLeegp,m ∈ R+, is het aantal dagen nodig om de tank leeg te maken van niveau
V T3p,m−1 naar 0. Ondertussen is het wel mogelijk dat er nog productie is van p
tijdens het legen van de tank. Variabele in fase 1.
x
Gebruikte Variabelen en Parameters xi
dagenOp Parameter in fase 1 die de verwachte dagen omstel vastlegt na het beeindigen
van een productierun van product p.
dagenP luss,m ∈ R+, variabele in fase 1 die gelijk is aan #dm − dagenSs,m − dagenSA1,m
indien dat groter is dan 0 en gelijk aan 0 indien de term kleiner is dan nul.
dagenSs,m ∈ Z+, variabele in fase 1 die vastlegt hoeveel dagen stilstand het model gaat
inplannen op straat s in maand m.
dagenTussenp,m ∈ R+ is omwille van het tussentijds gebruik van tank 3 voor een ander
product. Variabele in fase 1.
dagenV olp,m ∈ R+ is het aantal dagen nodig om de tank te vullen van 0 tot het niveau
V T3p,m. Ondertussen is het wel mogelijk dat er ook reeds verbruik is van p tijdens
het vullen van de tank. Variabele in fase 1.
DPp,d ∈ {0, 1}, variabele in fase 2 die aanduidt of er productie is van product p op dag d
in maand m2.
DQp,d ∈ Z+, variabele in fase 2 die de productiehoeveelheid aanduidt van product p op
dag d.
DV raagA2,d ∈ R+, variabele in fase 2 die de totale vraag in een maand naar A2 gaat
uitspreiden over de verschillende dagen.
EPp,m ∈ {0, 1}, variabele in fase 1 die bepaalt of er een productiecampagne eindigt in de
maand m van product p of niet.
EPp Binaire parameter in fase 2 die aanduidt of er in de maand waarvoor fase 2
behandeld wordt een productierun beeindigd wordt van product p. Deze parameter
wordt vastgelegd in fase 1.
ESs,m ∈ {0, 1}, variabele in fase 1 die bepaalt of er een stilstand eindigt in de maand m
op straat s of niet.
ESs Binaire parameter in fase 2 die aanduidt of er in de maand waarvoor fase 2
behandeld wordt een stilstand beeindigd wordt op straat s. Deze parameter wordt
vastgelegd in fase 1.
Gebruikte Variabelen en Parameters xii
helpDebietd ∈ {0, 1}, helpvariabele in fase 2 die 1 is als de restrictie in verband met het
afvalwaterdebiet moet gelden.
ingeplandeSs,m Parameter die het aantal ingeplande dagen stilstand van straat s in
maand m vastlegt.
ingSs Een set van dagen in fase 2 die voor maand m2 alle dagen vastlegt waarop een
stilstand is ingepland door het management op straat s. Dit wordt afgeleid in de
preprocessingstap
initCBp De initiele voorraad van product p op de eerste dag van de maand m2 in
containers. Vastgelegd door fase 1.
initDPp,d ∈ {0, 1}, parameter uit fase 2 die de beginvoorwaarden van de productie uit de
vorige maand voor elke dag d bevat.
initLPp ∈ {0, 1}, parameter in fase 2 die gelijk is aan 1 indien p het laatste product is dat
geproduceerd werd op zijn straat.
initSp,d ∈ {0, 1}, parameter uit fase 2 die de beginvoorwaarden van de stilstanden uit de
vorige maand voor elke dag d voor elke straat s bevat.
initT12p De initiele voorraad van product p op de eerste dag van de maand m2 in tanks 1
en 2. Vastgelegd door fase 1.
initT3p De initiele voorraad van product p op de eerste dag van de maand m2 in tank 3.
Vastgelegd door fase 1.
initT4p De initiele voorraad van product p op de eerste dag van de maand m2 in tank 4.
Vastgelegd door fase 1.
initTBp De initiele voorraad van product p op de eerste dag van de maand m2 in tank B.
Vastgelegd door fase 1.
initV IBCp De initiele voorraad van product p op de eerste dag van de maand m2 in vaten
en IBC’s. Vastgelegd door fase 1.
initV rijs,d ∈ {0, 1}, parameter in fase 2 die de vrije toestand van de laatste dagen van de
vorige maand vastlegt.
Gebruikte Variabelen en Parameters xiii
m2 De maand waarin fase 2 zich bevindt.
M6nietOm ∈ R+, variabele in fase 1 die het aantal dagen weergeeft waarop er meer
M-productie is in de maand m dan O-productie.
maxCapCD1 Parameter die het maximaal aantal dagen productie op straat CD1 voor een
jaar vastlegt.
maxDagp,vp Parameter die voor product p het aantal dagen van maximale voorraad
vastlegt.
minADebiet Parameter die het minimale afvalwaterdebiet per dag voor de
AW2-installatie vastlegt.
minDagp,vp Parameter die voor product p het aantal dagen horende bij de
voorraadparameter vp van minimale voorraad vastlegt.
MLp Parameter die de minimale lengte van een productiecampagne voor product p
vastlegt.
MSs ∈ Z+, variabele uit fase 2. De makespan van straat s die de volledige productie van
alle geschatte hoeveelheden uit fase 1 omvat.
NnietOm ∈ R+,variabele uit fase 1 die het aantal dagen zal weergeven waarbij de
N-productie nog gecovered is door O, nadat we zoveel mogelijk de M-productie en
de tussenliggende stilstand coveren
ODp1,p2 ∈ Z+, parameter uit fase 2 die de werkelijke omstelduur in dagen tussen de twee
producten p1 en p2 vastlegt.
OMp1,p2,d ∈ {0, 1}, variabele uit fase 2 die aangeeft of er een omstel bezig is van product
p1 naar product p2 op dag d.
omstelDuo een set van productduo’s waartussen een omstel kan plaatsvinden.
OMT3d ∈ {0, 1}, variabele uit fase 2 die 1 is indien er een omstelling plaatsvindt in tank
3 op dag d.
Gebruikte Variabelen en Parameters xiv
OSp,m ∈ {0, 1} variabele in fase 1 die bepaalt of er een omstel is na product p in de
maand m of niet.
OST3m ∈ {0, 1, 2}, bepaalt het aantal omstellingen in tank 3 gedurende maand m.
Pp,m ∈ {0, 1}, binaire productievariabele van product p in maand m voor fase 1.
PA1 Het set dat bestaat uit al die producten die rechtstreeks uit A1 vervaardigd kunnen
worden, A2 uitgezonderd.
PA1vA2 Het set van producten die enkel uit A2 worden vervaardigd indien de productie
van A1 stilligt.
PA1vA2T12 Het set van producten die enkel vervaardigd worden uit A2 indien A1 stilligt
en waarbij de A2 afkomstig is uit tank 1 en 2.
PA1vA2T3 Het set van producten die enkel vervaardigd worden uit A2 indien A1 stilligt
en waarbij de A2 afkomstig is uit tank 3.
PA2 Het set van producten dat rechtstreeks vervaardigd wordt uit A2.
PA2T12 Het set van producten die rechtstreeks vervaardigd worden uit A2 waarbij de A2
afkomstig is uit tank 1 en 2.
PA2T3 Het set van producten die rechtstreeks vervaardigd worden uit A2 waarbij de A2
afkomstig is uit tank 3.
PAfval die verzameling van producten p waarvoor een afvalwaterdebiet (ADebietp) geldt.
PT3p,m ∈ {0, 1}, variabele in fase 1 die bepaalt of tank 3 op het einde van maand m
toegewezen is aan product p of niet.
PV T3p,d ∈ {0, 1}, variabele uit fase 2 die aangeeft aan welk product p tank 3 toegewezen
is doorheen dag d.
PV T4p,d ∈ {0, 1}, variabele uit fase 2 die aangeeft op welke dag d tank 4 in gebruik is
voor opslag van product p.
Qp,m ∈ R+, variabele in fase 1. De productiehoeveelheid van product p in maand m.
Gebruikte Variabelen en Parameters xv
QV CBB,d ∈ R+, variabele in fase 2 die weergeeft wat de voorraad is van product B op het
einde van dag d in de tankcontainers voor B.
QV T12p,d ∈ R+, de voorraad van product p op het einde van dag d in tanken 1 en 2.
Beslissingsvariabele van in fase 2.
QV T3p,d ∈ R+, de voorraad van product p op het einde van dag d in tank 3.
Beslissingsvariabele van in fase 2.
QV T4p,d ∈ R+ variabele in fase 2 die aangeeft hoeveel ton van product p opgeslagen is in
tank 4 op het eind van dag d.
QV T4p,d ∈ R+, variabele in fase 2 die de voorraad weergeeft van product p op het einde
van dag d in tank 4.
QV TBB,d ∈ R+, variabele in fase 2 die weergeeft wat de voorraad is van product B op het
einde van dag d in de tank B.
QV V IBCp,d ∈ R+, de voorraad van product p op het einde van dag d in vaten en IBC’s.
Beslissingsvariabele van in fase 2.
Ss,d ∈ {0, 1}, variabele uit fase 2 die aangeeft of straat s stilstaat op dag d of niet.
Inclusief de afstel- en opstartdagen.
schatQp,m2 De schatting voor de productiehoeveelheid van product p in maand m2
bepaald door fase 1.
schatTA2,m Parameter in fase 2 die de schatting weergeeft van het tekort voor A2 in
maand m zoals bepaald in fase 1.
SJM4 Parameter die het eerste jaar waarin M-productie mogelijk is op straat 4 definieert.
SMM4 Parameter die de eerste maand waarin M-productie mogelijk is op straat 4
definieert.
somInitV rijs ∈ Z+, parameter in fase 2 dit het aantal vrije dagen van de vorige maand
weergeeft voor straat s.
Gebruikte Variabelen en Parameters xvi
somSPEPs Binaire parameter in fase 2 die aangeeft of er op straat s een productierun
gaande is op de overgang van maand m2− 1 naar maand m2. Deze parameter komt
rechtstreeks voort uit fase 1.
somSSESs Binaire parameter in fase 2 die aangeeft of er op straat s een stilstand gaande
is op de overgang van maand m2 − 1 naar maand m2. Deze parameter komt
rechtstreeks voort uit fase 1.
SPp,m ∈ {0, 1}, variabele in fase 1 die bepaalt of er een productiecampagne start in de
maand m van product p of niet.
SPp Binaire parameter in fase 2 die aanduidt of er in de maand waarvoor fase 2
behandeld wordt een productierun gestart wordt van product p. Deze parameter
wordt vastgelegd in fase 1.
SSs,m ∈ {0, 1}, variabele in fase 1 die bepaalt of er een stilstand start in de maand m op
straat s of niet.
SSs Binaire parameter in fase 2 die aanduidt of er in de maand waarvoor fase 2
behandeld wordt een stilstand gestart wordt op straat s. Deze parameter wordt
vastgelegd in fase 1.
startM De maand waarin de planning wordt gestart.
Tp,m ∈ R+: de tekorten van elk product p in de maand m zodat niet aan de vereiste
vraag voor die maand kan voldaan worden. Variabele in fase 1.
totMS ∈ Z+, variabele uit fase 2. De makespan van het volledige chemische proces voor
maand m2, deze is gelijk aan het maximum van MSs van die maand m2.
Vp,m ∈ R+: de voorraden van elk product p op het einde van de maand m. Fase 1
V Cp,m ∈ R+: de voorraad van p in containers op het einde van de maand m. Fase 1
V erbrA2s,m,12 ∈ R+: geeft de schatting weer van het verbruik van A2 voor straat s in de
maand m die te maken heeft met restrictie 12.
verbruikp1,p2 ∈ R+ Parameter die het verbruik van product p2 weergeeft voor de
productie van p1.
Gebruikte Variabelen en Parameters xvii
verwDagenOs Parameter voor fase 1 die het verwachte aantal dagen omstel op een straat
s vastlegt.
vraagp,m ∈ R+ Parameter die de vraag naar product p in de maand m weergeeft.
vrijT3p,d ∈ {0, 1}, parameter in fase 2 die de toestand van tank 3 op het einde van de
vorige maand vastlegt.
V T12p,m ∈ R+: de voorraad van p in tank 1 en 2 op het einde van de maand m. Fase 1
V T3p,m ∈ R+: de voorraad van p in tank 3 op het einde van de maand m. Fase 1
V T4p,m ∈ R+: de voorraad van p in tank 4 op het einde van de maand m. Fase 1
V TBp,m ∈ R+: de voorraad van p in tank B op het einde van de maand m. Fase 1
V V IBCp,m ∈ R+: de voorraad van p in vaten en IBC’s op het einde van de maand m.
Fase 1
y140,m ∈ {0, 1}, hulpvariabele in fase 1 in verband met D2K-productierun.
y210,m ∈ {0, 1}, hulpvariabele in fase 1 in verband met D2K-productierun.
y70,m ∈ {0, 1}, hulpvariabele in fase 1 in verband met D2K-productierun.
Lijst van figuren
3.1. Schematische voorstelling van het productieproces . . . . . . . . . . . . . . . 10
4.1. Algemene structuur van de oplossing . . . . . . . . . . . . . . . . . . . . . . . 15
5.1. Grafische voorstelling van het ambitieuze plan . . . . . . . . . . . . . . . . . . 22
5.2. Grafische voorstelling van het praktische plan . . . . . . . . . . . . . . . . . . 23
7.1. Grafische voorstelling variabelen stilstand . . . . . . . . . . . . . . . . . . . . 42
7.2. Grafische voorstelling vergelijking 7.28 . . . . . . . . . . . . . . . . . . . . . . 46
7.3. Grafische voorstelling bij vergelijkingen 7.33a en 7.33b . . . . . . . . . . . . . 49
7.4. Grafische voorstelling restrictie 21 . . . . . . . . . . . . . . . . . . . . . . . . 54
7.5. Grafische voorstelling situatie 0 1 1 uit tabel 7.3 . . . . . . . . . . . . . . . . 58
7.6. Grafische voorstelling situatie 1 1 0 uit tabel 7.3 . . . . . . . . . . . . . . . . 59
7.7. Grafische voorstelling situatie 1 1 1 uit tabel 7.3 . . . . . . . . . . . . . . . . 60
7.8. Grafische voorstelling van de omstelduur in straat 3 . . . . . . . . . . . . . . 63
7.9. Grafische voorstelling van de kosten horend bij de omstel in straat 3 . . . . . 63
7.10. Grafische voorstelling voor probleem in tank 3 bij C- of D1-productie . . . . . 69
7.11. Grafische voorstelling voor het opvullen en legen van Tank 3 . . . . . . . . . . 71
7.12. Grafische voorstelling ter verduidelijking restrictie 73 . . . . . . . . . . . . . . 72
7.13. Grafische voorstelling ter verduidelijking restrictie 74 . . . . . . . . . . . . . . 75
7.14. Grafische voorstelling in verband met restrictie 63 . . . . . . . . . . . . . . . 83
8.1. Grafische voorstelling mogelijke combinaties omstellingen tussen D2KJ . . . . 106
9.1. Resultaat: productieplanning voor maand 5-12 . . . . . . . . . . . . . . . . . 111
9.2. Resultaat: productieplanning voor maand 13-16 . . . . . . . . . . . . . . . . . 112
9.3. Evolutie van de totale kost (rood) en de tekortkost (blauw) doorheen de tijd . 115
9.4. Evolutie van de omstelkosten met de simulatietijd . . . . . . . . . . . . . . . 116
9.5. Evolutie van de gebondenkosten met de simulatietijd . . . . . . . . . . . . . . 116
9.6. Evolutie van de voorraadkosten met de simulatietijd . . . . . . . . . . . . . . 117
9.7. Productieschema voor straat 6 doorheen de 12 maanden . . . . . . . . . . . . 118
9.8. Productieschema voor maand 12 . . . . . . . . . . . . . . . . . . . . . . . . . 119
xviii
LIJST VAN FIGUREN xix
A.1. Variabelen van de productieplanning . . . . . . . . . . . . . . . . . . . . . . . 124
B.1. Inputgegevens in verband met specifieke probleem . . . . . . . . . . . . . . . 126
Lijst van tabellen
6.1. Relaties tussen de stilstanden. vb: stilstand in AG wordt doorgegeven aan
A1 omwille van restrictie (2) . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
7.1. Opsplitsing van product G . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
7.2. Denkvoorbeeld in verband met de capaciteitsengpassingen . . . . . . . . . . . 41
7.3. Waarheidstabel in verband met de verschillende situaties voor SS, ES en∑
. 58
7.4. Waarheidstabel in verband met de verschillende situaties voor omstel in tank 3 69
8.1. Relaties tussen rechtstreekse producten. vb: productie van FC vereist pro-
ductie van F . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
xx
1Inleiding
HET ultieme doel van deze masterproef is een bruikbaar lineair model opstellen dat de
productieplanning genereert voor een chemisch proces voor de komende twaalf maan-
den vertrekkende van de voorspelling van de vraag en de beginvoorraden van de producten.
Dit is een uitbreiding op het werk van Andy Maenhout die getracht heeft om dit probleem
op te lossen aan de hand van een model. Computationele beperkingen zorgden er echter voor
dat men niet verder kwam dan een productieplanning voor enkele maanden. Vandaar dat
we op zoek gingen naar een alternatieve methode om deze productieplanning te verkrijgen.
Hierarchische productieplanning
Bij een hierarchische productieplanning maakt men gebruik van meerdere modellen om een
productieplanning te genereren. Op het hoogste level gaat men strategische beslissingen
nemen door het aggregeren van producten en door het gebruiken van grote tijdsperiodes.
Een planningshorizon van 1 jaar is hierbij zeker niet vreemd. De aggregatie van producten
in de tijd vraagt een specifieke behandeling. Niet elk product uit dezelfde productgroep
heeft dezelfde parameters, maar de producten uit een groep worden wel beschreven met een
parameter. Men heeft dus nood aan geaggregeerde verwachte waarden.
Het volgende level gaat de resultaten uit het bovenliggende level disaggregeren in zowel de
tijd als over de verschillende producten van een groep. Bijvoorbeeld er wordt eerst een
planning gemaakt voor de productie van t-shirts voor het komende jaar, vervolgens wordt er
een planning gemaakt voor de komende maand waarbij de totale productiehoeveelheid van
1
HOOFDSTUK 1. INLEIDING 2
1de t-shirts wordt opgeplitst in hoeveelheden per kleur van een t-shirt. In de onderliggende
levels spreekt men daarom vaak over het nemen van operationele beslissingen.
Het grote voordeel van hierarchische productieplanning is de opsplitsing in kleinere modellen
waardoor men mathematisch sneller tot een oplossing komt. Het nadeel is dat door deze
opsplitsing niet de meest optimale oplossing wordt gevonden, maar slechts een suboptimale.
Bovendien kan men ook niet spreken van een simpele top-down benadering en is er vaak
nood aan iteratief switchen tussen de verschillende modellen.
Oplossingsalgoritme
Door de beperking in het aantal producten en omdat er geen twee producten ook maar
een gelijke behandeling kennen, aggregeren we niet naar productgroepen. We maken enkel
gebruik van de aggregatie in de tijd. Voor een planningshorizon van 12 maanden kiezen we
een planningsbucket van 1 maand in de eerste fase. De tweede fase maakt gebruik van een
planningshorizon van 1 maand met een bucket van 1 dag.
Het oplossingsalgoritme ziet er dan als volgt uit:� In eerste instantie lossen we de eerste fase op. Deze gaat op zoek naar de goedkoopste
planning voor de komende twaalf maanden en genereert de eerste productiecijfers.� Vervolgens wordt er per maand gekeken of de vooropgestelde productiehoeveelheden
voor die maand in te plannen zijn. Dit wordt door de tweede fase uitgevoerd die de
totale makespan van de productie van de vooropgestelde schattingen gaat minimalise-
ren.
– Indien de makespan kleiner is dan het aantal beschikbare dagen, gaan we over
naar de controle van de volgende maand met behulp van fase 2. Bovendien wordt
het aantal dagen van de beschikbare dagen, die vrij zijn van productie omdat
de makespan voldoende klein is, bijgehouden om eventueel een probleem in een
volgende maand op te vangen.
– Indien de makespan groter is dan het aantal beschikbare dagen en het overschot
aan dagen niet kan opgevangen worden door eerder opgespaarde dagen, wordt te-
ruggekeerd naar fase 1 en wordt er gezocht naar een nieuwe goedkoopste planning
mits het updaten van het aantal beschikbare dagen in de probleemmaand. Indien
we bijvoorbeeld 2 dagen tekort hebben voor de huidige planning, dan lossen we
fase 1 op met het aantal dagen voor die maand verminderd met 2.
Voor het opstellen van de modellen is het van belang om alle restricties van het chemische
proces op een correcte manier te vertalen naar de verschillende aggregatieniveaus. Veel van
deze restricties staan uitgedrukt in dagen wat het niet eenvoudig maakt om ze in de eerste
HOOFDSTUK 1. INLEIDING 3
1fase toe te passen. Bovendien wordt de flow van alle producten ook uitgedrukt in dagen,
maar kan in het eerste model met de planningsbucket van 1 maand deze flow enkel per maand
verzekerd worden. Het was in eerste instantie dan ook de bedoeling om een zeer nauwkeurig
model op te stellen voor fase 1 om latere moeilijkheden in fase twee te verminderen. Voor de
wiskundeliefhebber verwijs ik dan graag naar de hoofdstukken in verband met het opstellen
van deze modellen. Alle restricties zijn verwerkt in beide fasen behalve die restricties die de
start van een omstel op een bepaalde datum verbieden. Dit is een perfecte restrictie die pas
in fase twee aan bod moet komen, maar indien ze niet in fase een wordt gemodelleerd, levert
dat zeer grote problemen in de tweede fase. De implementatie hiervan zou te uitgebreid
worden en is daarom weggelaten.
Resultaten en Conclusie
De eerste fase werkt perfect en geeft schitterende schattingen voor de goedkoopste planning.
Het nadeel hierbij is de nodige rekentijd. Op dit moment is minimaal drie uur nodig om
min of meer in de buurt te komen van de optimale oplossing. In de tweede fase is ergens een
kleine logische fout gekropen waardoor deze voorlopig niet werkt, aangezien de nadruk toch
vooral lag op de eerste fase. Op zich is dat een spijtige zaak, maar door de lange rekentijd
van de eerste fase zijn meerdere terugkoppelingen toch uitgesloten. Bovendien kan door de
zeer nauwkeurige resultaten van de eerste fase deze ook als een losstaand geheel worden
gebruikt.
Naar de toekomst toe moet er een oplossing worden gezocht voor fase 2, voor de computa-
tionele problemen en voor de restricties in verband met dagen waarop geen omstel mag
voorkomen. Indien men in plaats van voor alle maanden, slechts voor de eerste twee maan-
den fase twee gaat controleren en mits toevoeging in fase een van deze weggelaten restricties
voor de verboden dagen van de eerste twee maanden, dan kunnen beide problemen op een
correcte manier behandeld worden.
2Literatuurstudie
HIERARCHISCHE productieplanning heeft in de literatuur al uitgebreid de aandacht
gekregen. Het is hier zeker niet de bedoeling om een uitgebreide reflectie te geven
van alles wat er in de literatuur is te vinden. We gaan hier voor een zo concreet en bondig
mogelijke uitleg over wat hierarchische productieplanning nu juist is, waar het voor gebruikt
wordt en wat de voor- en nadelen zijn. Op deze manier heeft de lezer een algemeen begrip
voor de toepassing van hierarchische productieplanning voor de specifieke case. We starten
eerst met een algemene uitleg over wat hierarchische productieplanning is. Vervolgens gaan
we meer in detail in op enkele aspecten van een single-stage systeem en een multi-stage
systeem en bekijken we de verschillende mogelijkheden van aggregatie en disaggregatie.
Wat is hierarchische productieplanning
Volgens Bitran et al. (1981) draait de methode van hierarchische productieplanning om het
herkennen van de verschillen tussen strategische en operationele beslissingen. De modellen
voor de productieplanning die hieruit volgen, zijn dan volledig in overeenstemming met het
reele beslissingsproces. De strategische beslissingen die in eerste instantie worden genomen,
komen overeen met een geaggregeerde eerste productieplanning. De operationele beslissingen
komen dan aan bod in een lager level met een gedisaggregeerde planning.
In het meest algemene geval treedt er aggregatie op door zowel het samennemen tot langere
tijdsperiodes als door het samennemen van verschillende producten in 1 groep. Vandaar
de analogie met het strategische level van het beslissingsproces. Er wordt bijvoorbeeld in
4
HOOFDSTUK 2. LITERATUURSTUDIE 5
2
eerste instantie een forecast gemaakt voor een heel lange tijdsperiode en voor verschillende
productgroepen. Met een simpel voorbeeld uitgelegd: het is in januari nog niet van belang
om te weten hoeveel t-shirts van elke kleur zullen verkocht worden in december van datzelfde
jaar, maar het is wel het totaal aantal t-shirts voor het komende jaar ongeacht de kleur en
ongeacht de maand van verkoop dat ons op dit niveau interesseert. In het gedisaggregeerde
level wordt er dan naar kleinere periodes gekeken en per product afzonderlijk. De operati-
onele beslissingen zijn daarbij van belang. Hierbij willen we enkel voor de maand januari
weten hoeveel t-schirts er in welke kleur verkocht zullen worden. Eventueel ook nog voor
februari, maar dat is niet strikt noodzakelijk. Een combinatie van deze twee levels met alle
mogelijke tussenliggende vormen is mogelijk. Zolang er maar duidelijk in elk level wordt
nagegaan wat de tijdshorizon is en hoe de producten gegroepeerd zijn.
Het grote voordeel van deze aggregatie en disaggregatie is dat een productieplanning kan ge-
genereerd worden voor een grote planningshorizon, maar dat er geen gedetailleerde gegevens
noodzakelijk zijn voor heel deze planningshorizon. De planning die werkelijk zal uitgevoerd
worden, is deze van een kortere planningshorizon. Hiervoor zijn wel gedetailleerde gegevens
nodig, maar deze zijn eenvoudiger te voorspellen op korte termijn dan op een lange termijn.
Het nadeel van het opsplitsen in verschillende niveaus is dat er aan nauwkeurigheid wordt
ingeboet. Het meest optimale geval wordt gevonden indien al de informatie gekend is voor
de hele planningsperiode zodat er 1 model kan opgesteld worden. Deze gedetailleerde for-
mulering van het probleem leidt vaak tot meer problemen. Het is moeilijk om het op te
lossen, het vereist data die op langere termijn moeilijk nauwkeurig te bepalen zijn en het is
vaak duur om het te laten werken. Het verlies van nauwkeurigheid door de opsplitsing is
dus zeker gerechtvaardigd.
Single-Stage System
Bitran et al. (1981) geeft een heel uitgebreide uitleg over de toepassing van deze theorie voor
single-stage systemen. Er wordt een opsplitsing gemaakt in drie aggregatielevels:� Items: de eindproducten zoals geleverd aan de klanten� Families: een groepering van items die gelijkaardige setups delen. Indien een item
van een familie wordt geproduceerd, kan elk ander item van deze familie zonder grote
omstelling ook geproduceerd worden.� Product types: een groepering van families met gelijkaardige kosten, voorraadkosten,
hoeveelheden,...
In het eerste level wordt voor de product types een geaggregeerde planning opgesteld met
een typische planningshorizon van 1 jaar om strategische beslissingen te kunnen nemen.
HOOFDSTUK 2. LITERATUURSTUDIE 6
2
Enkel de hoeveelheid van elk product type dat gepland wordt in de eerste periode wordt
doorgegeven naar het familie-level. In dit level wordt de geplande hoeveelheid van het
producttype opgesplitst in de families die tot dit type behoren. Deze hoeveelheden worden
doorgegeven aan het item level om de te produceren hoeveelheid te bepalen van elk item
in deze eerste periode. We zien hierin dus duidelijk dat gedetailleerde voorspellingen op
het item niveau niet nodig zijn voor de hele planningshorizon, enkel voor de eerste periode.
Aangezien geaggregeerde voorspellingen ook nauwkeuriger zijn dan meer gedetaileerde zullen
de productieplannen door deze aanpak stabieler zijn in de tijd.
Bitran et al. (1981) suggereren het gebruik van convexe knapzak problemen voor de disag-
gregatie tussen de verschillende levels. Op het hoogste niveau worden de productiekosten
en de voorraadkosten geminimaliseerd. Het tweede niveau probeert de setupkosten tussen
de verschillende families te minimaliseren. Op dit moment zijn alle kosten bepaald. Op het
derde niveau is het dan de bedoeling om te kijken naar de invloed op de toekomstige kos-
ten. De hoeveelheden per familie worden opgesplitst per item op zo’n manier dat alle items
ongeveer in een zelfde tijdspanne een nieuwe productierun vragen. Voor meer gedetailleerde
uitleg hierover verwijs ik je naar de tekst van Bitran et al. (1981). Mits het gebruik van
enkele aanpassingen aan de heuristieken kan voor de meeste situaties een optimaal model
worden gevonden.
Een two-stage system
Bitran et al. (1982) geeft uitbreidingen op het algemene model van een hierarchische produc-
tieplanning voor een tweedelig productieproces. Naast de producten voor de eindgebruiker
hebben we hier ook grondstoffen voor deze producten die ingepland moeten worden. Ook
voor deze grondstoffen wordt een verdeling gemaakt in verschillende types en families. Wat
hieruit vooral kan besloten worden is dat elk probleem zijn specifieke oplossing vergt. Je
kan je baseren op een algemene structuur, maar de uiteindelijke oplossing blijft afhankelijk
van het specifieke probleem.
Aggregatie en Disaggregatie
Een moeilijkheid bij de aggregatie is dat door het samennemen van verschillende producten
in 1 producttype er ook aggregatieparameters voor dit producttype moeten bepaald worden.
Een gezamenlijke voorraadkost, een gezamenlijke productiekost, een gezamenlijke produc-
tierate, een verwachte setupkost (Qiu en Burch, 1997),. . . Vaak doet men dit door gewichten
toe te kennen per product om zo tot 1 parameter te komen. Hieruit blijkt duidelijk dat
hierarchische planning geen pure top-down benadering kent. Via een iteratief proces is het
beter om deze parameters te updaten tot ze de gewenste waarden bereiken (Vicens et al.,
2001).
HOOFDSTUK 2. LITERATUURSTUDIE 7
2
Een goede aggregatie en disaggregatieprocedure heeft daarnaast ook nog heuristieken en
consistencyvergelijkingen om infeasible problemen te vermijden en om feedback te geven
tussen de verschillende modellen. Op deze manier wordt de beste suboptimale oplossing
gevonden (Erschler et al., 1986; Vicens et al., 2001).
Conclusie
Samenvattend kunnen we stellen dat een hierarchische productieplanning zijn voordelen en
nadelen kent. Het grote nadeel is dat men op zoek moet naar een correcte aggregatie- en
disaggregatieprocedure. Dit is niet voor de hand liggend en elk probleem vraagt een eigen
oplossing. Bovendien verliezen we door de opsplitsing in meerdere levels aan nauwkeurigheid
en vinden we een suboptimale oplossing. De voordelen wegen echt zwaarder door dan de
nadelen, want naast de link met het reele beslissingsproces is vooral de beperking in rekentijd
en de noodzaak aan een minder gedetailleerde productieforecast van zeer grote waarde.
Voor meer details in verband met de wiskundige modellering verwijs ik door naar de meer
gespecialiseerde literatuur. Na het eerste level is het op langere termijn reeds mogelijk
om eerste essentiele trade-offs op te merken en kan er reeds op ingespeeld worden door
manageriele interactie.
3Probleemstelling: De case van Lanxess
IN theorie is het een zeer eenvoudige probleemstelling:
Stel een optimalisatiemodel op voor de automatisering van de productieplanning voor een
chemisch proces van het chemische bedrijf Lanxess.
Achter deze ene zin zit echter meer dan men op het eerste zicht denkt. Daarom overlopen
we kort alle elementen die in deze probleemstelling aan bod komen.
3.1. Optimalisatiemodel
De bedoeling is om een wiskundig model op te stellen dat bestaat uit een doelfunctie en
een aantal voorwaarden waaraan de variabelen moeten voldoen, waaruit de meest optimale
oplossing van het probleem moet volgen. Een zeer eenvoudig voorbeeld van een wiskundig
model is het volgende: maximaliseer de winst door het produceren van twee producten x en
y, waarbij rekening moet gehouden worden met de beschikbaarheid van een grondstof: 20
stuks. Voor x heb je 5 eenheden van de grondstof nodig en win je 10 euro. Voor y heb je 4
eenheden nodig, maar win je ook maar 9 euro.
Max. 10x + 9y
o.v. 5x + 4y ≤ 20
x ∈ Z+
y ∈ Z+
8
HOOFDSTUK 3. PROBLEEMSTELLING: DE CASE VAN LANXESS 9
3
Het is hier duidelijk dat de oplossing wordt gegeven door x = 0 en y = 5. De probleemstelling
houdt dus in om de correcte doelfunctie en de correcte voorwaarden op te stellen voor het
specifieke probleem.
3.2. Automatisering
Op dit moment gebeurt de planning handmatig. Hier zijn onmiddellijk twee nadelen aan
verbonden. Enerzijds is het een tijdrovend proces, anderzijds is men nooit zeker of de
gevonden planning wel de beste is. De bedoeling van het automatiseren van de planning
is dan ook tweedelig. Men kan zogezegd op de ’start’-knop drukken en na een verloop van
tijd terugkomen om te zien dat je planning klaar is. Ondertussen kan er dus iets anders
gedaan worden. Bovendien is men ook zeker dat dit de beste planning is onder de gegeven
voorwaarden.
3.3. Productieplanning
Productieplanning is een zeer ruim begrip. In het algemeen is het de bedoeling dat de
productie van producten gepland wordt doorheen de tijd om zo aan de doelstellingen te
voldoen. Ik stap nu af van het algemene geval om meer in detail het specifieke probleem te
bekijken.� Input
– De beginvoorraden van alle producten op de eerste van een bepaalde maand
– De verkoopsprognoses voor de komende 12 maanden
– De door het management ingeplande stilstanden
– De restricties specifiek voor het proces
– De variabelen van de productieplanning (kosten, capaciteiten,. . . )� Output: Een planning voor de komende 12 maanden die voor elke maand de produc-
tiehoeveelheden geeft.� Doelstelling: het vinden van die planning die de totale kost zo klein mogelijk maakt.
De planningshorizon is dus 1 jaar, de tijd waarover men in de toekomst wil kijken om de
producten te plannen. De planningsbucket lijkt 1 maand, maar achteraf zal blijken dan
een planningsbucket van 1 dag nodig is. Dit is de kleinste eenheid voor planning. En de
planningsfrequentie is 2 weken, of de basis waarop de planning geupdate wordt. Hieraan
moet het model allemaal voldoen.
HOOFDSTUK 3. PROBLEEMSTELLING: DE CASE VAN LANXESS 10
3
3.4. Chemisch proces van Lanxess
3.4.1. Schematisch
Al het voorgaande moet specifiek toegepast worden op een chemisch proces van het bedrijf
Lanxess. Een schematische voorstelling van dit proces is gegeven in figuur 3.1. Hierop
zien we dat, om het bedrijfsgeheim niet te schaden, alle producten en processen een code
gekregen hebben. Dit is voor het model van geen belang, aangezien het slechts namen zijn.
Figuur 3.1.: Schematische voorstelling van het productieproces
We overlopen in het kort dit schema. We zien twee grondstoffen AG en E. Deze grondstoffen
zijn in een onbeperkte hoeveelheid aanwezig, er moet enkel rekening gehouden worden met
een eventuele ingeplande stilstand van de processen die aan deze grondstoffen vooraf gaan.
Tijdens die periode zijn er geen grondstoffen beschikbaar.
Uit grondstof E kunnen dan de producten F , L, M en O gemaakt worden, wat aangeduid
wordt door de blauwe pijl op het schema. Alle pijlen op het schema, uitgezonderd de
dunne blauwe lijntjes, duiden aan wat de grondstoffen zijn voor andere producten en welke
producten er al dan niet nog verder worden verwerkt.
HOOFDSTUK 3. PROBLEEMSTELLING: DE CASE VAN LANXESS 11
3
Indien verschillende producten in 2 aaneengesloten kadertjes staan, zoals bijvoorbeeld pro-
ducten C en D1 betekent dit dat ze op dezelfde installatie vervaardigd worden. Dit is een
exclusiviteitsrelatie. Op elk moment kan slechts 1 product gemaakt worden.
We onderscheiden twee grote delen. Enerzijds het linkerdeel van het schema met de pro-
ducten A1, B, C, D1 en A2. Anderzijds het rechterdeel met alle overige producten. Het
linkerdeel wordt ook wel installatie 1 genoemd, het rechterdeel installatie 2. In installatie 2
hebben we 5 productiestraten gevolgd door 1 maalstraat. Op straat 1 worden bijvoorbeeld
F en G geproduceerd. Vervolgens hebben we nog straten 3, 4, 5 en 6. Straat 2 bestaat niet
meer. Alle producten van deze straten worden verkocht (behalve D2). 3 van deze producten
kunnen eventueel ook nog gemalen worden. Deze gemalen producten worden ook verkocht.
En ook van A2 is er verkoop mogelijk.
Ter illustratie gaan we even verder in op A1. Gewoon om te duiden dat achter dit schema nog
veel meer zit dan op het eerste gezicht. Deze informatie is echter niet helemaal nuttig voor de
productieplanning en wordt dus voor de rest achterwege gelaten. Het is belangrijk om enkel
de nodige aspecten uit deze informatie te halen. A1 is een volledige chemische installatie
met reactoren, extracties, ...enz. Uit deze installatie komt het product A1. We hebben geen
stapelcapaciteit voor A1. Product A2 wordt uit A1 gemaakt. De A2-installatie is niet meer
dan een indamping (destillatie). Deze indamping kan relatief gemakkelijk gestopt en gestart
worden. Voor deze A2-installatie gelden de 21 dagen stilstand natuurlijk niet. We kunnen
bij wijze van spreken de A2-installatie ook voor een paar dagen stilleggen. Dan moeten we
natuurlijk ook de capaciteit van de A1-installatie verminderen omdat we A1 niet kunnen
bufferen. Dit doen we dus zelden omwille van de energie-inefficientie.
Er zijn ook vier voorraadtanken beschikbaar voor tijdelijke opslag van producten. In tank
1 kan A2 opgeslagen worden. In tank 3 kan A2, C of D1 opgeslagen. Ook hier exclusiviteit,
slechts 1 product op elk moment. Deze tanken zijn beperkt in capaciteit. Er kan niet
oneindig veel in opgeslagen worden. Indien er geen tank staat is er ook geen opslag mogelijk
en moeten de geproduceerde producten ook onmiddellijk verbruikt worden. Indien er dus
A1-productie is, moet dat onmiddellijk omgezet worden naar A2, F , . . .C- of D1 kan eerst
opgeslagen worden, indien de tank beschikbaar is, alvorens verder te worden verwerkt.
Dan rest er ons nog alleen AW1, AW2 en AW3 uit te leggen. Dit zijn drie afvalwaterin-
stallatie die met de verschillende producten in verbinding staan. Voor de werking hiervan
in combinatie met de producten verwijs ik naar de behandeling van de restricties. Een
voorbeeld om de complexiteit van deze installaties te illustreren: als er maar op 1 straat
geproduceerd wordt (1 product), dan mag bij uitval van AW2 terwijl AW1 nog loopt elk
product geproduceerd worden behalve product N.
HOOFDSTUK 3. PROBLEEMSTELLING: DE CASE VAN LANXESS 12
3
3.4.2. Restricties
Naast deze floweigenschappen zoals vastgelegd in het schema zijn er ook nog 103 andere
restricties waaraan het chemische proces moet voldoen. Deze lijst is ter beschikking ge-
steld door Lanxess. Ik ga deze hier niet allemaal opsommen. Ze komen voldoende aan bod
bij de uitwerking van het wiskundig model. In het kort gezegd gaan deze restricties over
de omstellingen die tussen bepaalde producten op eenzelfde straat moeten gebeuren. Ver-
plichtingen in verband met productiesequenties, de lengte van een productierun, het aantal
productiecampagnes, stilstanden, de kosten die hiermee gepaard gaan, . . .
3.4.3. Bemerkingen
Het grote probleem hierbij is dat er met zeer veel factoren rekening moet worden gehouden.
Geen enkel product is hetzelfde en kan dus op dezelfde manier behandeld worden. Het
analoge geldt voor de productiestraten. Het probleem vraagt dus echt een zeer specifieke
oplossing.
Vorig jaar reeds heeft een thesis-student zich gebogen over het probleem. Toen is men van
een straightforward aanpak uitgegaan. Het bleek echter al snel dat door de planningsbucket
van slechts 1 dag het aantal variabelen voor het model zeer snel toenam. Elke ingevoerde
variabele voor 1 dag, moet vermenigvuldigd worden met 365 om voor het hele jaar de
planning te kunnen bepalen. De rekencapaciteit en rekentijd nam dus ook toe, zodat de
enige correcte conclusie die hieruit volgde was: het gaat niet op deze manier. Er moest dus
gezocht worden naar een nieuwe manier om dit probleem aan te pakken.
4Werkelijke model: structuur
IN de volgende hoofdstukken wordt al het voorgaande samengenomen om tot een op-
lossing van het specifieke planningsprobleem van Lanxess te komen. We beginnen in
dit hoofdstuk met het uitleggen van de algemene structuur van de oplossing, zodat al de
onderdelen onmiddellijk kunnen gesitueerd worden in het volledige plaatje. In de vier daar-
opvolgende hoofdstukken behandelen we de belangrijkste bouwblokken om tot het resultaat
te komen.
4.1. Algemene structuur
Zoals aangehaald in het theoretische onderdeel over hierarchische productieplanning is het
mogelijk om op verschillende manieren de hierarchie in het beslissingsproces te verwerken.
De combinatie van een aggregatie over tijd en producten is bij ons probleem niet toepas-
baar omwille van de complexiteit van een chemisch proces. Aggregatie van producten in
productfamilies en productgroepen om zo voor deze groepen een geaggregeerde planning op
te stellen is niet mogelijk omdat elk product verschillend is en bovendien gaat het ook maar
over een beperkt aantal producten.
Aggregatie over enkel de tijd is wel mogelijk om toe te passen. Ondanks dat er gevraagd
wordt naar productiehoeveelheden per maand voor de komende twaalf maanden, is het toch
noodzakelijk om de planningsbucket kleiner te kiezen dan die maand aangezien zeer veel
restricties en voorwaarden worden uitgedrukt in dagen. Bijvoorbeeld, een omstelling op
straat 1 duurt twee dagen, een stilstand duurt minstens 21 dagen, . . . Om zo een correcte
13
HOOFDSTUK 4. WERKELIJKE MODEL: STRUCTUUR 14
4
productieplanning te krijgen moeten we kijken per dag of dat mogelijk is. Zoals al eerder
gezegd is het niet mogelijk om dit als 1 wiskundig model te formuleren voor een volledig
jaar. Elke variabele moet dan vermenigvuldigd worden met de factor 365, wat tot een te
grote rekentijd leidt.
Indien we nu echter aggregeren over de tijd om vervolgens opnieuw te disaggregeren, is het
wel mogelijk om dit probleem op te lossen. Het algemene schema van deze aggregatie/dis-
aggregatie is te zien op het schema van figuur 4.1.
HOOFDSTUK 4. WERKELIJKE MODEL: STRUCTUUR 15
4
Figuur 4.1.: Algemene structuur van de oplossing
HOOFDSTUK 4. WERKELIJKE MODEL: STRUCTUUR 16
4
We onderscheiden drie grote delen:� Input� Wiskundige model� Output
Over de input en de output kunnen we zeer kort zijn. Op vraag van Lanxess en uiteraard
omwille van de gebruiksvriendelijkheid wordt alles ingegeven via Excel en wordt de output
gegenereerd in Excel. Het wiskundige model zelf wordt in AMPL, ’A Modeling Language
for Mathematical Programming’ geschreven, wat een begrijpbare en krachtige algebraısche
modelleertaal is voor lineaire en niet-lineaire optimalisatieproblemen. Daarom is er dus
nood aan de koppeling tussen Excel en AMPL enerzijds en AMPL en Excel anderzijds.
Deze koppeling is niet zomaar met 1 commando te regelen. Vooral voor de output was het
een hele opgave om de correcte waarden op de correcte plaats te krijgen in de geleverde
excelsjablonen. Ik ga hier verder niet op in omdat dat niet relevant is voor de oplossing van
het echte probleem.
4.1.1. De theorie achter het wiskundige model
Na het inlezen van alle parameters en de beginvoorwaarden uit excel is er eerst nog nood
aan een kleine preprocessing stap alvorens echt over te gaan op de wiskundige modellen.
Deze preprocessing komt uitgebreid aan bod in sectie 6.
Zoals op schema 4.1 te zien bestaat het werkelijke model uit drie grote onderdelen die op
allerlei manieren met elkaar gekoppeld zijn. We beschrijven het doel van elk afzonderlijk deel
en hoe ze met elkaar gekoppeld worden. De wiskunde per onderdeel wordt in desbetreffende
hoofdstukken gegeven.
Fase 1: planning per maand voor een heel jaar
Zonder in al te veel detail te treden, worden er hier productiehoeveelheden per product
voor de komende 12 maanden vastgelegd. Dit zou dan een eerste ruwe schatting moeten
geven voor de uiteindelijke productieplanning. We doen dit door te aggregeren over de
tijd en alles te bekijken op het maandelijks niveau. We kijken helemaal niet op welke
dag een bepaald product geproduceerd wordt of in welke volgorde de producten worden
geproduceerd. Zolang de algemene flow voor een hele maand maar behouden blijft en dat
er geen producten geproduceerd worden die dan plots verdwijnen in de overgang naar de
volgende maand. Op deze manier moet elke variabele slechts vermenigvuldigd worden met
12, voor elke maand 1. Dit zorgt voor een zeer sterke reductie van de rekentijd. Bovendien
behandelen we ook een volledig jaar, wat zonder aggregatie onmogelijk zou zijn.
HOOFDSTUK 4. WERKELIJKE MODEL: STRUCTUUR 17
4
We trachten hier wel al de kosten reeds in rekening te brengen om zo die schatting te bekomen
waarvoor de totale kost geminimaliseerd wordt. Het grote probleem door deze aggregatie is
dat alles moet worden uitgedrukt in maanden en dat we daardoor aan correctheid inboeten.
Het is dus nooit mogelijk om echt de optimale oplossing te vinden voor het gehele probleem,
maar we zullen wel een suboptimale oplossing vinden die een zeer goede benadering is van
het gehele probleem.
Indien de exacte productievolgorde niet geweten is, is het ook onmogelijk om hier de exacte
omstellingen in rekening te brengen. We zullen dus een methode moeten vinden om een
verwachte omstelduur en een verwachte omstelkost per straat te definieren. Ook stiltanden
kunnen moeilijk worden ingepland, we weten namelijk niet wanneer deze stilstand zal plaats-
vinden. Is dat in het begin van de maand, op het einde of in het midden van die maand. De
eisen voor een minimale duur van een stilstand zullen dus over verschillende maanden moe-
ten lopen waarbij er zeer goed nagedacht moet worden over de verschillende mogelijkheden
en hoe die te modelleren. Indien je voor elke dag exact weet wat er geproduceerd wordt,
weet je ook perfect of dit voldoet aan de capaciteit. Je weet nu niet welke omstellingen
er gebeuren op welke dagen er productie is van welk product, dus het definieren van een
restrictie die eist dat een straat op vollast moet lopen is ook niet zo eenvoudig aangezien de
totale capaciteit van die straat moeilijk te voorspellen is.
Er wordt dus bij elke restrictie nagedacht of er een equivalente formulering bestaat op het
maandelijkse niveau en de keuze wordt gemaakt om restricties door te schuiven naar de
volgende fase of niet.
Het resultaat van deze eerste fase is een eerste ruwe schatting voor de productiehoeveelheden
voor de komende twaalf maand. Met andere woorden de gevraagde planning voor het
probleem. We zijn echter door het aggregeren over de tijd en door het uitstellen van enkele
restricties niet zeker of deze planning wel haalbaar is en dus aan alle eisen voldoet. Daarom
worden deze eerste ruwe schattingen en enkele andere variabelen dan doorgegeven aan de
tweede fase van het model.
Fase 2: scheduling per dag voor een maand
Per maand wordt er gekeken of er een schedule bestaat die al de geplande producties uit
de eerste fase inplant over de verschillende productiestraten. Indien er zo een schedule
bestaat voor elke maand en indien al deze schedules voldoen aan alle restricties dan is het
volledige probleem opgelost. Dit is eigenlijk gedeeltelijk te vergelijken met het rechtstreeks
modelleren van het probleem voor een heel jaar, maar ik heb hier wel voor een andere
doelfunctie gekozen. Bovendien zal de rekentijd ook een heel stuk ingekort worden aangezien
een zeer groot deel van de producties in bepaalde maanden op nul wordt gesteld, wat dus ook
weer aanleiding geeft tot een groot aantal variabelen in het model die onmiddellijk worden
HOOFDSTUK 4. WERKELIJKE MODEL: STRUCTUUR 18
4
vastgelegd.
Er wordt dus 12 keer een ’kleiner’ model opgelost. Dit model plant voor elke dag van een
maand welk product er wordt geproduceerd of welke omstelling er gebeurt. We beginnen
met de eerste maand vertrekkend van de beginvoorwaarden uit de huidige maand en plannen
de geschatte hoeveelheden in op de productielijnen rekening houdend met alle restricties.
We bekijken dan voor elke straat afzonderlijk hoeveel dagen er noodzakelijk zijn om aan deze
planning te voldoen, dit is de makespan. Het is natuurlijk de bedoeling dat deze makespan
kleiner is dan of gelijk aan het aantal dagen van een maand. De fout op deze makespan
moet dus zo klein mogelijk gemaakt worden. Hoe meer dagen we tekort hebben om alles in
de maand te produceren, hoe slechter dus de eerste schattingen waren.
Analyse van de schedule
We analyseren deze schedule van de eerste maand en nemen een beslissing of we de schatting
behouden of niet. Indien de schatting voor deze maand goed is, starten we de tweede fase
voor de tweede maand uitgaande van de beginvoorwaarden bepaald door de schedule van de
eerste maand. Indien de schatting niet goed is keren we terug naar de eerste fase en bepalen
we nieuwe schattingen. Welke beslissingsregels er opgesteld worden, wordt besproken in het
deel over deze analyse.
Uiteindelijk komen we in de situatie waarbij het tweede model voor elke maand de schedule
heeft bepaald en beslist heeft dat deze allemaal in orde zijn. Op dat moment weten we
dat de laatst gevormde schattingen een volledig haalbare productieplanning geeft voor de
volgende twaalf maanden en is het probleem opgelost.
Terugkoppeling naar fase 1
Aangezien alles draait rond voldoende capaciteit hebben om alles te kunnen produceren
in een maand of in een jaar ligt hier de sleutel tot de terugkoppeling. Capaciteit kan
onmiddellijk vertaald worden naar het aantal beschikbare dagen voor productie. Indien we
dus merken dat er enkele dagen tekort zijn om de huidige productiehoeveelheden in 1 maand
in te plannen, laten we het eerste model opnieuw lopen, maar met een beperking op het
aantal dagen in de maand die niet voldeed in fase 2. We merken bijvoorbeeld in de maand
mei dat we 32 dagen nodig hebben om aan de huidige planning te kunnen voldoen. Er zijn
slechts 31 dagen beschikbaar in mei. We laten deze eerste fase dus opnieuw lopen, maar
met een beperking van het aantal dagen in mei tot slechts 30, wat 1 dag minder is dan de
realiteit. Op deze manier gaan er nieuwe schattingen gecreeerd worden die nu hopelijk wel
voldoen. Het is dus een iteratief proces dat op zoek gaat naar de beste optimale oplossing.
Een tweede aspect in verband met deze terugkoppeling is of we al dan niet alle maanden gaan
HOOFDSTUK 4. WERKELIJKE MODEL: STRUCTUUR 19
4
herrekenen. Stel dat we bijvoorbeeld op een bepaald moment reeds vijf maanden hebben
die in orde zijn. De zesde maand die we bekijken is niet in orde en er wordt een terugkop-
peling gemaakt naar de eerste fase. Er zijn nu twee mogelijkheden. Ofwel berekenen we
nieuwe schattingen voor alle maanden, ofwel berekenen we enkel nieuwe schattingen voor
die maanden die nog niet in orde zijn. Het is duidelijk dat in de eerste situatie fase 2 voor
alle maanden opnieuw moet doorlopen worden, maar dit geeft wel een perfecte aggregatie/-
disagggregatie. In de tweede situatie is door het vastleggen van deze productiehoeveelheden
in fase 1, de schatting niet veranderd, en hoeft fase 2 niet opnieuw doorlopen worden voor
de maanden die reeds in orde zijn. Twee grote voordelen, enerzijds is er door het vastleggen
in fase 1 van een groot aantal variabelen minder tijd nodig om tot nieuwe schattingen te
komen, anderzijds is er ook tijdswinst in fase 2 omdat niet opnieuw alle maanden moeten
gecontroleerd worden. Het nadeel echter is dat er met deze methode ook weer een klein
verlies aan optimaliteit wordt ingecalculeerd, omdat eventuele wijzigingen enkel nog kunnen
voorkomen in de laatste maanden. We verkiezen omwille van de tijdswinst toch voor deze
tweede methode.
4.1.2. Probleem: Restricties 88-91 en 96
Nu reeds zou ik willen wijzen op de grote moeilijkheid in het specifieke probleem. Indien
onderstaande restricties worden genegeerd is het bovenstaande model perfect in staat om in
een beperkte rekentijd tot een goede oplossing te komen.� (88) een productomstel moet op maandag, dinsdag, woensdag of donderdag gebeuren.
Er mag geen wettelijke feestdag binnen deze dagen vallen.� (89) de productomstel van straat 1 en 3 mag niet gelijktijdig gebeuren omwille van de
personeelsbezetting.� (90) de productomstel van straat 4 en 6 mag niet gelijktijdig gebeuren omwille van de
personeelsbezetting.� (91) een productomstel van straat 1, 3, 4, 5 en 6 mag niet gelijktijdig gebeuren omwille
van de personeelsbezetting. Opgepast: het zou kunnen zijn dat deze voorwaarde in de
nabije toekomst komt te vervallen terwijl de twee vorige behouden blijven.� (96) een productomstel in de maalstraat moet op maandag, dinsdag, woensdag of don-
derdag gebeuren. Er mag geen wettelijke feestdag binnen deze dagen vallen.
In het geval deze restricties niet worden genegeerd zitten we met meer problemen. Enerzijds
volgt uit deze restricties dat ze niet van belang zijn in de eerste fase, omdat ze expliciet
spreken over producties op bepaalde dagen. Maar deze worden helemaal nog niet vastgelegd
in deze eerste fase waardoor de restricties logischerwijze worden doorgeschoven naar de
tweede fase.
HOOFDSTUK 4. WERKELIJKE MODEL: STRUCTUUR 20
4
In de tweede fase zullen deze restricties echter voor zeer grote problemen zorgen indien er in
de eerste fase nog geen rekening met gehouden is. Een productierun is bijvoorbeeld geschat
voor 8 dagen in de maand. Deze run stopt op een vrijdag, wat betekent dat we twee dagen
moeten wachten, tot een maandag, alvorens de omstelling kan starten. Nog erger is het
dan als ook op een andere straat deze productierun toevallig stopt in het einde van die
week, zodat ook die omstelling op maandag moet starten. Maar 1 omstelling tegelijkertijd
betekent zelfs het uitstellen van de omstelling naar de volgende week. Dit effect kan zeer
snel oplopen, wat leidt tot fouten op de makespan van een groot aantal dagen. Het is niet de
bedoeling dat deze fouten te groot worden, want dit zal leiden tot inconsistenties tussen de
twee fasen. Mits enkele kleine aanpassingen zou waarschijnlijk de schatting wel voldoen aan
bovenstaande restricties zonder al te veel verlies van capaciteit. Er moet dus een oplossing
worden gezocht om deze voorwaarden in de eerste fase reeds in te plannen.
Dit gaat weer gepaard met voor- en nadelen. De eerste fase is op dit moment al meer dan
genoeg belast en heeft al voldoende tijd nodig om nauwkeurige schattingen te berekenen
zonder deze restricties. Het is mogelijk om deze restricties uit te schrijven voor de eerste
fase indien men de volledige productievolgorde gaat proberen vastleggen van alle straten en
de productiehoeveelheden dan zo gaat beperken zodat een productierun steeds eindigt op
een dag waarbij een omstelling kan beginnen. Er moeten dus ranges opgesteld worden voor
deze productiehoeveelheden. Dit vraagt echter een zeer groot aantal aan extra variabelen
en bovendien is dan de tweede fase ook helemaal niet meer van belang.
Voorlopig negeren we deze restricties en we komen er op terug bij de bespreking van de
resultaten.
5Analyse en terugkoppeling
ALVORENS over te gaan op de behandeling van de echte wiskundige modellen wordt
eerst het ’analyse-blok’ nog verder besproken, omdat dit van belang is voor een correct
begrip van de beide modellen.
De grote vraag die in dit blok wordt gesteld is of de vooropgestelde schedule haalbaar is in
de maand of niet. Indien het niet haalbaar is, is het dan mogelijk om wijzigingen aan te
brengen zodat het alsnog haalbaar wordt?
5.1. Ambitieuze plan
Het ambitieuze plan houdt in dat voor elke maand de makespan wordt geminimaliseerd. Alle
producten worden ingepland en beslissingen die afhangen van de volgende maand worden
uitgesteld. Zo zal het starten van een stilstand, of het starten van een omstelling op het
einde van de maand afhangen van de situatie in de volgende maand. Alle dagen die op
het einde van de maand op deze manier onbepaald blijven voor een straat noemen we de
vrije dagen van die straat. Deze vrije dagen kunnen dan worden gebruikt om verschillende
problemen van de komende maanden op te vangen.
Bekijken we bijvoorbeeld de situatie van figuur 5.1. In de eerste maand wordt er slechts voor
15 dagen F-productie ingepland. De laatste 15 dagen van de maand zijn over. We zouden
nu al kunnen beslissen om er een stilstand te starten, maar dit hangt ook af van de daarop-
volgende maand. Deze 15 dagen worden dus voorlopig beschouwd als vrije dagen. Indien nu
21
HOOFDSTUK 5. ANALYSE EN TERUGKOPPELING 22
5
maand 2 volledig is volgepland met G-productie, betekent dit dat er een omstel noodzakelijk
is tussen de F-productie uit maand 1 en de G-productie uit maand 2. Twee van de vrije
dagen worden dus ingenomen door omsteldagen en dan blijven er nog 13 dagen over. Indien
maand 2 gedeeltelijk is volgepland met G-productie, zou er ook nog een stilstand mogelijk
zijn. Stellen we dat deze stilstand bijvoorbeeld minstens 20 dagen moet duren, dan kunnen
een aantal vrije dagen daarvoor gebruikt worden tot het minimum aantal stilstand dagen
bereikt is voor maand 2 in combinatie met maand 1. Maand 3 veronderstellen we volledig
volgepland zodat er geen problemen zijn. In maand vier zijn door omstandigheden twee
dagen productie tekort voor de F-productie. De schedule is niet haalbaar in het vooropge-
stelde aantal dagen en een terugkoppeling naar fase 1 is vereist. We hebben echter geluk,
want we hadden nog een aantal dagen over in de eerste maand. Het ambitieuze plan houdt
dus in om de overproductie naar voor te schuiven en de vrije dagen op deze manier vol te
plannen.
Het grote nadeel hierbij is dat deze methode impliceert dat opnieuw moet worden gecon-
troleerd of maand 1 nog wel feasible is. Het naar voor brengen van F impliceert ook meer
A1-productie, en al de daarbij horende andere verbanden met de andere producten. Het
opnieuw doorlopen van de eerste maand en uiteraard dan ook de daaropvolgende maanden
vraagt extra rekentijd. Ten tweede ontstaat er een veel groter gevaar door het naar voor
brengen van producties. De schattingen uit de eerste fase worden dus gewijzigd en indien
in een latere maand een terugkoppeling naar de eerste fase noodzakelijk is, worden deze
schattingen vastgelegd, maar is het mogelijk dat er op die manier een infeasible probleem is
gecreeerd voor de eerste fase. Deze twee problemen zijn niet helemaal onoverkomelijk, maar
in de realiteit is het zeer moeilijk om dit allemaal te implementeren. Het ambitieuze plan
wordt bij deze dus afgevoerd.
Figuur 5.1.: Grafische voorstelling van het ambitieuze plan
5.2. Radicale plan
Indien de schedule niet feasible is voor een bepaalde maand, omdat er bijvoorbeeld 33 dagen
noodzakelijk zijn om de vooropgestelde schattingen te produceren, maar de maand slechts
31 dagen telt, zouden we radicaal kunnen zeggen: ’Die twee dagen produceren we niet’.
Bijgevolg is de planning uiteraard haalbaar in 31 dagen, maar we verliezen op deze manier
wel een grote productiehoeveelheid en dit leidt tot een grote hoeveelheid tekorten. Het is
HOOFDSTUK 5. ANALYSE EN TERUGKOPPELING 23
5
duidelijk dat ook deze oplossing niet wordt verkozen.
5.3. Intermediaire oplossing
Praktisch gezien zoeken we dus een oplossing die iets van beide voorgaande oplossingen
heeft. De terugkoppeling naar voorgaande maanden door het verschuiven van productie-
hoeveelheden laten we achterwege. Er wordt nog enkel naar de laatst ingeplande maand
gekeken om de productiehoeveelheden van de huidige maand in te plannen. Indien in de
vorige maand in totaal een overschot van 1 dag is op elke productiestraat, dan kan deze
dag ter beschikking worden gesteld van de volgende maand. De tweede fase gaat dus op
zoek naar die schedule die het minst lang duurt en niet zoals in de oorspronkelijke structuur
van de oplossing gezegd naar die schedule die de totale fout op de makespan minimaliseert.
We behouden het concept van de vrije dagen, maar deze keer niet per straat, maar voor de
hele productie. Dit aantal vrije dagen voegen we dan toe aan het aantal beschikbare dagen
van de volgende maand. Dit kan voor elke maand herhaald worden en op deze manier gaan
we iteratief een volledig vrije dag doorschuiven naar een latere periode op het jaar tot het
moment waarbij deze vrije dag nodig is. Een illustratie hiervan is te zien op figuur 5.2. Zeer
eenvoudig zouden we kunnen stellen dat door de overschot van 1 dag in januari we beslissen
dat januari maar 1 dag telt en februari 28 dagen. Aangezien er geen probleem is in februari,
telt februari opnieuw 28 dagen en schuiven we de dag door naar maart welke dan 32 dagen
telt. Uiteindelijk zien we dat in april een dag tekort is, dus indien april 31 dagen zou tellen
is het probleem opgelost. Door het verschuiven van de overschot-dag uit januari naar april
is dit probleem opgelost.
Figuur 5.2.: Grafische voorstelling van het praktische plan
Volledige productieruns worden op deze manier verschoven naar voren. We passen echter
niet de schattingen uit de eerste fase aan om het daaraan gekoppelde probleem bij de te-
rugkoppeling te vermijden, we passen wel het aantal beschikbare dagen aan door gebruik te
maken van formule 5.1 waarin ∆dm−1 gelijk is aan de vrije dagen van de voorgaande maand.
#dm,update = #dm,oud + ∆dm−1 (5.1)
Alles hangt feitelijk af van de correctheid van de schattingen uit fase 1. Zoals eerder reeds
besproken zou de terugkoppeling naar fase 1 gebeuren door het inperken van het aantal
HOOFDSTUK 5. ANALYSE EN TERUGKOPPELING 24
5
beschikbare dagen in een maand. Een terugkoppeling gaat wel gepaard met een aanzienlijk
tijdsverlies. Ik kan nu al zeggen dat fase 1 niet zo klein uitvalt en dat het nood heeft aan
een relatief grote rekentijd. Dus terugkoppelingen worden liefst zoveel mogelijk vermeden.
Een oplossing hiervoor zou kunnen zijn om reeds in fase 1 een zeer grote beperking op de
totale capaciteit per maand in te voeren. Alle maanden kunnen dan perfect de geschatte
productiehoeveelheden in de maand inplannen, maar verschillende maanden zullen meer-
dere vrije dagen hebben. Bovendien geeft een beperking van de capaciteit aanleiding tot
meer tekorten. Met andere woorden, er is hier sprake van een tradeoff. Ofwel regelmati-
ge terugkoppeling en een aanzienlijk tijdsverlies, ofwel geen terugkoppeling en veel dagen
die moeten worden doorgeschoven tussen de verschillende maanden en het daarbij horende
capaciteitsverlies. Er moet dus gezocht worden naar de perfect afweging tussen deze twee
aspecten.
Indien de makespan na het opgebruiken van alle vrije dagen nog steeds te lang uitvalt is er
noodzaak voor een terugkoppeling naar fase 1. Indien terugkoppeling niet noodzakelijk is
gaat men wel naar de volgende maand om te kijken of het mogelijk is om de schattingen in
te plannen mits gebruik van een vrije dag of mits zelf een extra vrije dag te creeren.
Hieronder staat het gebruikte algoritme welk het verband aangeeft tussen de eerste en de
tweede fase en waarin de terugkoppelingsmechanismen ook verwerkt zijn. Dit algoritme
geeft schematisch weer wat hierboven reeds is uitgelegd.
1. Initialisatie beginwaarden fase 1
2. Oplossen fase 1
3. Initialisatie beginwaarden fase 2� Begintoestand vorige maand� maandF2 := startM� ∆DstartM−1 := 0� #d2startM := #dstartM + ∆DstartM−1
4. Herhaal zolang maandF2 ≤ startM + 11� Opslaan waarden en parameters uit fase 1 noodzakelijk voor fase 2 betreffende
maandF2
– QmaandF2, SPp,maandF2, EPp,maandF2, SSs,maandF2, ESs,maandF2
– V T12p,maandF2−1, V T3p,maandF2−1,. . .� Ingeplande stilstanden door het management vastleggen voor fase 2� Initialiseren van de dagen waarop geen omstel mag plaatsvinden
HOOFDSTUK 5. ANALYSE EN TERUGKOPPELING 25
5
� Oplossen fase 2� Bepalen van het aantal dagen dat er tekort of te veel zijn in de gevonden schedule
– ∆DmaandF2 := #d2maandF2 − totMakespan� Indien ∆DmaandF2 < 0, dan zijn er dagen tekort en is de schedule niet feasible
a) Updaten van het aantal beschikbare dagen voor maandF2 in fase 1, het
beschikbare aantal dagen wordt kleiner gemaakt
– #d1maandF2 := #d1maandF2 + ∆DmaandF2
b) Opnieuw oplossen van fase 1 (eventueel met vastleggen van de produc-
tiehoeveelheden uit maanden die reeds in orde zijn)� Anders, dus als ∆DmaandF2 >= 0, wat wil zeggen dat de schedule feasible is,
maken we alles klaar om over te gaan naar de volgende maand in fase 2
a) De schattingen uit de maand die in orde is worden vastgelegd
b) Indien er een overschot is, ∆DmaandF2 > 0, wordt het aantal dagen van de
huidige maand geupdate:
– #d2maandF2 := #d2maandF2 − ∆DmaandF2
c) De gevonden schedule is de begintoestand voor de volgende maand
d) #d2maandF2+1 := #d2maandF2+1 + ∆DmaandF2
e) maandF2 := maandF2 + 1
5.4. Probleem: Restricties 88-91 en 96
Ook hier weer een kleine zijsprong naar het eerder besproken grote probleem. De eerder
gevormde conclusie om de restricties 88-91 en 96 te negeren wordt hier verder aangemoedigd.
Het gevaar van het uitstellen van omstellingen geeft aanleiding tot de mogelijkheid dat er
een groot aantal dagen tekort kunnen zijn in elke maand. Dit kan niet opgelost worden
door enkel gebruik te maken van de terugkoppeling door het aantal dagen te beperken. Er
moeten dus meer gesofisticeerde oplossingen worden bedacht, die alvorens terug te koppelen
echt gaan kijken waar het probleem van het tekort aan productiedagen zich werkelijk bevindt.
Zo een probleem analyse vergt echter zeer veel extra tijd om nog volledig in detail te kunnen
uitwerken. We blijven dus bij de conclusie om deze restricties te negeren.
6Preprocessing
6.1. Stilstanden ingevoerd door het management
ER zijn verschillende stilstanden die op voorhand ingevoerd worden door het manage-
ment. Deze zijn niet gelijk aan de stilstanden die door het model worden ingevoerd
zoals verderop wordt uitgelegd. Volgende opsomming is een samenvatting van al deze stil-
standen en de relaties onderling.� (1) jaarlijkse technische stilstand van de AG-installatie gedurende 3 weken, door het
management vast te leggen. Drie weken betekent vanaf maandagmorgen van de eerste
week tot vrijdag 16u30 van de derde week of 18.3 kalenderdagen (dit getal moet als
variabele kunnen ingegeven worden).� (2) de A1-, A2- en B-productie kan alleen lopen als de AG-installatie loopt.� (23) geen C- of D1-productie als de AG-installatie stilstaat (zie hierboven).� (25) geen C- of D1-productie tussen 15 december en 15 maart omdat de installatie niet
wintervast is (deze grenzen moeten als variabele kunnen ingegeven worden).� (32) jaarlijkse technische stilstand van de E-installatie gedurende 1 of 2 weken, door
het management vast te leggen. De weken lopen vanaf maandagmorgen tot vrijdag
16u30. 1 week is dus 4.3 dagen, 2 weken zijn 11.3 dagen (dit getal moet als variabele
kunnen ingegeven worden).
26
HOOFDSTUK 6. PREPROCESSING 27
6
� (33) de O-, F-, L- en M(in L)-producties kunnen alleen lopen als de E-installatie loopt.� (37) indien een technische stilstand van de AW3-installatie noodzakelijk is, wordt deze
gedurende 1 of 2 weken afgesteld. Dat wordt door het management vastgelegd. De
weken lopen vanaf maandagmorgen tot vrijdag 16u30. 1 week is dus 4.3 dagen, 2
weken zijn 11.3 dagen (dit getal moet als variabele kunnen ingegeven worden).� (38) bij een stilstand van de AW3-installatie, moeten alle producties stilgelegd worden.� (39) jaarlijkse technische stilstand van de AW1-installatie gedurende 1 of 2 weken,
door het management vast te leggen. De weken lopen vanaf maandagmorgen tot vrijdag
16u30. 1 week is dus 4.3 dagen, 2 weken zijn 11.3 dagen (dit getal moet als variabele
kunnen ingegeven worden).� (40) de H1-, H2-, H3-, L-, M(in L)- en O- en M(in L)-producties kunnen alleen lopen
als de AW1-installatie loopt.� (41) jaarlijkse technische stilstand van de AW2-installatie gedurende 1 of 2 weken,
door het management vast te leggen. De weken lopen vanaf maandagmorgen tot vrijdag
16u30. 1 week is dus 4.3 dagen, 2 weken zijn 11.3 dagen (dit getal moet als variabele
kunnen ingegeven worden).� (43) als de AW2-installatie niet loopt, is alleen onderstaande combinatie van producties
mogelijk (zie spreadsheet ’variabelen productieplanning, 2e blad) op voorwaarde dat de
AW1-installatie loopt.� (46) jaarlijkse algemene energiestilstand in installatie 2 tijdens de AG-/A1-stilstand
(o.a. spanningstesten) gedurende 2 dagen (dit getal moet als variabele kunnen ingege-
ven worden).� (47) indien een langere algemene energiestilstand in installatie 2 noodzakelijk is (warm-
watersysteem, koelwatersysteem, stoomsysteem) wordt het aantal dagen door het ma-
nagement vastgelegd (dit getal moet als variabele kunnen ingegeven worden).
Aangezien deze stilstanden allemaal op voorhand vastgelegd worden, zorgen we voor een
preprocessing stap die een aantal parameters met betrekking tot deze stilstanden initiali-
seert. In eerste instantie worden de noodzakelijke stilstanden per installatie of per straat
ingegeven in een excel-file (meerdere per installatie zijn mogelijk). Restricties (1), (25),
(32), (37), (39), (41), (46) en (47) zijn hierdoor onmiddellijk voldaan. Enkel de ingave van
de startdatum en de duur van de stilstand zijn voldoende, dit is inclusief de afstel- en op-
starttijd. Het is ook niet noodzakelijk om de daaruitvolgende stilstanden ook allemaal in
te geven. Het is bijvoorbeeld voldoende om de productie van AG 20 dagen stil te leggen.
Het onmiddellijke gevolg hiervan is dat ook A1, A2 en B 20 dagen zullen stilliggen. Dit
HOOFDSTUK 6. PREPROCESSING 28
6
mag mee ingegeven worden, maar is niet strikt noodzakelijk. De preprocessing stap zorgt
automatisch voor het doorgeven van de ingeplande stilstanden. Voor fase 1 is het vooral van
belang dat we weten hoeveel dagen er effectief geproduceerd kan worden. Daarom voeren we
volgende parameter in: ingeplandeSs,m ∈ Z+, deze parameter geeft voor elke straat s in el-
ke maand m weer hoeveel dagen er verloren gaan door een op voorhand ingeplande stilstand.
De preprocessing stap gaat als volgt te werk:
1. Bepalen van de einddatum horend bij de ingegeven stilstand
2. Doorgeven van de ingegeven stilstand naar daaropvolgende productiestraten volgens
de relaties uit tabel 6.1:� Stilstand bestaat reeds in de daaropvolgende straat: er wordt niets gedaan� Stilstand bestaat nog niet: stilstand wordt toegevoegd� Stilstand overlapt gedeeltelijk met een stilstand in de daaropvolgende straat: de
correcte totale stilstand wordt bepaald
3. Per straat wordt uitgaande van de resulterende stilstanden uit vorige stappen in elke
maand het totaal aantal dagen ingeplande stilstand bepaald: ingeplandeSs,m
Tabel 6.1.: Relaties tussen de stilstanden. vb: stilstand in AG wordt doorgegeven aan A1 omwille
van restrictie (2)
Straat 1 Straat 2 Restrictie Straat 1 Straat 2 Restrictie
AG → A1 (2) AW3 → s5 (38)
AG → A2 (2) AW3 → s6 (38)
AG → CD1 (23) AW3 → sM (38)
E → s5 (33) AW1 → s4 (40)
AW3 → AG (38) AW1 → s5 (40)
AW3 → E (38) A1 → A2 (-)
AW3 → A1 (38) inst2 → s1 (46)
AW3 → A2 (38) inst2 → s3 (46)
AW3 → CD1 (38) inst2 → s4 (46)
AW3 → s1 (38) inst2 → s5 (46)
AW3 → s3 (38) inst2 → s6 (46)
AW3 → s4 (38) inst2 → sM (46)
De restricties (33), (40) en (42) zijn slechts gedeeltelijk voldaan door de relaties in tabel 6.1,
het andere gedeelte wordt behandeld in het model zelf en we komen er later dus nog op terug.
HOOFDSTUK 6. PREPROCESSING 29
6
Op deze manier blijft enkel restrictie (43) nog over. Dit is niet eenvoudig te modelleren,
zowel niet in de preproces-stap als in de eerste of de tweede fase. Aangezien echter de
afvalwaterinstallatie zeer bedrijfszeker is, er geen stilstanden moeten ingepland worden door
het model en vanuit het management slechts 1 stilstand wordt ingepland per jaar, betekent
dit dat deze restrictie slechts in 2 weken van het hele jaar zou moeten gelden. Vanuit
deze optiek besluiten we om ze pas in fase 2 nauwkeuriger te bekijken. Indien AW2 dan
toch onverwacht uitvalt door een storing, kan dit toch niet op voorhand voorspeld worden
wanneer dit juist gaat gebeuren. Op dat moment maakt men het best gebruik van een
manuele planning om de storingsperiode op te vangen.
7Fase 1: Planning
HET is in de eerste fase de bedoeling dat we een zo goed mogelijke schatting maken
voor alle maandelijkse productiehoeveelheden. Deze beste schatting moet voortkomen
uit een zo klein mogelijke totale kost. De doelfunctie van deze eerste fase zal dan ook
bestaan uit het minimaliseren van een totale kost. Deze totale kost bestaat uit zeer veel
verschillende termen aangezien er ook zeer veel interacties zijn in het chemische proces. Een
kleine opsomming van de meeste aspecten die in de totale kost zitten vervat, wordt hierna
gegeven:� Voorraadkosten� Gebonden voorraadkosten� Omstellingskosten� Kosten voor tekorten� Winst en verlies ten gevolge van energie-(in)efficientie� Kosten en opbrengsten door invoeren van stilstanden
Deze totale kost wordt niet als 1 onderdeel behandeld, maar er worden telkens termen toe-
gevoegd indien ze voortkomen uit een behandeld onderwerp. Hou vooral in het achterhoofd
dat deze kost geminimaliseerd moet worden, omdat we naar de goedkoopste planning op
zoek zijn.
30
HOOFDSTUK 7. FASE 1: PLANNING 31
7
7.1. Veel gebruikte notaties
We beginnen eerst met het geven van de notatie van enkele veel gebruikte parameters.� startM geeft de maand waarin de planning wordt gestart� #dm is het aantal dagen in een maand. Bijvoorbeeld maand 5 is de meimaand die 31
dagen telt.� Tenzij anders wordt vermeld, geldt voor de index m het volgende: m ∈ {startM, . . . , startM+
11} Deze index geeft de maand aan waarvoor de variabelen gelden.� Vervolgens hebben we nog de index p die het product aangeeft waarvoor de variabele
geldt� Een laatste, veel voorkomende, index is s, die de productiestraat aangeeft
7.2. Algemene beslissingsvariabelen
De belangrijkste beslissingsvariabelen die worden ingevoerd zijn:� Qp,m ∈ R+: de productiehoeveelheden van elk product p per maand m� Pp,m :=
1, als productie van product p in maand m,
0, als geen productie van product p in maand m
De binaire productievariabelen.
We voeren voorwaarde 7.1 in die de relatie tussen Qp,m en Pp,m vastlegt. Indien Pp,m gelijk
is aan 0, dan zorgt vergelijking 7.1a er voor dat Qp,m ook gelijk is aan 0. Indien Pp,m = 1
dan kan Qp,m elke mogelijke productiehoeveelheid aannemen. De omgekeerde relatie wordt
vastgelegd door vergelijking 7.1b.
∀p,∀m : Qp,m ≤ Pp,m · dagcapaciteitp · 31 (7.1a)
∀p,∀m : Pp,m ≤ Qp,m (7.1b)
In het voorgaande is p elk product dat mogelijks wordt geproduceerd. Voor sommige voor-
waarden is het noodzakelijk om deze producten op te splitsen in verschillende subproducten.
Het product G kan hier perfect als voorbeeld voor dienen:
HOOFDSTUK 7. FASE 1: PLANNING 32
7
Tabel 7.1.: Opsplitsing van product G
G product G
→ G1 G geproduceerd op straat 1
→ G1v1 G1 uit grondstof A1
→ G1v2 G1 uit grondstof A2
→ G1v2T12 G1v2 via tank 1 en 2
→ G1v2T3 G1v2 via tank 3
→ G3 G geproduceerd op straat 3
→ G3v1 G3 uit grondstof A1
→ G3v2 G3 uit grondstof A2
→ G3v2T12 G3v2 via tank 1 en 2
→ G3v2T3 G3v2 via tank 3
In tabel 7.1 zien we dus dat G kan opgesplitst worden afhankelijk van de wijze waarop het
geproduceerd wordt. De index p kan al deze productvormen aannemen. Voor de andere
producten gelden analoge opsplitsingsregels, we splitsen echter niet op indien het niet strikt
noodzakelijk is voor verder gebruik in de voorwaarden. Voorwaarde 7.2 wordt toegevoegd
voor die producten die opgesplitst worden, zodat de totale productiehoeveelheid de som is
van de deelproducties.
∀m,∀(p1, p2, p) ∈ {alle producten p die opgesplitst worden in p1 en p2} :
Qp1,m + Qp2,m = Qp,m
(7.2)
We gaan vervolgens verder met de opsomming van de belangrijkste beslissingsvariabelen:� Tp,m ∈ R+: de tekorten van elk product p in de maand m zodat niet aan de vereiste
vraag voor die maand kan voldaan worden. Uiteraard geldt deze variabele enkel voor
die producten die verkocht worden. Bovendien kan een tekort in een maand ook
nooit groter zijn dan de vraag in die maand. Hier hoort wel nog een opmerking bij,
er is namelijk ook nog steeds een veiligheidsvoorraad waar het model rekening met
houdt. Dus een tekort in de vraag kan eventueel wel opgevangen worden door de
veiligheidsvoorraad indien het tekort uiteraard niet te groot is.� Vp,m ∈ R+: de voorraden van elk product p op het einde van de maand m� V T12A2,m, V T3p,m, V T4p,m en V TBB,m ∈ R
+: de voorraad van p in tank 1 en 2,
respectievelijk tank 3, respectievelijk tank 4, respectievelijk tank B op het einde van
de maand m.
HOOFDSTUK 7. FASE 1: PLANNING 33
7
� V V IBCp,m ∈ R+: de voorraad van p in vaten en IBC’s op het einde van de maand m� V Cp,m ∈ R
+: de voorraad van B in containers op het eind van maand m
In wat volgt zullen er indien nodig nog andere beslissingsvariabelen worden ingevoerd. We
proberen dit echter zoveel als mogelijk te vermijden. Eerst trachten we de problemen op te
lossen met de bestaande beslissingsvariabelen. Indien het echter onmogelijk blijkt, voeren
we toch nieuwe beslissingsvariabelen in. Dit om het aantal variabelen en de daarbij horende
rekentijd toch zoveel mogelijk te beperken.
7.3. Flowvoorwaarden
7.3.1. Vraag versus Aanbod eindproducten
Voorwaarden
Voor p ∈ {Alle producten die verkocht worden uitgezonderd A2} moet de algemeen gekende
voorwaarde 7.3 gelden: de voorraad op het begin van de maand samen met de productie
in de maand moet gelijk zijn aan de vraag naar het product in de maand samen met de
voorraad op het eind van de maand eventueel verminderd met de tekorten in de maand
indien de productie niet kan voldoen aan de vraag. We laten ook backlogging toe om
tekorten uit de vorige maand op te vangen met een eventueel productieoverschot van de
huidige maand. Indien het in de volgende maand nog niet opgevangen is, wordt er weer
een penalty aangerekend. Op zich kan je de vraagp,m + Tp,m−1 zien als de geupdate vraag
vraagUpdatep,m voor de maand m.
∀p,∀m : Vp,m−1 + Qp,m + Tp,m = vraagp,m + Vp,m + Tp,m−1 (7.3)
Twee korte bemerkingen in verband met deze tekorten: ten eerste is dit niet expliciet een
tekort omdat er niet geleverd kan worden. Zoals eerder gezegd is er ook nog de minimum-
voorraad waaruit het tekort kan geleverd worden. Ten tweede is het aan het bedrijf zelf om
de strategie in verband met deze tekorten te bepalen.
Voorwaarde 7.3 moet niet gelden voor A2 omdat daar ook nog intermediair verbruik is.
In plaats daarvan geldt voorwaarde 7.4 waarbij het verbruik van A2 voor de productie
van andere producten in rekening wordt gebracht. We maken hier de opsplitsing tussen
producten rechtstreeks vervaardigd uit A2 (PA2) en producten die enkel uit A2 worden
vervaardigd indien er een tekort is van A1 (PA1vA2).
HOOFDSTUK 7. FASE 1: PLANNING 34
7
∀m : QA2,m + VA2,m−1 + TA2,m =∑
p∈PA2
(verbruikp,A2 ·Qp,m)+∑
p∈PA1vA2
(verbruikp,A2 ·Qp,m)+VA2,m +vraagA2,m +TA2,m−1
(7.4)
We splitsen deze voorwaarde ook nog op volgens de tank die gebruikt wordt voor de tussen-
opslag van A2 en we maken ook gebruik van een opsplitsing voor VA2,m. Bij deze opsplitsing
zien we in voorwaarden 7.5 ofwel T12 ofwel T3 bij komen. Dit wil niets anders zeggen dan
het product dat via tank 1 en 2, respectievelijk tank 3 wordt geproduceerd. Bijvoorbeeld
PA2T12 is dan die set van producten die rechtstreeks vervaardigd worden uit A2, zoals PA2
ons leert, maar waarbij A2 afkomstig is uit tank 1 en 2. We veronderstellen hier ook bij dat
zowel de vraag als de voorraad van de vaten en de IBC’s altijd wordt voldaan vanuit tank
1 en 2.
∀m : VA2,m = V T12p,m + V T3p,m + V V IBCp,m (7.5a)
∀m : QA2T12,m + V T12A2,m−1 + V V IBCA2,m−1 + TA2T12,m =∑
p∈PA2T12
(verbruikp,A2 · Qp,m) +∑
p∈PA1vA2T12
(verbruikp,A2 · Qp,m)+
V T12A2,m + V V IBCA2,m + vraagA2,m + TA2T12,m−1 (7.5b)
∀m : QA2T3,m + V T3A2,m−1 + TA2T3,m =∑
p∈PA2T3
(verbruikp,A2 · Qp,m) +∑
p∈PA1vA2T3
(verbruikp,A2 · Qp,m) + V T3A2,m + TA2T3,m−1
(7.5c)
De opsplitsing van de producties is reeds behandeld in een vorige paragraaf. Dan rest er al-
leen nog enkele voorwaarden te schrijven in verband met de tekorten. Enerzijds hebben we de
tekorten opgesplitst en moet deze som gelijk zijn aan de totale som van tekorten (voorwaarde
7.6), anderzijds mag het tekort van A2 enkel dienen om de tekorten voor de verkoop van A2
op te vangen (en de eventuele tekorten uit de vorige maand), hiervoor schrijven we voorwaar-
de 7.7. Indien de productie van A2 nog meer beperkt wordt dan kan het tekort van enkel A2
dit niet meer alleen opvangen. Bijgevolg zal de productiehoeveelheid van een volgend pro-
duct ook verminderd worden en worden de tekorten uit vergelijking 7.3 verschillend van 0.
Ook voor de andere producten p ∈ {Alle producten die verkocht worden uitgezonderd A2}
HOOFDSTUK 7. FASE 1: PLANNING 35
7
is er een beperking op de grootte van de tekorten. Deze voorwaarde 7.8 is niet strikt nood-
zakelijk, omdat het model automatisch de tekorten probeert te minimaliseren, maar ze zorgt
wel voor extra intelligentie zodat er sneller een oplossing wordt gevonden.
∀m : TA2T12,m + TA2T3,m = TA2,m (7.6)
∀m : TA2,m ≤ vraagA2,m + TA2,m−1 (7.7)
∀p∀m : Tp,m ≤ vraagp,m + Tp,m−1 (7.8)
7.3.2. Voldoende productie tussenproducten
De algemene flowvergelijking 7.3 is niet geldig voor de tussenproducten. We passen hier 1
na 1 deze vergelijking aan met betrekking tot de andere producten.
A1-productie:
∀m : QA1,m = verbruikA2,A1 · QA2,m +∑
p∈PA1
verbruikp,A1 · Qp,m (7.9a)
In voorwaarde 7.9a bestaat het set PA1 uit al die producten die rechtstreeks uit A1 vervaar-
digd kunnen worden, A2 uitgezonderd. De termen in verband met de voorraden en de vraag
vallen weg omdat er geen opslagmogelijkheid is van A1 en omdat A1 niet verkocht wordt.
Bijgevolg kunnen er ook geen tekorten zijn voor A1, want de tekorten waren zo gedefinieerd
als die hoeveelheid waaraan men niet kon voldoen voor de vraag. Indien er een tekort aan
capaciteit is op de productiestraat van A1 weerspiegelt dit in lagere productiehoeveelheden
Q voor de andere producten, en dit wordt in de eigen flowvergelijking opgevangen door de
tekorten van de andere producten. Dit is in overeenstemming met volgende restrictie: (15)
er is geen opslag van A1. De productie moet dus direct verbruikt worden of tot A2 worden
omgezet. De A2-productiecapaciteit is kleiner dan de A1-productiecapaciteit. Indien er geen
verbruik is van A1 moet de A1-productie verminderd worden.
C-productie:
∀m : QC,m + V T3C,m−1 = verbruikI,C · QI,m + V T3C,m (7.9b)
Een analoge uitleg geldt voor voorwaarde 7.9b. Wel voorraden omdat er opslag mogelijk is,
geen vraag en dus ook geen tekorten omdat er geen verkoop is van product C.
HOOFDSTUK 7. FASE 1: PLANNING 36
7
D1-productie
∀m : QD1,m + V T3D1,m−1 =∑
p∈PD1
(verbruikp,D1 · Qp,m) + V T3D1,m (7.9c)
Het set PD1 wordt als volgt gedefinieerd: PD1 := {D2, J}.
D2-productie
∀m : QD2,m + V T4D2,m−1 = verbruikK,D2 · QK,m) + V T4D2,m (7.9d)
Molen-productie
∀m,∀(p1, p2) ∈ {(F, FC), (G, GC), (L, LC)} :
dagcapaciteitp2
dagcapaciteitp1· Qp1,m ≥ Qp2,m
(7.9e)
De vergelijking voor de producten in de molen is eigenlijk al vervat in 7.3, maar aangezien
er geen tussenopslag is tussen de productiestraten en de maalstraat, moet er een beperking
ingevoerd worden op de molenproductie per product. Bijvoorbeeld 1 dag productie van F
betekent 25.4 ton, indien op diezelfde dag ook de molen draait voor F kan niet die volledige
25.4 ton vermaald worden, maar slechts 19.3 ton. Dus de hoeveelheid van gemalen producten
per maand moet kleiner zijn dan een fractie van de ongemalen producten per maand wat is
uitgeschreven in vergelijking 7.9e. Hiermee is voldaan aan restrictie: (93) om een product
te kunnen malen, moet de overeenkomstige productiestraat lopen, straat 1 voor F/c, straat
1 of 3 voor G/c en straat 4 voor L/c.
B-productie
Voor B is nog een speciale uitbreiding nodig omdat het een bijproduct is van A1, met beper-
kingen op de geproduceerde hoeveelheid van B afhankelijk van de geproduceerde hoeveelheid
van A1. Vergelijkingen 7.9f en 7.9g worden ingevoerd omwille van restrictie: (17) B is een
nevenproduct uit de A1-productie en kan dus enkel geproduceerd worden als de A1-productie
loopt. De B-productie ’voor verkoop’ is minimaal 3.5% (ondergrensB) en maximaal 7.0%
(bovengrensB) van het A1-productievolume (deze grenzen moeten als variabele kunnen in-
gegeven worden).
∀m :ondergrensB
100· QA1,m ≤ QB,m (7.9f)
∀m :bovengrensB
100· QA1,m ≥ QB,m (7.9g)
HOOFDSTUK 7. FASE 1: PLANNING 37
7
Flow-producties
Voor volgende restricties moeten niet expliciet voorwaarden worden uitgeschreven. Door
een correcte definitie van het set producten waaraan elke voorwaarde moet voldoen is auto-
matisch aan deze restricties voldaan.� (34) De O-, N- en M(in N)-producties kunnen enkel uit A2 als grondstof lopen.� (35) De F-, G(in F), G(in H1)-, H1-, H2-, H3-, L- en M(in L)- en L- en M(in L)-
producties lopen preferentieel uit A1 als grondstof.� (36) De F-, G(in F), G(in H1)-, H1-, H2-, H3-, L- en M(in L)-producties kunnen ook
uit A2 als grondstof geproduceerd worden zolang er voorraad beschikbaar is.� (53) op straat 6 kunnen N of M(in N) geproduceerd worden.� (57) op straat 4 kunnen L of M(in L) geproduceerd worden.� (66) op straat 1 kunnen F of G (=G(in F) geproduceerd worden.� (71) op straat 3 kunnen G(in H1), H1, H2, H3, I, J, D2 of K geproduceerd worden.� (72) K wordt uitsluitend uit D2 geproduceerd.� (92) in de maalstraat kunnen F/c, G/c en L/c geproduceerd worden.
Nog een kleine bemerking is op zijn plaats bij restricties 35 en 36. In heel de voorgaande
discussie is er nog geen enkele keer gesproken over hoe de voorkeur wordt gegeven tot
productie uit A1 in plaats van productie uit A2. Door de restricties te schrijven zoals
hierboven is namelijk deze voorkeur er automatisch ingeslopen. Enerzijds heeft productie
over A2 noodzaak aan meer verbruik van A1, dus hieruit volgt al de logische beslissing om
rechtstreeks uit A1 te produceren. Anderzijds krijgen we ook een weerspiegeling van de
voorkeur in de kosten. Zowel voor A2 als voor de producten wordt een kost aangerekend.
Dus de kost van rechtstreekse productie uit A1 is kleiner dan productie via A2. Deze twee
bemerkingen zouden de preferenties op een correcte manier moeten weerspiegelen. Of het
model tot dezelfde conclusies leidt, zullen we verifieren bij de resultaten.
7.4. Totale kost (1)
In dit onderdeel behandelen we de belangrijkste termen uit de doelfunctie tot nu toe. In
latere onderdelen worden er indien nodig extra termen aan de doelfunctie toegevoegd. We
houden in ons achterhoofd dat het de bedoeling is om de totale kost te minimaliseren.
De totale kost is dan het resultaat van verschillende effecten die op elkaar inwerken. We
behandelen hier achtereenvolgens de voorraadkosten en de tekortkosten.
HOOFDSTUK 7. FASE 1: PLANNING 38
7
7.4.1. Voorraadkost
De voorraadkosten zijn een combinatie van de kost voor opslag van de geproduceerde pro-
ducten in het magazijn en het gebonden kapitaal dat in de voorraad zit. Want indien de
voorraad niet aanwezig is, dan zou op het bespaarde kapitaal van die voorraad een rendement
zijn van 7.5%.
Voorraadkost omwille van opslag:
(103) de opslag van F, G, H1, H2, H3, I, J, K, L, M, O en N gebeurt in een extern maga-
zijn en kost 3.15 Euro/ton/maand (voorraadKost). 400 ton (maximumOpslag) wordt
kostenloos in het bedrijf gestockeerd (deze getallen moeten als variabele kunnen ingege-
ven worden). We breiden deze restrictie uit door ook de gemalen producten in reke-
ning te brengen. We voegen volgende term toe aan de te minimaliseren totale kost met
p ∈ {F, G, H1, H2, H3, I, J, K, L, M, O, N, FC, GC, LC}:
+∑
m
(
∑
p
∑mt=m−1 Vp,t
2− maximumOpslag
)
· voorraadKost (7.10)
We sommeren over alle maanden het teveel aan gemiddelde voorraad van die maand en
vermenigvuldigen dit met de voorraadkost voor het bijhouden van de voorraad per maand.
Het teveel aan gemiddelde voorraad per maand, is niets anders dan de de totale gemiddelde
voorraad van alle producten verminderd met de maximum opslag capaciteit. We nemen het
gemiddelde in een maand, omdat er niet exact geweten is op elk moment van de maand
hoeveel voorraad er aanwezig is. De beste schatting hiervoor is de voorraad in het begin
van de maand plus de voorraad op het einde van de maand te delen door 2.
Een tweede aspect van de voorraadkost voor opslag vind je in restrictie (9) 4.4 Euro/ton/-
maand (voorraadKostV atenEnIBC) opslagkost voor vaten en IBC’s (dit getal moet als
variabele kunnen ingegeven worden). Deze restrictie geldt voor alle producten die in vaten
en IBC’s kunnen opgeslagen worden, dus p ∈ {A2, B}.
+∑
m
(
∑
p
∑mt=m−1 V V IBCp,t
2
)
· voorraadKostV atenEnIBC (7.11)
Een analoge uitleg als bij term 7.10 geldt voor deze term.
In verband met deze voorraadkosten is er nog niets in rekening gebracht wat het kost voor
de opslag van de voorraden in de tanks. Indien deze ook noodzakelijk zijn kunnen deze
eenvoudig aan deze termen toegevoegd worden.
HOOFDSTUK 7. FASE 1: PLANNING 39
7
Voorraadkost omwille van het gebonden kapitaal:
Het gebonden kapitaal wordt als volgt berekend:
+∑
m
∑
p
(∑m
t=m−1 Vp,t
2· varProductieKostp
)
·7.5%
12(7.12)
Hierin zit de productiekost reeds vervat, dus het is niet noodzakelijk om de productiekosten
apart in de doelfunctie op te nemen.
7.4.2. Tekortkosten
De kost voor een ton tekort van een product is gelijk aan de marge van dat product in ton.
De tekortkost kan dan heel eenvoudig geschreven worden als volgt:
+ (∑
m
∑
p∈verkochte producten
Tp,m · margep) (7.13)
De tekorten zoals in het model beschreven, zijn de tekorten indien we onder de totale mi-
nimum voorraad zitten. In praktijk kunnen deze producten dus wel nog geleverd worden
zolang de voorraad maar niet negatief wordt. Een echt tekort is er dus maar als de voorraad
negatief wordt en de klanten dus niet meer bediend kunnen worden. We behouden toch
deze vergelijking 7.13 omdat het niet de bedoeling is om onder de minimale voorraad te
gaan. Op die manier bestraffen we elke productiehoeveelheid tekort voor het behouden van
dit minimumlevel, ondanks het feit dat in de praktijk alle klanten toch beleverd kunnen
worden. Om in de praktijk met deze tekorten om te gaan is het aan het bedrijf zelf om een
goede strategie te ontwikkelen. Ze geven een eerste indicatie waar het in de komende 12
maanden verkeerd kan gaan door een tekort aan capaciteit.
Het voorgaande was het eenvoudige geval. Het is echter ook de bedoeling dat indien er een
tekort is, dit tekort zo wordt opgevangen dat er het minste verlies is zoals beschreven in
onderstaande restricties.� (98) bij capaciteitsengpassen op straat 4 en 6 voor L,M en N moet volgende productie
prioriteit gevolgd worden in functie van de variabele marge/dag: N > M > L (deze
volgorde moet manueel kunnen ingegeven worden). P98 := {L, M, N}� (99) bij capaciteitsengpassen op straat 1 en 3 bij F, G, H1, H2, H3, I, J en K moet
volgende productie prioriteit gevolgd worden in functie van de variabele marge/dag:
K > I > J > H1 > H2 > F > G > H3 (deze volgorde moet manueel kunnen
ingegeven worden). P99 := {F, G, H1, H2, H3, I, J, K}� (100) bij capaciteitsengpassen bij de A1-/A2-productie moet volgende productie prio-
riteit gevolgd worden in functie van de marge/kg A1/A2: N > M > H1 > H2 >
HOOFDSTUK 7. FASE 1: PLANNING 40
7
O > L > F > G > H3 > verkoopA2 (deze volgorde moet manueel kunnen ingegeven
worden). P100 := {F, G, H1, H2, H3, L, M, N, O, verkoopA2}� (101) bij capaciteitsengpassen bij de D1-productie moet volgende productie prioriteit
gevolgd worden in functie van de marge/kg D1: K > I > J (deze volgorde moet
manueel kunnen ingegeven worden). P101 := {K, I, J}
In overleg is er besloten dat de volgorde automatisch uit het model moet volgen indien de
marge en het verbruik van de producten gegeven zijn. De eis om de volgorde manueel te
kunnen ingegeven vervalt dus.
Het is dus de bedoeling om de algemene vergelijking van de kost voor de tekorten 7.13 zo te
manipuleren dat de correcte productievolgordes worden gegeven, maar dat de tekortkost per
product wel in dezelfde grootteorde blijft. Indien we de vier sets van producten P98, P99,
P100 en P101 samennemen zien we dat elk product er tweemaal in voorkomt uitgezonderd
verkoopA2 en O. Bovendien zien we ook dat de volgordes in deze vier restricties consequent
zijn. Bijvoorbeeld M > L in zowel restrictie 98 als 100. We bekomen volgende voorwaarden:
+ (∑
m
∑
p∈P98⋃
P99⋃
{O, verkoopA2}
Tp,m · margep) ·1
2(7.14a)
+ (∑
m
∑
p∈P100
Tp,m ·margep
verbruikp,A1/A2) ·
1
2(7.14b)
+ (∑
m
∑
p∈P101
Tp,m ·margep
verbruikp,C/D1) ·
1
2(7.14c)
+ (∑
m
∑
p∈{FC, GC, LC, B}
Tp,m · margep) (7.14d)
Door de factor 12 in de eerste drie voorwaarden van 7.14 wordt de grootteorde van deze te-
kortkost behouden, aangezien elk product voorkomt in 2 van die vergelijkingen. De laatste
voorwaarde 7.14d bepaalt de tekortkost van de andere producten die niet door restricties
98-101 worden vermeld. Een kleine illustratie bij deze termen: een tekort op straten 4 en
6, betekent dat enkel de tekorten van {L, M, N} verschillend kunnen zijn van 0. Alleen in
term 7.14a en in term 7.14b kunnen er dus delen bijdragen aan de totale kost. Door de eer-
der vermelde conclusie dat de volgorde ten gevolge van de restricties overeenkomen, zullen
deze twee termen ook tot een gelijk resultaat komen, nl. zo weinig mogelijk tekorten van N
en zoveel mogelijk tekorten van L. Een analoge redenering geldt voor een capaciteitsverlies
op de andere straten.
Het enigste nadeel van deze methode is dat er een mogelijke switch in de volgorde kan
voorkomen. Beschouwen we het denkvoorbeeld in tabel 7.2. In de eerste situatie zien we
HOOFDSTUK 7. FASE 1: PLANNING 41
7
dat de volgorde voor N en M gelijk is volgens beide restricties. In het huidige geval geldt
dit voor alle producten. Het gevaar bestaat er nu echter in dat, door het wijzigen van een
marge of een verbruik de volgorde niet meer hetzelfde blijft voor alle restricties zoals te
zien in situatie 2. We gaan er hier vanuit dat zo’n drastische veranderingen in de praktijk
niet zullen voorkomen en dat de volgordes steeds behouden blijven of slechts zeer minimaal
zullen verschillen. Tenslotte is het verschil in kost voor het tekort dan niet extreem groot.
Tabel 7.2.: Denkvoorbeeld in verband met de capaciteitsengpassingen
Situatie 1 N M Situatie 2 N M
Marge 8 2 Marge 3 2
Verbruik 4 2 Verbruik 4 2
Volgorde 98 1 2 Volgorde 98 1 2
Volgorde 100 1 2 Volgorde 100 2 1
7.5. Stilstanden
Dit onderdeel betreft alle stilstanden, zowel de stilstanden vastgelegd door het management
die in deel 6.1 aan bod zijn gekomen als de stilstanden die achteraf door het model worden
ingepland omwille van overcapaciteit. De stilstanden die hier ingevoerd worden, zijn inclusief
de afstel- en opstarttijd. We introduceren eerst een aantal nieuwe variabelen, daarna geven
we de bijhorende restricties. In eerste instantie geldt voor de index s het volgende: s ∈
{sA1, sA2, sCD1, s1, s3, s4, s5, s6, sM}. In tweede instantie passen we voor sommige
productiestraten de eerder gegeven vergelijkingen aan.
7.5.1. Beslissingsvariabelen in verband met Stilstanden
Eerst definieren we twee binaire variabelen SS : StartStilstand en ES : EindStilstand die
aanduiden of er al dan niet een stilstand in een bepaalde maand plaatsvindt. Voor een
grafische voorstelling verwijs ik naar figuur 7.1. Op deze figuur zijn enkel de variabelen
verschillend van nul weergegeven.
∀m : SSs,m ∈ {0, 1} en ESs,m ∈ {0, 1} (7.15)
SSs,m :=
1, als een stilstand wordt gestart op straat s in maand m,
0, anders(7.16)
ESs,m :=
1, als een stilstand wordt geeindigd op straat s in maand m,
0, anders(7.17)
HOOFDSTUK 7. FASE 1: PLANNING 42
7
Figuur 7.1.: Grafische voorstelling variabelen stilstand
Vervolgens definieren we nog een gehele variabele dagenSs,m ∈ Z+ : dagenStilstand. Deze
variabele houdt voor elke productiestraat in elke maand bij hoeveel dagen het model de
productiestraat stillegt. Deze dagen stilstand zijn inclusief de afstel- en opstarttijd van de
productiestraat.
7.5.2. Restricties in verband met Stilstanden
Algemene restricties
∀s,∀m : dagenSs,m ≥ ingeplandeSs,m (7.18a)
∀s,∀m : SSs,m ≤ 1 −
m−1∑
t=startM−1
(SSs,t − ESs,t) (7.18b)
∀s,∀m : ESs,m ≤
m−1∑
t=startM−1
(SSs,t − ESs,t) + SSs,m (7.18c)
∀s,∀m : dagenSs,m ≤
(
m−1∑
t=startM−1
(SSs,t − ESs,t) + SSs,m
)
· 31 (7.18d)
∀s,∀m ∈ {startM − 1, . . . , startM + 10} :
m+1∑
t=m
dagenSs,t ≥ (afstels + opstarts) · SSs,m
(7.18e)
∀s,∀m ∈ {startM, . . . , startM + 11} :
dagenSs,m ≥ (afstels + opstarts) · (SSs,mESs,m − 1)(7.18f)
∀s,∀p ∈ {producten vervaardigd op straat s},∀m :
1 −
m−1∑
t=startM−1
(SSs,t − ESs,t) + ESs,m ≥ Pp,m
(7.18g)
In de voorwaarden 7.18 komt regelmatig de volgende som voor:∑m−1
t=startM−1(SSs,t−ESs,t).
Deze som is gelijk aan 0 indien in de vorige maanden alle stilstanden die gestart zijn ook
HOOFDSTUK 7. FASE 1: PLANNING 43
7
zijn beeindigd in de vorige maanden. De som is gelijk aan 1 indien er een stilstand gestart
is in een van de vorige maanden die in maand m nog steeds niet is afgesloten.
Deze stilstanden zijn inclusief de ingeplande stilstanden door het management, voorwaarde
7.18a zorgt er dan ook onmiddellijk voor dat het aantal dagen van de stilstand sowieso groter
zal zijn dan de vastgelegde dagen. Door het integreren van de ingeplande dagen kan het
model nog beslissen om deze stilstanden nog langer te maken. Bovendien wordt het dan ook
verplicht om de beslissingsvariabelen SS en ES in verband met deze ingeplande stilstanden
te gebruiken. Voorwaarde 7.18b zorgt ervoor dat er geen stilstand wordt gestart in maand
m indien de vorige stilstand nog niet is afgesloten. Dit betekent dat indien er in de maand m
eerst een nog lopende stilstand moet worden afgesloten er geen nieuwe kan worden gestart.
Restrictie 7.18c betekent dat je nooit een stilstand kan stoppen, ESs,m = 1 indien er nog
geen stilstand gestart is. Deze stilstand mag gestart zijn in een vorige maand of in een
huidige maand. Het linkerlid van de derde voorwaarde (7.18d) kan enkel verschillen van nul
indien er 1 stilstand in de maand m nog niet is afgesloten. Met andere woorden, er worden
geen dagen stilstand vastgelegd in een maand zonder stilstand. Voorwaarde 7.18e zorgt dat
een stilstandduur nooit kleiner is dan de tijd nodig om een straat af te stellen en opnieuw
op te starten. Aangezien een stilstand kan verspreid zijn over meerdere maanden wordt
hier de som genomen van het aantal dagen stilstand in maand m en de daaropvolgende
maand. In het geval de stilstand toch slechts in 1 maand plaatsvindt, zal voorwaarde 7.18f
er voor zorgen dat ook dan het minimum aantal dagen voorbehouden wordt. Restrictie
7.18g tenslotte bepaalt dat er enkel opnieuw productie kan zijn van een product op straat s
indien de stilstand afgesloten is.
Specifieke restricties per straat
Voor s ∈ {sA1, sA2, s5} wordt vergelijking 7.18b vervangen door vergelijking 7.19 en valt
voorwaarde 7.18f weg (niet meer geldig). Dit omdat bij deze straten de keuze wordt gemaakt
om eventueel wel een nieuwe stilstand te laten starten in maand m indien de vorige stilstand
pas afgesloten is in dezelfde maand. Het kan bijvoorbeeld op straat 5 voorvallen dat een
stilstand eindigt in het begin van de maand, vervolgens wordt er 21 dagen geproduceerd en
tegen het einde van de maand zou dan een nieuwe stilstand moeten starten. Deze situatie
is onmogelijk in 7.18b, maar wordt door de extra term wel mogelijk gemaakt door 7.19.
∀s ∈ {sA1, sA2, s5},∀m : SSs,m ≤ 1 −
m−1∑
t=startM−1
(SSs,t − ESs,t) + ESs,m (7.19)
Voorwaarde 7.18e in verband met de eis voor een minimum lengte van een stilstand wordt
voor s ∈ {sA1, s5} nog uitgebreid omwille van restrictie (16) de minimale duur van een A1-
/A2-stilstand, tussen stop productie en start productie moet ten minste 21 dagen bedragen.
Kortere stilstanden zijn economisch zinloos (dit getal moet als variabele kunnen ingegeven
worden)en restrictie (51) een O-stilstand moet minstens 3 weken duren (dit getal moet als
HOOFDSTUK 7. FASE 1: PLANNING 44
7
variabele kunnen ingegeven worden). De minimum lengte voor een stilstand per straat wordt
meegegeven als parameter in aantal dagen. Voorwaarde 7.18e wordt dan 7.20.
∀s ∈ {sA1, s5},∀m ∈ {startM − 1, . . . , startM + 10} :
m+1∑
t=m
dagenSs,t ≥ minimumLengteStilstands · SSs,m
(7.20)
Ook voor de maalstraat moet voorwaarde 7.18e aangepast worden. Dit omdat de afstel
en opstart van de maalstraat samen slechts 1 dag vraagt. Een omstelling in de maalstraat
vereist echter 3 dagen. Indien de voorwaarde 7.18e dus niet aangepast wordt, gaat het model
beslissen om in plaats van een omstelling in te voeren van drie dagen, een stilstand in te
plannen van slechts 1 dag. Het is echter onmogelijk om na deze korte stilstand een ander
product in de maalstraat te produceren. De enige situatie waarbij we de stilstand dus langer
moeten maken is indien SSp,m = 1 en ESp,m = 1. Dit is de situatie waarbij een stilstand
wordt gestart en nog in dezelfde maand wordt gestopt. Hiervoor voegen we voorwaarde 7.21
toe. Praktisch gezien houdt dit geen verlies van algemeenheid in aangezien de productie
toch nooit zal stoppen voor minder dan 3 dagen.
∀s ∈ {sM},∀m : dagenSs,m ≥ 3 · (SSs,m + ESs,m − 1) (7.21)
Doorgeven van stilstanden
Sommige straten zijn rechtstreeks gekoppeld aan andere, zodat productie op de ene straat
betekent dat er ook productie is op de voorgaande straat. Voor volgende situaties moeten
er extra voorwaarden worden toegevoegd:� Aangezien er enkel A2-productie mogelijk is indien er ook A1 wordt geproduceerd
voegen we voorwaarde 7.22 toe. In deze voorwaarde wordt niet de gelijkheid geeist
omdat het ook mogelijk is om A2 niet te produceren terwijl men wel A1 produceert.
Dat is in het theoretische geval, in de praktijk echter zal men zien dat A1 en A2 steeds
samen worden geproduceerd omwille van energie-efficientie en omdat er bijna steeds
A2-verbruik of A2-verkoop is of opstapeling van A2 in de tanks. We behouden hier wel
de ongelijkheid om de algemeenheid van het model te waarborgen. Bovendien voegen
we toch een extra term (ss62) toe aan de totale kost voor elke dag dat A2 langer
stilstaat dan A1. Want dit is een niet te negeren energieverlies. De A1 installatie zal
dan tegen lagere snelheid moeten produceren omdat de straten niet perfect uitgelijnd
zijn qua capaciteit. Het model zal zelf de beslissing nemen afhankelijk van de kosten
om meer dagen stilstand van A2 in te voeren of toch niet.
∀m : dagenSsA1,m ≤ dagenSsA2,m (7.22)
HOOFDSTUK 7. FASE 1: PLANNING 45
7
+ penaltysA2nietA1 ·∑
m
(dagenSsA2,m − dagenSsA1,m) (7.23)� Ook straten 1, 3 en 4 zijn rechtstreeks gekoppeld aan de productie van A1. Aangezien
het echter mogelijk is om ook via A2 deze straten te laten lopen is het hierbij niet
mogelijk om rechtstreeks een voorwaarde zoals 7.22 te schrijven. Het is wel mogelijk
om de productie van deze producten via A1 te beperken tot een maximale hoeveelheid
gelijk aan het aantal dagen dat de A1-productie loopt. Dit wordt in voorwaarde 7.24
bepaald, waarbij met PvA1: ProductenViaA1 enkel dat gedeelte van de productie-
hoeveelheid wordt overgehouden dat via A1 wordt geproduceerd.
∀s ∈ {s1, s3, s4},∀m :∑
PvA1∈{s}
QPvA1,m
dagcapaciteitPvA1≤ #dm − dagenSs,m (7.24)
Voor straat 3 wordt er in het rechterlid dus de som genomen van de productiehoe-
veelheden van G (op straat 3), H1, H2 en H3 geproduceerd uit A1 gedeeld door hun
respectievelijke dagcapaciteit. Op deze manier bekomt men in het rechterlid het aantal
dagen dat er rechtstreeks uit A1 wordt geproduceerd. Eventueel zou het linkerlid nog
kunnen verminderd worden door de omstellingen ook in rekening te brengen.
7.5.3. Bijdrage van de stilstanden tot de totale kost� Het volledig stilleggen van een productiestraat is uiteraard goedkoper dan het produ-
ceren tegen een lagere snelheid. Bovendien is een lange stilstand ook efficienter inzake
energieverbruik dan verschillende kleine stilstanden omdat elke opstart en afstel van
een productiestraat ook enerige verbruikt. We verwerken dit in de doelfunctie door
elke dag stilstand die niet behoort tot de afstel- of opstarttijd te belonen met een
gekozen factor. s ∈ {sCD1, s1, s3, s4, s5, s6, sM}
∀s : −50 ·
startM+11∑
m=startM
(dagenSs,m − (afstels + opstarts) · SSs,m) (7.25)� (10) de A1-productie loopt best op vollast met 3 straten. 83 dagen op 2/3-last t.o.v.
28 dagen afstel en 55 dagen op vollast levert 160,000 Euro besparing op (dit getal moet
als variabele kunnen ingegeven worden). Deze besparing is lineair te extrapoleren naar
andere deellasten. We voegen daarom bij de doelfunctie de volgende term waarbij
de getallen in het model worden meegegeven als parameters die op voorhand nog
te wijzigen zijn. Per dag stilstand van de straat A1 krijgen we dus een bonus van
160000/28 euro.
HOOFDSTUK 7. FASE 1: PLANNING 46
7
−160000
28·
startM+11∑
m=startM
dagenSsA1,m (7.26)
Op restrictie 10 wordt later in combinatie met restrictie 22-bis nog dieper op ingegaan.� De stilstanden gaan uiteraard ook gepaard met kosten. Voorlopig worden hier enkel de
kosten voor afstel en opstart in beschouwing genomen. Indien er tijdens een stilstand
ook nog kosten zijn tengevolge van een omstel naar een ander product worden deze kos-
ten bij de omstellingskosten in rekening gebracht. s ∈ {sA1, sA2, sCD1, s1, s3, s4, s5, s6, sM}.
Aan de doelfunctie wordt de volgende term toegevoegd:
∀s : +startM+11∑
m=startM
(SSs,m · kostAfstels + ESs,m · kostOpstarts) (7.27)
7.6. Productierun
(54) een N-productiecampagne moet minstens 14 dagen duren (dit getal moet als variabele
kunnen ingegeven worden). Naar analogie met deze restrictie gelden er ook zo’n restricties
voor de productie van verschillende andere producten. Kort samengevat: indien product p
geproduceerd wordt, moet deze productierun een minimum lengte (MLp) hebben. Er zijn
verschillende manieren om dit op te lossen. Een eerste manier bestaat erin om voorwaarde
7.28 toe te voegen voor p ∈ {minimale lengte productierun vereist}. Deze voorwaarde eist
dat indien er productie is in maand m, dus als Pp,m = 1, de som van het aantal dagen
productie van de vorige maand m − 1, de huidige maand m en de volgende maand m + 1
groter moet zijn dan de minimum lengte. Enkel eisen dat het aantal dagen productie van
de huidige maand groter moet zijn is niet voldoende aangezien een productierun over twee
maanden verspreid kan zijn. Enkel eisen dat het moet gelden voor de huidige maand en
de volgende maand is ook niet voldoende, omdat de vergelijking dan niet geldig is voor
maanden m + 1 en m + 2. Een grafische voorstelling hiervan zie je op figuur 7.2. Daarom
moet ook nog de vorige maand in beschouwing worden genomen.
Figuur 7.2.: Grafische voorstelling vergelijking 7.28
HOOFDSTUK 7. FASE 1: PLANNING 47
7
∀m ∈ {startM, . . . , startM + 10} :
m+1∑
t=m−1
Qp,t
dagcapaciteitp≥ MLp · Pp,m
(7.28)
Deze methode is zeer eenvoudig en maakt alleen gebruik van reeds eerder gedefinieerde
variabelen. Het grote nadeel van deze methode is dat er zeer veel ongewenste situaties
overblijven. Een voorbeeld hiervan is de situatie waarbij de productiehoeveelheid voor elke
maand gelijk is aan vijf dagen productie. De som van drie opeenvolgende maanden is dan
steeds gelijk aan 15 dagen, welke dus zou voldoen aan de eerder geciteerde restrictie 54. We
creeren op deze manier in het beste geval slechts productieruns van 10 dagen, wat niet in
overeenstemming is met het gevraagde.
Door gebruik te maken van de huidige variabelen kunnen we geen nauwkeurigere voorwaarde
opstellen en aangezien voorwaarde 7.28 nog voor te veel interpretatie vatbaar is, voeren we
nieuwe variabelen in.
7.6.1. Beslissingsvariabelen in verband met Productieruns
Volledig naar analogie met de variabelen voor het invoeren van een stilstand maken we hier
gebruik van de binaire variabelen SP : StartProductie en EP : EindProductie. De index
p wordt hier gebruikt voor alle producten waarvoor deze variabelen noodzakelijk zijn, dit
zijn alle producten voor straten 1, 3, 4, 6, de maalstraat en productiestraat CD1. Voor
straat 3 wordt er een uitzondering gemaakt voor de producten H1, H2 en H3; deze worden
in de onderstaande vergelijkingen beschouwd als 1 product: H123 omdat ze steeds in blok
en zonder omstellingen voorkomen. Hetzelfde geldt voor het blok D2K. De productiestraat
van C en D1 wordt niet in beschouwing genomen omdat daar geen vereisten zijn voor de
lengte van een productierun.
∀m : SPp,m ∈ {0, 1} en EPp,m ∈ {0, 1} (7.29)
SPp,m :=
1, als een productierun wordt gestart van product p in maand m,
0, anders(7.30)
EPp,m :=
1, als een productierun wordt geeindigd van product p in maand m,
0, anders(7.31)
HOOFDSTUK 7. FASE 1: PLANNING 48
7
7.6.2. Voorwaarden in verband met Productieruns
Algemene voorwaarden
Uiteraard gelden hier ook dezelfde vergelijkingen die de relaties aangeven tussen SP en EP
zoals de eerder geziene vergelijkingen voor de relaties tussen SS en ES. Voor de volledigheid
geven we ze snel even mee:
∀m : SPp,m ≤ 1 −
m−1∑
t=startM−1
(SPp,t − EPp,t) (7.32a)
Geen productierun starten als er 1 nog niet afgesloten is.
∀m : EPp,m ≤
m−1∑
t=startM−1
(SPp,t − EPp,t) + SPp,m (7.32b)
Geen productierun eindigen als er geen gestart is.
∀m : Pp,m ≤m−1∑
t=startM−1
(SPp,t − EPp,t) + SPp,m (7.32c)
Geen productie van product p in maand m indien er geen productierun aan het lopen is,
dus enkel indien er 1 gestart is, die nog niet is afgesloten.
∀m : SPp1,m ≤ 1 −
m−1∑
t=startM−1
(SPp2,t − EPp2,t) + EPp2,m (7.32d)
Geen andere productierun starten op dezelfde straat zolang de vorige productierun op die
straat nog aan het lopen is. Hierbij zijn p1 en p2 producten op eenzelfde straat en moet
deze voorwaarde gelden voor alle mogelijke combinaties van producten op eenzelfde straat.
Het uiteindelijke doel van het invoeren van deze variabele was om een minimale lengte van
een productierun te kunnen verzekeren. Daarvoor voegen we voorwaarden 7.32e en 7.32f
toe.
∀m :Qp,m
dagcapaciteitp≥ MLp · (SPp,m + EPp,m − 1) (7.32e)
Indien een productierun wordt gestart en gestopt in een en dezelfde maand, dan moet de
grootte van de productiehoeveelheid groter zijn dan de minimale productielengte.
∀m ∈ {startM − 1, . . . , startM + 10} :
m+1∑
t=m
Qp,t
dagcapaciteitp≥ MLp · SPp,m
(7.32f)
HOOFDSTUK 7. FASE 1: PLANNING 49
7
Indien er een productierun wordt gestart in maand m en niet eindigt in dezelfde maand m,
zodat niet aan voorwaarde 7.32e voldaan is, dan zal voorwaarde 7.32f ervoor zorgen dat het
aantal dagen productie van product p in de komende twee maand groter is dan de minimale
lengte van een productierun. Op deze manier wordt de productierun mooi gespreid over
twee opeenvolgende maanden.
In de vorige beschouwing is de productie van H1, H2 en H3 beschouwd als 1 blok. Restrictie
75 legt echter ook nog enkele beperkingen op voor de producties van deze 3 producten apart.
Zo moet, indien het product voorkomt in een productieblok, de minimale productierun
5 dagen bedragen. Hiervoor hebben we nog enkele extra voorwaarden nodig: 7.33 voor
p ∈ {H1, H2, H3}.
∀m :m+1∑
t=m
Qp,t
dagcapaciteitp≥ MLp · (SPH123,p + Pp,m − 1) (7.33a)
∀m :
m+1∑
t=m
Qp,t
dagcapaciteitp≥ MLp · (SPH123,p + Pp,m+1 − 1) (7.33b)
∀m :Qp,m
dagcapaciteitp≥ MLp · (SPH123,p + EPH123,m + Pp,m − 2) (7.33c)
De eerste voorwaarde 7.33a eist dat indien er een productieblok van H123 start in de maand
m (SPH123,m = 1) en indien er productie is van p ∈ {H1, H2, H3} in de maand m
(Pp,m = 1), dat het aantal dagen dat er productie is in m en m + 1 groter is dan het
minimum aantal dagen. Indien aan 1 van deze twee voorwaarden niet voldaan is, dan wordt
het rechterlid van de voorwaarde 0 en is er geen beperking voor het linkerlid. De tweede
voorwaarde doet juist hetzelfde enkel dat er nu gekeken wordt of er productie is van p in
de volgende maand m + 1, want het productieblok van H123 kan over meerdere maanden
verspreid zijn. Een verduidelijking voor deze twee situaties wordt gegeven in figuur 7.3.
Waarbij voorwaarde 7.33a geldt voor productie van H1 en H2 en voorwaarde 7.33b voor
H2 en H3. Voorwaarde 7.33c is dan een strengere versie van de vorige twee. Deze zal eisen
dat het aantal dagen productie van p ∈ {H1, H2, H3} in 1 maand groter is dan 5 indien
het productieblok van H123 start en eindigt in dezelfde maand.
Figuur 7.3.: Grafische voorstelling bij vergelijkingen 7.33a en 7.33b
Door het invoeren van deze voorwaarden is voldaan aan volgende restricties:
HOOFDSTUK 7. FASE 1: PLANNING 50
7
� (54) een N-productiecampagne moet minstens 14 dagen duren (dit getal moet als vari-
abele kunnen ingegeven worden).� (55) een M-productiecampagne in straat 6 (=M(in N)) moet minstens 14 dagen duren
(dit getal moet als variabele kunnen ingegeven worden).� (58) een L-productiecampagne moet minstens 14 dagen duren (dit getal moet als vari-
abele kunnen ingegeven worden).� (59) een M-productiecampagne in straat 4 (=M(in L)) moet minstens 14 dagen duren
(dit getal moet als variabele kunnen ingegeven worden).� (67) een F-productiecampagne moet minstens 14 dagen duren (dit getal moet als vari-
abele kunnen ingegeven worden).� (68) een G-productiecampagne in straat 1 moet minstens 7 dagen duren (dit getal moet
als variabele kunnen ingegeven worden).� (75) de H1-, H2- en H3-productiekampagnes moeten telkens in blok gebeuren met een
totale minimale campagneduur voor het blok van 15 dagen en indien H1, H2 of H3 in
het blok voorkomen moeten ze elk een minimale duur hebben van 5 dagen (deze getallen
moeten als variabele kunnen ingegeven worden).� (94) een maalcampagne van F/c, G/c en L/c moet minstens 7 dagen duren (dit getal
moet als variabele kunnen ingegeven worden).
O-productierun
Straat 5 was niet in vorige beschouwing inbegrepen omdat we daar slechts 1 product op
kunnen produceren. Bijgevolg betekent ook dat een einde van een stilstand gelijk is aan
het begin van de productie van O, en het einde van de productie van O komt dan overeen
met het begin van een stilstand op straat 5. Om deze reden hebben we niet de extra
variabelen voor productieruns ingevoerd in straat 5. Om toch de minimale lengte van een
productierun te verzekeren zoals gevraagd in (50) een O-productiecampagne moet minstens
3 weken duren (dit getal moet als variabele kunnen ingegeven worden), is een kleine wijziging
van voorgaande voorwaarden noodzakelijk. Voorwaarde 7.32f is onmiddellijk over te nemen
mits wijziging van SP in ES, voorwaarde 7.32e is niet mogelijk om over te nemen, omdat
er op straat 5 twee mogelijkheden zijn waarbij zowel SSs5,m = 1 als ESs5,m = 1. De eerste
mogelijkheid is die waarbij er een stilstand eindigt in het begin van de maand, vervolgens
21 dagen productie is en op het einde van de maand een nieuwe stilstand wordt gestart.
Hiervoor zou een aanpassing van 7.32e nog gelden. De tweede mogelijkheid echter, waarbij
een stilstand wordt gestart en gestopt in dezelfde maand zorgt ervoor dat er onmogelijk 21
HOOFDSTUK 7. FASE 1: PLANNING 51
7
dagen productie van O mogelijk is, maar wat wel zou geeist worden door aanpassing van
7.32e. We laten deze voorwaarde bijgevolg zonder veel verlies van nauwkeurigheid weg.
∀m ∈ {startM − 1, . . . , startM + 10} :
m+1∑
t=m
QO,t
dagcapaciteitO≥ MLO · ESs5,m
(7.34)
7.7. Stilstanden in combinatie met Productieruns
Vanzelfsprekend worden er ook voorwaarden opgesteld die de relaties tussen de variabe-
len van de stilstanden en de variabelen van de productieruns vastleggen. In onderstaande
voorwaarden is s ∈ {s1, s3, s4, s6, sM, CD1}
∀s,∀m,∀p ∈ {geproduceerd op straat s} :
SSs,m ≤ 1 −m−1∑
t=startM−1
(SPp,t − EPp,t) + EPp,m
(7.35a)
Geen stilstand starten op straat s indien er een productierun aan het lopen is op diezelfde
straat s.
∀s,∀m,∀p ∈ {geproduceerd op straat s} :
SPp,m ≤ 1 −m−1∑
t=startM−1
(SSs,t − ESs,t) + ESs,m
(7.35b)
Analoog als voorwaarde 7.35a, geen productie starten op straat s indien er nog een stilstand
bezig is op straat s.
∀s,∀m :m∑
t=startM−1
SSs,t +∑
p∈{geproduceerd op straat s}
SPp,t
≤
m∑
t=startM−1
ESs,t +∑
p∈{geproduceerd op straat s}
EPp,t
+ 1 (7.35c)
Overdracht per maand van maximaal 1 eenheid die niet afgesloten is naar de volgende
maand. Dus ofwel is er een stilstand die de overgang naar de volgende maand overbrugt,
ofwel is het een productierun.
HOOFDSTUK 7. FASE 1: PLANNING 52
7
7.8. Voorraadrestricties
7.8.1. Algemene voorwaarden
Minimum voorraad:
Voor de minimale voorraad van de producten (p ∈ {producten die verkocht worden}), heb-
ben we volgende restrictie: (102) de minimale voorraad per product die nooit mag onder-
schreden worden is de som van:
1. de gemiddelde off-spec voorraad
2. de gemiddelde voorraad in de ko-lagers
3. de gemiddelde toegewezen voorraad
4. de gemiddelde Q-stock
5. de minimale vrij beschikbare voorraad
(deze getallen moeten als variabele kunnen ingegeven worden). We noemen deze 5 termen
de voorraadParameters en krijgen voor elk product het minimaal aantal dagen per voor-
raadParameter als: minDagp,vp.
Deze voorraad wordt gegeven in dagen, maar moet nog omgezet worden naar aantal ton.
Dit gebeurt op volgende wijze: De dagen voorraad moeten vermenigvuldigd worden met de
gemiddelde dagverkoop van de 12 maanden waarvoor een planning gemaakt wordt. Indien
de totale verkoopsprognose voor het komende jaar gelijk is aan 38300 ton, dan is de gemid-
delde dagverkoop gelijk aan 10.5 ton. Als de minimumvoorraad 25 dagen is betekent dit dat
we niet onder de 25 * 10.5 = 262.5 ton mogen komen voor dat product.
∀p,∀m :
∑startM+11t=startM vraagp,t
365·
∑
vp∈voorraadParameters
minDagp,vp ≤ Vp,m (7.36)
Maximum voorraad:
In analogie met de paragraaf van de minimale voorraad is er ook per product een maximale
voorraad. Het geldt voor dezelfde producten p uitgezonderd A2 en B. Deze hebben speciale
restricties die verderop behandeld worden.
∀p,∀m :
∑startM+11t=startM vraagp,t
365· maxDagp ≥ Vp,m (7.37)
7.8.2. B-voorraad:� (18) maximaal 112 ton B-bulkstapelcapaciteit in eigen tanks (dit getal moet als varia-
bele kunnen ingegeven worden).
HOOFDSTUK 7. FASE 1: PLANNING 53
7
� (19) maximaal 204 ton B-stapelcapaciteit in vaten. Opslagkost in vaten of IBC’s: zie
onder punt 9. (dit getal moet als variabele kunnen ingegeven worden).� (20) maximaal 84 ton B-bulkstapelcapaciteit in tankcontainers (dit getal moet als va-
riabele kunnen ingegeven worden).� (21) de B-bulkvoorraad (eigen tanks en tankcontainers) mag bij de heropstart van
het A1-/A2-bedrijf niet lager zijn dan 20 dagen (dit getal moet als variabele kunnen
ingegeven worden).� (22) de B-voorraad in vaten mag bij de heropstart van het A1-/A2-bedrijf niet lager
zijn dan 20 dagen (dit getal moet als variabele kunnen ingegeven worden).
∀m : V TBB,m ≤ maxTankB (7.38a)
Restrictie 18 wiskundig uitgeschreven als voorwaarde 7.38a.
∀m : V V IBCB,m ≤ maxV atenEnIBCB (7.38b)
Restrictie 19 wiskundig uitgeschreven als voorwaarde 7.38b.
∀m : V CB,m ≤ maxContB (7.38c)
Restrictie 20 wiskundig uitgeschreven als voorwaarde 7.38c. Op dit moment is er echter een
te grote voorraad van B aanwezig in het bedrijf. Indien dat het geval is, moet de maximale
opslagcapaciteit van B in tankcontainers verhoogd worden.
∀m : VB,m = V TBB,m + V V IBCB,m + V CB,m (7.38d)
Voorwaarde 7.38d om de opsplitsing van de voorraad van B in de verschillende deelvoorraden
te definieren.
∀m : V TBB,m + V CB,m − QB,m + vraagB,m · (1 −dagenSsA1,m
#dm) ≥
minBulkBstilstandA1 ·
∑startM+11t=startM vraagB,t
365· ESsA1,m (7.38e)
Voorwaarde 7.38e ten gevolge van restrictie 21. We willen de voorraad kennen op het einde
van een productiestilstand van het A1-bedrijf (V op figuur 7.4), want deze voorraad moet
groter zijn dan 20 dagen. We kennen enkel de variabelen op het einde van elke maand, dus
we moeten V omzetten naar Veind. In de periode daartussen is er dus nog productie van
B en is er ook vraag naar B. In de veronderstelling dat de vraag naar B constant verloopt
doorheen de tijd, moeten we slechts die fractie van de vraag hebben in overeenstemming
HOOFDSTUK 7. FASE 1: PLANNING 54
7
met het aantal dagen dat er nog productie van A1 is. Aangezien er enkel B-productie is als
de A1-productie loopt, is het niet nodig om daar een fractie van te nemen en kunnen we de
volledige productiehoeveelheid in beschouwing nemen. De vergelijking moet uiteraard enkel
gelden indien er een stilstand van A1 wordt beeindigd (ESsA1,m = 1). Indien ESsA1,m = 0,
blijft er een eenvoudige vergelijking over die steeds moet gelden, nl. de voorraad van B op
het einde van maand m moet groter zijn dan de productie van B in m verminderd met de
vraag naar B in m. Het aantal dagen voorraad (minBulkBstilstandA1) zetten we op een
analoge manier om naar ton voorraad zoals eerder uitgelegd. Wanneer we alles samennemen
verkrijgen we voorwaarde 7.38e.
Figuur 7.4.: Grafische voorstelling restrictie 21
Restrictie 22 valt weg. Deze voorwaarde is enkel interessant om de detailplanning te maken.
Het is voldoende dat de totale voorraad bij de heropstart van het A1/A2-bedrijf niet lager
is dan 20 dagen. Dus restrictie 22 zit op die manier vervat in restrictie 21.
7.8.3. A2-voorraad:� (5) maximaal 1780 ton A2-stapelkapaciteit in de tanks 01 en 02 (dit getal moet als
variabele kunnen ingegeven worden).� (6) indien noodzakelijk is er extra 890 ton A2-stapelkapaciteit in tank 03 buiten de
C-, D1-, D2-, I-, J- en K-productiecampagnes (dit getal moet als variabele kunnen
ingegeven worden).� (8) maximaal 2 maand stapelcapaciteit van product A2 in vaten en IBC’s omwille van
de beperkte verkoop van vaten en IBC’s (dit getal moet als variabele kunnen ingegeven
worden).� (11) streefdoel A2-bulkvoorraad buiten een stilstandsperiode is minimum 1400 ton in
de tanks 01 en 02 omwille van de bedrijfszekerheid van de A1-installatie (dit getal moet
als variabele kunnen ingegeven worden).� (12) streefdoel A2-bulkvoorraad net voor de stilstand is 1,780 ton indien enkel tank 01
en 02 ter beschikking staan en 2,670 ton indien ook tank 03 ter beschikking staat (zie
onder punt 6) (dit getal moet als variabele kunnen ingegeven worden).
HOOFDSTUK 7. FASE 1: PLANNING 55
7
� (13) de A2-bulkvoorraad mag bij de opstart van het A1-/A2-bedrijf niet lager zijn dan
25 dagen (dit getal moet als variabele kunnen ingegeven worden).� (14) A2-voorraad in vaten en IBC’s mag bij de opstart van het A1-/A2-bedrijf niet
lager zijn dan 25 dagen (dit getal moet als variabele kunnen ingegeven worden).
∀m : V T12A2,m ≤ maxTank12A2 (7.39a)
Restrictie 5 wiskundig uitgeschreven als voorwaarde 7.39a.
Restrictie 6 wordt voor later behouden. Het is alleszins geen moeilijke voorwaarde, dus laat
ons er hier gewoon vanuit gaan dat ze voldaan is.
∀m : V V IBCA2,m ≤ maxV atenEnIBCA2 ·
∑startM+11t=startM vraagA2,t
365(7.39b)
Restrictie 8 wiskundig uitgeschreven als voorwaarde 7.39b. maxV atenEnIBCA2 wordt hier
gegeven in dagen.
∀m : V T12A2,m ≥ minTank12A2 (7.39c)
Restrictie 11 wiskundig uitgeschreven als voorwaarde 7.39c.
Restrictie 13 eist minimaal 25 dagen A2-bulkvoorraad op het moment dat de installatie
effectief terug begint te produceren. Het aantal dagen berekenen we analoog als in de voor-
gaande gevallen als volgt: voor een heel jaar de rechtstreekse vraag naar A2 voor verkoop
plus de vraag voor productie van de vervolgproducten uit A2. Dit geeft de totale vraag van
A2 voor dat jaar. Indien we delen door 365 krijgen we de gemiddelde vraag naar A2 voor 1
dag. Dus de voorraad mag niet lager zijn dan 25 keer deze gemiddelde vraag voor 1 dag.
Restrictie 14 is naar analogie met restrictie 22 niet interessant voor een schatting van de
maandproducties en zit volledig vervat in restrictie 13.
Dus dan blijven de wiskundige formuleringen van restricties 12 en 13 over. We zouden een
analoge redenering kunnen toepassen zoals bij restrictie 21 voor de B-voorraad. Maar de
vraag naar B, moet hier nu vervangen worden door de vraag naar A2. Deze vraag bestaat
uit de rechtstreekse vraag voor verkoop, maar ook uit het verbruik van A2 voor verdere
productie. De exacte waarde van dit verbruik in de periode waarbij er nog geen stilstand
is van A1 is echter niet eenduidig te bepalen. Om deze reden gaan we een schatting maken
van dit verbruik. We krijgen dan vergelijking 7.40 voor restrictie 12.
HOOFDSTUK 7. FASE 1: PLANNING 56
7
∀m : 2670 · SSsA1,m − 890 · (PT3C,m−1 + PT3D1,m−1) ≤
V T12A2,m−1 + V T3A2,m−1 + (#dm − dagenSsA2,m) · dagcapaciteitA2
− V erbrA2s5,m,12 − V erbrA2s6,m,12 − vraagA2,m · (1 −dagenSsA1,m
#dm) (7.40)
PT3 zijn binaire variabelen die we verderop beter zullen definieren, het volstaat nu om te
weten dat ze 1 zijn indien tank 3 toegewezen is aan het product p. En anders zijn ze 0.
We hebben hier ook enkele nieuwe variabelen ingevoerd, die de schatting van het verbruik
moeten weergeven:� V erbrA2s,m,12 ∈ R+: geeft de schatting weer van het verbruik van A2 voor straat s in
de maand m die te maken heeft met restrictie 12.
De verklaring van de voorwaarde 7.40:� Het rechterlid stelt niets anders voor dan de voorraad van A2 op het moment dat de
stilstand start.� Indien er een stilstand van straat A1 wordt gestart in de maand m is het de bedoeling
dat de voorraad van A2 in de tanks op dat moment zo groot mogelijk is. Dus indien
SSsA1,m = 1 dan moet het rechterlid een zo groot mogelijke waarde aannemen.� Indien tank 3 niet ter beschikking staat van A2 (PT3C,m−1 = 1 of PT3D1,m−1 = 1),
dan is het streefdoel van de voorraad in de tanks ook kleiner, want enkel tanks 1 en
2 staan ter beschikking. Slechts 1 van deze variabelen kan gelijk zijn aan nul. Het
streefdoel wordt dan 1780 ton.� Aangezien we niet de exacte voorraad weten op het moment dat de stilstand start,
maar enkel in het begin van de maand, moet deze voorraad geschreven worden in
functie van de beginvoorraden, de productie van A2 tot de stilstand en het verbruik
van A2 tot de stilstand.� De productie van A2 tot de stilstand is, aangezien een stilstand van A1 ook een stil-
stand van A2 inhoudt, gelijk aan (#dm−dagenSsA2,m) ·dagcapaciteitA2 . Dit is nu wel
een overschatting van deze productie aangezien er niet steeds tegen de volledige dag-
capaciteit van A2 wordt geproduceerd. We gaan nu niet verder in op de overschatting,
dit komt bij de bespreking van de schatting voor de verbruiken nog aan bod.� De vraag naar A2 tot op het moment dat de stilstand start is dan gelijk aan vraagA2,m ·
(1 −dagenSsA1,m
#dm)
HOOFDSTUK 7. FASE 1: PLANNING 57
7
� Het verbruik van A2 tot de stilstand van A1 wordt in de hierboven ingevoerde vari-
abelen bijgehouden. Er is in deze periode geen verbruik van A2 voor de producten
die normaal via A1 worden geproduceerd, omdat in die periode de A1-installatie in
werking is.
Schatting voor de verbruikte hoeveelheid van A2 tot het moment dat de stilstand van
A1 start:
We zijn op zoek naar de beste schatting. Indien de schatting te groot is, dan zal voorwaarde
7.40 er voor zorgen dat de voorraden in de tanks ook te groot zijn in het begin van de
maand. Dit vormt geen probleem, want dan zal men de productie van A2 sneller stilleggen
omwille van een volle tank. De paar dagen dat de productie van A2 sneller stilligt dan de
productie van A1 is er ook wel verbruik, dus de voorraad op het moment van de start van
de A1 stilstand zal iets kleiner zijn dan het streefdoel. Indien de schatting te klein is, dan
zullen de voorraden in de tanks in het begin van de maand ook te klein zijn en wordt het
streefdoel ook niet gehaald. We zijn dus op zoek naar de beste schatting van dit verbruik.
We schrijven volgende drie voorwaarden 7.41, waarbij we ineens veralgemenen naar restrictie
13. Ze geven alle drie een bovengrens voor het verbruik. Deze grenzen zijn alledrie te groot,
en we gebruiken daar de kleinste van. Dus onze beste schatting is zo groot mogelijk, maar
toch kleiner dan de drie bovengrenzen. We hebben reeds eerder gezien dat een overschatting
geen problemen oplevert. Bovendien compenseert dit ook de overschatting van de productie
van A2 zoals eerder al opgemerkt.
∀m,∀s ∈ {s5, s6},∀r ∈ {12, 13} : V erbrA2s,m,r ≤∑
p∈s
Qp,m · verbruikp,A2; (7.41a)
7.41a is de meest eenvoudige voorwaarde, het verbruik van A2 per straat in een maand
alvorens de stilstand wordt gestart is steeds kleiner dan het totale verbruik van A2 op die
straat per maand.
∀m,∀s ∈ {s5, s6},∀r ∈ {12, 13} :
V erbrA2s,m,r ≤ (#dm−dagenSsA1,m) ·
∑
p∈s dagcapaciteitp · verbruikp,A2
aantal producten in straat s·verbruikp,A2;
(7.41b)
7.41b geeft het verbruik weer van A2 indien tijdens de hele periode voor de stilstand van
A2 er continu productie is geweest van de producten op de straat.
Voor de derde voorwaarde maken we wel de opsplitsing tussen restrictie 12 en 13. Voor
restrictie 12 geldt vergelijking 7.41c, voor restrictie 13 geldt voorwaarde 7.41d
HOOFDSTUK 7. FASE 1: PLANNING 58
7
∀m,∀s ∈ {s5, s6} :
V erbrA2s,m,12 ≤ dagenP luss,m ·
∑
p∈s dagcapaciteitp · verbruikp,A2
aantal producten in straat s
+ M · (2 − ESs,m −
m−1∑
t=startM−1
(SSs,t − ESs,t));
(7.41c)
∀m,∀s ∈ {s5, s6} :
V erbrA2s,m,13 ≤ dagenP luss,m ·
∑
p∈s dagcapaciteitp · verbruikp,A2
aantal producten in straat s
+ M · (1 − SSs,m);
(7.41d)
Voor de verklaring van deze laatste twee voorwaarden stellen we eerst de waarheidstabel 7.3
op. Hierin worden enkel die verschillende mogelijkheden opgesomd die mogelijk zijn. Het
verbruik van A2 voor productie van andere producten hangt af van de stilstanden op die
straat.
Tabel 7.3.: Waarheidstabel in verband met de verschillende situaties voor SS, ES en∑
SSs,m ESs,m∑m−1
t=startM−1(SSs,t − ESs,t)
0 0 0 geen stilstand aan het lopen,
er is alleen productie op straat s
voldaan met voorwaarde 7.41b
0 0 1 er is geen productie op straat s
voldaan met voorwaarde 7.41a
1 0 0 De stilstand van straat s start voor
of na de start van de stilstand van A1
voldaan met 7.41a of 7.41b
0 1 1 Al dan niet overlap van stilstanden
zie figuur 7.5
1 1 0 zie figuur 7.6
1 1 1 zie figuur 7.7
Figuur 7.5.: Grafische voorstelling situatie 0 1 1 uit tabel 7.3
HOOFDSTUK 7. FASE 1: PLANNING 59
7
Voor de bovenste situatie van figuur 7.5 zou het te zoeken verbruik gelijk moeten zijn
aan het verbruik nodig voor de productie op straat s tussen de twee stilstanden in. Het
aantal dagen productie op straat s die in rekening gebracht moeten worden is dan #dm −
dagenSs,m−dagenSA1,m. Het probleem hierbij vormt echter de tweede situatie van diezelfde
figuur. Op dat moment is het aantal dagen hiervoor gedefinieerd negatief. We zien hier
dus dat we vergelijking 7.41c kunnen gebruiken mits het invoeren van de nieuwe variabele
dagenP luss,m ∈ R+.
dagenP luss,m :=
#dm − dagenSs,m − dagenSA1,m, als #dm − dagenSs,m − dagenSA1,m ≥ 0
0, anders
(7.42)
De laatste term in voorwaarde 7.41c zorgt ervoor dat deze vergelijking enkel geldt bij de
corresponderende gevallen uit de waarheidstabel. M is hierbij een groot getal, bijvoorbeeld∑
p∈s Qp,m · verbruikp,A2, zodat de eerste voorwaarde in die gevallen zeker de derde over-
schaduwt.
Figuur 7.6.: Grafische voorstelling situatie 1 1 0 uit tabel 7.3
De onderste situatie uit figuur 7.6 is onmiddellijk voldaan omwille van voorwaarde 7.41b. Bij
de bovenste situatie krijgen we zowel voorin als achterin de maand enkele dagen productie die
bij het verbruik moeten gerekend worden. Voorwaarde 7.41a is hiervoor de beste benadering
aangezien de stilstand van straat s toch een minimale lengte moet hebben. Voor de middelste
situatie is er niet onmiddellijk een eenvoudige oplossing mogelijk. We gaan ervan uit dat de
combinatie van 7.41a en 7.41b een goede benadering geeft.
HOOFDSTUK 7. FASE 1: PLANNING 60
7
Figuur 7.7.: Grafische voorstelling situatie 1 1 1 uit tabel 7.3
De bovenste situatie uit figuur 7.7 is vervat in voorwaarde 7.41a. De onderste situatie in
7.41c. De middelste situatie wordt in zeer goede mate benaderd door 7.41c.
Er rest ons dan enkel nog de voorwaarden te vermelden voor variabele dagenP luss,m. We
gaan daarbij uit van de eigenschap dat een getal steeds kan geschreven worden als het ver-
schil van twee positieve getallen. De volgende voorwaarden moeten dan eenvoudig vertaald
worden naar de nodige situatie.
A = A+ − A− (7.43a)
A+ ≥ 0 (7.43b)
A+ ≥ A (7.43c)
A− ≥ 0 (7.43d)
A− ≥ −A (7.43e)
Een heel analoge redenering geldt voor restrictie 13. We hebben reeds enkele vergelijkingen
daarvoor weergegeven. Enkel de voorwaarde die effectief voor restrictie 13 moet gelden,
blijft nog over:
∀m : 25 ·
∑startM+11t=startM vraagA2,t +
∑
p∈{rechtstreeks uit A2} vraagp,t · verbruikp,A2
365·ESsA1,m ≤
V T12A2,m + V T3A2,m − (#dm − dagenSsA2,m) · dagcapaciteitA2
+ V erbrA2s5,m,13 + V erbrA2s6,m,13 + vraagA2,m · (1 −dagenSsA1,m
#dm) (7.44)
Zoals eerder al vermeld, willen we de hoogste schatting bekomen van het verbruik die toch
kleiner is dan de drie bovengrenzen. Hiervoor voegen we in de doelfunctie een term toe die
het verbruik bevordert en dus maximaal gaat maken:
−∑
m
∑
s∈{s5, s6}
∑
r∈{12, 13}
verbrA2s,m,r (7.45)
HOOFDSTUK 7. FASE 1: PLANNING 61
7
7.9. Omstellingen
7.9.1. Beslissingsvariabelen en voorwaarden
In eerste instantie was het de bedoeling om een voorspelling te maken welke omstellingen
er in een maand zouden plaatsvinden uitgaande van de productiegegevens in die maand.
Indien je bijvoorbeeld weet dat product F en product G beiden gemaakt worden in maand
m, dan kan je een omstelling in die maand op die straat veronderstellen. Of de omstelling
nu gebeurt volgens F → G of volgens G → F kunnen we in eerste instantie niet weten.
Bovendien is het ook mogelijk dat indien er een stilstand door het model wordt ingepland
in de maand m dat de omstel wordt opgeslorpt door deze stilstand. Uiteindelijk zijn er zeer
veel situaties mogelijk en zou het bepalen van een omstel en het daarbij horende capaciteits-
verlies slechts een zeer ruwe benadering zijn van de werkelijkheid.
We zoeken dus een andere manier om deze omstellingen nauwkeuriger te bepalen. Door het
invoeren van de variabelen SP en EP in combinatie met de variabelen SS en ES wordt
er eigenlijk reeds op het hoogste niveau toch al min of meer een productievolgorde vastge-
legd. Zo weten we dus voor elke maand welke producties er gestopt worden. Een productie
die stopt betekent een overgang naar een andere productie of een overgang naar een stilstand.
We voeren de variabele OS ∈ {0, 1} (Omstel) in die voor alle producten geproduceerd op
de straten s ∈ {sCD1, s1, s3, s4, s6, sM} als volgt wordt gedefinieerd:
OSp,m :=
1, als een omstel noodzakelijk is na de productie van product p in maand m,
0, anders
(7.46)
Voorwaarde 7.47 is de voorwaarde die zorgt dat deze variabele de correcte waarde aanneemt.
Zoals reeds vermeld, vindt er een omstelling plaats op het moment dat een productierun
beeindigd wordt en er wordt overgegaan op een andere productierun.
∀p,∀m : EPp,m = OSp,m (7.47)
Door voorwaarde 7.47 wordt ook een omstelling gedefinieerd op het moment dat de produc-
tie gevolgd wordt door een stilstand. We behouden deze definitie omwille van de kosten.
Het is na de stilstand goed mogelijk dat er een ander product wordt geproduceerd. In dat
geval moeten niet alleen de kosten voor afstel gerekend worden, maar ook de kosten voor
omstel. Op deze manier is dat eenvoudig te schrijven in de doelfunctie.
Indien we niet de kosten bekijken, maar het aantal dagen dat gepaard gaat met een omstel,
dan moet daar wel een correctie worden doorgevoerd. Als een omstel wordt gevolgd door een
HOOFDSTUK 7. FASE 1: PLANNING 62
7
stilstand, dan worden de omsteldagen ingesloten in de stilstanddagen. In vergelijking 7.48
schrijven we het aantal dagen omstel in een bepaalde maand uit voor de eerder gedefinieerde
straten s.
∀s,∀m : Dagen verloren omwille van omstellingen op straat s =∑
p∈{geproduceerd op s}
(dagenOp · OSp,m) − verwDagenOs · SSs,m (7.48)
We zien dus dat de totale tijd die we verliezen door omstellingen gelijk is aan elke omstel-
ling die voorkomt in de maand vermenigvuldigd met het aantal dagen voor die omstelling
verminderd met een term indien een omstelling samenvalt met een stilstand. (SSs,m = 1
impliceert namelijk dat er minstens 1 EPp,m = 1 van die straat) Deze term is gelijk aan de
verwachte duur van een omstel op die straat, aangezien we niet op voorhand weten welke
productie er wordt beeindigd net voor de stilstand gestart wordt.
Er zijn wel nog enkele niet eenduidig gedefinieerde parameters in voorwaarde 7.48. Voor
straten 1, 4, 6, CD1 en de maalstraat is dit geen probleem. Alle omstellingen duren even lang
ongeacht welk product erop volgt. Dus dagenOp is voor alle producten van 1 straat gelijk en
tevens ook gelijk aan verwDagen0s. Voor straat 3 geeft dit meer problemen. Bekijken we
enkel het zwarte in figuur 7.8, dan zien we dat alle omstellingen 2 dagen duren uitgezonderd
de 4 zwarte pijlen. Zonder al te veel te wijzigen, passen we twee omstellingen aan (in het
rood), zodat vertrekkend vanuit elk product de omstelduur naar eender welk product gelijk
is. We veronderstellen bijvoorbeeld dat als de productie van K stopt elke omstelling drie
dagen zal duren. Dit is zo in de realiteit uitgezonderd bij de omstelling van K naar H123 die
slechts 2 dagen duurt. Deze vereenvoudiging is gerechtvaardigd omdat de exacte volgorde
van de producties toch nog niet gekend is. Op dit punt is het vooral van belang dat we de
kosten van de omstelling in rekening brengen en het capaciteitsverlies dat daarmee gepaard
gaat. In de tweede fase wordt uiteraard wel gewerkt met de exacte omstelduur. Op deze
manier zijn voor straat 3 de parameters dagenOp en verwDagenOp wel eenduidig bepaald.
Bovendien is het ook beter om een dag omstel extra te beschouwen dan een dag minder,
omdat we op deze manier een overschot aan capaciteit zullen creeren welke meer flexibiliteit
zal toelaten in fase 2. Een dag omstel minder zou leiden tot een capaciteitstekort waarbij
we in fase 2 niet tot een haalbare schedule kunnen komen.
HOOFDSTUK 7. FASE 1: PLANNING 63
7
Figuur 7.8.: Grafische voorstelling van de omstelduur in straat 3
7.9.2. Bijdrage tot de totale kost
Voor de kosten kan eenzelfde redenering gevolgd worden als in de paragraaf hierboven. We
voegen bij de zwarte pijlen van figuur 7.9 twee rode pijlen toe, zodat de kost voor een omstel
na een bepaald product ook weer eenduidig bepaald wordt per product: kostOp. We voegen
volgende term toe aan de doelfuntie:
∀s : +
startM+11∑
m=startM
∑
p∈{geproduceerd op s}
(kostOp · OSp,m) (7.49)
Figuur 7.9.: Grafische voorstelling van de kosten horend bij de omstel in straat 3
Op deze manier hebben we omstellingen ingepland in de maanden en is voldaan aan onder-
staande lijst van restricties:� (26) 2 dagen omstel bij overgang van C- op D1-productie (dit getal moet als variabele
kunnen ingegeven worden).� (27) 3 dagen omstel bij overgang van D1- op C-productie (dit getal moet als variabele
kunnen ingegeven worden).� (28) 2000 Euro omstelkosten bij omstel van C naar D1 (dit getal moet als variabele
kunnen ingegeven worden).� (29) 2000 Euro omstelkosten bij omstel van D1 naar C (dit getal moet als variabele
kunnen ingegeven worden).
HOOFDSTUK 7. FASE 1: PLANNING 64
7
� (56) een omstel in straat 6 van N naar M(in N) of vice versa duurt 3 dagen. De
omstellingskosten bedragen 10,000 Euro per omstel (deze getallen moeten als variabele
kunnen ingegeven worden).� (60) een omstel in straat 4 van L naar M of vice versa duurt 3 dagen. De omstellings-
kosten bedragen 10,000 Euro per omstel (deze getallen moeten als variabele kunnen
ingegeven worden).� (69) een omstel in straat 1 van F naar G of vice versa duurt 2 dagen. De omstel-
lingskosten bedragen 7,000 Euro per omstel (deze getallen moeten als variabele kunnen
ingegeven worden).� (78) een omstel van J naar K duurt 1 dag (dit getal moet als variabele kunnen ingegeven
worden).� (79) een omstel van K naar I, J of G duurt 3 dagen (dit getal moet als variabele kunnen
ingegeven worden).� (80) alle andere omstellen in straat 3 duren 2 dagen (dit getal moet als variabele
kunnen ingegeven worden).� (81) een productomstel van H1, H2 of H3 naar I, G of J kost 4000 Euro.� (82) een productomstel van K naar I, G of J kost 4000 Euro.� (83) een productomstel van H1, H2 of H3 naar K, K naar H1, H2 of H3, I naar J of
G of H1 of H2 of H3 of K, G naar I of J of H1 of H2 of H3 of K, J naar I of G of H1
of H2 of H3 of K kost 1000 Euro (dit moet als variabele kunnen ingegeven worden).� (95) een omstel in de maalstraat duurt 3 dagen. De omstellingskosten bedragen 5,000
Euro per omstel (deze getallen moeten als variabele kunnen ingegeven worden).
7.10. Capaciteitsrestricties
Restrictie: (49) de verschillende straten moeten steeds op maximale uitlasting lopen, ten-
zij andere restricties andere beperkingen opleggen (bv. Restrictie 22 bis), omwille van de
energie-efficientie (zie file met dagcapaciteiten in bijlage). Deze restrictie leert ons dat de
totale productiehoeveelheid op een straat in een bepaalde maand m strikt gelijk moet zijn
aan de maximale productiecapaciteit in diezelfde maand m. Deze maximale productieca-
paciteit wordt beperkt door ingeplande stilstanden, stilstanden vastgelegd door het model
en omstellingen. Deze capaciteit moet zo nauwkeurig mogelijk bepaald worden. Indien de
maximale capaciteit te groot wordt berekend gaan we te veel productie plannen in die maand
op die straat, bijgevolg is er geen haalbare schedule mogelijk in fase 2 voor die maand. Is
HOOFDSTUK 7. FASE 1: PLANNING 65
7
de maximale capaciteit te klein, dan hebben we een overcapaciteit in fase 2 op die straat,
wat niet energie-efficient is.
Deze restrictie (49) geldt voor s ∈ sG := {sCD1, s1, s3, s4, s5, s6, sM}, want voor straat
A1 en dus ook straat A2 en B leert restrictie 10 dat we best op vollast lopen, maar uit
restrictie: (15) er is geen opslag van A1. De productie moet dus direct verbruikt worden of
tot A2 worden omgezet. De A2-productiecapaciteit is kleiner dan de A1-productiecapaciteit.
Indien er geen verbruik is van A1 moet de A1-productie verminderd worden. besluiten we
dat de totale productiehoeveelheid op straat A1 in maand m kleiner (en niet strikt gelijk)
moet zijn dan de maximale productiecapaciteit van straat A1 in diezelfde maand m.
De capaciteit van A2 moet ook niet strikt gelijk zijn, want deze productiecapaciteit is vari-
abel afhankelijk van de productieafname van A1 door de straten 1, 3 en 4.
Schrijven we dit nu allemaal uit dan krijgen we de voorwaarden 7.50.
∀s ∈ sG,∀m :
∑
p∈{p geproduceerd op s}
⌈
Qp,m
dagcapaciteitp
⌉
= #dm − dagenSs,m−
∑
p∈{geproduceerd op s}
(dagenOp · OSp,m) + verwDagenOs · SSs,m (7.50a)
Een klein woordje uitleg bij vergelijking 7.50a: Het linkerlid is het totaal aantal dagen
dat er geproduceerd wordt op straat s in maand m. Hier wordt naar boven afgerond per
onvolledige dag productie. Anders kan een halve dag productie van product 1 samengeteld
worden met een halve dag productie van product 2. In de praktijk is dat niet mogelijk en
worden deze halve producties ook over 2 dagen gespreid, wat dus een verlies van 2 halve
dagen productie inhoudt. Deze afronding naar boven beschrijft perfect de situatie die we
willen. AMPL beschouwt deze afronding echter als een niet-lineariteit en kan hier niet met
werken. Daarom moeten we op zoek naar een andere manier om te zorgen dat twee halve
dagen productie op twee verschillende dagen plaatsvinden. De oplossing die deze ideale
situatie het beste benadert zal voor elke productie die beeindigd wordt in de maand m
een extra dag aanrekenen. Deze extra dag brengt dan de twee halve dagen in rekening die
verloren gaan. We laten de afrondingstekens in voorwaarde 7.50 weg en zodra er meer dan
1 product op een straat wordt geproduceerd voegen we in het linkerlid volgende term toe:∑
p∈{p geproduceerd op s} EPp,m.
Het rechterlid is het aantal dagen dat er beschikbaar is voor productie. Volgens restrictie 49
moeten rechter- en linkerlid gelijk zijn aan elkaar omwille van maximale uitlasting. Het aan-
HOOFDSTUK 7. FASE 1: PLANNING 66
7
tal beschikbare dagen is niets anders dan het totaal aantal dagen in een maand verminderd
met de stilstanden in die maand (zowel ingepland als door het model gepland) verminderd
met dagen die verloren gaan door omstellingen (laatste twee termen). Voor straat 5 vallen
deze laatste twee termen weg omdat daar geen omstellingen mogelijk zijn.
∀s ∈ {A1, A2},∀m :
∑
p∈{p geproduceerd op s}
⌈
Qp,m
dagcapaciteitp
⌉
≤ #dm − dagenSs,m (7.50b)
Zoals reeds eerder uitgelegd, geldt voor A1 en A2 de gelijkheid niet, bovendien zijn hier ook
geen omstellingen en we verkrijgen voorwaarde 7.50b.
Voor de productiestraat van CD1 bestaat nog een andere restrictie die een beperking oplegt
voor de capaciteit, nl. (24) maximaal 100 (maxCapCD1) productiedagen mogelijk voor C +
D1 inclusief opstart en afstel omwille van personeelsbeperkingen (dit getal moet als variabele
kunnen ingegeven worden). We zien in voorwaarde 7.51 dat alle productiedagen, de afstel-
en opstartdagen en de omsteldagen voor een heel jaar samen kleiner moeten zijn dan het
maximum aantal dagen productie op straat CD1.
∑
m
∑
p∈{p geproduceerd op sCD1}
⌈
Qp,m
dagcapaciteitp
⌉
+ afstelsCD1 · SSsCD1,m + opstartsCD1 · ESsCD1,m
+∑
p∈{geproduceerd op sCD1}
(dagenOp · OSp,m) − verwDagenOs · SSsCD1,m
≤ maxCapCD1
(7.51)
7.11. Totale kost (2)
Nu de productiehoeveelheden, de voorraden, de tekorten en de omstellingen gedefinieerd
zijn, kunnen we meer in detail ingaan op de relatie tussen de kosten die hier allemaal met
gepaard gaan. Bij de totale kost is het de bedoeling dat aan volgende restricties wordt
voldaan:� (52) het gebonden kapitaal in de O-voorraad moet geoptimaliseerd (geminimaliseerd)
worden. De variabele productiekosten zijn in de tabel met variabelen weergegeven (deze
variabele productiekosten moeten als variabele kunnen ingegeven worden).� (65) het gebonden kapitaal in de gezamelijke L-, N- en M-voorraad moet geoptima-
liseerd (geminimaliseerd) worden. Hierbij moeten de omstelkosten en de capaciteits-
verliezen bij productomstellen ook in overweging genomen worden. Zie de variabele
productiekosten in de tabel in bijlage.
HOOFDSTUK 7. FASE 1: PLANNING 67
7
� (85) het gebonden kapitaal in de gezamelijke F-, G-, H1-, H2-, H3-, I-, J- en K-
voorraad moet geoptimaliseerd (geminimaliseerd) worden. Hierbij moeten de omstel-
kosten en de capaciteitsverliezen bij productomstellen ook in overweging genomen wor-
den. Zie de variabele productiekosten in de tabel in bijlage.� (97) het gebonden kapitaal in de gezamelijke L-, F- en G-voorraad moet geoptimaliseerd
(geminimaliseerd) worden. Hierbij moeten de omstelkosten (omstel tussen G en F in
straat 1 alsook tussen L/c, F/c en G/c in de maalstraat) en de capaciteitsverliezen bij
productomstellen (in straat 1 en in de maalstraat) ook in overweging genomen worden.
Zie de variabele productiekosten in de tabel in bijlage.
De bijdrage van het gebonden kapitaal in de voorraadkost is reeds eerder uitgewerkt, maar
hoe dit in relatie staat met de andere kosten wordt hieronder besproken. Omstellingskosten
en voorraadkosten brengen een trade-off met zich mee, want langere productieruns geven,
grotere voorraden, maar minder omstelingen. Kortere productieruns geven kleinere voorra-
den, maar meer omstellingen. Het model zal dus die situatie bevoordelen waarbij de totale
kost geminimaliseerd wordt. Op deze manier is al voldaan aan Het gebonden kapitaal in de
voorraad moet geoptimaliseerd worden, hierbij moeten de omstelkosten in rekening worden
gebracht. Een tweede aspect dat nog in rekening moet gebracht worden, zijn de capaci-
teitsverliezen. De trade-off zet zich verder indien er te veel omstellingen worden ingepland,
want per omstelling verliest men een aantal productiedagen. Op deze manier kan de totale
hoeveelheid niet meer geproduceerd worden, kan men dus minder producten verkopen en is
er winstderving. Zodra er winstderving is, moeten er kosten voor de capaciteitsverliezen in
rekening gebracht worden. Het verlies dat men leidt, is per product gelijk aan het tekort
vermenigvuldigd met de marge. Deze tekortfactor hebben we in een voorgaand onderdeel
reeds behandeld. Dus we voldoen aan de trade-off: Het gebonden kapitaal in de voorraad
moet geoptimaliseerd worden. Hierbij moeten de omstelkosten en de capaciteitsverliezen ook
in overweging genomen worden. Samengevat zoekt het model dus de beste oplossing voor
volgende punten:� Zo weinig mogelijk voorraad, maar dan meer omstellingen.� Zo weinig mogelijk omstellingen, maar dan meer voorraad.� Geen capaciteitsverliezen, dus beperking op het aantal omstellingen
7.12. Voorwaarden in verband met Tank 3
Dit onderdeel bundelt verschillende voorwaarden die te maken hebben met tank 3. Naast
de reeds eerder gedefinieerde variabele V T3p,m definieren we nog de volgende variabelen:
HOOFDSTUK 7. FASE 1: PLANNING 68
7
� PT3p,m :=
1, als Tank 3 toegewezen aan product p op het einde van maand m,
0, als Tank 3 toegewezen aan een ander product op het einde van maand m
De binaire variabelen corresponderend met V T3p,m� OST3m ∈ {0, 1, 2}: een omstel in tank 3, het aantal omstellingen in tank 3 in maand
m
Voorwaarden 7.52 leggen de relaties vast tussen V T3p,m en PT3p,m.
∀m :∑
p∈{mogelijke opslag in T3}
PT3p,m = 1 (7.52a)
∀m,∀p ∈ {mogelijke opslag in T3} : V T3p,m ≤ maxTank3p · PT3p,m (7.52b)
Voorwaarde 7.52b is noodzakelijk omwille van restricties 6 en 30:� (6) indien noodzakelijk is er extra 890 ton A2-stapelkapaciteit in tank 03 buiten de
C-, D1-, D2-, I-, J- en K-productiecampagnes (dit getal moet als variabele kunnen
ingegeven worden).� (30) maximaal 178 ton C- of D1-stapelcapaciteit in de tank 03.
Aangezien de tank ook slechts toegewezen mag worden aan A2 buiten een productierun van
C of D1, kunnen we een verband (7.53) uitdrukken tussen de stilstand van straat CD1 en de
toewijzing van A2 aan tank 3. In theorie zou ook zo een verband kunnen opgesteld worden
in de omgekeerde richting, dat indien er geen stilstand is, de tank toegewezen moet zijn aan
C of D1, maar omwille van de gelijkheid van 7.53 in combinatie met 7.52a is dit automatisch
in orde.
∀m :m∑
t=startM−1
(SSsCD1,t − ESsCD1,t) = PT3A2,m (7.53)
Voorwaarde 7.53 legde het verband vast tussn de CD1-productie en de A2-productie via
Tank 3. Voor de C- en D1-productie is ook nog een extra voorwaarde noodzakelijk. Bekijken
we figuur 7.10, dan herinner ik eraan dat in de eerste fase enkel maar schattingen worden
vastgelegd. In de veronderstelling dat er voldoende wordt geproduceerd van D1 in maand m
voor de hele productie van J en D2K in maand m is er nog capaciteit over op de CD1-straat.
Deze capaciteit wordt gebruikt voor C-productie. De I-productie start echter pas in maand
m + 1, wat betekent dat in heel de tussenperiode tank 3 eigenlijk moet toegewezen zijn
aan product C. We leggen in fase 1 nog niets over productiedagen vast, enkel op het einde
van de maand. In deze situatie zien we dat het model beslist om tank 3 toe te wijzen aan
product C op het einde van maand m, en niet aan product D1. Alle productie van D1 uit
maand m is perfect opgebruikt zodat tank 3 tegen het einde van de maand leeg is. Mits
HOOFDSTUK 7. FASE 1: PLANNING 69
7
deze veronderstellingen is voldaan aan de eerder gevormde voorwaarden. Om deze situatie
op te lossen is er nood aan een voorwaarde die de toewijzing van tank 3 op het einde van
een maand verbiedt indien er een productierun bezig is die gebruik maakt van de andere
grondstof. In de situatie van figuur 7.10 mag er geen toewijzing van tank 3 aan product
C zijn op het einde van maand m aangezien er een productierun bezig is van D2K. We
schrijven voorwaarde 7.54.
Figuur 7.10.: Grafische voorstelling voor probleem in tank 3 bij C- of D1-productie
∀(p1, p2) ∈{(C,D2K), (C, J), (D1, I)},∀m :
PT3p1,m ≤ 1 −m∑
t=startM−1
(SPp2,t − EPp2,t)(7.54)
Omstel in tank 3 (7) 2 dagen reiniging van tank 03 te voorzien voor en nadat er A2 in
gestockeerd wordt (dit getal moet als variabele kunnen ingegeven worden).
Tussen C en D1 of omgekeerd wordt de tank niet gereinigd. Het enigste wat we weten is
welk product er zich op het eind van elke maand in de tank bevindt, aan de hand daarvan
bepalen we dan of er een omstel heeft plaats gevonden of niet. Onderstaande waarheidstabel
7.4 geeft de verschillende situaties weer.
Tabel 7.4.: Waarheidstabel in verband met de verschillende situaties voor omstel in tank 3
PT3A2,m−1 PT3A2,m PA2T3,m OST3m
1 0 - 1
0 1 - 1
0 0 0 0
0 0 1 2
1 1 - 0
In de eerste situatie gaat men over van A2 naar C of D1. Dit betekent dat de productie
van C of D1 moet gestart zijn of een stilstand moet beeindigd zijn (ESsCD1,m = 1). We
HOOFDSTUK 7. FASE 1: PLANNING 70
7
schrijven volgende voorwaarde:
∀m : OST3m ≥ PT3A2,m−1 + ESsCD1,m − 1 (7.55a)
De tweede situatie betekent een overgang naar opslag van A2. Dit is enkel mogelijk als
straat CD1 begonnen is aan een stilstand: (SSsCD1,m = 1). Volgende voorwaarde voldoet
aan deze situatie en verbreekt de vorige situatie niet.
∀m : OST3m ≥ PT3A2,m + SSsCD1,m − 1 (7.55b)
In de derde en vierde situatie maken we een verdere opsplitsing. Op het begin en het einde
van de maand is de tank toegewezen aan C of D1. Tussendoor is het echter best mogelijk
dat de tank even aan A2 is toegewezen. Afhankelijk van de situatie is er dus geen omstel of
twee omstellingen in de maand. We maken een onderscheid in deze situatie door te kijken
of de productie van A2 via T3 in de maand m verschillend is van 0 en schrijven volgende
voorwaarde:
∀m : OST3m ≥ 2 · PPA2T3,m − PT3A2,m−1 − PT3A2,m (7.55c)
In de vijfde situatie is de tank in het begin en het einde van de maand toegewezen aan A2.
Het is theoretisch mogelijk om hiertussen de tank toe te wijzen aan C of D1, maar dan moet
straat CD1 eerst stoppen en later ook terug starten. Dit is echter een situatie die onmogelijk
is gemaakt bij de definitie van de stilstanden. Dus er zijn geen omstellingen mogelijk. We
voegen voor deze situatie nog een voorwaarde toe die deze relatie weergeeft:
∀m : PPA2T3,m + PT3A2,m−1 ≤ 2 − (SSsCD1,m + ESsCD1,m) (7.55d)
In de doelfunctie komt dan de volgende term:
+∑
m
OST3m · kostOT3 (7.56)
Capaciteitsbeperking tank 3 Het is niet mogelijk om in het begin van de maand van
een volledige volle tank A2 over te gaan naar een volle tank C op het eind van diezelfde
maand aangezien er tijd nodig is om de tank te legen en opnieuw te vullen. Er is dus een
capaciteitsbeperking voor de tank. Bekijken we figuur 7.11, dan zien we dat er zich drie
zones voordoen. De capaciteitsbeperking wordt dan eenvoudig geschreven als volgt:
∀m :∑
p∈{mogelijke opslag in T3}
(dagenLeegp,m + dagenTussenp,m + dagenV olp,m)
≤ #dm − dagenOsT3 · OST3m (7.57)
HOOFDSTUK 7. FASE 1: PLANNING 71
7
Figuur 7.11.: Grafische voorstelling voor het opvullen en legen van Tank 3
dagenLeegp,m ∈ R+, dagenTussenp,m ∈ R
+ en dagenV olp,m ∈ R+ zijn dan drie nieuwe
variabelen die we op een correcte manier moeten definieren.
dagenLeegp,m is het aantal dagen nodig om de tank leeg te maken van niveau V T3p,m−1
naar 0. Ondertussen is het wel mogelijk dat er nog productie is van p tijdens het legen van
de tank.
∀p ∈ {C, D1},∀m : dagenLeegp,m ≥Qp,m
dagcapaciteitp− (1 − PT3p,m−1) · M (7.58a)
∀m : dagenLeegA2,m ≥QA2T3,m
dagcapaciteitA2− (1 − PT3A2,m−1) · M (7.58b)
Indien de tank niet toegewezen is aan het product, dan is er geen beperking voor dagenLeeg.
Indien de tank wel toegewezen is, dan weten we sowieso dat de tank een bepaalde tijd moet
toegewezen blijven aan dat product. Deze tijd moet groter zijn dan de productieduur van
het voorgaande product. Bijvoorbeeld C wordt nog 8 dagen geproduceerd, dat betekent dus
dat tank 3 zeker nog 8 dagen toegewezen is aan C. Dit wordt verkregen in vergelijking 7.58a
en 7.58b. Omgekeerd geldt net hetzelfde. Zolang er afname is uit de tank, weten we dat de
tank toegewezen moet zijn aan dat product. Bijvoorbeeld zolang er J en D2 productie is,
moet de tank toegewezen zijn aan C. Dit wordt geschreven in vergelijking 7.58c.
∀p ∈ {C, D1, A1},∀s,∀m :
dagenLeegp,m ≥∑
p′∈P ′
⌈
Qp′,m
dagcapaciteit′p
⌉
− (1 − PT3p,m−1) · M(7.58c)
Hierin bestaat het set P’ uit alle producten die vervaardigd worden uit product p via tank
3 van een en dezelfde straat s. Bijvoorbeeld NT3 en M6T3, beiden van straat 6 en beiden
vervaardigd uit A2 via T3.
dagenV olp,m is het aantal dagen nodig om de tank te vullen van 0 tot het niveau V T3p,m.
Ondertussen is het wel mogelijk dat er ook reeds verbruik is van p tijdens het vullen van de
tank.
∀p ∈ {C, D1},∀m : dagenV olp,m ≥Qp,m
dagcapaciteitp−(1−PT3p,m +PT3p,m−1) ·M (7.59a)
HOOFDSTUK 7. FASE 1: PLANNING 72
7
∀m : dagenV olA2,m ≥QA2T3,m
dagcapaciteitA2− (1 − PT3A2,m + PT3p,m−1) · M (7.59b)
Hier geldt een analoge uitleg als bij dagenLeeg. De situatie waarbij zich doorheen heel
de maand slechts 1 product in de tank bevindt, wordt geteld bij zowel dagenVol als bij
dagenLeeg. Vandaar de extra term bij dagenVol op het einde om deze situatie dan toch niet
dubbel te tellen.
dagenTussenp,m is omwille van het tussentijds gebruik van de tank voor een ander product.
PT3p,m = PT3p,m−1 = 0
∀p ∈ {C, D1},∀m : dagenTussenp,m ≥Qp,m
dagcapaciteitp−(PT3p,m−1+PT3p,m)·M (7.60a)
∀m : dagenTussenA2,m ≥QA2T3,m
dagcapaciteitA2− (PT3A2,m−1 + PT3A2,m) · M (7.60b)
Hier geldt ook een analoge uitleg als bij dagenLeeg en dagenVol.
∀p ∈ {C, D1, A1},∀s,∀m : dagenTussenp,m ≥∑
p′∈P ′
⌈
Qp′,m
dagcapaciteit′p
⌉
−(PT3p,m−1+PT3p,m)·M
(7.60c)
7.13. Straat 3
Dit onderdeel bundelt een aantal voorwaarden specifiek voor productiestraat 3.
7.13.1. 70 ton D2
(73) D2 wordt uit D1 geproduceerd op straat 3. Er wordt telkens 70 ton D2 in tank 04
geproduceerd die daarna tot K omgezet wordt.
Een korte verduidelijking van deze restrictie: tijdens een K-campagne wordt er telkens
maximaal 70 ton D1 omgezet naar D2 dat opgeslagen wordt in tank 4. Deze D2 wordt dan
vervolgens omgezet naar K. Dit kan zich in 1 K-campagne meerdere malen na elkaar her-
halen. Zolang het maar geen sequenties zijn die groter zijn dan 70 ton, omdat de maximale
opslagcapaciteit van tank 4 beperkt is tot 70 ton. Sequenties kleiner dan 70 ton zijn ook
toegestaan. Een verduidelijking hiervan is te zien op figuur 7.12.
Figuur 7.12.: Grafische voorstelling ter verduidelijking restrictie 73
HOOFDSTUK 7. FASE 1: PLANNING 73
7
Door gebruik te maken van D2K als 1 product in voorgaande onderdelen, is automatisch
voldaan aan het produceren van D2 en K in blok. Het probleem dat zich nu stelt is om de
correcte hoeveelheden van D2 en K te verdelen over de maanden. Zoals in figuur 7.12 te
zien is de tweede run van K verdeeld over de twee maanden, wat het probleem illustreert.
Indien dit vrijgelaten wordt, zal alle D2 naar het begin van de campagne geplaatst worden
en alle K naar het einde omwille van de voorraadkosten. De beperking van tank 4 zorgt
echter dat dit niet mogelijk is. Volgende voorwaarden worden daarom toegevoegd.
∀m : QD2,m + QK,m = QD2K,m (7.61a)
Voorwaarde 7.61a is eigenlijk het logische gevolg indien D2 en K samen worden genomen.
∀m : QD2,m = QK,m ≤QD2K,m
2+ M · (2 − SPD2K,m − EPD2K,m) (7.61b)
Indien de productierun van D2K start en stopt in dezelfde maand is de opsplitsing tussen
D2 en K zeer eenvoudig, namelijk de helft. Voorwaarde 7.61b is niet strikt noodzakelijk
maar zorgt wel voor een extra intelligentie.
∀m :
m∑
t=startM−1
QD2,t ≥
m∑
t=startM−1
QK,t (7.61c)
Uiteraard moet op elk moment de geproduceerde hoeveelheid van D2 groter zijn dan de
geproduceerde hoeveelheid van K, wat door voorwaarde 7.61c wordt vastgelegd.
∀m :
m∑
t=startM−1
QD2,t ≤
m∑
t=startM−1
QK,t + 70 ·
m∑
t=startM−1
(SPD2K,t − EPD2K,t) (7.61d)
Omgekeerd mag de geproduceerde hoeveelheid van D2 nooit de geproduceerde hoeveelheid
van K overschrijden met meer dan 70 ton, anders is tank 4 overbelast (7.61d). Indien er
geen productierun aan het lopen is van D2K, moet de geproduceerde hoeveelheid van D2
gelijk zijn aan die van K, wat verkregen wordt door de combinatie van 7.61c en 7.61d.
Ondanks deze vergelijkingen is het nog steeds mogelijk om D2 naar voor te brengen ten
voordele van de voorraadkosten van K. Bijvoorbeeld 90 ton D2 produceren in maand m
gevolgd door 20 ton K in maand m. Het verschil is niet groter dan 70 ton, dus aan voorgaande
restricties is voldaan, maar 90 ton D2 verbreekt wel de maximum voorraad van tank 4 op
een bepaald moment. Dus dit zou moeten worden 70 ton D2 in maand m, dan 70 ton K
verwerken in maand m en m + 1 om vervolgens pas de extra 20 ton D2 in maand m + 1 te
produceren. Om dit te verwezenlijken voeren we 3 extra binaire variabelen in: y70,m, y140,m
en y210,m. Onderstaande voorwaarden vervolledigen dit onderdeel.
∀m : y70,m + y140,m + y210,m ≤ 1 (7.61e)
HOOFDSTUK 7. FASE 1: PLANNING 74
7
∀p ∈ {K, D2},∀m : 70 · y140,m + 140 · y210,m + 210 · (SPD2K,m − 1) ≤ Qp,m (7.61f)
∀p ∈ {K, D2},∀m : Qp,m ≤ 70·y70,m+140·y140,m+210·y210,m−210·(SPD2K,m−1) (7.61g)
De extra term met SP omdat deze vergelijking enkel moet gelden in de eerst maand van
de productierun in de veronderstelling dat een totale campagne van D2K nooit langer dan
1 maand kan duren.
7.13.2. J- en D2K-productie in blok
(74) de J- en K-productiecampagnes moeten telkens in blok (=aaneensluitend) gebeuren om-
dat ze uit een gemeenschappelijke grondstof nl. D1 geproduceerd worden.
Met in ons achterhoofd de vergelijkingen voor productieruns, waarbij er slechts 1 productie-
run van elk product per maand kan voorkomen schrijven we volgende vergelijkingen 7.62a
en 7.62b die er voor zorgen dat indien bijvoorbeeld de productie van J wordt gestopt in
maand m en er is nog geen D2K-productie voorgekomen, er een productierun van D2 wordt
gestart in diezelfde maand m. Het is echter wel nog mogelijk dat er tussen deze twee pro-
ducties nog andere producties voorkomen zoals te zien in figuur 7.13. De producties van
D2K en J voldoen aan de vergelijkingen 7.62a en 7.62b, maar toch zijn ze nog niet in blok
en het is ook niet mogelijk om ze in blok te plaatsen aangezien ze starten of eindigen in een
andere maand. Hiervoor hebben we nog andere vergelijkingen nodig: 7.62c en 7.62d. Deze
vergelijkingen stellen een NAND-functie voor. Indien beide sommen gelijk zijn aan 1, zoals
in de situatie van figuur 7.13, dan kan er geen productie starten van een ander product, met
andere woorden, de blokken worden verplicht om dan na elkaar te komen.
∀m :m∑
t=startM
(EPD2K,t − EPJ,t) ≤ SPJ,m (7.62a)
∀m :
m∑
t=startM
(EPJ,t − EPD2K,t) ≤ SPD2K,m (7.62b)
∀p ∈ {producten op s3\{D2, K, J}},∀m :
SPp,m ≤ 2 −m∑
t=startM
(EPD2K,t − EPJ,t) −m−1∑
t=startM−1
(SPD2K,t − SPJ,t) (7.62c)
HOOFDSTUK 7. FASE 1: PLANNING 75
7
∀p ∈ {producten op s3\{D2, K, J}},∀m :
SPp,m ≤ 2 −
m∑
t=startM
(EPJ,t − EPD2K,t) −
m−1∑
t=startM−1
(SPJ,t − SPD2K,t) (7.62d)
Figuur 7.13.: Grafische voorstelling ter verduidelijking restrictie 74
7.13.3. Beperkt aantal productieruns per jaar� (76) maximum 1 I-productiecampagne per jaar (dit getal moet als variabele kunnen
ingegeven worden).� (77) maximum 4 J- en K-productiecampagnes per jaar (dit getal moet als variabele
kunnen ingegeven worden).
Definieren we het aantal productieruns afhankelijk van het product als volgende parameter:
APp. Dan kunnen deze twee restricties samen behandeld worden. Het totaal aantal produc-
tieruns die gestart worden en ook beeindigd worden, moet kleiner zijn dan het maximum
aantal productieruns: (∀p ∈ {I, D2K, J})
∑
m
SPp,m ≤ APp (7.63a)
∑
m
EPp,m ≤ APp (7.63b)
7.13.4. H123 in de winter
(84) 1 van de H1, H2 of H3 productiecampagnes moet in de koudere maanden (december tot
en met maart) geproduceerd worden omwille van de afvalwaterbehandelingskosten.
We definieren in de preproces-stap de koude maanden en krijgen vervolgens voorwaarde 7.64.
Hierbij wordt ook EP in rekening gebracht omdat het kan zijn dat de vorige productiemaand
ook een koude maand is, waarbij een productierun voor H123 gestart is die nog doorloopt
in de huidige planning.
∑
m∈{Koude maanden}
(SPH123,m + EPH123,m ≥ 1 (7.64)
HOOFDSTUK 7. FASE 1: PLANNING 76
7
7.13.5. Tank 3 leeg na productiecampagne
(31) Tijdens een I-/J-/D2-/K-productiecampagne wordt het geproduceerde C of D1 steeds
volledig opgebruikt, m.a.w. tot voorraad 0.
Het is dus niet de bedoeling om dagen op voorhand C en D1 te gaan produceren alvorens
dit verder te verwerken. Indien de tank beschikbaar is, slaagt men daar het liefst A2 in op.
I-productie
Er is slechts 1 productierun voor I per jaar. Het zou dus vrij zinloos zijn als tank 3 niet
helemaal leeg is na de productierun, want zo zou tank 3 voor de rest van het jaar niet
beschikbaar zijn voor andere producten. Aangezien we niet weten op welk moment de I-
productie stopt in een maand, kunnen we alleen eisen dat tank 3 niet meer toegewezen is
aan product C op het einde van de maand waarin de productierun van I stopt.
∀m : 1 − EPI,m ≥ PT3C,m (7.65)
Indien dus EPI,m = 1 dan moet PT3C,m = 0, dus de V T3C,m = 0 en de tank is niet meer
toegewezen aan C op het eind van de maand m. Indien EPI,m = 0 dan is PT3C,m vrij en
kan er op elk moment beslist worden of de tank opnieuw toegwezen wordt aan C of niet.
JD2K-productie
Maximaal 3 productieruns per jaar, in de veronderstelling dat deze verspreid zijn doorheen
het jaar, mogen we veronderstellen dat indien een productieblok eindigt in de maand m
tank 3 op het eind van die maand niet opnieuw toegewezen is aan D1. Zodat na de JD2K-
campagne de tank beschikbaar is voor andere producten. In theorie is dat wel mogelijk
indien twee productieblokken elkaar zeer dicht opvolgen. In praktijk veronderstel ik echter
dat dit niet mogelijk is. Dit is echter niet eenvoudig te vertalen naar 1 vergelijking zoals bij
product C het geval was.
Indien blok D2KJ afgesloten wordt in de maand m moet PT3D1,m = 0. Een blok is afgesloten
in de maand m als:
∑mt=startM (EPD2K,t − EPJ,t) = 0
∧
EPD2K,m = 1 ∨ EPJ,m = 1
(7.66)
Dit is zonder invoeren van een extra variabele niet mogelijk om te modelleren. Het probleem
zit hem in de eerste voorwaarde van 7.66 waarvan het linkerlid zowel −1, 0 als 1 kan zijn.
Mits het gebruik van de absolute waarde van dit linkerlid, is het wel mogelijk om het
probleem te modelleren. Om de absolute waarde van een variabele te krijgen, maken we
HOOFDSTUK 7. FASE 1: PLANNING 77
7
gebruik van de eerder vermelde vergelijkingen 7.43 die een getal schrijven als het verschil
van twee positieve getallen. De absolute waarde wordt dan de som van deze twee positieve
getallen:
|A| = A+ + A− (7.67)
Het probleem kan dan geschreven worden als:
∀m : 1 − PT3D1,m ≥ EPD2K,m −
∣
∣
∣
∣
∣
m∑
t=startM
(EPD2K,t − EPJ,t)
∣
∣
∣
∣
∣
(7.68a)
∀m : 1 − PT3D1,m ≥ EPJ,m −
∣
∣
∣
∣
∣
m∑
t=startM
(EPD2K,t − EPJ,t)
∣
∣
∣
∣
∣
(7.68b)
Indien we de eerder gevormde voorwaarden 7.66 invullen in de vergelijkingen 7.68 dan zien
we dat het resultaat is zoals we verwachtten.
7.14. Beginvoorwaarden
De initialisatie van de beginvoorwaarden vertrekkende van de resultaten in de huidige maand:� Initiele voorraad voor de producten p waarvoor dit nodig is:
initieleV oorraadp = Vp,startM−1 (7.69a)� Initiele voorraad van A2 in tank 1 en 2:
initieleTank12 = V T12A2,startM−1 (7.69b)� Initiele voorraad van D2 in tank 4:
initieleTank4 = V T4D2,startM−1 (7.69c)� Initiele voorraad van B in tank B:
initieleTankB = V TBB,startM−1 (7.69d)� Initiele voorraad van p ∈ {B, A2} in vaten en IBC’s:
initieleV IBCp = V V IBCp,startM−1 (7.69e)� Initiele voorraad van B in Container B:
initieleContB = V CB,startM−1 (7.69f)
HOOFDSTUK 7. FASE 1: PLANNING 78
7
� Initiele voorraad van p ∈ {A2, C, D1} in tank 3:
initieleTank3p = V T3p,startM−1 (7.69g)� Aantal dagen stilstand op het einde van de vorige maand voor
s ∈ {s1, s3, s4, s5, s6, sA1, sA2, sCD1, sM}
initieleDagenSs = dagenSs,startM−1 (7.69h)� Of er een stilstand bezig is op het einde van de vorige maand voor
s ∈ {s1, s3, s4, s5, s6, sA1, sA2, sCD1, sM}
initieleSSs = SSs,startM−1 (7.69i)� De productiehoeveelheid waarmee de straat s geeindigd is in de vorige periode. s ∈
{s1, s3, s4, s5, s6, sA1, sA2, sCD1, sM}
∀p ∈ {geproduceerd op s}initieleQp = Qp,startM−1 (7.69j)� En indien de straat s ∈ {s1, s3, s4, s5, s6, sA1, sA2, sCD1, sM} in de vorige
periode nog bezig is aan een productierun:
∀p ∈ {geproduceerd op s}initieleSPp = SPp,startM−1 (7.69k)� Op het moment dat de planning start, zijn er uiteraard nog geen tekorten. Deze zitten
verwerkt in de werkelijke voorraadcijfers, die eventueel lager zijn dan de eis voor de
minimale voorraad.
∀p ∈ {producten die verkocht worden}Tp,startM−1 = 0 (7.69l)
7.15. Overige voorwaarden
7.15.1. Efficientie productie A1
Het betreft hier restrictie 10 versus restrictie 22-bis.� (10) de A1-productie loopt best op vollast met 3 straten. 83 dagen op 2/3-last t.o.v.
28 dagen afstel en 55 dagen op vollast levert 160,000 Euro besparing op (dit getal moet
als variabele kunnen ingegeven worden).� (22 bis) de A1-productie moet minimaal 8 maanden lopen op minstens 50% capaciteit
(het aantal maanden en de minimale capaciteit moeten als variabele kunnen ingegeven
worden).
HOOFDSTUK 7. FASE 1: PLANNING 79
7
Vollast moet als volgt geınterpreteerd worden: de A1-installatie produceert tegen maxima-
le capaciteit van 116.7 ton. Dit kan men bekomen door er drie productiestraten op aan
te sluiten en de resterende capaciteit via A2 te verwerken. Of door twee productiestraten
aan te sluiten en weer de resterende capaciteit via A2 te verwerken. Of slechts 1 straat en
. . . Zolang er maar geproduceerd wordt tegen maximale capaciteit spreekt men van vollast.
Beide voorwaarden zijn niet eenvoudig te modelleren. We kunnen echter een zeer goede
benadering verkrijgen door de combinatie van volgende twee voorwaarden en een extra term
in de doelfunctie:
∑
m
(#dm − dagenSsA1,m) ≥ 8 · 30 (7.70a)
Deze vergelijking eist dat er minstens 240 dagen productie is in installatie A1, het equivalent
van 8 maanden. Een deel van restrictie 22-bis is op deze manier reeds voldaan.
∑
m
QA1,m ≥ 0.5 · 8 · 30 · dagcapaciteitA1 (7.70b)
Deze vergelijking stelt gewoon een minimum waarde voorop van de productiehoeveelheid
van A1 volgens restrictie 22 bis.
−160000
28·∑
m
dagenSsA1,m (7.70c)
Deze term is gelijk aan de eerder gegeven term 7.26.
De combinatie van 7.70 zou dus als effect moeten hebben dat de A1-installatie zoveel mogelijk
tegen vollast loopt, maar dat er toch minimaal 8 maanden productie is. Term 7.70c zal
er voor zorgen dat er zoveel mogelijk stilstanden worden ingepland. Echter nooit meer
stilstanden dan 4 maand (7.70a). Zo veel mogelijk stilstanden betekent ook dat de productie
zoveel mogelijk gegroepeerd wordt, ofte zoveel mogelijk productie op zo weinig mogelijk
dagen. Dus dit leidt benaderend tot zowel meer dan 50% capaciteit als tot zoveel mogelijk
dagen in vollast, waardoor restricties 10 en 22-bis bij benadering voldaan zijn.
7.15.2. Doorgeven van stilstanden� (33) de O-, F-, L- en M(in L)-producties kunnen alleen lopen als de E-installatie loopt.� (40) de H1-, H2-, H3-, L-, M(in L)- en O- en M(in L)-producties kunnen alleen lopen
als de AW1-installatie loopt.� (42) de N-productie kan alleen lopen als de AW2-installatie loopt.
In de preprocessing stap zijn deze vergelijkingen al eens aangehaald. Deze zijn gedeeltelijk
opgelost indien het mogelijk was om een stilstand van de ene productiestraat door te geven
HOOFDSTUK 7. FASE 1: PLANNING 80
7
naar een stilstand van een andere productiestraat. Bijvoorbeeld voor restrictie 33, is de
stilstand van de E-installatie al volledig doorgegeven naar straat 5 in de preproces-stap.
Voor F is dat echter iets moeilijker, omdat een stilstand van E niet impliceert dat straat 1
moet stilliggen, want er is nog G-productie mogelijk. Voor deze situaties zoeken we hier een
oplossing. Het enigste wat dan mogelijk is in deze fase, is om de productieduur van F in
maand m te beperken tot maximaal het aantal dagen dat de E-installatie in werking is in
diezelfde maand. Voorwaarde 7.71a wordt hiervoor uitgeschreven. Een analoge redenering
kan gevolgd worden voor de H123-productie versus de AW1-installatie (vgl 7.71b) en de
N-productie versus de AW2-installatie (vgl. 7.71c).
∀m : QF,m ≤ (#dm − ingeplandeSsE,m) · dagcapaciteitF (7.71a)
∀m : QH123,m ≤ (#dm − ingeplandeSsAW1,m) · dagcapaciteitH123 (7.71b)
∀m : QN,m ≤ (#dm − ingeplandeSsAW2,m) · dagcapaciteitN (7.71c)
7.15.3. Minimum afvalwaterdebiet
(44) het minimale afvalwaterdebiet naar de AW2-installatie bedraagt 30 ton/uur. (minADebiet)
Dit betekent dat wanneer de AW2-installatie loopt, minstens die combinatie van producties
moet lopen waarbij het totale afvalwaterdebiet (zie kolom G uit de spreadsheet ’variabelen
productieplanning, 2e blad) groter is dan 30 ton/uur (dit getal moet als variabele kunnen
ingegeven worden).
Deze restrictie geldt altijd als de AW2-installatie in dienst is. Omwille van de bedrijfs-
zekerheid van deze installatie geldt deze restrictie het hele jaar door, behalve gedurende
de ingeplande stilstand van AW2 die ongeveer 2 weken duurt. We kunnen dus eenvoudig
voorwaarde 7.72 schrijven waarin PAfval die verzameling van producten p is waarvoor een
afvalwaterdebiet (ADebietp) geldt.
∀m :∑
p∈PAfval
(Qp,m
dagcapaciteitp· ADebietp) ≥ minADebiet · (#dm − ingeplandeSsAW2,m)
(7.72)
Voor de maanden waarin er geen stiltand is van AW2, is deze voorwaarde strikt geldig.
Voor de maanden waarbij er wel een stilstand is ingepland van A2, is deze voorwaarde te
zwak. Dan wordt het afvalwaterdebiet van de hele maand in rekening gebracht, terwijl de
vergelijking moet gelden voor slechts die dagen waarbij AW2 in werking is. Het linkerlid zal
dus veel sneller voldoen aan de voorwaarde. We negeren echter deze opmerking omdat het
HOOFDSTUK 7. FASE 1: PLANNING 81
7
toch slechts voor een tweetal weken op een heel jaar een probleem vormt. In fase 2 wordt
er wel rekening met gehouden.
7.15.4. Maximum stilstand installatie 2
(45) de maximale duur voor een algemene productiestilstand van installatie 2 (F, G(in F),
G(in H1), H1, H2, H3, I, J, K, L, M(in L), O, N, M(in N)) is 8 weken omdat de AW3
installatie anders beschadigd wordt (dit getal moet als variabele kunnen ingegeven worden).
8 weken is net iets minder dan twee maand. Dus als er een hele maand geen productie is
geweest op installatie 2, moet er zeker productie zijn in de maand die daarop volgt.
∀m :∑
p∈{producten van installatie 2}
Pp,m+1 ≥ 1 −∑
p∈{producten van installatie 2}
Pp,m (7.73a)
We hebben hier ook nood aan een beginvoorwaarde. Indien installatie 2 in de vorige maand
langer dan 28 dagen stilstaat, moet er geproduceerd worden in de eerste maand van de
planning op installatie 2. In de preproces-stap definieren we een binaire variabele: pI die 1
is indien er moet geproduceerd worden in de eerste maand en 0 anders.
∑
p∈{producten van installatie 2}
Pp,startM ≥ pI (7.73b)
7.15.5. Stilstand tijdens zomervakantie:
(48) tijdens de maanden juli en augustus moet straat 1 of straat 3 stilgelegd worden wegens
de personeelsbezetting.
Hierbij gelden twee mogelijkheden. Ofwel wordt dit op voorhand vastgelegd door het ma-
nagement en wordt dit ingegeven via de ingeplande stilstanden. Ofwel wordt er niet op
voorhand besloten welke straat er wanneer wordt stilgelegd en moet het model hiervoor
zorgen. In deze eerste fase is het onmogelijk om de stilstanden op deze twee straten reeds te
schedulen zodat er steeds 1 straat stilligt. Wat wel al kan gedaan worden, is ervoor zorgen
dat er genoeg stilstanddagen op beide straten worden ingepland, zodat de totale productie-
duur op beide straten samen kleiner is dan 30 dagen. Op deze wijze moet dan in fase 2 de
productie op correcte wijze worden gescheduled.
∀m ∈ {Zomermaanden} :
∑
p∈{p geproduceerd op s1⋃
s3}
(⌈
Qp,m
dagcapaciteitp
⌉
+ dagenOp · OSp,m
)
≤ #dm(7.74)
HOOFDSTUK 7. FASE 1: PLANNING 82
7
7.15.6. Voorkeur M-productie op straat 6
(62) preferentiele M-productie op straat 6. De rest moet op straat 4 geproduceerd worden
(dit moet als variabele kunnen ingegeven worden).
Anders verwoord houdt deze restrictie het volgende in: de eerste 2 jaar kan M alleen op
straat 6 geproduceerd worden omwille van het aanpassen van straat 4. Nadien beslist het
model waar product M het best wordt geproduceerd. We moeten dus de productie gelijk
stellen aan nul in de periode waarbij er nog geen M geproduceerd kan worden op straat
4. Indien we volgende parameters invoeren: SJM4 := het eerste jaar waarin M-productie
mogelijk is op straat 4 en SMM4 := de eerste maand in SJM4 waarin M-productie mogelijk
is op straat 4, dan stellen voorwaarden 7.75 de producties voor deze datum gelijk aan 0.
(startJ is naar analogie met startM het huidige jaar waarin de planning start.)
∀j ∈ {startJ, . . . , SJM4 − 2},∀m : QM4,m = 0 (7.75a)
Indien men het komende jaar helemaal nog geen M kan produceren op straat 4: voorwaarde
7.75a.
∀j ∈ {startJ, . . . , SJM4 − 1},∀m ∈ {startM, . . . , SMM4 + 12 − 1} : QM4,m = 0 (7.75b)
Indien er in de huidige jaargang nog geen M-productie op straat 4 is, maar wel al in de
volgende jaargang. Alle productiehoeveelheden van M op straat 4 voor deze maand gelijk
aan 0: voorwaarde 7.75b.
∀j ∈ {startJ, . . . , SJM4},∀m ∈ {startM, . . . , SMM4 − 1} : QM4,m = 0 (7.75c)
Indien in de huidige jaargang de productie van M wordt gestart op straat 4, enkel de maanden
ervoor nog beperken tot 0: voorwaarde 7.75c.
7.15.7. Energiekoppeling tussen straat 5 en 6
(63) N en M(in N) lopen best samen met O. Als N samen loopt met O, dan besparen we
875 Euro/dag t.o.v. als N loopt zonder O. Als M samen loopt met O, dan besparen we 1,225
Euro/dag t.o.v. als M loopt zonder O. (Deze beide getallen moeten als variabele kunnen
ingegeven worden.)
In eerste instantie willen we dat indien M loopt, O zoveel mogelijk op hetzelfde moment
loopt. Omdat de winst hierbij groter is dan bij N versus O. Indien in dezelfde maand mits
omstelling ook N geproduceerd wordt, willen we ook daarbij zoveel mogelijk O-productie
hebben. Een fictieve situatie is voorgesteld in figuur 7.14. Hierbij zou het dus het meest
HOOFDSTUK 7. FASE 1: PLANNING 83
7
voordelig zijn om de O-productie zoveel mogelijk naar achteren in de maand te schedulen,
zodat die volledig met de M6-productie samenvalt. En we proberen dan ook nog zoveel
mogelijk van de N-productie ermee te laten samenvallen. Met deze figuur in het achterhoofd
zijn voorwaarden 7.76 eenvoudig te interpreteren.
Figuur 7.14.: Grafische voorstelling in verband met restrictie 63
∀m :QM6,m
dagcapaciteitM6−
QO,m
dagcapaciteitO≤ M6nietOm (7.76a)
Hierin voegen we een nieuwe variabele toe: M6nietOm ∈ R+ , die het aantal dagen weergeeft
waarop er meer M-productie is in de maand m dan O-productie. Indien groter dan 0 is het
onmogelijk om alle M-productie te coveren met O-productie en zijn we niet energie-efficient.
∀m :QN,m
dagcapaciteitN+
QM6,m
dagcapaciteitM6+
∑
p∈{producten op straat 6}
dagenOp · OSp,m
− verwDagenOs6 · SSs6,m −QO,m
dagcapaciteitO≤ NnietOm
(7.76b)
Ook hier voegen we een nieuwe variabele in: NnietOm ∈ R+ . Bekijken we figuur 7.14 nauw-
keurig dan zien we dat deze variabele het aantal dagen zal weergeven waarbij de N-productie
nog gecovered is door O, nadat we zoveel mogelijk de M-productie en de tussenliggende stil-
stand coveren. Is deze variabele positief, dan produceren we niet energie-efficient en moet
er ook een penaltykost aangerekend worden.
Bij de te minimaliseren totale kost voegen we volgende term toe:
+∑
m
(875 · NnietOm + (1225 − 875) · M6nietOm) (7.77)
De penalty voor M6nietOm is het verschil, omdat deze dagen sowieso ook in de eerste term
reeds vervat zitten. Dus de totale penalty voor M6nietOm is nog steeds 1125 euro.
7.15.8. Voorkeur voor G-productie op straat 3
(70) preferentiele G-productie op straat 3. De rest moet op straat 1 geproduceerd worden
(dit moet als variabele kunnen ingegeven worden).
HOOFDSTUK 7. FASE 1: PLANNING 84
7
Het product G kan nu reeds op beide productiestraten worden geproduceerd en wordt het
liefst op straat 3 geproduceerd. Indien straat 3 echter volgeboekt is, moet de rest van G op
straat 1 worden geproduceerd. We voeren een penaltyfactor in de doelfunctie in, die elk ton
G-productie via straat 1 bestraft. De totale kost wordt uitgebreid met volgende term:
+∑
m
QG1,m · varProductieKostG1 · kostFactorG (7.78)
Afhankelijk van de grootte van de kostfactor bestraffen we de productie van G op straat
1 meer of minder. Indien de factor kleiner dan 0 is, is het voordeliger om G op straat 1
te produceren. Indien kostFactorG = 0 dan is er geen voorkeur voor een bepaalde straat.
Indien de factor groter is dan 0, is het voordeliger om te produceren op straat 3.
7.15.9. Voorwaarden in verband met het moment van omstel� (88) een productomstel moet op maandag, dinsdag, woensdag of donderdag gebeuren.
Er mag geen wettelijke feestdag binnen deze dagen vallen.� (89) de productomstel van straat 1 en 3 mag niet gelijktijdig gebeuren omwille van de
personeelsbezetting.� (90) de productomstel van straat 4 en 6 mag niet gelijktijdig gebeuren omwille van de
personeelsbezetting.� (91) een productomstel van straat 1, 3, 4, 5 en 6 mag niet gelijktijdig gebeuren omwille
van de personeelsbezetting. Opgepast: het zou kunnen zijn dat deze voorwaarde in de
nabije toekomst komt te vervallen terwijl de twee vorige behouden blijven.� (96) een productomstel in de maalstraat moet op maandag, dinsdag, woensdag of don-
derdag gebeuren. Er mag geen wettelijke feestdag binnen deze dagen vallen.
In deze eerste fase kan er onmogelijk gezegd worden op welke dag een omstel zal plaatsvin-
den. We kunnen toch al een beperking opstellen die ons zal beschermen in de tweede fase
tegen infeasible schedules. In 1 maand zijn er ongeveer 4 weken, dus 16 dagen waarop een
omstel mag plaatsvinden. In de praktijk zullen dit meerdere dagen zijn, maar aangezien op
een sequentie van 4 mogelijke dagen voor een omstelling een omstel van 3 dagen sowieso een
verlies van 1 omsteldag betekent is 16 reeds een mooie beperking. Een productomstel van
straat 1 en 3 mag niet gelijktijdig gebeuren. Dit betekent dat ze op verschillende omstelda-
gen moeten voorkomen, dus het totaal aantal omsteldagen voor straat 1 en 3 in een maand
moet kleiner zijn dan 16. Het analoge geval geldt voor de andere restricties en we schrijven
voorwaarden 7.79.
HOOFDSTUK 7. FASE 1: PLANNING 85
7
∀m :∑
p∈{geproduceerd op s1 of s3}
dagenOp · OSp,m ≤ 16 (7.79a)
∀m :∑
p∈{geproduceerd op s4 of s6}
dagenOp · OSp,m ≤ 16 (7.79b)
∀m :∑
p∈{geproduceerd op s1, s3, s4, s5 of s6}
dagenOp · OSp,m ≤ 16 (7.79c)
∀m :∑
p∈{geproduceerd op maalstraat}
dagenOp · OSp,m ≤ 16 (7.79d)
Hierbij horen wel enkele kritische opmerkingen. Ten eerste zullen deze beperkingen bijna
altijd voldaan zijn, want bijvoorbeeld op straat 4 en 6 zijn slechts twee producten mogelijk,
dus maximaal 1 omstelling per straat per maand, wat steeds kleiner is dan 16. Met andere
woorden ze beperken bijna niets. Ten tweede betekent nog niet dat door het aantal omstel-
dagen te beperken, deze omsteldagen ook perfect op het juiste moment zullen vallen. Dit
hangt af van de productiehoeveelheden van de producten op een straat. Een productierun
van 20 dagen eindigt misschien net op een vrijdag, wat dus zal leiden tot twee dagen wach-
ten alvorens men aan de omstelling kan beginnen. Bijgevolg zijn er twee dagen verlies. Nog
erger wordt het als de andere straat ook net op die vrijdag stopt met een productierun, dan
zou deze al meer dan een week moeten wachten alvorens de omstelling kan starten. Heel dit
probleem kan opgelost worden door bepaalde ranges voor een productierun vast te leggen
en de bijhorende productiehoeveelheid. Bijvoorbeeld een productierun met een omstelduur
van 2 dagen nadien die start op een vrijdag mag eindigen op elke maandag of dinsdag van
de komende weken. Zodat de omstelling op dinsdag, woensdag of donderdag onmiddellijk
kan afgehandeld worden. Dit vraagt echter zeer veel extra vergelijkingen en gaat dus eigen-
lijk de producties op het eerste niveau helemaal gaan plannen zodat het tweede niveau niet
meer nodig is. Extra vergelijkingen en de bijhorende onvermijdelijke extra variabelen zorgen
ook voor de noodzaak aan meer rekentijd, dus dit valt helemaal buiten de eerste fase. En
we zullen op dit moment vrede moeten nemen met het feit dat er grote problemen kunnen
ontstaan in de tweede fase door deze restricties.
8Fase 2: Scheduling
IN dit hoofdstuk stellen we het wiskundige model op van de tweede fase. Zoals besproken
in hoofdstuk 4 dient deze fase om te kijken of de vooropgestelde schattingen ook mogelijk
zijn in de praktijk. Per maand wordt er getracht om deze geschatte productiehoeveelheden
in te plannen in de beschikbare tijd. In dit hoofdstuk wordt ongeveer dezelfde structuur
gevolgd als in hoofdstuk 7. Het gaat hierbij vooral om te bewijzen dat het mogelijk is om de
vooropgestelde schattingen in te plannen in de maand. De werkelijke planning in de maand
hoeft niet noodzakelijk gelijk te lopen met dit vooropgestelde schedule.
8.1. Inputvariabelen
We overlopen kort de notaties van de waarden van de variabelen die we uit de eerste fase
halen. Deze variabelen zijn vastgelegd voor de tweede fase en worden dus als parameters
behandeld.� m2: de maand waarvoor fase 2 wordt opgelost, de maand waarvoor de schedule wordt
gezocht.� ∆Dm2: Het aantal dagen in de maand m2 die vrij zijn van productie. Indien ∆D > 0,
dan zijn er productiedagen over voor maand m2, die doorgeschoven kunnen worden
naar maand m2 + 1. Indien ∆D < 0, dan zijn er in maand m2 dagen tekort voor
productie en dan zal zoals eerder gezien er een terugkoppeling naar de eerste fase
optreden.
86
HOOFDSTUK 8. FASE 2: SCHEDULING 87
8
� #d2m2: het aantal dagen beschikbaar in maand m2 voor de tweede fase om de ge-
schatte hoeveelheden in te plannen. Dit is met inbegrip van de eventuele extra dagen
∆Dm2−1 die nog vrij waren van productie uit de vorige maand.� schatQp,m2: De schatting voor de productiehoeveelheid van product p in maand m2
bepaald door fase 1.� SPp: Binaire parameter die aanduidt of er in de maand m2 een productierun gestart
wordt van product p. Deze parameter wordt vastgelegd in fase 1.� EPp: Binaire parameter die aanduidt of er in de maand m2 een productierun beeindigd
wordt van product p. Deze parameter wordt vastgelegd in fase 1.� somSPEPs: Binaire parameter die aangeeft of er op straat s een productierun gaande
is op de overgang van maand m2−1 naar maand m2. Deze parameter komt rechtstreeks
voort uit fase 1.� SSs: Binaire parameter die aanduidt of er in de maand m2 een stilstand gestart wordt
op straat s. Deze parameter wordt vastgelegd in fase 1.� ESs: Binaire parameter die aanduidt of er in de maand m2 een stilstand beeindigd
wordt op straat s. Deze parameter wordt vastgelegd in fase 1.� somSSESs: Binaire parameter die aangeeft of er op straat s een stilstand gaande is
op de overgang van maand m2−1 naar maand m2. Deze parameter komt rechtstreeks
voort uit fase 1.� ingSs: Een set van dagen die voor maand m2 alle dagen vastlegt waarop een stilstand
is ingepland door het management op straat s.� initT12p: De initiele voorraad van product p op de eerste dag van de maand m2 in
tanks 1 en 2 bepaald door fase 1.� initT3p: De initiele voorraad van product p op de eerste dag van de maand m2 in
tank 3 bepaald door fase 1.� initT4p: De initiele voorraad van product p op de eerste dag van de maand m2 in
tank 4 bepaald door fase 1.� initTBp: De initiele voorraad van product p op de eerste dag van de maand m2 in
tank B bepaald door fase 1.� initV IBCp: De initiele voorraad van product p op de eerste dag van de maand m2 in
vaten en IBC’s bepaald door fase 1.
HOOFDSTUK 8. FASE 2: SCHEDULING 88
8
� initCBp: De initiele voorraad van product p op de eerste dag van de maand m2 in
containters bepaald door fase 1.
Alle voorgaande parameters die betrekking hebben op m2, maar waarbij in de index niet
naar m2 verwezen wordt, worden bij elke iteratie naar de volgende maand voor fase 2 op de
correcte waarde geınitialiseerd.
We definieren ook nog de volgende verzamelingen van dagen die regelmatig gaan voorkomen
in het volgende hoofdstuk. De eerste dagen zijn die dagen van de voorbije maand, de laatste
dagen zijn die uit de huidige maand m2.� D12 := ∀d ∈ {1, . . . ,#d2m2−1 + #d2m}� D1 := ∀d ∈ {1, . . . ,#d2m2−1}� D2 := ∀d ∈ {#d2m2−1 + 1, . . . ,#d2m}
Door het gebruik van deze verzamelingen kunnen de voorwaarden op een eenvoudigere ma-
nier worden geschreven.
8.2. Beslissingsvariabelen
De belangrijkste beslissingsvariabelen die we gebruiken in fase 1 worden hieronder opgelijst.
We geven eerst nog twee opmerkingen vooraf. We zoeken de geschikte schedule voor maand
m2. Deze geschikte schedule kan alleen bepaald worden als we voor elke dag weten wat er
geproduceerd wordt. Alle variabelen komen daarom in 30-voud voor. Ten tweede wordt
de schedule voor maand m2 in zeer sterke mate beınvloed door de schedule van de maand
ervoor. Het ideale is dan dat we de volledige vorige maand ook ingeven als variabelen. Deze
worden door enkele restricties onmiddellijk vastgelegd op de waarden uit de vorige maand.� MSs: De makespan van straat s die de volledige productie van alle geschatte hoeveel-
heden uit fase 1 omvat.� totMS: De makespan van het volledige chemische proces voor maand m2, deze is
gelijk aan het maximum van MSs van die maand m2.� DPp,d ∈ {0, 1}: duidt aan of er productie is van product p op dag d of niet.� DQp,d ∈ Z+: variabele die de productiehoeveelheid aanduidt van product p op dag d.� Ss,d ∈ {0, 1}: Geeft aan of straat s stilstaat op dag d of niet. Inclusief de afstel- en
opstartdagen.� OMp1,p2,d ∈ {0, 1}: Geeft aan of er een omstel bezig is van product p1 naar product
p2 op dag d.
HOOFDSTUK 8. FASE 2: SCHEDULING 89
8
8.3. Doelfunctie
Het doel van deze fase in verschillende vorige delen al uitgebreid aan bod gekomen. Wis-
kundig vertaalt zich dat door het minimaliseren van de totale makespan. Ik opteer er echter
voor om ook per straat de makespan te minimaliseren aangezien zoals eerder uitgelegd stil-
standen en omstellingen op het einde van de maand nog niet worden ingepland in deze
maand vermits ze afhankelijk zijn van de volgende maand. Deze dagen worden als vrije
dagen ingepland, zodat ze door de volgende maand indien noodzakelijk worden vastgelegd.
Als de makespan van de straten afzonderlijk niet wordt geminimaliseerd, is het mogelijk dat
er helemaal geen vrije dagen worden gepland op het einde van de maand, maar wel ergens
tussenin. Deze dagen kunnen dan onmogelijk dienen voor de volgende maand, waardoor dit
tot problemen kan leiden. Als resultaat krijgen we dan de volgende te minimaliseren functie:
Min : (totMS − #d2m2) · 1000 +∑
s
MSs (8.1)
In doelfunctie 8.1 is s ∈ {s1, s3, s4, s5, s6, sCD1, sM, sA1, sA2}. De factor 1000 bij de
eerste term is ingevoerd, omdat het eerste doel toch nog steeds is om de totale makespan
te minimaliseren ongeacht de makespan van de andere productiestraten. Elke dag dat de
totale productie van die maand langer duurt dan het aantal dagen beschikbaar in die maand
wordt bestraft. Elke dag die over is, wordt beloond, omdat deze dag in een latere maand
kan gebruikt worden om tekorten te compenseren.
8.4. Definitie van de makespan
Om in de doelfunctie de makespan te kunnen gebruiken moet deze op een correcte manier
gedefinieerd worden, vertrekkend van de variabelen die per dag aanduiden wat er gaande is.
Er zijn drie toestanden waarin een straat zich kan bevinden: productie, omstel of stilstand.
Op het einde van de maand voegen we daar een vierde toestand aan toe, namelijk de
ongebruikte vrije dagen. Deze vierde toestand is niet van belang voor de makespan aangezien
een vrije dag een dag is die kan opgevuld worden door producties uit de volgende maand. Op
elke dag is slechts 1 van deze toestanden mogelijk en we voeren daarom voorwaarde 8.2a toe
voor s ∈ {s1, s3, s4, s5, s6, sCD1, sM, sA1, sA2}. Hierin wordt geeist dat op elke dag
en voor elke straat slechts 1 toestand mogelijk is. Een kleine bemerking bij de definitie van
de dagen waarvoor deze vergelijking moet gelden. De notatie die hier gebruikt wordt, gaat
namelijk nog regelmatig terugkomen. Zoals eerder vermeld is D12 die verzameling van dagen
die in de vorige maand en de huidige maand voorkomen. Bijvoorbeeld de maand mei telt
31 dagen en de maand juni 30, dan zijn de indices als volgt verdeeld voor d: 1 tot en met 31
zijn de dagen van mei, 32 tot en met 61 zijn de dagen voor juni en daarbij voegen we nog 10
extra dagen, 62 tot en met 71. De dagen van mei zijn reeds volledig ingepland, de dagen van
juni proberen we nu in te plannen, maar het kan zijn dat de productieschattingen te groot
HOOFDSTUK 8. FASE 2: SCHEDULING 90
8
zijn en dat er dagen tekort zijn. Vandaar de tien extra dagen om eventuele overschattingen
op te vangen. Indien deze dagen niet noodzakelijk zijn, dan zijn gewoon alle variabelen nul
en kunnen ze eenvoudig genegeerd worden.
∀s,∀d ∈ D12 ∪ 10 :∑
p∈{geproduceerd op s}
DPp,d +∑
(p1,p2)∈{omstellingen op s}
OMp1,p2,d + Ss,d ≤ 1 (8.2a)
Aangezien het niet de bedoeling is dat midden in een maand een dag helemaal niet toege-
wezen wordt aan een bepaalde toestand, zorgt voorwaarde 8.2b ervoor dat alle producties,
stilstanden en omstellingen aaneengesloten voorkomen. Indien op een bepaalde dag er geen
toewijzing van de straat aan een toestand voorkomt, dan kan er onmogelijk op de volgende
dagen wel een toewijzing voorkomen. We eisen dus dat alle onbepaalde dagen op het einde
van de maand vallen en dat de straat voordien steeds in een bepaalde toestand is.
∀s,∀d ∈ D2 ∪ 9 :∑
p∈{geproduceerd op s}
DPp,d +∑
(p1,p2)∈{omstellingen op s}
OMp1,p2,d + Ss,d
≥∑
p∈{geproduceerd op s}
DPp,d+1 +∑
(p1,p2)∈{omstellingen op s}
OMp1,p2,d+1 + Ss,d+1
(8.2b)
We bemerken bij voorwaarde 8.2b dat het aantal dagen beperkt is tot enkel de tweede
maand (dagen 32-71 zoals in het voorbeeld aangehaald), aangezien bij de vorige maand op
het einde vrije dagen kunnen voorkomen op een straat en de ongelijkheid dan niet geldt.
Voor de overgang van de vorige maand naar de huidige maand voegen we daarom voorwaarde
8.2c toe (voor dag 31 uit het voorbeeld). initV rijs,d ∈ {0, 1} is een parameter die gelijk is
aan 0 indien dag d uit de vorige maand toegewezen is aan een stilstand, omstel of productie
en 1 indien deze dag nog vrij beschikbaar is.
∀s, d = #d2m2−1 :∑
p∈{geproduceerd op s}
DPp,d +∑
(p1,p2)∈{omstellingen op s}
OMp1,p2,d + Ss,d + initV rijs,d
≥∑
p∈{geproduceerd op s}
DPp,d+1 +∑
(p1,p2)∈{omstellingen op s}
OMp1,p2,d+1 + Ss,d+1
(8.2c)
In de wetenschap dat op elke dag slechts 1 toestand kan voorkomen en dat deze toestanden
aaneensluitend voorkomen, kan de makespan zeer eenvoudig bepaald worden met voorwaarde
8.2d.
HOOFDSTUK 8. FASE 2: SCHEDULING 91
8
∀s : MSs =∑
d∈{D2∪10}
(∑
p∈{geproduceerd op s}
DPp,d +∑
(p1,p2)∈{omstellingen op s}
OMp1,p2,d + Ss,d)(8.2d)
De totale makespan is per definitie groter dan de makespan voor elke straat afzonderlijk.
We schrijven voorwaarde 8.2e.
∀s : totMS ≥ MSs (8.2e)
8.5. Voldoen aan schattingen uit fase 1
Uiteraard is het de bedoeling dat de geproduceerde hoeveelheden uit fase 2 voldoen aan
de schattingen die gemaakt zijn in fase 1. Het aantal dagen dat er toegewezen wordt aan
een bepaald product p moet dus groter zijn dan het aantal dagen dat er noodzakelijk is
om de geschatte productiehoeveelheid van p te produceren. Indien het verband tussen DP
en DQ wordt gedefinieerd, kan bovenstaande voorwaarde eenvoudig worden uitgedrukt in
voorwaarde 8.3b. Indien een dag d toegewezen is aan een product p ofte DPp,d = 1, dan kan
de productiehoeveelheid op die dag DQp,d varieren tussen 0 en de maximale dagcapaciteit.
We maken hierbij de bemerking dat volgens restrictie 49 alle productiestraten op vollast
moeten lopen. De eis zou bijgevolg nog strikter moeten geformuleerd worden: als DPp,d = 1
dan moet DQp,d gelijk zijn aan de dagcapaciteit. Aangezien het ook mogelijk is dat een
straat een dag moet wachten alvorens zijn omstelling begint, is deze eis niet altijd geldig,
want op deze dag is de straat toegewezen aan het product, maar er wordt niet geproduceerd.
Bijgevolg gebruiken we toch de vereenvoudigde voorwaarde. Indien DPp,d = 0, dan moet
DQp,d = 0. Dit wordt vertaald in voorwaarde 8.3a.
∀p,∀d ∈ {D2 ∪ 10} : DQp,d ≤ DPp,d · dagcapp (8.3a)
∀p :∑
d∈{D2∪10}
DQp,d ≥ schatQp,m2 (8.3b)
In theorie moet er een gelijkheidsteken staan in voorwaarde 8.3b, omdat overproductie
zeker niet de bedoeling is. Voor de eenvoud van het programma mag daar zonder verlies
van algemeenheid een ongelijkheid van gemaakt worden. Te veel productie wordt toch
niet bevorderd omdat dan de makespan ook zal vergroten, wat tegengegaan wordt door de
doelfunctie.
Voor de B-productie geldt vergelijking 8.3a niet, maar is er wel een andere eis voor de pro-
ductiehoeveelheid volgens restrictie (17) B is een nevenproduct uit de A1-productie en kan
HOOFDSTUK 8. FASE 2: SCHEDULING 92
8
dus enkel geproduceerd worden als de A1-productie loopt. De B-productie ’voor verkoop’ is
minimaal 3.5% en maximaal 7.0% van het A1-productievolume (deze grenzen moeten als va-
riabele kunnen ingegeven worden). Dit wordt onmiddelijk vertaald in volgende voorwaarden
8.3c en 8.3d.
∀d ∈ {D2 ∪ 10} : DQB,d ≥ 0.035 · DQA1,d (8.3c)
∀d ∈ {D2 ∪ 10} : DQB,d ≤ 0.07 · DQA1,d (8.3d)
8.6. Flowvoorwaarden
Per dag moet ook de flow tussen de producten onderling gewaarborgd blijven of tussen de
opsplitsingen van de producten zoals uiteengezet in paragraaf 7.2. We beginnen met de flow
tussen de producten onderling.
8.6.1. Flow A1
Er is geen tussenopslag mogelijk van A1, wat betekent dat de productie van A1 op een dag
gelijk moet zijn aan het verbruikte A1 op diezelfde dag. Simpel uitgedrukt naar analogie met
voorwaarde 7.9a uit fase 1 krijgen we voorwaarde 8.4. We herhalen dat het set PA1 bestaat
uit al die producten die rechtstreeks uit A1 vervaardigd kunnen worden, A2 uitgezonderd.
Ook hier weer de opmerking dat in theorie het gelijkheidsteken moet gelden, maar zonder
verlies van algemeenheid kunnen we dit vervangen door de ongelijkheid. Het doel van deze
fase is om aan te tonen dat de geschatte productie ook werkelijk mogelijk is om in te plannen
in deze maand. Meer produceren op dezelfde tijd is geen probleem, in de praktijk zal er echter
geen meerproductie voorkomen. We verkiezen de ongelijkheid omdat deze wiskundig gezien
minder strikt is dan de gelijkheid en omdat er dan sneller een oplossing wordt gevonden. Te
veel meerproductie zorgt toch voor een langere makespan wat we zeker niet wensen.
∀d ∈ {D2 ∪ 10} : DQA1,d ≥ verbruikA2,A1 · DQA2,d +∑
p∈PA1
verbruikp,A1 · DQp,d (8.4)
HOOFDSTUK 8. FASE 2: SCHEDULING 93
8
8.6.2. Flow A2
Volledig naar analogie met voorwaarden 7.4 en 7.5 uit fase 1 worden hier de voorwaarden
8.5 opgesteld voor de in- en uitgaande flow van A2 op 1 dag.
∀d ∈ {D2 ∪ 10} : DQA2,d + QV T12A2,d−1 + QV T3A2,d−1 + QV V IBCA2,d−1 ≥∑
p∈PA2
(verbruikp,A2 · DQp,d) +∑
p∈PA1vA2
(verbruikp,A2 · DQp,d)
+ QV T12A2,d + QV T3A2,d + QV V IBCA2,d + DV raagA2,d (8.5a)
We zien hier enkele nieuwe variabelen opduiken. QV T12p,d , QV T3p,d en QV V IBCp,d
geven logischerwijze de voorraad van het product p op het einde van dag d in desbetreffende
opslagplaats. DV raagA2,d geeft de vraag per dag van A2 weer. De verdeling van deze
vraag over de maand is niet geweten, enkel de totale vraag op het einde van de maand. We
laten het model volledig vrij om te bepalen wanneer hij aan de vraag voldoet, zolang op
het einde van de maand de volledige vraag voor die maand voldaan is, zoals geschreven in
voorwaarde 8.5b. Uiteraard moeten bij deze vraag de tekorten in rekening gebracht worden,
een betere uitleg zou zijn dat de totale vraag op het einde van de maand gelijk moet zijn
aan de geschatte vraag uit fase 1 waarin wel tekorten zijn opgenomen. schatTA2,m geeft de
schatting weer van de tekorten voor de vraag naar A2 uit fase 1 voor maand m.
∑
d∈{D2∪10}
DV raagA2,d ≥ vraagA2,m − schatTA2,m2 + schatTA2,m2−1 (8.5b)
De opsplitsing per tank:
∀d ∈ {D2 ∪ 10} : DQA2T12,d + QV T12A2,d−1 + QV V IBCA2,d−1 ≥∑
p∈PA2T12
(verbruikp,A2 · DQp,d) +∑
p∈PA1vA2T12
(verbruikp,A2 · DQp,d)+
QV T12A2,d + QV V IBCA2,d + DV raagA2,d (8.5c)
∀d ∈ {D2 ∪ 10} : DQA2T3,d + QV T3A2,d−1 ≥∑
p∈PA2T3
(verbruikp,A2 · DQp,d) +∑
p∈PA1vA2T3
(verbruikp,A2 · DQp,d) + QV T3A2,d (8.5d)
Ter herhaling: PA1vA2T3 is het set van producten die normaal rechtstreeks uit A1 worden
geproduceerd, maar nu via A2 en via tank 3.
∀d ∈ {D2 ∪ 10} : DQA2T12,d + DQA2T3,d = DQA2,d (8.5e)
Voorwaarde 8.5e zorgt voor de correcte opsplitsing van de A2-productie over de tanken 1, 2
en 3.
HOOFDSTUK 8. FASE 2: SCHEDULING 94
8
8.6.3. Flow tank 3 en 4
In navolging van vergelijkingen 8.5c en 8.5d kunnen identieke flowvergelijkingen opgesteld
worden voor de andere producten opgeslagen in tank 3 (vgl. 8.6a) of tank 4 (8.6b). Hierin
is QV T4p,d ∈ R+ de hoeveelheid van product p opgeslagen in tank 4 op het einde van dag
d.
∀d ∈ {D2 ∪ 10}, p ∈ {C, D1} :
DQp,d + QV T3p,d−1 = QV T3p,d +∑
p2∈{geproduceerduitp}
verbruikp2,p · DQp2,d(8.6a)
∀d ∈ {D2 ∪ 10} :
DQD2,d + QV T4D2,d−1 = QV T4D2,d + verbruikK,D2 · DQK,d
(8.6b)
8.6.4. Flow tussen rechtstreekse producten
Als voorbeeld nemen we de maalstraat: indien FC geproduceerd wordt op de maalstraat,
moet ook F geproduceerd worden op straat 1. Deze eis geldt voor alle producten opgesomd
in tabel 8.1.
Tabel 8.1.: Relaties tussen rechtstreekse producten. vb: productie van FC vereist productie van F
Product (p1) Voorganger (p2) Product (p1) Voorganger (p2)
FC → F B → A1
GC → G A1 → B
LC → L A2 → A1
Fv1 → A1 Fv2 → 1-A1
G1v1 → A1 G1v2 → 1-A1
G3v1 → A1 G3v2 → 1-A1
H1v1 → A1 H1v2 → 1-A1
H2v1 → A1 H2v2 → 1-A1
H3v1 → A1 H3v2 → 1-A1
Lv1 → A1 Lv2 → 1-A1
M4v1 → A1 M4v2 → 1-A1
Voorwaarde 8.7 legt dit verband vast in een wiskundige vorm.
∀(p1, p2) ∈ tabel 8.1,∀d ∈ {D2 ∪ 10} : DPp1,d ≤ DPp2,d (8.7)
Aangezien er een 1 op 1 relatie is tussen A1 en B zijn beide verbanden vervat in voorgaande
vergelijking. Voor de producten die via 2 gemaakt worden, leggen we het verband vast
HOOFDSTUK 8. FASE 2: SCHEDULING 95
8
waarbij productie via A2 enkel mogelijk is indien tank A1 stilstaat. In het rechterlid van
voorwaarde 8.7 schrijven we dan 1 − DPp2,d.
8.6.5. Flow tussen deelproducten
Net zoals in paragraaf 7.2 uiteengezet, moet ook in fase 2 gezorgd worden dat de coherentie
tussen de verschillende delen van een product behouden blijft. Enerzijds hebben we produc-
ten die elkaar gaan uitsluiten, een voorbeeld hiervan is dat productie van F via A1 nooit
kan samenvallen met productie van F via A2. Indien 1 van de twee producties 1 is, dan
moet ook F gelijk zijn aan 1, indien ze beide nul zijn, dan is ook F gelijk aan 0. Deze relatie
wordt uitgedrukt in voorwaarde 8.8. Waarin p gelijk is aan F, p1 gelijk aan Fv1 en p2 gelijk
aan Fv2 uit het gegeven voorbeeld. Naast de opsplitsing tussen productie via A1 en A2
geldt deze relatie ook voor opsplitsing tussen productie over T12 en T3. Op een dag kan er
bijvoorbeeld geen productie zijn van N via T3 en via T12.
∀(p1, p2, p) ∈ exclusieve producten,∀d ∈ {D2 ∪ 10} : DPp1,d + DPp2,d = DPp,d (8.8)
Daarnaast hebben we ook producten die opgesplitst worden, maar waarbij geen exclusiviteit
in de productie vereist is. Een productie van G kan gelijkertijd gebeuren op straat 1 en op
straat 3. Hier geldt de voorgaande voorwaarde niet, maar kan eenzelfde voorwaarde gebruikt
worden als 8.7.
Niet alleen voor de binaire variabelen moeten we zorgen voor een correcte opsplitsing, ook
bij de gehele variabelen is er nood aan enkele voorwaarden. Indien 1 product p opgesplitst
wordt in twee p1 en p2 voegen we voorwaarde 8.9 toe.
∀(p1, p2, p) ∈ {opgesplitste producten},∀d ∈ {D2 ∪ 10} : DQp1,d + DQp2,d = DQp,d (8.9)
8.7. Voorraden
8.7.1. Minimum voorraden
Het is niet van belang om de restricties voor de minimum voorwaarden op het niveau van
een dag op te stellen. De productiehoeveelheden voor deze maand zijn reeds vastgelegd
door fase 1 en de minimumvoorraad op het einde van de maand is daarom gewaarborgd.
Willen we bovendien per dag de evolutie van de voorraad gaan uitzetten, dan hebben we
ook de distributie van de vraag doorheen de maand nodig, welke niet gegeven is. Fysisch
gezien zal er zich geen probleem vormen indien de voorraad op een bepaalde dag onder
het minimumniveau zakt, er wordt sowieso op een latere dag meer geproduceerd zodat
op het einde van de maand het minimumlevel opnieuw bereikt wordt. Dit geldt zowel
HOOFDSTUK 8. FASE 2: SCHEDULING 96
8
voor de voorraden van de eindproducten als voor de voorraden in de tanken. De analoge
uitleg geldt ook voor de maximumvoorraad van de eindproducten. In het geval van de
maximumvoorraad in de tanken is de capaciteit wel beperkt en is het noodzakelijk om per
dag wel een voorwaarde op te leggen zodat alles opgeslagen kan worden.
8.7.2. Maximum voorraden tanken
De restricties in verband met de voorraden gelden ook hier. Op elke dag mag de maximale
voorraad van een product nooit de maximaal toegelaten waarde overschrijden. We schrijven
hiervoor de voorwaarden 8.10.
∀d ∈ {D2 ∪ 10} : QV T12A2,d ≤ maxTank12A2 (8.10a)
Voorwaarde 8.10a beperkt de voorraad in tanks 1 en 2 op het einde van elke dag d voor
product p. Eenzelfde voorwaarde kan geschreven worden voor tank 3, maar we komen hier
uitgebreider op terug in paragraaf 8.8 die alle voorwaarden van tank 3 bekijkt.
Voor de voorraden van B zijn er ook enkele eisen die worden gemodelleerd zoals in de
vergelijkingen 8.10b, 8.10c en 8.10d.
∀d ∈ {D2 ∪ 10} : QV V IBCB,d ≤ maxV atenEnIBCB (8.10b)
∀d ∈ {D2 ∪ 10} : QV TBB,d ≤ maxTankB (8.10c)
∀d ∈ {D2 ∪ 10} : QV CBB,d ≤ maxContB (8.10d)
Hierin zijn QV TBB,d ∈ R+ en QV CBB,d ∈ R
+ de voorraden van product B op het einde
van dag d respectievelijk in tank B en de tankcontainers voor B.
Voor de voorraad in vaten en IBC’s van product A2 wordt vergelijking 8.10e opgesteld in een
iets andere vorm dan voorgaande voorwaarden aangezien de maximumvoorraad nu wordt
uitgedrukt in voorraaddagen in plaats van rechtstreeks in ton. totV raagp geeft de totale
voorspelde vraag van het product p voor het komende jaar.
∀d ∈ {D2 ∪ 10} : QV V IBCA2,d ≤ maxV atenEnIBCA2 ·totV raagA2
365(8.10e)
8.8. Voorwaarden in verband met Tank 3 en tank 4
8.8.1. Tank 3
Toewijzing We starten eerst met de definitie van enkele beslissingsvariabelen. QV T3p,d is
reeds gedefinieerd en gaf de voorraad weer van product p op het einde van dag d in tank 3.
HOOFDSTUK 8. FASE 2: SCHEDULING 97
8
Een product dat opgeslagen wordt in een tank, kan enkel gebeuren als deze tank toegewezen
is aan dit product. Daarom voegen we de binaire variabele PV T3p,d ∈ {0, 1} in. Deze
variabele bepaalt voor elke dag d of tank 3 al dan niet toegewezen is aan product p. Dit is
niet de binaire variant van QV T3p,d, want de ene geldt voor het einde van de dag, de andere
voor een hele dag.
Indien tank 3 overgaat van het ene product op het andere is er nood aan een omstelling.
Om deze toestand te karakteriseren, gebruiken we de binaire variabele OMT3d. Deze is 1
indien er een omstelling in tank 3 plaatsvindt op dag d, anders is hij 0.
Op elke dag kan tank 3 zich slechts in 1 toestand bevinden. Ofwel is de tank toegewezen
aan een product ofwel bevindt de tank zich in een omstelling. Dit wordt uitgedrukt in
voorwaarde 8.11a.
∀d ∈ {D2 ∪ 10} :∑
p∈{opslag in tank 3}
PV T3p,d + OMT3d ≤ 1 (8.11a)
Voorraad Door gebruik te maken van deze variabelen kunnen de voorwaarden in verband
met de voorraden en de capaciteit van tank 3 eenvoudig worden uitgedrukt. Er mag zich
voorraad van een product p op het einde van dag d in tank 3 bevinden indien de tank op dag
d toegewezen is aan dit product en indien de tank op dag d + 1 ook nog steeds toegewezen
is aan het product. Bovendien is de maximale voorraad in de tank ook beperkt. Dit wordt
wiskundig vertaald in vergelijkingen 8.11b en 8.11c.
∀p ∈ {opslag in tank 3},∀d ∈ {D2 ∪ 10} : QV T3p,d ≤ maxTank3p · PV T3p,d (8.11b)
∀p ∈ {opslag in tank 3},∀d ∈ {D2 ∪ 10} : QV T3p,d ≤ maxTank3p · PV T3p,d+1 (8.11c)
Flow Ook in verband met de flow kunnen we hier enkele voorwaarden toevoegen. Indien er
bijvoorbeeld productie is van C op dag d, dan moet tank 3 toegewezen zijn aan het product
C op dag d: DPC,d = 1 ⇒ PV T3C,d = 1. Indien er productie is van I op dag d, dan moet
tank 3 toegewezen zijn aan het product C op dag d: DPI,d = 1 ⇒ PV T3C,d = 1. Hetzelfde
geldt voor volgende combinaties:
flowTank := {(C,C), (I, C), (D1,D1), (J,D1), (D2,D1), (A2T 3, A2), (Fv2T3, A2), . . .}. De-
ze relaties worden verkregen door voorwaarde 8.11d.
∀(p, pTank) ∈ flowTank,∀d ∈ {D2 ∪ 10} : DPp,d ≤ PV T3pTank,d (8.11d)
HOOFDSTUK 8. FASE 2: SCHEDULING 98
8
Omstelling Een omstelling van 2 dagen vindt plaats indien er wordt overgegaan van A2
naar CD1 of omgekeerd. Indien de toewijzing van tank 3 voor het product A2 wisselt van
0 naar 1 of van 1 naar 0, weten we dus dat er een ander product wordt opgeslagen. Op
dat moment kunnen we de variabele OM verplichten om 1 te zijn. We onderscheiden twee
situaties. In de eerste situatie 8.12a is op dag d de tank nog toegewezen aan A2, maar op
dag d + 1 niet meer. Bijgevolg moet er dan een omstel plaatsvinden op dag d + 1 en dag
d + 2. De tweede situatie 8.12b leert ons dat de tank op dag d niet toegewezen is aan A2,
maar op dag d + 1 wel. Er moet hiervoor dus een omstelling hebben plaatsgevonden. Beide
situaties kunnen eenvoudig uitgedrukt worden in vier voorwaarden van de vorm 8.12c zoals
hier uitgeschreven voor het eerste deel van de eerste situatie.
PV T3A2,d = 1 ∧ PV T3A2,d+1 = 0
⇒ OMT3d+1 = 1, OMT3d+2 = 1(8.12a)
PV T3A2,d = 0 ∧ PV T3A2,d+1 = 1
⇒ OMT3d = 1, OMT3d−1 = 1(8.12b)
∀d ∈ {D2 ∪ 9} : OMT3d+1 ≥ PV T3A2,d − PV T3A2,d+1 (8.12c)
Bij het uitschrijven van de verzamelingen waarvoor d geldt, moet opgelet worden dat er
geen indices voorkomen uit de vorige maand D1. Dit omdat we ervoor gekozen hebben om
op het einde van de vorige maand nog geen omstel vast te leggen indien we niet weten wat
erna komt. In plaats daarvan werden er vrije dagen ingevoerd die beschikbaar zijn voor een
stilstand of voor een omstel. Afhankelijk van hoe de vorige maand eindigt met tank 3, moet
er in het begin van deze maand een omstelling starten of afgewerkt worden. We voegen
daarom een parameter vrijT3p,d in, die de toestand van de laatste twee dagen uit de vorige
maand van tank 3 vastlegt ∀p ∈ {A2, CD1}. Op elke dag d is maximaal een parameter
gelijk aan 1.
vrijT3p,d :=
1, als tank 3 geen product p bevat op dag d
0, als tank 3 wel product p bevat op dag d(8.13)
Indien voor een bepaalde p de parameter vrijT3 = 1 voor de laatste twee dagen van de vorige
maand, dan kan op de eerste dag van de huidige maand zich elk product in de tank bevinden.
De laatste twee dagen van de vorige maand kunnen dan voor een omstel dienen. Indien voor
de voorlaatste dag vrijT3p,vl = 0 en voor de laatste dag vrijT3p,l = 1, dan is afhankelijk
van het product dat zich in de tank bevindt op de voorlaatste dag een omstel vereist op
de laatste dag van de vorige maand en op de eerste dag van de huidige maand indien men
overgaat naar opslag van een ander product ofwel kan hetzelfde product op de eerste dag
HOOFDSTUK 8. FASE 2: SCHEDULING 99
8
opnieuw opgeslagen worden en staat de tank gewoon 1 dag leeg. Een analoge redenering als
de tank de laatste 2 dagen van de maand bezet is. Afhankelijk van het product is er een
omstel noodzakelijk de eerste twee dagen of kan hetzelfde product opgeslagen worden. Dit
vertaalt zich in onderstaande voorwaarden 8.14, waarbij een vereiste omstel hetzelfde is als
geen productie mogelijk.
∀p ∈ {C, D1} : DQp,eerste dag ≤ vrijT3A2,vl (8.14a)
Indien op de voorlaatste dag van de vorige maand de tank toegewezen is aan A2, dan kan
er op de eerste dag van de huidige maand nooit productie zijn van C of D1 omdat tank 3
nog niet vrij is.
∀p ∈ {C, D1} : DQp,tweede dag ≤ vrijT3A2,l (8.14b)
Zelfde verhaal indien ook op de laatste dag van de vorige maand de tank toegewezen is aan
A2, dan kan er op de tweede dag van de huidige maand onmogelijk productie zijn van C of
D1.
Indien in 8.14 C, D1 omgewisseld wordt met A2, krijgen we de vergelijkingen waarbij er
beperkingen worden opgelegd voor de productie van A2 op de eerste twee dagen van de
maand.
8.8.2. Tank 4
De voorwaarden in verband met de maximale voorraad en flow zoals opgesteld voor tank 3,
gelden ook voor tank 4 mits het invoeren van volgende beslissingsvariabelen: QV T4p,d ∈ R+
geeft de voorraad weer van product p op het einde van dag d in tank 4. PV T4p,d ∈ {0, 1}
bepaalt voor elke dag d of tank 4 al dan niet toegewezen is aan product p. De voorwaarden
8.11b en 8.11d worden herschreven naar 8.15a en 8.15b.
∀d ∈ {D2 ∪ 10} : QV T4D2,d ≤ maxTank4D2 · PV T4D2,d (8.15a)
∀(p, pTank) ∈ {(D2,D2), (K,D2)},∀d ∈ {D2 ∪ 10} : DPp,d ≤ PV T4pTank,d (8.15b)
8.9. Productierun
Algemeen
De eis dat een productierun minimaal een aantal dagen moet lopen, is vrij eenvoudig uit te
drukken in deze fase. We weten uit fase 1 welke producties er eindigen in deze maand en welke
er ook starten. Indien een productierun eindigt (EPp = 1), wat zich in deze fase vertaalt
HOOFDSTUK 8. FASE 2: SCHEDULING 100
8
in volgende sequentie: DPp,d = 1, DPp,d+1 = 0, dan moet voor d1 ∈ {d − MLp + 1, . . . , d}
ook DPp,d1 = 1 gelden, met MLp de minimale lengte van de productierun. Indien deze
productierun echter gespreid is over de vorige maand en de huidige maand, dan is het
mogelijk dat er zich in deze verzameling enkele vrije dagen bevinden, omdat de makespan
op die straat kleiner is dan de totale makespan van de vorige maand. In dat geval is
DPp,vrije dag = 0. We lossen dit op door deze vrije dagen ook mee te nemen in deze sequentie
en krijgen voorwaarde 8.16a.
∀p ∈ {vereist minimale lengte run}, s de straat van p ,∀d ∈ {D2 ∪ 9} :
d∑
t=d−MLp+1
DPp,t +
#d2m−1∑
t=d−MLp+1
initV rijs,t ≥ MLp · (EPp + DPp,d − DPp,d+1 − 1)(8.16a)
Naast deze algemene vergelijking voer ik ook nog een verplichting in, in verband met de
eerste dag van de maand. Indien we weten dat een productie aan de gang is, dus als de
productie eindigt EPp = 1, maar niet begint SPp = 0 in de maand, dan verplichten we de
eerste dag van de maand om dat product te produceren. Het is namelijk niet de bedoeling om
de productiecampagnes te spreiden doorheen de maand. Deze verplichting wordt vastgelegd
in voorwaarde 8.16b.
∀p : DPp,eerste dag ≥ EPp − SPp (8.16b)
Wanneer een productie niet beeindigd wordt in de huidige maand, maar pas in de volgende
maand, moet deze productie op het einde van de makespan liggen, zodat er geen opsplitsing
kan optreden in de productiecampagne. We verplichten dat door te eisen dat alle variabelen
uit de makespan gelijk worden aan 0 indien de sequentie DPp,d = 1, DPp,d+1 = 0 optreedt
in combinatie met EPp = 0. Dit wordt geschreven zoals in vergelijking 8.16c.
∀s,∀p ∈ {geproduceerd op s},∀d ∈ {D2 ∪ 9} :∑
p1∈{geproduceerd op s}
DPp1,d+1 +∑
(p1,p2)∈{omstellingen op s}
OMp1,p2,d+1 + Ss,d+1
≤ 1 − DPp,d + DPp,d+1 + EPp
(8.16c)
O-productie
Bij de O-productie ligt het net iets anders. Hiervoor is geen EP of SP beschikbaar. Bo-
vendien is het mogelijk dat een O-productiecampagne stopt in het begin van de maand en
opnieuw start op het einde van de maand. Wat we wel weten is dat indien een productierun
van O stopt, dat er dan een stiltand op straat 5 wordt gestart. We stellen voorwaarde 8.17a
HOOFDSTUK 8. FASE 2: SCHEDULING 101
8
op, waarbij er weer rekening wordt gehouden met eventuele vrije dagen in de vorige maand.
∀d ∈ {D2 − 1 ∪ 9} :
d∑
t=d−MLO+1
DPO,t +
#d2m−1∑
t=d−MLO+1
initV rijs5,t
≥ MLO · (SSs5 + DPO,d − DPO,d+1 − 1)
(8.17a)
Hierin is de verzameling D2 − 1 gelijk aan alle dagen van de maand m2, uitgebreid met de
laatste dag van de vorige maand. Indien er dus een stilstand start, wat gelijk is aan het einde
van een productierun, dan eist de voorwaarde dat er minimaal MLO opeenvolgende dagen
toegewezen zijn aan de productie voor O. We hebben ook nog nood aan een beginvoorwaarde
8.17b in het geval de stilstand zou starten op de eerste dag van de maand en indien er in de
vorige maand vrije dagen zouden zijn, want in dat geval zijn DPO,d en DPO,d+1 gelijk aan
0, maar moet toch de minimum lengte gewaarborgd worden.
d = #d2m−1 :
d∑
t=d−MLO+1
DPO,t +
#d2m−1∑
t=d−MLO+1
initV rijs5,t
≥ MLO · (SSs5 + initV rijs5,d − somSSESs5 − DPO,d+1 − 1)
(8.17b)
De somSSES komt hierbij kijken omdat deze vergelijking enkel mag gelden indien er geen
stilstand bezig is. Op dat moment kan initV rij namelijk ook 1 worden, wat leidt tot een
tegenstrijdigheid: het eisen van een minimale productieduur, terwijl er een stilstand aan het
lopen is.
8.10. Stilstanden
8.10.1. Ingeplande stilstanden door het management
In de preprocessing stap maken we voor elke maand en voor elke straat een set aan van
dagen waarop een stilstand moet voorkomen ingSs. Door gebruik te maken van deze sets
kan heel gemakkelijk per straat de ingeplande stilstand worden meegegeven met voorwaarde
8.18.
∀s,∀d ∈ ingSs : Ss,d = 1 (8.18)
8.10.2. Stilstanden ingevoerd door het model
Deze stilstanden kunnen op eenzelfde manier behandeld worden als een productierun. De
vereiste hierbij is dat indien er een stilstand wordt ingevoerd dat deze stilstand minimaal
een aantal dagen duurt. We verkrijgen voorwaarden 8.19 naar analogie met 8.16a.
HOOFDSTUK 8. FASE 2: SCHEDULING 102
8
∀s ∈ {s5, sA1},∀d ∈ {D2 − 1 ∪ 9} :
d∑
t=d−MLSs+1
Ss,t +
#d2m2−1∑
t=d−MLSs+1
initV rijs,t ≥ MLSs · (ESs + Ss,d − Ss,d+1 − 1)(8.19a)
Voorwaarde 8.19a voor de specifieke minimale duur van een stilstand opgelegd door de
restricties. Voorwaarde 8.19b omdat een stilstand langer moet zijn dan de afstel en de
opstart samen van een productiestraat.
∀s,∀d ∈ {D2 − 1 ∪ 9} :
d∑
t=d−(afstels+opstarts)+1
Ss,t +
#d2m2−1∑
t=d−(afstels+opstarts)+1
initV rijs,t
≥ (afstels + opstarts) · (ESs + Ss,d − Ss,d+1 − 1)
(8.19b)
Voor de molen moet er net zoals in de eerste fase een uitbreiding worden gemaakt op
voorwaarde 8.19b aangezien de afstel- en opstarttijd kleiner zijn dan de omstelduur. We
schrijven vergelijking 8.19c.
∀d ∈ {D2 − 1 ∪ 9} :
d∑
t=d−verwDagenOsM+1
SsM,t +
#d2m2−1∑
t=d−verDagenOsM +1
initV rijsM,t
≥ verwDagenOsM · (ESsM + SsM,d − SsM,d+1 − 1)
(8.19c)
We voegen nog een beginvoorwaarde toe (8.19d) voor de laatste dag van de vorige maand,
aangezien het mogelijk is dat een stilstand wordt afgesloten tussen twee maanden in en dat
ESs bij de volgende maand wordt geplaatst. Indien er dus een stilstand lopende is van de
vorige maand naar de huidige maand somSSESs = 1 verplichten we de laatste stilstanddag
van de vorige maand tot 1 in plaats van gebruik te maken van de vrije dagen uit die maand.
Hierdoor zijn alle voorgaande vergelijkingen van 8.19 geldig voor de gegeven dagen.
∀s : Ss,#d2m−1≥ somSSESs (8.19d)
En als laatste voegen we ook nog een vergelijking (8.19e) toe die niet strikt noodzakelijk is,
maar die wel zorgt voor meer intelligentie. Het is namelijk niet noodzakelijk om stilstanden
toe te wijzen in een maand indien er helemaal geen stilstand gepland is. Er is nooit een
stilstand gepland in een straat indien de drie termen uit het rechterlid gelijk zijn aan 0.
∀s,∀d ∈ {D2 ∪ 10} : Ss,d ≤ SSs + ESs + somSSESs (8.19e)
HOOFDSTUK 8. FASE 2: SCHEDULING 103
8
8.11. Omstellingen
Voor de omstellingen gaan we te werk in een soort van stappenplan. We definieren eerst de
werkelijke omstelduur tussen twee producten als volgt: ODp1,p2 ∈ Z+, een parameter die
voor de omstel van p1 naar p2 weergeeft hoeveel dagen deze omstel duurt. Vervolgens stellen
we een eerste vergelijking op die eist dat als er een productie stopt, deze wordt opgevolgd
door een omstel indien er geen stilstand is gepland (Ss,d = 0) op die dag en indien het
product niet stopt omwille van het einde van de maand, maar enkel omwille van het einde
van de productie (EPp = 1). Welke omstel er wordt getriggerd, is hier nog niet van belang
en we schrijven voorwaarde 8.20a. Hierin is omstelDuo dat set van duo’s producten p1 en
p2 waartussen een omstel kan plaatsvinden. We zien dat indien aan de voorwaarden van
het rechterlid voldaan is, er de volgende dag d + 1 een eerste dag van de omstelling wordt
verplicht.
∀s ∈ {straten met omstel},∀p ∈ {geproduceerd op s}, d ∈ {D2 ∪ 9} :∑
(p,p2)∈omstelDuo
OMp,p2,d+1 ≥ DPp,d − DPp,d+1 − Ss,d+1 + EPp − 1 (8.20a)
Een tweede stap legt de omstelduur vast voor de gekozen omstelling. Voorwaarde 8.20b eist
dat indien er een omstel start op dag d + 1 dat deze omstel ook vastgelegd wordt voor een
minimum aantal dagen die daarop volgen.
∀(p1, p2) ∈ omstelDuo, d ∈ {D2 ∪ 7} :
d+ODp1,p2∑
t=d+1
OMp1,p2,t ≥ ODp1,p2 · (OMp1,p2,d+1 − OMp1,p2,d)(8.20b)
Ten derde verplichten we om na de omstelling dat product te produceren dat past bij de
gekozen omstelling horende bij de twee vergelijkingen hierboven. Je zou ook omgekeerd
kunnen zeggen dat de eerste twee vergelijkingen die omstelling gaan kiezen die passen bij
de te produceren producten op de straat. Wiskundig gezien ziet dat eruit als in 8.20c
waarbij het rechterlid 0 wordt indien er een omstel tussen p1 en p2 eindigt en zo dus alle
producten verschillend van p2 verhindert om te produceren op die dag op die straat. In het
set omstelDuo kan p1 nooit gelijk zijn aan p2 omdat er uiteraard geen omstel voorkomt
tussen dezelfde producten.
∀(p1, p2) ∈ omstelDuo,∀(p, p2) ∈ omstelDuo,∀d ∈ {D2 − 1 ∪ 9} :
DPp,d+1 ≤ 1 − OMp1,p2,d + OMp1,p2,d+1
(8.20c)
Indien er geen productie beeindigd wordt in de maand, dan kan er ook nooit een omstelling
voorkomen voor dit product. Voorwaarde 8.20d zorgt hiervoor.
HOOFDSTUK 8. FASE 2: SCHEDULING 104
8
∀(p1, p2) ∈ omstelDuo,∀d ∈ {D2 − 1 ∪ 10} : OMp1,p2,d ≤ EPp1 (8.20d)
Ook hier is weer nood aan enkele beginvoorwaarden omwille van de vorige maand en zijn
eventuele vrije dagen op het einde van de makespan. Ten eerste kan al besloten worden dat
een omstel van belang voor de volgende maand die reeds start in de vorige maand enkel
verschillend van 0 kan zijn indien in de huidige maand een productierun start horende bij
die omstel. We voegen hiervoor vergelijking 8.20e in.
∀(p1, p2) ∈ omstelDuo,∀d ∈ D1 : OMp1,p2,d ≤ SPp1 (8.20e)
Om nu te weten welke omstel er eventueel kan plaatsvinden in de overgang tussen de twee
maanden voegen we nog twee extra voorwaarden toe. Hierin maken we gebruik van twee
nieuwe parameters. somInitV rijs ∈ Z+ geeft het aantal vrije dagen op het einde van de
vorige maand weer van straat s. initLPp ∈ {0, 1} is 1 indien het product p het laatste
product was in de vorige maand. Per straat kan maar 1 initLP verschillend zijn van 0.
Indien er geen stilstand aan de gang is (somSSESs = 0) en er geen productierun aan het
lopen is (somSPEPs = 0) op de maandwissel dan kunnen de vrije dagen gebruikt worden
voor een omstelling. Voor de eenvoud definieren we dan alle vrije dagen als een omsteldag.
In de praktijk zullen sommigen van deze dagen gewoon een stilstand inhouden. 8.20f drukt
dit uit in wiskundige vorm waarbij het linkerlid de keuze heeft uit omstellen van het laatst
geproduceerde product naar eender welk product. Maar in combinatie met 8.20e is deze
keuze beperkt tot enkel die omstellen waarvoor in de volgende maand een productierun
start.
∀(p1, p2) ∈ omstelDuo, s:= de straat van deze omstel,
∀d ∈ {#d2m2−1 − somInitV rijs + 1, . . . ,#d2m2−1} :∑
(p1,p)∈omstelDuo
OMp1,p,d ≥ initLPp1 − somSSESs − somSPEPs
(8.20f)
Indien er geen vrije dagen zijn op het einde van de vorige maand, maar waar er wel een
omstel moet volgen op de eerste dagen van de volgende maand, dan moeten we voor de
eerste dag van deze maand zorgen dat de omstel veplicht 1 is.
∀(p1, p2) ∈ omstelDuo, s:= de straat van deze omstel :∑
(p1,p)∈omstelDuo
OMp1,p,#d2m2−1+1
≥ initLPp1 − somSSESs − somSPEPs − initV rijs,#d2m2−1
(8.20g)
HOOFDSTUK 8. FASE 2: SCHEDULING 105
8
8.12. Voorwaarden in verband met JD2K-productie
8.12.1. D2K-productie
De D2 en K-productiecampagnes moeten in blok gebeuren en op elk moment mag er niet
meer dan 70 ton D2 in tank 4 opgeslagen zijn. Het werkelijk schedulen van deze producties
in blokken van 70 is een vrij complex gegeven en is eigenlijk niet strikt noodzakelijk. De
beperking van 70 ton is reeds verwerkt bij de voorraden van de tanken en aangezien er geen
omstellingen noodzakelijk zijn tussen D2 en K, laat ik hier de werkelijke schedule vrij. Het
enige wat ik eis, is dat na D2 sowieso K wordt geproduceerd. Dit wordt in voorwaarde 8.21
geschreven.
∀d ∈ {D2 ∪ 9} : DPK,d+1 ≥ DPD2,d − DPD2,d+1 (8.21)
8.12.2. D2KJ-productie
De D2K- en J-productie moeten in blok voorkomen. Dit betekent dat we de omstellingen
tussen D2K en J moeten vastleggen. Door de andere voorwaarden voor de omstellingen uit
een van de vorige paragrafen zijn we ineens verzekerd dat D2K en J in blok voorkomen.
In figuur 8.1 zien we de verschillende situaties waarbij een omstelling tussen D2K en J
voorkomt. De voorwaarden 8.22 leggen deze situaties vast en zorgen te gepaste tijde dat
een omstel vastgelegd wordt. Voor de omgekeerde situatie waarbij een omstel van K naar
D2 plaatsvindt, gelden identieke vergelijkingen.
∀d ∈ {D2∪9} : OMD2K,J,d+1 ≥ EPD2K−SPD2K +SPJ +DPD2K,d−DPD2K,d+1−2 (8.22a)
Geldt voor de bovenste en de onderste situatie.
∀d ∈ {D2∪ 9} : OMD2K,J,d+1 ≥ EPD2K +SPJ −EPJ +DPD2K,d−DPD2K,d+1− 2 (8.22b)
Geldt voor de bovenste en de derde situatie.
∑
d∈{D2∪9}
(OMD2K,J,d + OMJ,D2K,d ≥ EPD2K + SPD2K + SPJ + EPJ − 3 (8.22c)
Geldt voor de tweede situatie.
HOOFDSTUK 8. FASE 2: SCHEDULING 106
8
Figuur 8.1.: Grafische voorstelling mogelijke combinaties omstellingen tussen D2KJ
8.13. Beginvoorwaarden
De scheduling voor een maand hangt uiteraard af van de maand die hieraan voorafgaat. We
stellen voorwaarden op voor de beginvoorraden van de maand 8.25, de vorige producties 8.23
en de stilstanden uit de vorige maand 8.24. De omstellingen uit de vorige maand zijn van
geen belang aangezien deze, indien ze op het einde vallen, vervat zitten in de vrije dagen.
Bovendien onthouden we ook dat er voor sommige straten op het einde ook een aantal vrije
dagen zijn. initDPp,d ∈ {0, 1} is een parameter die de producties van de vorige maand van
elke dag d bijhoudt. initSs,d ∈ {0, 1} is een parameter die de stilstanden uit de vorige maand
van elke dag d bijhoudt voor elke straat s.
∀p,∀d ∈ {D1} : DPp,d = initDPp,d (8.23)
∀s,∀d ∈ {D1} : Sp,d = initSp,d (8.24)
∀p ∈ {in tank 1 en 2} : QV T12p,l = initT12p (8.25a)
De index l betekent hier de laatste dag van de vorige maand en initT12p ∈ R+ is de
parameter die de beginvoorraad van product p in tank 1 en 2 vastlegt. Een analoge uitleg
geldt voor initT3p, initT4p, initV IBCp, initTBp en initCBp.
∀p ∈ {in tank 3} : QV T3p,l = initT3p (8.25b)
∀p ∈ {in tank 4} : QV T4p,l = initT4p (8.25c)
∀p ∈ {in vaten en IBC’s} : QV V IBCp,l = initV IBCp (8.25d)
HOOFDSTUK 8. FASE 2: SCHEDULING 107
8
∀p ∈ {in tank B} : QV TBp,l = initTBp (8.25e)
∀p ∈ {in containers} : QV CBp,l = initCBp (8.25f)
8.14. Overige voorwaarden
8.14.1. Doorgeven van stilstanden
Net zoals bij de eerste fase moeten we hier enkele restricties bovenhalen in verband met het
doorgeven van stilstanden. Bijvoorbeeld de F-productie mag enkel lopen als de E-installatie
loopt, maar dit betekent niet dat heel straat 1 moet worden stilgelegd. Daarom konden
we dit niet bij de algemene ingeplande stilstanden mee in beschouwing nemen. Mits het
invoeren van de volgende drie zeer eenvoudige voorwaarden 8.26 worden alle stilstanden
perfect doorgegeven.
∀d ∈ {ingSstraatE} : DPF,d = 0 (8.26a)
∀d ∈ {ingSAW1} : DPH123,d = 0 (8.26b)
∀d ∈ {ingSAW2} : DPN,d = 0 (8.26c)
8.14.2. Minimum afvalwaterdebiet
Hier kan rechtstreeks per dag geeist worden dat de productie zo wordt gepland dat er elke
dag voldoende afvalwaterdebiet op AW2 is. Aangezien we niet op voorhand weten hoeveel
dagen het zal innemen om de geschatte productiehoeveelheden in te plannen, hebben we
tien extra dagen ingevoerd zoals eerder uitgelegd. Indien deze dagen niet in de makespan
vallen, moeten ze ook niet voldoen aan de eis voor het minimale afvalwaterdebiet. We lossen
dit op met behulp van een biniare helpvariabele helpDebietd die 1 is zodra er productie is
van minimaal 1 product op dag d. Indien er geen productie is op dag d, dan mag deze
helpvariabele 0 zijn. Wiskundig krijgen we dan 8.27.
∀d ∈ {D2 ∪ 10} :∑
p∈{PAfval}
DPp,d ≤ 15 · helpDebietd (8.27a)
Zodra er productie is van 1 product wordt helpDebiet verplicht 1. 15 is hierbij een arbitraire
bovengrens. De restrictie wordt dan als volgt uitgeschreven, waarbij de dagen van ingeplande
stilstand voor AW2 ook buiten beschouwing worden gelaten.
HOOFDSTUK 8. FASE 2: SCHEDULING 108
8
∀d ∈ {D2 ∪ 10 \ ingSAW2} :∑
p∈{PAfval}
DQp,d
dagcapaciteitp· ADebietp ≥ minADebiet · helpDebietd
(8.27b)
8.14.3. Stilstand tijdens zomervakantie
Indien m2 ∈ zomer := {7, 8, 19, 20} dan kan ofwel straat 1 produceren ofwel straat 3, maar
niet beiden tegelijk op dezelfde dag. We voegen voorwaarde 8.28 toe die voor elke dag uit
deze maand de productie gaat beperken.
∀m2 ∈ zomer,∀d ∈ {D2 ∪ 10} :∑
p∈{geproduceerd op s1 of s3}
DPp,d ≤ 1; (8.28)
8.14.4. M-productie op straat 4
Voor een bepaalde datum is het niet mogelijk om M te produceren op straat 4. Daarom
voegen we voorwaarde 8.29 toe. SJM4 en SMM4 zijn respectievelijk het jaar en de maand
waarin er voor het eerst productie van M op straat 4 mag zijn.
∀j ∈ {startJ, . . . , SJM4 − 2},∀d ∈ {D2 ∪ 10} : DPM4,d = 0 (8.29a)
Indien men het komende jaar helemaal nog geen M kan produceren op straat 4: voorwaarde
8.29a.
∀j ∈ {startJ, . . . , SJM4 − 1},∀d ∈ {D2 ∪ 10},
∀m2 ∈ {m : m ≤ SMM4 + 12 − 1} : DPM4,d = 0(8.29b)
Indien er in de huidige jaargang nog geen M-productie is op straat 4, maar wel al in de
volgende jaargang. Alle productiehoeveelheden van M op straat 4 voor deze maand gelijk
aan 0: voorwaarde 8.29b. Deze vergelijking geldt enkel als de vaste parameter m2 kleiner is
dan SSM4 + 12 − 1.
∀j ∈ {startJ, . . . , SJM4},∀d ∈ {D2 ∪ 10},
∀m2 ∈ {m : m ≤ SMM4 − 1} : DPM4,d = 0(8.29c)
Indien in de huidige jaargang de productie van M wordt gestart op straat 4, enkel de maanden
ervoor nog beperken tot 0: voorwaarde 8.29c.
HOOFDSTUK 8. FASE 2: SCHEDULING 109
8
8.14.5. Resterende voorwaarden
Alle voorwaarden die in dit hoofdstuk nog niet behandeld zijn, zijn niet van belang voor
het dagelijkse niveau indien men slechts voor 1 maand gaat kijken of de vooropgestelde
schattingen haalbaar zijn of niet. In de eerste fase worden alle kosten reeds in rekening
gebracht en de schedule die in fase 2 wordt bepaald zou dan al diegene moeten zijn met de
laagste kost. Alle voorwaarden in verband met kosten komen bijgevolg niet aan bod in fase
2. Voorwaarden die eisen opleggen voor de efficientie van de productie of voorwaarden die
eisen stellen over meerdere maanden komen in fase 2 ook niet aan bod aangezien de produc-
tiehoeveelheden reeds bepaald zijn in de eerste fase. De productiecijfers zijn vastgelegd voor
de maand en er kan niets meer gedaan worden aan straten die al dan niet efficient lopen. De
voorwaarden die we in fase 2 niet vermeldden, zijn uiteraard allemaal wel zeer gedetailleerd
vervat in de eerste fase.
Zoals eerder vermeld laten we de restricties over het moment van opstart en afstel van een
straat en het moment van een omstel op een straat buiten beschouwing.
9Resultaten en Conclusie
IN dit hoofdstuk is het de bedoeling om het hele model uitvoerig te testen, de verkregen
resultaten met een grondige blik te bekijken zodat er zinnige conclusies uit volgen.
9.1. Resultaten
We gaan uit van een reele situatie om te kijken of het model voldoet aan de flowvoorwaarden
en aan alle vooropgestelde restricties. Maakt het model de correcte afweging in zijn keuze
naar de te produceren producten. Zijn er niet te veel voorraden, zijn er niet te veel omstel-
lingen, wordt de capaciteit ten volle benut zijn slechts enkele vragen waarop onze resultaten
een antwoord moeten geven. De reele situatie gaat uit van de parameters zoals beschreven
in bijlagen A, B, C en D.
9.1.1. Fase 1: output
Na het oplossen van de eerste fase krijgen we zoals eerder uiteengezet zeer nauwkeurige
schattingen voor de productiehoeveelheden per maand. De output die wordt gegenereerd in
Excel ziet er voor de productieplanning uit als in figuren 9.1 en 9.2. Op het moment dat de
planning gegenereerd wordt, zijn we op het einde van de maand april. Ons model geeft ons
dan als output voor de eerste vier maanden de cijfers uit het verleden en voor de volgende 12
maanden de productiecijfers die de goedkoopste planning zouden moeten geven. Dit zijn de
resultaten na 14 uur rekenen, op dit moment zijn we nog lang niet zeker of dit de optimale
oplossing is, maar de nodige rekentijd om dit te bevestigen of om een betere oplossing te
110
HOOFDSTUK 9. RESULTATEN EN CONCLUSIE 111
9
genereren kan snel oplopen tot enkele dagen.
Figuur 9.1.: Resultaat: productieplanning voor maand 5-12
Voor de maalplanning ziet u de resultaten in de onderstaande tabellen.
9.1.2. Fase 1: gedetailleerde bespreking
Zoals gezegd waren voorgaande schattingen het resultaat van 14 uur rekenen. Indien we
nu gaan kijken hoe de oplossing evolueert doorheen de tijd kunnen we besluiten na hoeveel
tijd de oplossing benaderend in de buurt komt van de optimale oplossing. We voeren 10
experimenten uit telkens met een andere simulatielengte. In grafiek 9.3 hebben we de evolutie
doorheen de tijd van deze totale kost uitgezet in het rood. Binnen de eerste drie uur is er
HOOFDSTUK 9. RESULTATEN EN CONCLUSIE 112
9
Figuur 9.2.: Resultaat: productieplanning voor maand 13-16
HO
OFD
ST
UK
9.R
ESU
LTAT
EN
EN
CO
NC
LU
SIE
113
9
Maand L/C F/C G/C
Voorr. Malen Verk. Voorr. Malen Verk. Voorr. Malen Verk.
2009 1 269 408 91 563 0 148 218 0 33
2 586 50 36 414 488 205 185 0 56
3 600 0 193 698 216 243 128 311 97
4 407 0 41 671 519 122 342 0 21
5 366 0 73 1068 135 200 321 0 35
6 293 0 73 1003 0 200 286 0 35
7 220 0 73 803 0 200 251 0 35
8 147 216 73 603 0 200 216 0 35
9 290 0 73 403 0 200 181 0 35
10 217 0 73 203 193 200 146 0 35
11 144 135 73 196 196 200 111 47 35
12 206 0 73 192 200 200 123 87 35
Totaal 3745 809 945 6817 1947 2318 2508 445 487
Gemiddeld 1-12 78 193 40
HO
OFD
ST
UK
9.R
ESU
LTAT
EN
EN
CO
NC
LU
SIE
114
9
Maand L/C F/C G/C
Voorr. Malen Verk. Voorr. Malen Verk. Voorr. Malen Verk.
2010 13 133 75 75 192 234 205 175 0 40
14 133 224 75 221 181 205 135 0 40
15 283 0 75 198 405 205 95 0 40
16 208 0 75 398 0 205 55 46 40
17 133 0 0 193 0 0 62 0 0
18 0 0 0 0 0 0 0 0 0
19 0 0 0 0 0 0 0 0 0
20 0 0 0 0 0 0 0 0 0
21 0 0 0 0 0 0 0 0 0
22 0 0 0 0 0 0 0 0 0
23 0 0 0 0 0 0 0 0 0
24 0 0 0 0 0 0 0 0 0
Totaal 891 300 900 1205 821 2460 524 46 480
Gemiddeld 13-24 75 205 40
HOOFDSTUK 9. RESULTATEN EN CONCLUSIE 115
9
duidelijk een verbetering met de tijd. De simulatie daarvoor stopzetten zou dus tot een
niet optimaal resultaat leiden. Na drie uur zien we nog slechts een kleine verbetering. Het
stoppen van de simulatie na 200 minuten is in absolute getallen 175,070 euro slechter dan
indien men pas na 14 uur stopt. Procentueel gezien is er nog een verbetering van minstens
16% mogelijk door de simulatie langer te laten lopen. Deze procentuele marge loopt terug
tot 2% indien we 5 uur lang simuleren. We besluiten hieruit dat een simulatie van 5 uur
zeker voldoende moet zijn om tot een oplossing te komen die de optimale oplossing vrij goed
benadert. Elke simulatie die minstens 200 minuten loopt, kan gerechtvaardigd worden.
Figuur 9.3.: Evolutie van de totale kost (rood) en de tekortkost (blauw) doorheen de tijd
In het blauw op figuur 9.3 zijn de kosten voor de tekorten te zien. Zoals verwacht dalen deze
kosten mee met de totale kosten naargelang men langer simuleert. Alle andere onderdelen
van de totale kost hebben we van deze figuur weggelaten omdat het daar op lijkt dat ze na-
genoeg vlak verlopen. In drie meer gedetailleerde grafieken nemen we de meest opmerkelijke
van deze kosten in beschouwing.
De kosten die gepaard gaan met omstellingen zijn weergegeven in grafiek 9.4. In eerste
instantie lijkt dit een zeer grillig verloop. De totale kost wordt geminimaliseerd en is een
resultaat van trade-offs tussen de verschillende onderdelen van de totale kost. 1 onderdeel
hiervan zijn de omstellingen. Het betekent niet dat indien de omstellingskost opnieuw om-
hoog gaat bij een langere simulatie dat daarom de simulatie slechter is. Een andere kost zal
dan namelijk nog sterker dalen. Vooral de algemene trend hierbij is van belang. Algemeen
zien we dat de totale omstellingskost daalt met de lengte van de simulatie. Absoluut is er een
verschil van 19,200 euro wat toch een vermindering inhoudt van een 10 a 15 omstellingen.
Voor de voorraadkosten en de gebonden voorraadkosten geldt een analoge bespreking. Deze
zijn voorgesteld in grafieken 9.5 en 9.6.
HOOFDSTUK 9. RESULTATEN EN CONCLUSIE 116
9
Figuur 9.4.: Evolutie van de omstelkosten met de simulatietijd
Figuur 9.5.: Evolutie van de gebondenkosten met de simulatietijd
HOOFDSTUK 9. RESULTATEN EN CONCLUSIE 117
9
Figuur 9.6.: Evolutie van de voorraadkosten met de simulatietijd
Door gebruik te maken van alle vastgelegde parameters uit fase 1 kan nu reeds een schedule
opgesteld worden voor het komende jaar per dag. We hebben dit manueel gedaan voor alle
maanden in verband met straat 6. Het resultaat hiervoor zie je in figuur 9.7. We zien dat
elke maand perfect 31 dagen telt en dat alle vooropgestelde schattingen mooi doorheen het
hele jaar kunnen ingepland worden. Dit is zonder rekening te houden met de correlatie
tussen de verschillende straten.
Indien we voor 1 bepaalde maand alle schattingen inplannen voor alle straten krijgen we
een situatie zoals in figuur 9.8. We zien dat er voor straat 3 en straat CD1 1 dag overschot
is, dit geeft al iets meer ruimte in verband met de correlatie tussen de verschillende straten.
Het is de bedoeling om te kijken of op elke dag aan alle restricties wordt voldaan, waarbij
een grondstof zeker moet geproduceerd worden alvorens het verder kan gebruikt worden.
Om te zien of alle relaties tussen de verschillende straten op elke dag ook gelden hebben we
nood aan fase 2. Maar we besluiten met de opmerking dat fase 1 reeds zeer nauwkeurige
schattingen geeft voor het hele probleem.
De schattingen naar de laatste maanden toe moeten wel voorzichtig worden benaderd. Hier
kan een ongewild effect optreden. Op dit moment probeert de planning zoveel mogelijk te
voldoen aan de vraag voor de komende twaalf maanden. Na deze twaalf maanden zal er
nog steeds vraag zijn naar alle producten. Deze vraag wordt echter nog niet in rekening
gebracht en draagt bij tot zogenaamde eindeplanningsverschijnselen. In de resultaten van
figuur 9.2 zien we bijvoorbeeld dat naar het einde van de planning toe er zeer veel A2 wordt
opgeslagen in de maanden 13, 14 en 15. Net genoeg om de laatste twee maanden de A1- en
A2-installatie stil te leggen en uit te komen op de minimale voorraad van 1400 ton op het
begin van maand 17. In de praktijk is er in maand 17 ook nog vraag naar A2 en is het dan
perfect mogelijk dat een andere planning beter is. Anderzijds moet men er ook rekening
met houden dat het zakken naar de minimale voorraad ook een gevolg kan zijn van capa-
HOOFDSTUK 9. RESULTATEN EN CONCLUSIE 118
9
Figuur 9.7.: Productieschema voor straat 6 doorheen de 12 maanden
HOOFDSTUK 9. RESULTATEN EN CONCLUSIE 119
9
Figuur 9.8.: Productieschema voor maand 12
HOOFDSTUK 9. RESULTATEN EN CONCLUSIE 120
9
citeitstekorten in een straat. Een kritische blik op de resultaten is dus zeer noodzakelijk.
Een langere planningshorizon zou dit probleem kunnen oplosssen, maar vraagt ook meer
rekentijd. Anderzijds wordt de planning van maand 16 nog niet definitief vastgelegd. Een
eventueel probleem zal al veel duidelijker worden indien men de planning opstelt voor juni.
Dan is maand 16 niet meer de laatste maand, maar dan worden er ook schattingen toege-
voegd voor maand 17. Ofwel merken we dan dat er effectief capaciteitstekorten optreden
ofwel merken we de eindeplanningsverschijnselen op.
9.1.3. Fase 2
Heel het wiskundige model voor fase 2 is uitgeschreven en geımplementeerd. Nagenoeg
alle logische fouten zijn eruit gehaald, er is slechts 1 fout waardoor ik geen resultaten kan
weergeven. Nagenoeg 98% van het model werkt zoals behoren, enkel een koppige 2% weigert
mee te werken. Desalnietemin vind ik dit niet zo een ramp zoals ik bij mijn conclusies zal
vermelden.
9.2. Conclusies
De eerste fase werkt perfect en geeft schitterende schattingen. Het nadeel hierbij is de nodige
rekentijd. Dit valt op te lossen door een zwaardere computer in te schakelen, maar zelfs dan
blijft er de computationele beperking. De bedoeling is nog steeds om een terugkoppeling
te maken tussen de twee fasen zodra in fase 2 zou blijken dat voor een bepaalde maand de
productieschattingen niet in te plannen zijn in deze maand. Indien we in het beste geval
fase 1 stoppen na 3 uur, dan is elke terugkoppeling die gemaakt wordt weer 3 uur extra
rekentijd. Het is dus duidelijk dat het nooit de bedoeling kan zijn om meer dan twee keer
terug te koppelen. Zelfs dan zitten we reeds aan minimaal 9 uur rekenen. Dit is ook de
reden waarom fase 1 tot in het detail is uitgewerkt, om terugkoppelingen zoveel mogelijk te
vermijden.
Uit datgene wat ik in fase 2 al gemerkt heb, kan afgeleid worden dat de benodigde rekentijd
beperkt is tot een aantal minuten. Eens deze fase volledig op punt zou staan, vormt de
rekentijd geen probleem.
Er blijven dus drie problemen over voor de perfecte oplossing van deze case:� Zoeken van de logische fout in fase 2 zodat deze ook kan gebruikt worden� Tijdsbeperking voor het oplossen van het hele probleem� De restricties die we in de modellen genegeerd hebben in verband met gelijktijdige
afstel en opstart van een productiestraat en in verband met de mogelijke momenten
van omstel op een straat.
HOOFDSTUK 9. RESULTATEN EN CONCLUSIE 121
Voor het eerste probleem is het een kwestie van alles nog eens goed onderzoeken, een paar
testen uitvoeren en de logische fout er uit halen.
Voor het tweede en derde probleem stel ik de volgende oplossing voor: aangezien een pro-
ductieplanning vaak slechts de eerste weken ook effectief wordt gebruikt alvorens men een
nieuwe productieplanning opstelt, is het vooral van belang om te zorgen dat deze eerste
weken een feasible schedule geven. De eerste twee maanden zouden we dan door fase 2 laten
controleren en indien ze niet in orde zouden zijn, gaan we terugkoppelen naar fase 1. Voor
de latere maanden maken we de controle niet, aangezien het op dat moment nog niet van
belang is of de geschatte hoeveelheden ook effectief wel kunnen geproduceed worden. Indien
de grootteordes van deze schattingen gekend zijn, is men al een heel eind verder geholpen.
Even een verduidelijking als voorbeeld: voor de maand mei is het van belang om te weten
of een omstel op zaterdag valt of niet. Voor de maand april, die pas binnen 12 maanden
komt, is het niet van belang om te weten of die omstel nu op een zaterdag valt of niet.
Deze planning zal waarschijnlijk toch nog een paar keer aangepast worden tegen dat we ze
effectief nodig zullenhebben.
Door de controle van slechts 2 maanden, zijn er maximaal twee terugkoppelingen, wat de
rekentijd zeer goed beperkt. Dit lost het tweede probleem op. Dan rest ons nog de opmerking
over het feasible zijn van een schatting in de eerste twee maanden. Zoals in de uiteenzetting
van de modellen gezegd, negeerden we de restricties in verband met gelijktijdige omstellingen
en verboden dagen voor omstellingen omwille van implementatiemoeilijkheden. We stelden
toen voor om het op te lossen door ranges vast te leggen voor de productiehoeveelheden
zodat deze productiecampagnes steeds eindigen op een dag waarop de omstel kan starten.
Voor 12 maanden zou dit inderdaad zeer complex worden. Indien we dit echter toevoegen
voor de eerste twee maanden is het minder complex, maar worden de schattingen uit fase 1
nog beter en is het een kwestie van controleren of ze ook feasible zijn omwille van een tekort
van 1 of 2 dagen.
Indien bovenstaande opmerkingen nog geımplementeerd worden, heb ik er alle vertrouwen
in dat dit programma in de realiteit gebruikt kan worden.
Deel I.
Variabelen van het proces:
122
A
123
BIJLAGE A. VARIABELEN PRODUCTIEPLANNING 124
AVariabelen productieplanning
Figuur A.1.: Variabelen van de productieplanning
BInputgegevens productieplanning
125
BIJLAGE B. INPUTGEGEVENS PRODUCTIEPLANNING 126
B
Figuur B.1.: Inputgegevens in verband met specifieke probleem
CInputgegevens maalplanning
127
BIJ
LA
GE
C.
INP
UT
GE
GE
VE
NS
MA
ALP
LA
NN
ING
128
CMaand L/C F/C G/C
Voorr. Malen Verk. Voorr. Malen Verk. Voorr. Malen Verk.Index LC Vo LC Ma LC Ve FC Vo FC Ma FC Ve GC Vo GC Ma GC Ve
1 1 269 408 91 563 0 148 218 0 332 2 586 50 36 414 488 205 185 0 563 3 600 0 193 698 216 243 128 311 974 4 407 0 41 671 519 122 342 0 215 5 366 0 73 1068 0 200 321 0 356 6 0 0 73 0 0 200 0 0 357 7 0 0 73 0 0 200 0 0 358 8 0 0 73 0 0 200 0 0 359 9 0 0 73 0 0 200 0 0 35
10 10 0 0 73 0 0 200 0 0 3511 11 0 0 73 0 0 200 0 0 3512 12 0 0 73 0 0 200 0 0 35
Totaal 13 0 0 945 0 0 2318 0 0 48714
Gem 1-12 15 0 0 29
BIJ
LA
GE
C.
INP
UT
GE
GE
VE
NS
MA
ALP
LA
NN
ING
129
CMaand L/C F/C G/C
Voorr. Malen Verk. Voorr. Malen Verk. Voorr. Malen Verk.Index LC Vo LC Ma LC Ve FC Vo FC Ma FC Ve GC Vo GC Ma GC Ve
13 17 0 0 75 0 0 205 0 0 4014 18 0 0 75 0 0 205 0 0 4015 19 0 0 75 0 0 205 0 0 4016 20 0 0 75 0 0 205 0 0 4017 21 0 0 75 0 0 205 0 0 4018 22 0 0 75 0 0 205 0 0 4019 23 0 0 75 0 0 205 0 0 4020 24 0 0 75 0 0 205 0 0 4021 25 0 0 75 0 0 205 0 0 4022 26 0 0 75 0 0 205 0 0 4023 27 0 0 75 0 0 205 0 0 4024 28 0 0 75 0 0 205 0 0 40
Totaal 0 0 900 0 0 2460 0 0 480
Gemiddeld 13-24 0 0 0
DGegevens van de laatst beeindigde maand
Datum waarop de productieplanning moet starten:
Index Datum
1 1 dag
2 5 maand
3 2009 jaar
Stilstanden ingepland door het management:
Straat stilstandStartDag stilstandStartMaand stilstandDuur
straatAG 1 9 30
straatE 1 9 30
straatCD1 15 12 90
AW1 1 9 30
AW2 1 9 30
AW3 1 9 30
installatie2 1 9 30
Situatie van de vorige maand tot en met de datum waarop de productieplanning moet
starten:
Beginvoorwaarden: stilstanden straten
Straat dagenStilstand
straat5 29
straatCD1 29
130
BIJLAGE D. GEGEVENS VAN DE LAATST BEEINDIGDE MAAND 131
D
Aantal dagen productie waarmee de vorige periode geeindigd is.
Beginvoorwaarden: producties
Prod dagenProductie
prodF 26
prodJ 26
prodL 26
prodM6 26
prodFC 26
Aantal onbepaalde dagen op een straat in de vorige periode.
Beginvoorwaarden: vrije dagen
Straat dagenOmstelBW
straat1 0
straat3 0
straat4 0
straat6 0
straatCD1 0
straatMolen 0
Beginwaarden tank 3
dag prod bwT3
1 prodA2 0 zit er op de laatste productiedag
A2 in tank 3?
2 prodA2 0 zit er op de voorlaatste productiedag
A2 in tank 3?
1 prodCD1 0 laatste productiedag
2 prodCD1 0 voorlaatste productiedag
1 leeg 1 laatste productiedag
2 leeg 1 voorlaatste productiedag
Deel II.
Broncode:
132
EFase 1: broncode mod-file
###################################################################
# Programmacode Hierarchische productieplanning fase 1: #
# Model-file #
###################################################################
############################
#### Sets en parameters ####
############################
# De meeste spreken voor zich en dus zijn ze er uit gelaten
problem Fase1;
# ----------------------------------------
###############################
#### Beslissingsvariabelen ####
###############################
var productie{productenAlles, startMaand-1..startMaand+11} >= 0;
# Productiehoeveelheid van de producten in maand
var voorraad{producten, startMaand-1..startMaand+11} >= 0;
# Voorraad op het einde van maand t
var tekorten{productenVerkoop union productenA2Tank union
productenA2Tank12 union productenA2Tank3,
startMaand-1..startMaand+11} >= 0;
# tekorten voor de producten die verkocht kunnen worden,
# indien de voorraad zakt onder het minimumlevel
133
BIJLAGE E. FASE 1: BRONCODE MOD-FILE 134
E
var voorraadTank1En2{productenInTank1En2, startMaand-1..startMaand+11} >= 0;
# Hoeveelheid van producten in tank 1 en 2 op het einde van maand m
var voorraadTank3{productenInTank3, startMaand-1..startMaand+11} >= 0;
# Hoeveelheid van product in tank 3 op einde van maand m
var productieTank3Bin{productenInTank3, startMaand-1..startMaand+11} binary;
# Geeft weer welk product op het einde van maand m is toegewezen
# aan tank 3
var voorraadTank4{productenInTank4, startMaand-1..startMaand+11} >= 0;
# Hoeveelheid van product in tank 4 op einde van maand m
var voorraadVatenEnIBC{productenInVatenEnIBC,
startMaand-1..startMaand+11} >= 0;
# Hoeveelheid van producten in vaten en IBC’s op het einde van maand m
var voorraadTankB{productenInTankB, startMaand-1..startMaand+11} >= 0;
# Hoeveelheid producten in tank B op het einde van maand m
var voorraadContB{productenInTankB, startMaand-1..startMaand+11} >= 0;
# Hoeveelheid producten in tankcontainers op het einde van maand m
var omstel{productenStraten1en3Cen4en6enCD1enMolen,
startMaand..startMaand+11} binary;
# omstel na product p in maand m of niet,
# ongeacht het product dat erop volgt
var omstelT3{startMaand..startMaand+11} integer >=0 <= 2;
# Een omstel op tank 3 of niet in maand m
var stilstandStart{straten1en3en4en5en6enA1enA2enCD1enMolen,
startMaand-1..startMaand+11} binary;
# 1 indien er een stilstand start in maand m op straat s
var stilstandEind{straten1en3en4en5en6enA1enA2enCD1enMolen,
startMaand-1..startMaand+11} binary;
# 1 indien er een stilstand eindigt in maand m
var stilstandDagen{straten1en3en4en5en6enA1enA2enCD1enMolen,
startMaand-1..startMaand+11} integer >= 0;
# aantal dagen van stilstand gepland door het model in maand m
var productieBinair{productenAlles, startMaand-1..startMaand+11} binary;
# Al dan niet productie p in maand m
BIJLAGE E. FASE 1: BRONCODE MOD-FILE 135
E
var runStart{productenStraten1en3Cen4en6enCD1enMolen,
startMaand-1..startMaand+11} binary;
# 1 indien er een productierun van het product wordt gestart
# in de maand m
var runEind{productenStraten1en3Cen4en6enCD1enMolen,
startMaand-1..startMaand+11} binary;
# 1 indien er een productierun van het product wordt geeindigd
# in de maand m
var stilstandA1VerbruikA2Plus{straten5en6, startMaand..startMaand+11} >= 0;
# Helpvariabele in verband met restrictie 12 en 13
var stilstandA1VerbruikA2Min{straten5en6, startMaand..startMaand+11} >= 0;
# Helpvariabele in verband met restrictie 12 en 13
var stilstandA1VerbruikA2{straten5en6, startMaand..startMaand+11, 1..2} >= 0;
# Restrictie 12 (1) en 13 (2), geeft het verbruik weer van A2
# voor de productie van andere producten in de overbruggingsperiode
var tank3DagenLeeg{productenInTank3, startMaand..startMaand+11} >= 0;
# Aantal dagen noodzakelijk om tank 3 leeg te maken indien ze in het
# begin van de maand gevuld is met product p
var tank3DagenVul{productenInTank3, startMaand..startMaand+11} >= 0;
# Aantal dagen noodzakelijk om de tank te vullen tot het niveau
# waarop ze zich bevindt op het einde van de maand m
var tank3DagenTussen{productenInTank3, startMaand..startMaand+11} >= 0;
# Aantal dagen noodzakelijk om tank 3 te vullen en daarna opnieuw leeg
# te maken in maand m indien in het begin en het einde van de maand
# een ander product in de tank zit.
var res31Plus{startMaand..startMaand+11} >= 0;
# Helpvariabele in verband met restrictie 31
var res31Min{startMaand..startMaand+11} >= 0;
# Helpvariabele in verband met restrictie 31
var M6nietO{startMaand..startMaand+11} >= 0;
# Restrictie 63, aantal dagen M6-productie waarbij geen O-productie is
var NnietO{startMaand..startMaand+11} >= 0;
# Restrictie 63, aantal dagen N-productie waarbij geen O-productie is,
# hierbij is ook de M6-productie in rekening gebracht
var hv{{70,140,210}, startMaand..startMaand+11} binary;
BIJLAGE E. FASE 1: BRONCODE MOD-FILE 136
E
# Helpvariabele in verband met productie D2K
#######################
#### Doelfunctie ####
#######################
minimize totaleKost:
sum{M in startMaand..startMaand+11}(sum{m in M-1..M, p in productenVoorraad
union productenGemalen}(voorraad[p,m])/2-maximumOpslag)*voorraadKost
# Kosten voor opslag van voorraad
+ sum{M in startMaand..startMaand+11}(sum{m in M-1..M, p in productenVoorraad
union productenGemalen}(voorraad[p,m])/2*varProductieKost[p]*1000)/12
*gebondenVoorraadPerc
# Kosten van de gebonden voorraad
+ sum{M in startMaand..startMaand+11}(sum{m in M-1..M,
p in productenInVatenEnIBC}(voorraadVatenEnIBC[p,m])/2)*voorraadKostVatenEnIBC
# Kosten voor bijhouden van voorraad in vaten en IBC
+ sum{m in startMaand..startMaand+11}(
sum{p in productenVoorraad union {"prodB", "prodA2"} union productenGemalen}
(tekorten[p,m]*marge[p])
+ sum{p in productenUitA1enA2}
(tekorten[p,m]*marge[p]/verbruik[p,"prodA1"])
+ sum{p in {"prodJ","prodK"}}
(tekorten[p,m]*marge[p]/verbruik[p,"prodD1"])
+ sum{p in productenUitC}
(tekorten[p,m]*marge[p]/verbruik[p,"prodC"])
+ sum{p in productenGemalen union {"prodB"}}
(tekorten[p,m]*marge[p])
)*tekortFactor
# Vermijden van tekorten, ook de winstderving bij
# capaciteitsverliezen wordt hier in rekening gebracht
- 50*sum{s in straten1en3en4en5en6enCD1enMolen}
(sum{m in startMaand..startMaand+11}(stilstandDagen[s,m]-
(stilstandOpstart[s]+stilstandAfstel[s])*stilstandStart[s,m]))
# Winst door stilstanden, stilleggen machines tov produceren
# tegen lagere snelheid
- stilstandA1StandaardBesparing/stilstandA1StandaardLengte*
sum{m in startMaand..startMaand+11} (stilstandDagen["straatA1",m])
# Winst door stilstand van A1
BIJLAGE E. FASE 1: BRONCODE MOD-FILE 137
E
+ sum{s in straten1en3en4en5en6enA1enA2enCD1enMolen,
m in startMaand..startMaand+11}(stilstandStart[s,m]*stilstandKostAfstel[s]
+stilstandEind[s,m]*stilstandKostOpstart[s])
# Kosten door stilstanden
+ sum{p in productenStraten1en3Cen4en6enCD1enMolen,
m in startMaand..startMaand+11}(omstel[p,m]*omstelKost[p])
+ sum{m in startMaand..startMaand+11}(omstelT3[m]*omstelKost["straatT3"])
# Kosten voor omstellingen (straten 1, 3, 4, 6, CD1 en maalstraat en tank3)
+ sum{m in startMaand..startMaand+11}
(productie["prodG1",m]*varProductieKost["prodG1"]*kostFactorG)
# Preferent. prod van G op str 3, extra kost indien prod op str 1
+ stilstandA2EnNietA1Penalty*sum{m in startMaand..startMaand+11}
(stilstandDagen["straatA2",m]-stilstandDagen["straatA1",m])
# Penalty als A2 niet loopt terwijl A1 loopt omwille van
# energie-efficientie (grote penalty geeft meer voorraden van A2)
- sum{s in straten5en6, m in startMaand..startMaand+11, r in 1..2}
(stilstandA1VerbruikA2[s,m,r])
# Restrictie 12 en 13. Een schatting voor het verbruik van A2 in
# de overbruggingsperiode, zo dicht mogelijk bij de virtuele grenzen
+ sum{m in startMaand..startMaand+11}
(penaltyNnietO*NnietO[m] + (penaltyM6nietO-penaltyNnietO)*M6nietO[m])
# Restrictie 63: M6 en N prod zoveel mogelijk als er O prod is
;
#######################
#### Restricties ####
#######################
#### Combinatie binaire met reele variabelen ####
subject to binaireProductieStraten1en3en3Aen4en5en6enA1enA2enCD1enMolen_1
{s in straten1en3en4en5en6enA1enA2enCD1enMolen union stratenT3 union
straten3extra, (p,s) in productenVSstraten, m in startMaand..startMaand+11}:
productie[p,m] <= productieBinair[p,m]*dagcapaciteit[p]*31;
subject to binaireProductieStraten1en3en3Aen4en5en6enA1enA2enCD1enMolen_2
{s in straten1en3en4en5en6enA1enA2enCD1enMolen union stratenT3 union
straten3extra, (p,s) in productenVSstraten, m in startMaand..startMaand+11}:
productieBinair[p,m] <= productie[p,m];
#### Opsplitsing tussen producten ####
BIJLAGE E. FASE 1: BRONCODE MOD-FILE 138
E
subject to opsplitsenProductie_1 {(p1,p2,p3) in productenTriples,
m in startMaand-1..startMaand+11}:
productie[p1,m] + productie[p2,m] = productie[p3,m];
subject to opsplitsenProductie_2 {m in startMaand-1..startMaand+11}:
productie["prodH1",m] + productie["prodH2",m] + productie["prodH3",m]
= productie["prodH123",m];
#### Vraag/aanbod-restricties eindproducten ####
subject to vraagAanbod_2 {p in productenEindenMolen,
m in startMaand..startMaand+11}:
productie[p,m] + voorraad[p,m-1] + tekorten[p,m]
= vraag[p,m] + voorraad[p,m] + tekorten[p,m-1];
subject to voldoendeA2productie {m in startMaand..startMaand+11}:
productie["prodA2",m] + voorraadTank1En2["prodA2",m-1]
+ voorraadTank3["prodA2",m-1] + voorraadVatenEnIBC["prodA2",m-1]
+ tekorten["prodA2",m] = sum{p in productenViaA2 union productenUitA2}
(verbruik[p,"prodA1"]*productie[p,m]) + voorraadTank1En2["prodA2",m]
+ voorraadTank3["prodA2",m] + voorraadVatenEnIBC["prodA2",m]
+ vraag["prodA2",m] + tekorten["prodA2",m-1];
subject to voldoendeA2productieViaTank12 {m in startMaand..startMaand+11}:
productie["prodA2T12",m] + voorraadTank1En2["prodA2",m-1]
+ voorraadVatenEnIBC["prodA2",m-1] + tekorten["prodA2T12",m]
= sum{p in productenA2Tank12}(verbruik[p,"prodA1"]*productie[p,m])
+ voorraadTank1En2["prodA2",m] + voorraadVatenEnIBC["prodA2",m]
+ vraag["prodA2",m] + tekorten["prodA2T12",m-1];
subject to voldoendeA2productieViaTank3 {m in startMaand..startMaand+11}:
productie["prodA2T3",m] + voorraadTank3["prodA2",m-1]
+ tekorten["prodA2T3",m] = sum{p in productenA2Tank3}
(verbruik[p,"prodA1"]*productie[p,m]) + voorraadTank3["prodA2",m]
+ tekorten["prodA2T3",m-1];
subject to flowA2VatenEnIBC {p in productenInTank1En2,
m in startMaand..startMaand+11}:
voorraadVatenEnIBC[p,m] >= voorraadVatenEnIBC[p,m-1] - vraag[p,m];
subject to voorraadA2_1 {p in productenInTank1En2,
m in startMaand-1..startMaand+11}:
voorraad[p,m]
= voorraadTank1En2[p,m] + voorraadTank3[p,m] + voorraadVatenEnIBC[p,m];
subject to beperkenTekorten {p in productenVerkoop,
m in startMaand..startMaand+11}:
BIJLAGE E. FASE 1: BRONCODE MOD-FILE 139
E
tekorten[p,m] <= vraag[p,m] + tekorten[p,m-1];
subject to tekortenA2 {m in startMaand..startMaand+11}:
tekorten["prodA2",m] = tekorten["prodA2T12",m] + tekorten["prodA2T3",m];
#### Voldoende productie tussenproducten ####
subject to voldoendeA1productie {m in startMaand..startMaand+11}:
productie["prodA1",m] = verbruik["prodA2","prodA1"]*productie["prodA2",m]
+ sum{p in productenViaA1}(verbruik[p,"prodA1"]*productie[p,m]);
subject to voldoendeCproductie {m in startMaand..startMaand+11}:
productie["prodC",m] + voorraadTank3["prodC",m-1]
= productie["prodI",m]*verbruik["prodI","prodC"] + voorraadTank3["prodC",m];
subject to voldoendeD1productie {m in startMaand..startMaand+11}:
productie["prodD1",m] + voorraadTank3["prodD1",m-1]
= sum{p in productenMetGrondstofD1}(productie[p,m]*verbruik[p,"prodD1"])
+ voorraadTank3["prodD1",m];
subject to voldoendeD2productie_1 {m in startMaand..startMaand+11}:
productie["prodD2",m] + voorraadTank4["prodD2",m-1]
= productie["prodK",m]*verbruik["prodK", "prodD2"] + voorraadTank4["prodD2",m];
subject to voldoendeMolenProductie {m in startMaand..startMaand+11,
(pNiet, pWel) in productenNietGemalenWel}:
productie[pNiet, m] >= dagcapaciteit[pNiet]/dagcapaciteit[pWel]*productie[pWel,m];
subject to BProductie_1 {m in startMaand..startMaand+11}:
ondergrensB/100*productie["prodA1",m] <= productie["prodB",m];
subject to BProductie_2 {m in startMaand..startMaand+11}:
productie["prodB",m] <= bovengrensB/100*productie["prodA1",m];
#### Stilstanden ####
# Algemene restricties
subject to ingeplandVSongepland {s in straten1en3en4en5en6enA1enA2enCD1enMolen,
m in startMaand..startMaand+11}:
stilstandDagen[s,m] >= stilstandIngepland[s,m];
subject to stilstandStraat1en3en4en6enCD1enMolen_1
{s in straten1en3en4en6enCD1enMolen, m in startMaand..startMaand+11}:
stilstandStart[s,m] <=
1-sum{t in startMaand-1..m-1}(stilstandStart[s,t]-stilstandEind[s,t]);
BIJLAGE E. FASE 1: BRONCODE MOD-FILE 140
E
subject to stilstandStraat1en3en4en5en6enA1enA2enCD1enMolen_2
{s in straten1en3en4en5en6enA1enA2enCD1enMolen, m in startMaand..startMaand+11}:
stilstandEind[s,m] <= sum{t in startMaand-1..m-1}
(stilstandStart[s,t]-stilstandEind[s,t])+ stilstandStart[s,m];
subject to stilstandStraat1en3en4en5en6enA1enA2enCD1enMolen_3
{s in straten1en3en4en5en6enA1enA2enCD1enMolen, m in startMaand..startMaand+11}:
stilstandDagen[s,m] <= 31*(sum{t in startMaand-1..m-1}
(stilstandStart[s,t]-stilstandEind[s,t])+ stilstandStart[s,m]);
subject to stilstandStraat1en3en4en6enA1enA2enCD1enMolen_4
{s in straten1en3en4en6enA1enA2enCD1enMolen, m in startMaand-1..startMaand+10}:
sum{t in m..m+1}(stilstandDagen[s,t])
>= (stilstandAfstel[s]+stilstandOpstart[s])*stilstandStart[s,m];
subject to stilstandStraat1en3en4en6enA1enA2enCD1enMolen_4extra
{s in straten1en3en4en6enA1enA2enCD1enMolen, m in startMaand..startMaand+11}:
stilstandDagen[s,m] >= (stilstandAfstel[s]+stilstandOpstart[s])
*(stilstandStart[s,m]+stilstandEind[s,m]-1);
subject to stilstandStraat1en3en4en5en6enA1enA2enCD1enMolen_5
{s in straten1en3en4en5en6enA1enA2enCD1enMolen, (p,s) in productenVSstraten,
m in startMaand..startMaand+11}:
1 - sum{t in startMaand-1..m-1}(stilstandStart[s,t]-stilstandEind[s,t])
+stilstandEind[s,m] >= productieBinair[p,m];
# Specifieke restricties per straat
subject to stilstandStraat5enA1enA2_1 {s in straten1enA1enA2,
m in startMaand..startMaand+11}:
stilstandStart[s,m] <= 1-sum{t in startMaand-1..m-1}
(stilstandStart[s,t]-stilstandEind[s,t]) + stilstandEind[s,m];
subject to stilstandStraat5enA1_4 {s in straten5enA1,
m in startMaand-1..startMaand+10}:
sum{t in m..m+1}(stilstandDagen[s,t])
>= stilstandMinLengteStraat[s]*stilstandStart[s,m];
subject to stilstandStraatMolen_6 {s in stratenMolen,
m in startMaand..startMaand+11}:
stilstandDagen[s,m] >= 3*(stilstandStart[s,m]+stilstandEind[s,m]-1);
# Doorgeven van stilstanden
subject to stilstandStraatA1enA2_8{m in startMaand..startMaand+11}:
stilstandDagen["straatA1",m] <= stilstandDagen["straatA2",m];
BIJLAGE E. FASE 1: BRONCODE MOD-FILE 141
E
subject to stilstandA1VSstraten {s in straten1en3en4,
m in startMaand..startMaand+11}:
sum{(p,s) in productenVSstraten2: p in productenViaA1}
(productie[p,m]/dagcapaciteit[p])
<= (aantalDagen1[m] - stilstandDagen["straatA1",m]);
#### Productierun ####
# Algemene voorwaarden
subject to runStraat1en3Cen4en6enCD1enMolen_1
{p in productenStraten1en3Cen4en6enCD1enMolen, m in startMaand..startMaand+11}:
runStart[p,m] <= 1-sum{t in startMaand-1..m-1}(runStart[p,t]-runEind[p,t]);
subject to runStraat1en3Cen4en6enCD1enMolen_2
{p in productenStraten1en3Cen4en6enCD1enMolen, m in startMaand..startMaand+11}:
runEind[p,m]
<= sum{t in startMaand-1..m-1}(runStart[p,t]-runEind[p,t]) + runStart[p,m];
subject to runStraat1en3Cen4en6enCD1enMolen_3
{p in productenStraten1en3Cen4en6enCD1enMolen, m in startMaand..startMaand+11}:
productieBinair[p,m]
<= sum{t in startMaand-1..m-1}(runStart[p,t]-runEind[p,t]) + runStart[p,m];
subject to runStraat1en3Cen4en6enCD1enMolen_5
{p1 in productenStraten1en3Cen4en6enCD1enMolen, (p1,s) in productenVSstraten,
(p2,s) in productenVSstraten, m in startMaand..startMaand+11}:
runStart[p2,m] <= 1 -
sum{t in startMaand-1..m-1}(runStart[p1,t]-runEind[p1,t]) + runEind[p1,m];
subject to runStraat1en3Cen4en6enMolen_7
{p in productenStraten1en3Cen4en6enMolen diff {"prodD2K"},
m in startMaand..startMaand+11}:
productie[p,m]/dagcapaciteit[p]
>= runMinLengte[p]*(runStart[p,m]+runEind[p,m]-1);
subject to runStraat1en3Cen4en6enMolen_6
{p in productenStraten1en3Cen4en6enMolen diff {"prodD2K"},
m in startMaand-1..startMaand+10}:
sum{t in m..m+1}(productie[p,t]/dagcapaciteit[p])
>= runMinLengte[p]*runStart[p,m];
subject to runMinLengteH1H2H3_1 {p in {"prodH1", "prodH2", "prodH3"},
m in startMaand-1..startMaand+10}:
sum{t in m..m+1}(productie[p,t]/dagcapaciteit[p])
>= runMinLengte[p]*(runStart["prodH123",m] + productieBinair[p,m] - 1);
BIJLAGE E. FASE 1: BRONCODE MOD-FILE 142
E
subject to runMinLengteH1H2H3_2 {p in {"prodH1", "prodH2", "prodH3"},
m in startMaand-1..startMaand+10}:
sum{t in m..m+1}(productie[p,t]/dagcapaciteit[p])
>= runMinLengte[p]*(runStart["prodH123",m] + productieBinair[p,m+1] - 1);
subject to runMinLengteH1H2H3_3 {p in {"prodH1", "prodH2", "prodH3"},
m in startMaand-1..startMaand+10}:
productie[p,m]/dagcapaciteit[p] >= runMinLengte[p]*
(runStart["prodH123",m] + runEind["prodH123",m] + productieBinair[p,m] - 2);
subject to productierunStraat5 {m in startMaand-1..startMaand+10}:
sum{t in m..m+1}(productie["prodO",t]/dagcapaciteit["prodO"])
>= runMinLengte["prodO"]*stilstandEind["straat5",m];
#### Stilstanden in combinatie met productieruns ####
subject to stilstandStraat1en3Cen4en6enCD1enMolen_7
{p in productenStraten1en3Cen4en6enCD1enMolen,
(p,s) in productenVSstraten, m in startMaand..startMaand+11}:
stilstandStart[s,m] <= 1 -
sum{t in startMaand-1..m-1}(runStart[p,t]-runEind[p,t]) + runEind[p,m];
subject to runStraat1en3Cen4en6enCD1enMolen_4
{p in productenStraten1en3Cen4en6enCD1enMolen,
(p,s) in productenVSstraten, m in startMaand..startMaand+11}:
runStart[p,m] <= 1 - sum{t in startMaand-1..m-1}
(stilstandStart[s,t]-stilstandEind[s,t]) + stilstandEind[s,m];
#### Voorraadrestricties ####
# Algemene voorwaarden
subject to minimumVoorraad {p in productenVerkoop,
M in startMaand..startMaand+11}:
sum{d in voorraadParameters}(minimumVoorraadDagen[p,d])*
sum{m in startMaand..startMaand+11}(vraag[p,m])/365 <= voorraad[p,M];
subject to maximumVoorraad {p in productenInstallatie2,
M in startMaand..startMaand+11}:
voorraad[p,M] <=
maximumVoorraadDagen[p]*sum{m in startMaand..startMaand+11}(vraag[p,m])/365;
# B-voorraad
subject to voorraadBMaxTank {p in productenInTankB,
m in startMaand..startMaand+11}:
voorraadTankB[p,m] <= maxTankB[p];
BIJLAGE E. FASE 1: BRONCODE MOD-FILE 143
E
subject to voorraadBMaxVatenEnIBC {p in productenInTankB,
m in startMaand..startMaand+11}:
voorraadVatenEnIBC[p,m] <= maxVatenEnIBC[p];
subject to voorraadBMaxCont {p in productenInTankB,
m in startMaand..startMaand+11}:
voorraadContB[p,m] <= maxContB[p];
subject to voorraadBFlow {p in productenInTankB,
m in startMaand..startMaand+11}:
voorraad[p,m]
= voorraadTankB[p,m] + voorraadVatenEnIBC[p,m] + voorraadContB[p,m];
subject to voorraadBRestrictie21 {p in productenInTankB,
m in startMaand..startMaand+11}:
voorraadTankB[p,m] + voorraadContB[p,m] - productie[p,m]
+ vraag[p,m]*(1-stilstandDagen["straatA1",m]/aantalDagen1[m])
>= voorraadMinBulkBBijStilstandA1*sum{t in startMaand..startMaand+11}
(vraag[p,t])/365*stilstandEind["straatA1",m];
# A2-voorraad
subject to voorraadMaxTank1en2 {p in productenInTank1En2,
m in startMaand..startMaand+11}:
voorraadTank1En2[p,m] <= maxTank1En2[p];
subject to voorraadMaxVatenEnIBC {p in productenInTank1En2,
m in startMaand..startMaand+11}:
voorraadVatenEnIBC[p,m]
<= maxVatenEnIBC[p]*sum{t in startMaand..startMaand+11}(vraag[p,t])/365;
subject to voorraadMinTank1En2 {p in productenInTank1En2,
m in startMaand..startMaand+11}:
voorraadTank1En2[p,m] >= minTank1En2[p];
subject to voorraadA2Restrictie12 {p in productenInTank1En2,
m in startMaand..startMaand+11}:
(maxTank1En2[p] + maxTank3[p])*stilstandStart["straatA1",m]
- maxTank3[p]*(productieTank3Bin["prodC",m-1] + productieTank3Bin["prodD1",m-1])
<= voorraadTank1En2[p,m-1] + voorraadTank3[p,m-1]
+ (aantalDagen1[m]-stilstandDagen["straatA2",m])*dagcapaciteit[p]
- sum{s in straten5en6}(stilstandA1VerbruikA2[s, m, 1])
- vraag[p,m]*(1-stilstandDagen["straatA1",m]/aantalDagen1[m]);
subject to voorraadA2VerbruikA2_1 {s in straten5en6,
m in startMaand..startMaand+11, r in 1..2, A2 in productenInTank1En2}:
BIJLAGE E. FASE 1: BRONCODE MOD-FILE 144
E
stilstandA1VerbruikA2[s,m,r]
<= sum{(p,s) in productenVSstraten}(productie[p,m]*verbruik[p,A2]);
subject to voorraadA2VerbruikA2_2 {s in straten5en6,
m in startMaand..startMaand+11, r in 1..2, A2 in productenInTank1En2}:
stilstandA1VerbruikA2[s,m,r] <= (aantalDagen1[m]-stilstandDagen["straatA1",m])
*sum{(p,s) in productenVSstraten}(dagcapaciteit[p]*verbruik[p,A2])
/card{(p2,s) in productenVSstraten};
subject to voorraadA2VerbruikA2_3_12 {s in straten5en6,
m in startMaand..startMaand+11, r in 1..1, A2 in productenInTank1En2}:
stilstandA1VerbruikA2[s,m,r] <= stilstandA1VerbruikA2Plus[s,m]
*sum{(p,s) in productenVSstraten}(dagcapaciteit[p]*verbruik[p,A2])
/card{(p2,s) in productenVSstraten} + aantalDagen1[m]
*sum{(p,s) in productenVSstraten}(dagcapaciteit[p]*verbruik[p,A2])
/card{(p3,s) in productenVSstraten}*(2-stilstandEind[s,m]
- sum{t in startMaand-1..m-1}(stilstandStart[s,t]-stilstandEind[s,t]));
subject to voorraadA2VerbruikA2_3_13 {s in straten5en6,
m in startMaand..startMaand+11, r in 2..2, A2 in productenInTank1En2}:
stilstandA1VerbruikA2[s,m,r] <= stilstandA1VerbruikA2Plus[s,m]
*sum{(p,s) in productenVSstraten}(dagcapaciteit[p]*verbruik[p,A2])
/card{(p2,s) in productenVSstraten} + aantalDagen1[m]
*sum{(p,s) in productenVSstraten}(dagcapaciteit[p]*verbruik[p,A2])
/card{(p3,s) in productenVSstraten}*(1-stilstandStart[s,m]);
subject to voorraadA2VerbruikA2_4 {s in straten5en6,
m in startMaand..startMaand+11}:
stilstandA1VerbruikA2Plus[s,m] - stilstandA1VerbruikA2Min[s,m]
= aantalDagen1[m] - stilstandDagen[s,m] - stilstandDagen["straatA1",m];
subject to voorraadA2VerbruikA2_5 {s in straten5en6,
m in startMaand..startMaand+11}:
stilstandA1VerbruikA2Plus[s,m]
>= aantalDagen1[m] - stilstandDagen[s,m] - stilstandDagen["straatA1",m];
subject to voorraadA2VerbruikA2_6 {s in straten5en6,
m in startMaand..startMaand+11}:
stilstandA1VerbruikA2Min[s,m]
>= -aantalDagen1[m] + stilstandDagen[s,m] + stilstandDagen["straatA1",m];
subject to voorraadA2Restrictie13 {p in productenInTank1En2,
m in startMaand..startMaand+11}:
voorraadMinBulkA2BijStilstandA1*(sum{t in startMaand..startMaand+11}
(vraag[p,t]+sum{pA2 in productenUitA2}(vraag[pA2,t]*verbruik[pA2,p])))/365
*stilstandEind["straatA1",m] <= voorraadTank1En2[p,m] + voorraadTank3[p,m] -
(aantalDagen1[m]-stilstandDagen["straatA2",m])*dagcapaciteit[p]
BIJLAGE E. FASE 1: BRONCODE MOD-FILE 145
E
+ sum{s in straten5en6}(stilstandA1VerbruikA2[s, m, 2])
+ vraag[p,m]*(1-stilstandDagen["straatA1",m]/aantalDagen1[m]);
#### Omstellingen ####
subject to defOmstel {p in productenStraten1en3Cen4en6enCD1enMolen,
m in startMaand..startMaand+11}:
runEind[p,m] = omstel[p,m];
#### Capaciteitsrestricties ####
subject to capaciteitStraat1en4en6enCD1enMolen_1
{s in straten1en4en6enCD1enMolen, m in startMaand..startMaand+11}:
sum{(p,s) in productenVSstraten}(productie[p,m]/dagcapaciteit[p] + runEind[p,m])
= aantalDagen1[m] - stilstandDagen[s,m]
- sum{(p,s) in productenVSstraten}(omstel[p,m]*omstelDagen[p])
+ stilstandStart[s,m]*verwOmstelDagen[s];
subject to capaciteitStraat3 {m in startMaand..startMaand+11}:
sum{p in productenStraat3}(productie[p,m]/dagcapaciteit[p])
+ sum{p in productenStraat3AangepastC}runEind[p,m] = aantalDagen1[m]
- stilstandDagen["straat3",m]
- sum{p in {"prodH123", "prodG3", "prodD2K", "prodJ", "prodI"}}
(omstel[p,m]*omstelDagen[p])
+ stilstandStart["straat3",m] * verwOmstelDagen["straat3"];
subject to capaciteitStraat5 {s in straten5,
m in startMaand..startMaand+11}:
sum{(p,s) in productenVSstraten}(productie[p,m]/dagcapaciteit[p])
= aantalDagen1[m] - stilstandDagen[s,m];
subject to capaciteitStraatA1 {s in stratenA1,
m in startMaand..startMaand+11}:
sum{(p,s) in productenVSstraten}(productie[p,m]/dagcapaciteit[p])
<= aantalDagen1[m] - stilstandDagen[s,m];
subject to capaciteitStraatA2 {s in stratenA2,
m in startMaand..startMaand+11}:
sum{(p,s) in productenVSstraten}(productie[p,m]/dagcapaciteit[p])
<= aantalDagen1[m] - stilstandDagen[s,m];
subject to capaciteitStraatCD1 {s in stratenCD1}:
sum{m in startMaand..startMaand+11}(sum{(p,s) in productenVSstraten}
(productie[p,m]/dagcapaciteit[p] + runEind[p,m])
+ stilstandAfstel[s]*stilstandStart[s,m]
+ stilstandOpstart[s]*stilstandEind[s,m]
+ sum{(p,s) in productenVSstraten}(omstel[p,m]*omstelDagen[p])
BIJLAGE E. FASE 1: BRONCODE MOD-FILE 146
E
- stilstandStart[s,m]*verwOmstelDagen[s]) <= capaciteitsMaximumStraatCD1;
#### Voorwaarden in verband met tank 3 ####
subject to voorraadTank3_1 {m in startMaand-1..startMaand+11}:
sum{p in productenInTank3}(productieTank3Bin[p,m])=1;
subject to voorraadTank3_2 {p in productenInTank3,
m in startMaand-1..startMaand+11}:
voorraadTank3[p,m] <= maxTank3[p]*productieTank3Bin[p,m];
subject to toewijzingTank3 {m in startMaand..startMaand+11}:
sum{t in startMaand-1..m}(stilstandStart["straatCD1",t]
- stilstandEind["straatCD1",t]) = productieTank3Bin["prodA2",m];
# Omstel in tank 3
subject to koppelingTank3 {(p1,p2) in {("prodC","prodD2K"),("prodC","prodJ"),
("prodD1","prodI"), ("prodD1","prodC"), ("prodC","prodD1"),
("prodA2","prodD2K"),("prodA2","prodJ"), ("prodA2","prodI"),
("prodA2","prodC"), ("prodA2","prodD1")}, m in startMaand..startMaand+11}:
productieTank3Bin[p1,m]
<= 1-sum{t in startMaand-1..m}(runStart[p2,t] - runEind[p2,t]);
subject to omstelTank3_1 {m in startMaand..startMaand+11}:
omstelT3[m]
>= productieTank3Bin["prodA2",m-1] + stilstandEind["straatCD1",m] - 1;
subject to omstelTank3_2 {m in startMaand..startMaand+11}:
omstelT3[m]
>= productieTank3Bin["prodA2",m] + stilstandStart["straatCD1",m] - 1;
subject to omstelTank3_3 {m in startMaand..startMaand+11}:
omstelT3[m] >= 2*productieBinair["prodA2T3",m]
- productieTank3Bin["prodA2",m-1] - productieTank3Bin["prodA2",m];
subject to omstelTank3_4 {m in startMaand..startMaand+11}:
productieTank3Bin["prodA2",m-1] + productieTank3Bin["prodA2",m]
<= 2- stilstandEind["straatCD1",m] - stilstandStart["straatCD1",m];
# Capaciteitsbeperking tank 3
subject to voorraadTank3_4 {m in startMaand..startMaand+11}:
sum{p in productenInTank3}(tank3DagenLeeg[p,m] + tank3DagenVul[p,m]
+ tank3DagenTussen[p,m])
<= aantalDagen1[m] - omstelDagen["straatT3"]*omstelT3[m];
BIJLAGE E. FASE 1: BRONCODE MOD-FILE 147
E
subject to voorraadTank3_5_1 {p in {p1 in productenInTank3: p1 <> "prodA2"},
m in startMaand..startMaand+11}:
tank3DagenLeeg[p,m]
>= productie[p,m]/dagcapaciteit[p] - (1-productieTank3Bin[p,m-1])*62;
subject to voorraadTank3_5_2 {m in startMaand..startMaand+11}:
tank3DagenLeeg["prodA2",m] >= productie["prodA2T3",m]/dagcapaciteit["prodA2"]
- (1-productieTank3Bin["prodA2",m-1])*62;
subject to voorraadTank3_6 {p in productenInTank3, s in straten1en3en4en5en6,
m in startMaand..startMaand+11}:
tank3DagenLeeg[p,m] >= sum{(p,p2,s) in productenVoorEnNaTank3}
(productie[p2,m]/dagcapaciteit[p2]) - (1-productieTank3Bin[p,m-1])*62;
subject to voorraadTank3_7_2 {m in startMaand..startMaand+11}:
tank3DagenVul["prodA2",m] >= productie["prodA2T3",m]/dagcapaciteit["prodA2"]
- (1 - productieTank3Bin["prodA2",m] + productieTank3Bin["prodA2",m-1])*62;
subject to voorraadTank3_7_1 {p in {p1 in productenInTank3: p1<>"prodA2"},
m in startMaand..startMaand+11}:
tank3DagenVul[p,m] >= productie[p,m]/dagcapaciteit[p]
- (1 - productieTank3Bin[p,m] + productieTank3Bin[p,m-1])*62;
subject to voorraadTank3_8_1 {p in {p1 in productenInTank3: p1<>"prodA2"},
m in startMaand..startMaand+11}:
tank3DagenTussen[p,m] >= productie[p,m]/dagcapaciteit[p]
- (productieTank3Bin[p,m] + productieTank3Bin[p,m-1])*62;
subject to voorraadTank3_8_2 {m in startMaand..startMaand+11}:
tank3DagenTussen["prodA2",m] >= productie["prodA2T3",m]/dagcapaciteit["prodA2"]
- (productieTank3Bin["prodA2",m] + productieTank3Bin["prodA2",m-1])*62;
subject to voorraadTank3_9 {p in productenInTank3, s in straten1en3en4en5en6,
m in startMaand..startMaand+11}:
tank3DagenTussen[p,m] >= sum{(p,p2,s) in productenVoorEnNaTank3}
(productie[p2,m]/dagcapaciteit[p2]) - (productieTank3Bin["prodA2",m]
+ productieTank3Bin["prodA2",m-1])*62;
#### Straat 3 ####
# 70 ton D2
subject to D2K_1 {m in startMaand..startMaand+11}:
productie["prodD2",m] + productie["prodK",m] = productie["prodD2K",m];
subject to D2K_2 {m in startMaand..startMaand+11}:
productie["prodD2",m] <= productie["prodD2K",m]/2 +
BIJLAGE E. FASE 1: BRONCODE MOD-FILE 148
E
(2 - runStart["prodD2K",m] - runEind["prodD2K",m])*31*dagcapaciteit["prodD2K"];
subject to D2K_3 {m in startMaand..startMaand+11}:
productie["prodK",m] <= productie["prodD2K",m]/2 +
(2 - runStart["prodD2K",m] - runEind["prodD2K",m])*31*dagcapaciteit["prodD2K"];
subject to D2K_4 {m in startMaand..startMaand+11}:
sum{t in startMaand-1..m} productie["prodD2",t]
>= sum{t in startMaand-1..m} productie["prodK",t];
subject to D2K_5 {m in startMaand..startMaand+11}:
sum{t in startMaand-1..m} productie["prodD2",t]
<= sum{t in startMaand-1..m}productie["prodK",t]
+ 70*sum{t in startMaand-1..m}(runStart["prodD2K",t] - runEind["prodD2K",t]);
subject to D2K_6 {m in startMaand..startMaand+11}:
hv[70,m] + hv[140,m] + hv[210,m] <= 1;
subject to D2K_7 {m in startMaand..startMaand+11}:
exactTonD2*hv[140,m] + exactTonD2*2*hv[210,m] +
exactTonD2*3*(runStart["prodD2K",m]-1) <= productie["prodK",m];
subject to D2K_8 {m in startMaand..startMaand+11}:
exactTonD2*hv[140,m] + exactTonD2*2*hv[210,m]
+ exactTonD2*3*(runStart["prodD2K",m]-1) <= productie["prodD2",m];
subject to D2K_9 {m in startMaand..startMaand+11}:
exactTonD2*hv[70,m] + exactTonD2*2*hv[140,m] + exactTonD2*3*hv[210,m]
- exactTonD2*3*(runStart["prodD2K",m]-1) >= productie["prodK",m];
subject to D2K_10 {m in startMaand..startMaand+11}:
exactTonD2*hv[70,m] + exactTonD2*2*hv[140,m] + exactTonD2*3*hv[210,m]
- exactTonD2*3*(runStart["prodD2K",m]-1) >= productie["prodD2",m];
# Straat 3: Restrictie 74: J en D2K in blok produceren
subject to JenD2KinBlok_1 {m in startMaand..startMaand+11}:
sum{t in startMaand..m}(runEind["prodD2K",t] - runEind["prodJ",t])
<= runStart["prodJ",m];
subject to JenD2KinBlok_2 {m in startMaand..startMaand+11}:
sum{t in startMaand..m}(runEind["prodJ",t] - runEind["prodD2K",t])
<= runStart["prodD2K",m];
subject to JenD2KinBlok_3 {p in {"prodG3","prodH123","prodI"},
m in startMaand..startMaand+11}:
runStart[p,m] <=
BIJLAGE E. FASE 1: BRONCODE MOD-FILE 149
E
2 - sum{t in startMaand..m}(runEind["prodD2K",t]-runEind["prodJ",t])
- sum{t in startMaand-1..m-1}(runStart["prodD2K",t]-runStart["prodJ",t]);
subject to JenD2KinBlok_4 {p in {"prodG3","prodH123","prodI"},
m in startMaand..startMaand+11}:
runStart[p,m] <=
2 - sum{t in startMaand..m}(runEind["prodJ",t]-runEind["prodD2K",t])
- sum{t in startMaand-1..m-1}(runStart["prodJ",t]-runStart["prodD2K",t]);
# Straat 3: Restrictie 76 en 77: Maximaal aantal productieruns voor I, J, D2 en K
subject to maxAantalProducties_1 {p in {"prodI", "prodD2K", "prodJ"}}:
sum{m in startMaand..startMaand+11}runStart[p,m] <= aantalProductieRuns[p];
subject to maxAantalProducties_2 {p in {"prodI", "prodD2K", "prodJ"}}:
sum{m in startMaand..startMaand+11}runEind[p,m] <= aantalProductieRuns[p];
# Straat 3: Res 84: Minimaal 1 productierun van H123 in de koudere maanden
subject to min1RunH123:
1 <= sum{m in koudeMaandRange[1]..koudeMaandRange[2]}
(runStart["prodH123",m] + runEind["prodH123",m])
+ sum{m in koudeMaandRange[3]..koudeMaandRange[4]}(runStart["prodH123",m]);
# Straat 3: Restrictie 31: Na I-productie tank 3 leeg
subject to tank3NaI {m in startMaand..startMaand+11}:
1 - runEind["prodI",m] >= productieTank3Bin["prodC",m];
# Straat 3: Restrictie 31: Na JD2K-productie tank 3 leeg
subject to tank3NaJD2K_1 {m in startMaand..startMaand+11}:
sum{t in startMaand..m}(runEind["prodD2K",t] - runEind["prodJ",t])
= res31Plus[m] - res31Min[m];
subject to tank3NaJD2K_2 {m in startMaand..startMaand+11}:
res31Plus[m]
>= sum{t in startMaand..m}(runEind["prodD2K",t] - runEind["prodJ",t]);
subject to tank3NaJD2K_3 {m in startMaand..startMaand+11}:
res31Min[m]
>= - sum{t in startMaand..m}(runEind["prodD2K",t] - runEind["prodJ",t]);
subject to tank3NaJD2K_4 {m in startMaand..startMaand+11}:
1 - productieTank3Bin["prodD1",m]
>= runEind["prodD2K",m] - res31Plus[m] - res31Min[m];
BIJLAGE E. FASE 1: BRONCODE MOD-FILE 150
E
subject to tank3NaJD2K_5 {m in startMaand..startMaand+11}:
1 - productieTank3Bin["prodD1",m]
>= runEind["prodJ",m] - res31Plus[m] - res31Min[m];
#### Beginvoorwaarden ####
subject to vraagAanbod_1 {p in productenEindenMolen}:
initieleVoorraad[p] = voorraad[p,startMaand-1];
subject to tank1En2 {p in productenInTank1En2}:
initieleTank1En2[p] = voorraadTank1En2[p,startMaand-1];
subject to voldoendeD2productie_2:
voorraadTank4["prodD2", startMaand-1] = initieleTank4["prodD2"];
subject to voorraadInitieelTankB {p in productenInTankB}:
voorraadTankB[p,startMaand-1] = initieelTankB[p];
subject to voorraadInitieelVatenEnIBC {p in productenInVatenEnIBC}:
voorraadVatenEnIBC[p,startMaand-1] = initieelVatenEnIBC[p];
subject to voorraadInitieelContB {p in productenInTankB}:
voorraadContB[p,startMaand-1] = initieelContB[p];
subject to voorraadTank3_3 {p in productenInTank3}:
voorraadTank3[p, startMaand-1] = initieleTank3[p];
subject to begin_stilstand_1 {s in straten1en3en4en5en6enA1enA2enCD1enMolen}:
stilstandDagen[s,startMaand-1] = stilstandDagenInitieel[s];
subject to begin_stilstand_2 {s in straten1en3en4en5en6enA1enA2enCD1enMolen}:
stilstandStart[s,startMaand-1] = stilstandStartInitieel[s];
subject to begin_stilstand_3 {s in straten1en3en4en5en6enA1enA2enCD1enMolen}:
stilstandEind[s,startMaand-1] = stilstandEindInitieel[s];
subject to begin_productie_1 {p in productenStraten1en4en6enMolen union
productenStraat3 union {"prodO", "prodD2K"}}:
productie[p,startMaand-1] = productieInitieel[p];
subject to begin_productie_2 {p in productenStraten1en3Cen4en6enCD1enMolen}:
runStart[p,startMaand-1] = runStartInitieel[p];
subject to begin_productie_3 {p in productenStraten1en3Cen4en6enCD1enMolen}:
runEind[p,startMaand-1] = runEindInitieel[p];
subject to begin_productie_4 {p in {"prodH1","prodH2","prodH3"}}:
BIJLAGE E. FASE 1: BRONCODE MOD-FILE 151
E
productieBinair[p,startMaand-1] = productieInitieel[p];
subject to initieelTekorten {p in {productenVerkoop union productenA2Tank
union productenA2Tank12 union productenA2Tank3}}:
tekorten[p,startMaand-1] = 0;
#### Overige voorwaarden ####
# Efficientie productie A1
subject to minAantalDagenA1 {s in stratenA1}:
sum{m in startMaand..startMaand+11}(aantalDagen1[m]-stilstandDagen[s,m])
>= aantalMaandenProductieA1*30;
subject to minProcentueleProductieA1 {s in stratenA1,
(p,s) in productenVSstraten}:
sum{m in startMaand..startMaand+11}(productie[p,m]) >=
minimaleProductieA1/100*aantalMaandenProductieA1*30*dagcapaciteit[p];
# Doorgeven van stilstanden
subject to geenProductieF{m in startMaand..startMaand+11}:
productie["prodF",m]
<= (aantalDagen1[m]-stilstandIngepland["straatE",m])*dagcapaciteit["prodF"];
subject to geenProductieN{m in startMaand..startMaand+11}:
productie["prodN",m]
<= (aantalDagen1[m]-stilstandIngepland["AW2",m])*dagcapaciteit["prodN"];
subject to geenProductieH123{m in startMaand..startMaand+11}:
productie["prodH1",m]/dagcapaciteit["prodH1"]
+ productie["prodH2",m]/dagcapaciteit["prodH2"]
+ productie["prodH3",m]/dagcapaciteit["prodH3"]
<= (aantalDagen1[m]-stilstandIngepland["AW1",m]);
# Minimale afvalwaterdebiet
subject to afvalwaterAW2 {m in startMaand..startMaand+11}:
sum{p in productenAfval}(productie[p,m]/dagcapaciteit[p]*ADebiet[p])
>= minADebiet*(aantalDagen1[m] - stilstandIngepland["AW2",m]);
# Restrictie 45: maximale productiestilstand installatie 2 is 8 weken
subject to maxProductieStilstandInstallatie2 {m in startMaand..startMaand+10}:
sum{p in productenInstallatie2}(productieBinair[p,m+1])
>= 1-sum{p in productenInstallatie2}(productieBinair[p,m]);
BIJLAGE E. FASE 1: BRONCODE MOD-FILE 152
E
subject to maxProductieStilstandInstallatie2_BW:
sum{p in productenInstallatie2}(productieBinair[p,startMaand])
>= productieInstallatie2;
# Restrictie 48: tijdens juli en augustus: straat 1 of straat 3 stil
subject to straat1en3Zomer
{m in {{7,8} union {19,20}}: m >= startMaand && m <= startMaand+11}:
sum{p in {productenStraat1 union productenStraat3}}
(productie[p,m]/dagcapaciteit[p])
+ sum{p in {productenStraat1 union productenStraat3AangepastC}}runEind[p,m]
+ sum{p in productenStraat1}(omstel[p,m]*omstelDagen[p])
+ sum{p in {"prodH123", "prodG3", "prodD2K", "prodJ", "prodI"}}
(omstel[p,m]*omstelDagen[p]) <= aantalDagen1[m];
# Restrictie 62: enkel productie van M op straat 4 na een bepaalde datum
subject to 62_1 {j in startJaar..startJaarM4-2, m in startMaand..startMaand+11}:
productie["prodM4",m]=0;
subject to 62_2 {j in startJaar..startJaarM4-1,
m in startMaand..startMaandM4+12-1: m<=startMaand+11}:
productie["prodM4",m]=0;
subject to 62_3 {j in startJaar..startJaarM4, m in startMaand..startMaandM4-1}:
productie["prodM4",m]=0;
# Restrictie 63: M6 en N productie zoveel mogelijk als de O productie ook loopt
subject to M6nietO_1 {m in startMaand..startMaand+11}:
productie["prodM6",m]/dagcapaciteit["prodM6"]
- productie["prodO",m]/dagcapaciteit["prodO"] <= M6nietO[m];
subject to NnietO_1 {m in startMaand..startMaand+11}:
productie["prodN",m]/dagcapaciteit["prodN"]
+ productie["prodM6",m]/dagcapaciteit["prodM6"]
+ sum{p in productenStraat6}(omstel[p,m]*omstelDagen[p])
- stilstandStart["straat6",m]*verwOmstelDagen["straat6"]
- productie["prodO",m]/dagcapaciteit["prodO"] <= NnietO[m];
# Restricties 88-91 en 96
subject to res89 {m in startMaand..startMaand+11}:
sum{p in productenStraten1en3C} omstelDagen[p]*omstel[p,m] <= 16;
subject to res90 {m in startMaand..startMaand+11}:
sum{p in productenStraten4en6} omstelDagen[p]*omstel[p,m] <= 16;
BIJLAGE E. FASE 1: BRONCODE MOD-FILE 153
E
subject to res91 {m in startMaand..startMaand+11}:
sum{p in productenStraten1en3Cen4en6} omstelDagen[p]*omstel[p,m] <= 16;
subject to res96 {m in startMaand..startMaand+11}:
sum{p in productenGemalen} omstelDagen[p]*omstel[p,m] <= 16;
#### Elke correcte maand uit fase 2 wordt vastgelegd ####
subject to vastleggen_1 {p in productenAlles, m in startMaand..maandF2-1}:
vasteProductie[p,m] = productie[p,m];
subject to vastleggen_2 {p in productenStraten1en3Cen4en6enCD1enMolen,
m in startMaand..maandF2-1}:
vasteOmstel[p,m] = omstel[p,m];
subject to vastleggen_3 {m in startMaand..maandF2-1}:
vasteOmstelT3[m] = omstelT3[m];
subject to vastleggen_4 {s in straten1en3en4en5en6enA1enA2enCD1enMolen,
m in startMaand..maandF2-1}:
vasteStilstandStart[s, m] = stilstandStart[s, m];
subject to vastleggen_5 {s in straten1en3en4en5en6enA1enA2enCD1enMolen,
m in startMaand..maandF2-1}:
vasteStilstandEind[s, m] = stilstandEind[s, m];
subject to vastleggen_6 {s in straten1en3en4en5en6enA1enA2enCD1enMolen,
m in startMaand..maandF2-1}:
vasteStilstandDagen[s, m] = stilstandDagen[s, m];
subject to vastleggen_7 {p in producten union productenA2Tank union
{"prodH123", "prodD2K"}, m in startMaand..maandF2-1}:
vasteProductieBinair[p,m] = productieBinair[p, m];
subject to vastleggen_8 {s in productenStraten1en3Cen4en6enCD1enMolen,
m in startMaand..maandF2-1}:
vasteRunStart[s, m] = runStart[s, m];
subject to vastleggen_9 {s in productenStraten1en3Cen4en6enCD1enMolen,
m in startMaand..maandF2-1}:
vasteRunEind[s, m] = runEind[s, m];
FFase 2: broncode mod-file
###################################################################
# Programmacode Hierarchische productieplanning fase 2: #
# Model-file #
###################################################################
############################
#### Sets en parameters ####
############################
# De meeste spreken voor zich en dus zijn ze er uit gelaten
problem Fase2;
# ----------------------------------------
###############################
#### Beslissingsvariabelen ####
###############################
var makespan{straten1en3en4en5en6enA1enA2enCD1enMolen} integer >= 0;
# Het aantal dagen prod noodzakelijk om aan de ruwe schatting te voldoen
var DP{productenAlles,
1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10} binary;
# Binaire variabele is er productie is op dag d van product p of niet
var DQ{producten union productenViaA1 union productenViaA2 union
productenA2Tank union productenA2Tank12 union productenA2Tank3,
aantalDagen2[maandF2-1]+1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10} >= 0;
154
BIJLAGE F. FASE 2: BRONCODE MOD-FILE 155
F
# Productiehoeveelheid van p op dag d
var S{straten1en3en4en5en6enA1enA2enCD1enMolen,
1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10} binary;
# Binaire var die aangeeft of er een stilstand is op dag d van straat s
var OM{omstelDuo,
1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10} binary;
# Bin var die aangeeft of er een omstel aan de gang is tussen twee producten
var OMT3{aantalDagen2[maandF2-1]-1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}
binary;
# Bin var die aangeeft of er een omstel in tank 3 noodzakelijk is of niet
var QVT12{productenInTank1En2,
1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10} >= 0;
# Hoeveelheid A2 in tanken 1 en 2 op elke dag
var QVT3{productenInTank3,
1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10} >= 0;
# Hoeveelheid van product in tank 3 op einde van periode d
var PVT3{productenInTank3,
1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10} binary;
# Bin var die aangeeft welk product p zich op dag d in tank 3 bevindt
var QVT4{productenInTank4,
1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10} >= 0;
# Hoeveelheid van product in tank 4 op einde van periode d
var PVT4{productenInTank4,
1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10} binary;
# Bin var die aangeeft welk product p zich op dag d in tank 4 bevindt
var QVVIBC{productenInVatenEnIBC,
1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10} >= 0;
# Hoeveelheid van producten in vaten en IBC’s op het einde van periode d
var QVTB{productenInTankB,
1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10} >= 0;
# Hoeveelheid producten in tank B op het einde van periode d
var QVCB{productenInTankB,
1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10} >= 0;
# Hoeveelheid producten in tankcontainers op het einde van periode d
var DVraag{{"prodA2"},
BIJLAGE F. FASE 2: BRONCODE MOD-FILE 156
F
1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10} >= 0;
# variabele die aangeeft op welke dag er aan de vraag van A2 wordt voldaan
var helpDebiet{aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10} binary;
# Helpvariabele in verband met het minimale afvalwaterdebiet
#######################
#### Doelfunctie ####
#######################
minimize totaleMakespan:
(totMakespan-aantalDagen2[maandF2])*1000
+ sum{s in straten1en3en4en5en6enA1enA2enCD1enMolen} makespan[s];
#######################
#### Restricties ####
#######################
#### Definitie van de makespan ####
subject to perStraat1Mogelijkheid{s in straten1en3en4en5en6enA1enA2enCD1enMolen,
d in aantalDagen2[maandF2-1]+1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
sum{(p,s) in productenVSstraten3}DP[p,d] +
sum{(p1,s) in productenVSstraten}(sum{(p1,p2) in omstelDuo}(OM[p1,p2,d]))
+ S[s,d] <= 1;
subject to aaneensluiten_1 {s in straten1en3en4en5en6enA1enA2enCD1enMolen,
d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+9}:
sum{(p,s) in productenVSstraten3}DP[p,d]
+ sum{(p1,s) in productenVSstraten}(sum{(p1,p2) in omstelDuo}(OM[p1,p2,d]))
+ S[s,d] >= sum{(p,s) in productenVSstraten3}DP[p,d+1]
+ sum{(p1,s) in productenVSstraten}(sum{(p1,p2) in omstelDuo}(OM[p1,p2,d+1]))
+ S[s,d+1];
subject to aaneensluiten_2 {s in straten1en3en4en5en6enA1enA2enCD1enMolen,
d in aantalDagen2[maandF2-1]..aantalDagen2[maandF2-1]}:
sum{(p,s) in productenVSstraten3}DP[p,d]
+ sum{(p1,s) in productenVSstraten}(sum{(p1,p2) in omstelDuo}(OM[p1,p2,d]))
+ S[s,d] + initVrij[s,d] >= sum{(p,s) in productenVSstraten3}DP[p,d+1]
+ sum{(p1,s) in productenVSstraten}(sum{(p1,p2) in omstelDuo}(OM[p1,p2,d+1]))
+ S[s,d+1];
subject to defMakespan {s in straten1en3en4en5en6enA1enA2enCD1enMolen}:
makespan[s] = sum{d in aantalDagen2[maandF2-1]+1..
BIJLAGE F. FASE 2: BRONCODE MOD-FILE 157
F
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}
(sum{(p,s) in productenVSstraten3}DP[p,d]
+ sum{(p1,s) in productenVSstraten}(sum{(p1,p2) in omstelDuo}(OM[p1,p2,d]))
+ S[s,d]);
subject to makespan_1 {s in straten1en3en4en5en6enA1enA2enCD1enMolen}:
totMakespan >= makespan[s];
#### Voldoen aan schattingen uit fase 1 ####
subject to binVSree {p in producten union productenViaA1 union productenViaA2
union productenA2Tank union productenA2Tank12 union productenA2Tank3
diff {"prodB", "prodM"}, d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
DQ[p,d] <= dagcapaciteit[p]*DP[p,d];
subject to voldoenAanSchatting_2 {p in productenOutput}:
sum{d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}(DQ[p,d])
>= schattingQ[p,maandF2];
subject to BProductie_1F2 {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
DQ["prodB",d] >= ondergrensB/100*DQ["prodA1",d];
subject to BProductie_2F2 {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
DQ["prodB",d] <= bovengrensB/100*DQ["prodA1",d];
#### Flowvoorwaarden ####
# Flow A1
subject to flowA1 {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
sum{p in productenViaA1}(verbruik[p,"prodA1"]*DQ[p,d])
+ verbruik["prodA2","prodA1"]*DQ["prodA2",d] <= DQ["prodA1",d];
# Flow A2
subject to flowA2 {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
QVT12["prodA2",d-1] + QVT3["prodA2",d-1] + QVVIBC["prodA2",d-1]
+ DQ["prodA2",d] >= QVT12["prodA2",d] + QVT3["prodA2",d]
+ QVVIBC["prodA2",d] + DVraag["prodA2",d]
+ sum{p in productenViaA2 union productenUitA2}(verbruik[p,"prodA1"]*DQ[p,d]);
BIJLAGE F. FASE 2: BRONCODE MOD-FILE 158
F
subject to vraagA2:
sum{d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}(DVraag["prodA2",d])
>= vraag["prodA2",maandF2] - schattingT["prodA2",maandF2]
+ schattingT["prodA2",maandF2-1];
subject to flowA2_T12 {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
QVT12["prodA2",d-1] + QVVIBC["prodA2",d-1] + DQ["prodA2T12",d]
>= QVT12["prodA2",d] + QVVIBC["prodA2",d] + DVraag["prodA2",d]
+ sum{p in productenA2Tank12}(verbruik[p,"prodA1"]*DQ[p,d]);
subject to flowA2_T3 {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
QVT3["prodA2",d-1] + DQ["prodA2T3",d] >= QVT3["prodA2",d]
+ sum{p in productenA2Tank3}(verbruik[p,"prodA1"]*DQ[p,d]);
subject to flowA2_2 {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
DQ["prodA2T12",d] + DQ["prodA2T3",d] = DQ["prodA2",d];
# Flow tank 3 en 4
subject to flowC_T3 {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
QVT3["prodC",d-1] + DQ["prodC",d]
= QVT3["prodC",d] + sum{p in productenUitC}(verbruik[p,"prodC"]*DQ[p,d]);
subject to flowD1_T3 {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
QVT3["prodD1",d-1] + DQ["prodD1",d]
= QVT3["prodD1",d] + sum{p in productenUitD1}(verbruik[p,"prodD1"]*DQ[p,d]);
subject to flowD2_T4 {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
QVT4["prodD2",d-1] + DQ["prodD2",d]
= QVT4["prodD2",d] + verbruik["prodK","prodD1"]*DQ["prodK",d];
# Flow tussen rechtstreekse producten
subject to BProductie_0 {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
DP["prodB",d] = DP["prodA1",d];
subject to algemeneFlow_2a {(p1,p) in productenDuos, d in
aantalDagen2[maandF2-1]+1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
DP[p1,d] <= DP[p,d];
BIJLAGE F. FASE 2: BRONCODE MOD-FILE 159
F
subject to algemeneFlow_Molen {(pniet,pwel) in productenNietGemalenWel, d in
aantalDagen2[maandF2-1]+1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
DP[pwel,d] <= DP[pniet,d];
subject to productieA1indienA1inWerking {p in productenViaA1, d in
aantalDagen2[maandF2-1]+1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
DP[p,d] <= DP["prodA1",d];
subject to productieViaA2IndienA1nietInWerking {p in productenViaA2, d in
aantalDagen2[maandF2-1]+1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
DP[p,d] <= 1 - DP["prodA1",d];
subject to algemeneFlow_3 {(p1,p2) in productenOpvolgingDuo, d in
aantalDagen2[maandF2-1]+1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
DP[p2,d] <= DP[p1,d];
# Flow tussen deelproducten
subject to algemeneFlow_1 {(p1,p2,p) in productenTriples1, d in
aantalDagen2[maandF2-1]+1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
DP[p1,d] + DP[p2,d] = DP[p,d];
subject to algemeneFlow_2c {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
DP["prodD2K",d] <= DP["prodD2",d] + DP["prodK",d];
subject to algemeneFlow_2d {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
DP["prodH123",d] <= DP["prodH1",d] + DP["prodH2",d] + DP["prodH3",d];
subject to algemeneFlow_2b {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
DP["prodG",d] <= DP["prodG1",d] + DP["prodG3",d];
subject to doorgeven_1 {(p1,p2,p3) in productenTriples, d in
aantalDagen2[maandF2-1]+1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
DQ[p1,d] + DQ[p2,d] = DQ[p3,d];
#### Voorraden ####
subject to maxVoorraadTank12 {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
QVT12["prodA2",d] <= maxTank1En2["prodA2"];
subject to maxVatenIBC_B {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
BIJLAGE F. FASE 2: BRONCODE MOD-FILE 160
F
QVVIBC["prodB",d] <= maxVatenEnIBC["prodB"];
subject to maxVoorraadTankB {p in productenInTankB, d in
aantalDagen2[maandF2-1]+1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
QVTB[p,d] <= maxTankB[p];
subject to maxContainerB {p in productenInTankB, d in
aantalDagen2[maandF2-1]+1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
QVCB[p,d] <= maxContB[p];
subject to maxVatenIBC_A2 {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
QVVIBC["prodA2",d] <= maxVatenEnIBC["prodA2"]*totaleVraag["prodA2"]/365;
#### Voorwaarden in verband met tank 3 en 4 ####
# Tank 3
subject to 1productOfOmstelPerDag {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
sum{p in productenInTank3}PVT3[p,d] + OMT3[d] <= 1;
subject to maxVoorraadTank3_1 {p in productenInTank3, d in
aantalDagen2[maandF2-1]+1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
QVT3[p,d] <= maxTank3[p]*PVT3[p,d];
subject to maxVoorraadTank3_2 {p in productenInTank3, d in
aantalDagen2[maandF2-1]..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+9}:
QVT3[p,d] <= maxTank3[p]*PVT3[p,d+1];
subject to algemeneFlow_T3 {(pTank, p) in productenOpvolgingDuoOverT3, d in
aantalDagen2[maandF2-1]+1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
DP[p,d] <= PVT3[pTank,d];
# Omstelling tank 3
subject to omstelT3_1 {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+9}:
OMT3[d+1] >= PVT3["prodA2",d] - PVT3["prodA2",d+1];
subject to omstelT3_2 {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+8}:
OMT3[d+2] >= PVT3["prodA2",d] - PVT3["prodA2",d+1];
subject to omstelT3_3 {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+9}:
OMT3[d] >= PVT3["prodA2",d+1] - PVT3["prodA2",d];
BIJLAGE F. FASE 2: BRONCODE MOD-FILE 161
F
subject to omstelT3_4 {d in aantalDagen2[maandF2-1]+2..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+9}:
OMT3[d-1] >= PVT3["prodA2",d+1] - PVT3["prodA2",d];
subject to omstelT3Init_1 {p in {"prodC","prodD1"}}:
DQ[p, aantalDagen2[maandF2-1]+1] <= vrijT3["prodA2",2];
subject to omstelT3Init_2 {p in {"prodC","prodD1"}}:
DQ[p, aantalDagen2[maandF2-1]+2] <= vrijT3["prodA2",1];
subject to omstelT3Init_3:
DQ["prodA2T3", aantalDagen2[maandF2-1]+1] <= vrijT3["prodCD1",2];
subject to omstelT3Init_4:
DQ["prodA2T3", aantalDagen2[maandF2-1]+2] <= vrijT3["prodCD1",1];
# Tank 4
subject to algemeneFlow_T4 {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
DP["prodK",d] <= PVT4["prodD2",d];
subject to relatieReeelBinairVT4_1 {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
QVT4["prodD2",d] <= 70*PVT4["prodD2",d];
#### Productierun ####
subject to minDuurRun_2 {p in productenStraten1en3Cen4en6enCD1enMolen
diff {"prodD2K", "prodC", "prodD1"}, d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+9}:
sum{t in d-runMinLengte[p]+1..d}DP[p,t] + sum{(p,s) in productenVSstraten}
sum{t in d-runMinLengte[p]+1..aantalDagen2[maandF2-1]}initVrij[s,t]
>= runMinLengte[p]*(EP[p] + DP[p,d] - DP[p,d+1] - 1);
subject to minDuurRunInit {p in productenStraten1en3Cen4en6enCD1enMolen
diff {"prodD2K", "prodC", "prodD1"}}:
DP[p, aantalDagen2[maandF2-1]+1] >= EP[p] - SP[p];
subject to omstel_5 {s in straten1en3en4en6enCD1enMolen,
(p,s) in productenVSstraten,d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+9}:
sum{(p1,s) in productenVSstraten3}DP[p1,d+1]
+ sum{(p1,s) in productenVSstraten}(sum{(p1,p2) in omstelDuo}(OM[p1,p2,d+1]))
+ S[s,d+1] <= 1 - DP[p,d] + DP[p,d+1] + EP[p];
BIJLAGE F. FASE 2: BRONCODE MOD-FILE 162
F
subject to minDuurRun_3 {d in aantalDagen2[maandF2-1]..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+9}:
sum{t in d-runMinLengte["prodO"]+1..d}DP["prodO",t]
+ sum{t in d-runMinLengte["prodO"]+1..aantalDagen2[maandF2-1]}initVrij["straat5",t]
>= runMinLengte["prodO"]*(SS["straat5"] + DP["prodO",d] - DP["prodO",d+1] - 1);
subject to minDuurRun_3e {d in aantalDagen2[maandF2-1]..
..aantalDagen2[maandF2-1]}:
sum{t in d-runMinLengte["prodO"]+1..d}DP["prodO",t]
+ sum{t in d-runMinLengte["prodO"]+1..aantalDagen2[maandF2-1]}initVrij["straat5",t]
>= runMinLengte["prodO"]*(SS["straat5"] + initVrij["straat5",d]
- somSSES["straat5"] - DP["prodO",d+1] - 1);
#### Stilstanden ####
# Ingeplande stilstanden
subject to ingeplandeStilstand {s in straten1en3en4en5en6enA1enA2enCD1enMolen,
d in ingeplandeS[s]}:
S[s,d] = 1;
# Minimale duur van een stilstand
subject to minDuurStilstand_1 {s in {"straat5", "straatA1"}, d in
aantalDagen2[maandF2-1]..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+9}:
sum{t in d-stilstandMinLengteStraat[s]+1..d}(S[s,t])
+ sum{t in d-stilstandMinLengteStraat[s]+1..aantalDagen2[maandF2-1]}(initVrij[s,t])
>= stilstandMinLengteStraat[s]*(ES[s] + S[s,d] - S[s,d+1] - 1);
subject to minDuurStilstand_2 {s in straten1en3en4en5en6enA1enA2enCD1enMolen, d in
aantalDagen2[maandF2-1]..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+9}:
sum{t in d-(stilstandOpstart[s]+stilstandAfstel[s])+1..d}(S[s,t])
+ sum{t in d-(stilstandOpstart[s]+stilstandAfstel[s])+1..
..aantalDagen2[maandF2-1]}(initVrij[s,t])
>= (stilstandAfstel[s]+stilstandOpstart[s])*(ES[s] + S[s,d] - S[s,d+1] - 1);
subject to minDuurStilstand_3 {d in aantalDagen2[maandF2-1]..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+9}:
sum{t in d-(verwOmstelDagen["straatMolen"])+1..d}(S["straatMolen",t])
+ sum{t in d-(verwOmstelDagen["straatMolen"])+1..aantalDagen2[maandF2-1]}
(initVrij["straatMolen",t]) >= (verwOmstelDagen["straatMolen"])
*(ES["straatMolen"] + S["straatMolen",d] - S["straatMolen",d+1] - 1);
subject to minDuurStilstand_4 {s in straten1en3en4en5en6enA1enA2enCD1enMolen}:
S[s, aantalDagen2[maandF2-1]] >= somSSES[s];
subject to minDuurStilstand_5 {s in straten1en3en4en5en6enA1enA2enCD1enMolen,
BIJLAGE F. FASE 2: BRONCODE MOD-FILE 163
F
d in aantalDagen2[maandF2-1]+1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
S[s,d] <= SS[s] + ES[s] + somSSES[s];
#### Omstellingen ####
subject to omstel_1 {s in straten1en3en4en6enCD1, (p,s) in productenVSstraten,
d in aantalDagen2[maandF2-1]+1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+9}:
sum{(p,p2) in omstelDuo} OM[p,p2,d+1]
>= DP[p,d] - DP[p,d+1] - S[s,d+1] + EP[p] - 1;
subject to omstel_2 {(p1,p2) in omstelDuo, d in
aantalDagen2[maandF2-1]..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+7}:
sum{t in d+1..d+OD[p1,p2]}OM[p1,p2,t] >= OD[p1,p2]*(OM[p1,p2,d+1]-OM[p1,p2,d]);
subject to omstel_3 {(p1,p2) in omstelDuo, (p,p2) in omstelDuo, d in
aantalDagen2[maandF2-1]..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+9}:
DP[p,d+1] <= 1 - OM[p1,p2,d] + OM[p1,p2,d+1];
subject to omstel_4 {(p1,p2) in omstelDuo, d in
aantalDagen2[maandF2-1]+1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
OM[p1,p2,d] <= EP[p1];
subject to omstel_7 {(p1,p2) in omstelDuo, (p1,s) in productenVSstraten, d in
aantalDagen2[maandF2-1]-somInitVrij[s]+1..aantalDagen2[maandF2-1]}:
sum{(p1,p) in omstelDuo}OM[p1,p,d] >= initLP[p1] - somSSES[s] - somSPEP[s];
subject to omstel_8 {(p1,p2) in omstelDuo, (p1,s) in productenVSstraten}:
sum{(p1,p) in omstelDuo}OM[p1,p,aantalDagen2[maandF2-1]+1]
>= initLP[p1] - somSSES[s] - somSPEP[s] - initVrij[s,aantalDagen2[maandF2-1]];
subject to omstel_4e {(p1,p2) in omstelDuo, d in 1..aantalDagen2[maandF2-1]}:
OM[p1,p2,d] <= SP[p1];
subject to omstel_6 {(p1,p2) in omstelDuo, (p1,s) in productenVSstraten, d in
1..aantalDagen2[maandF2-1]-somInitVrij[s]}:
OM[p1,p2,aantalDagen2[maandF2-1]-5] = 0;
#### JD2K-productie ####
subject to D2K_run {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+9}:
DP["prodK",d+1] >= DP["prodD2",d] - DP["prodD2",d+1];
subject to blok_1 {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+9}:
OM["prodD2K","prodJ",d+1] >= EP["prodD2K"] - SP["prodD2K"]
+ SP["prodJ"] + DP["prodD2K",d] - DP["prodD2K",d+1] - 2;
BIJLAGE F. FASE 2: BRONCODE MOD-FILE 164
F
subject to blok_2 {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+9}:
OM["prodD2K","prodJ",d+1] >= EP["prodD2K"] + SP["prodJ"]
- EP["prodJ"] + DP["prodD2K",d] - DP["prodD2K",d+1] - 2;
subject to blok_3 {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+9}:
OM["prodJ","prodD2K",d+1] >= EP["prodJ"] - SP["prodJ"]
+ SP["prodD2K"] + DP["prodJ",d] - DP["prodJ",d+1] - 2;
subject to blok_4 {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+9}:
OM["prodJ","prodD2K",d+1] >= EP["prodJ"] + SP["prodD2K"]
- EP["prodD2K"] + DP["prodJ",d] - DP["prodJ",d+1] - 2;
subject to blok_5 :
sum{d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+9}
(OM["prodD2K","prodJ",d]+OM["prodJ","prodD2K",d])
>= EP["prodD2K"] + SP["prodD2K"] + SP["prodJ"] + EP["prodJ"] - 3;
#### Beginvoorwaarden ####
subject to initProductie {p in productenAlles, d in 1..aantalDagen2[maandF2-1]}:
initDP[p,d] = DP[p,d];
subject to initStilstand {s in straten1en3en4en5en6enA1enA2enCD1enMolen,
d in 1..aantalDagen2[maandF2-1]-1}:
initS[s,d] = S[s,d];
subject to tank1En2_F2 {p in productenInTank1En2}:
initT12[p] = QVT12[p, aantalDagen2[maandF2-1]];
subject to tank3 {p in productenInTank3}:
initT3[p] = QVT3[p,aantalDagen2[maandF2-1]];
subject to tank4:
initT4["prodD2"] = QVT4["prodD2", aantalDagen2[maandF2-1]];
subject to VIBC {p in productenInVatenEnIBC}:
initVIBC[p] = QVVIBC[p,aantalDagen2[maandF2-1]];
subject to tankB {p in productenInTankB}:
initTB[p] = QVTB[p,aantalDagen2[maandF2-1]];
subject to CB {p in productenInTankB}:
BIJLAGE F. FASE 2: BRONCODE MOD-FILE 165
F
initCB[p] = QVCB[p,aantalDagen2[maandF2-1]];
#### Overige voorwaarden ####
# Doorgeven van stilstanden
subject to stopE {p in {"prodF"}, d in ingeplandeS["straatE"]}:
DP[p,d] = 0;
subject to stopAW1 {p in {"prodH1","prodH2","prodH3"}, d in ingeplandeS["AW1"]}:
DP[p,d] = 0;
subject to stopAW2 {p in {"prodN"}, d in ingeplandeS["AW2"]}:
DP[p,d] = 0;
# Restrictie 44: Minimale afvalwaterdebiet indien AW2 in werking
subject to afvalwaterAW2_F2 {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10 diff ingeplandeS["AW2"]}:
sum{p in productenAfval}(DQ[p,d]/dagcapaciteit[p]*ADebiet[p])
>= minADebiet*helpDebiet[d];
subject to helpDebiet_1 {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10} :
helpDebiet[d]*100 >= sum{p in productenAfval}DP[p,d];
# Restrictie 48: stilstand tijdens zomervakantie
subject to zomer {d in aantalDagen2[maandF2-1]+1..
..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10:
maandF2 == 7 || maandF2==8 || maandF2==19 || maandF2==20}:
sum{p in productenStraat3 union productenStraat1}DP[p,d] <= 1;
# Restrictie 62: enkel productie van M op straat 4 na een bepaalde datum
subject to M62_1 {j in startJaar..startJaarM4-2, d in
aantalDagen2[maandF2-1]+1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10}:
DP["prodM4",d]=0;
subject to M62_2 {j in startJaar..startJaarM4-1, d in
aantalDagen2[maandF2-1]+1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10,
m in maandF2..maandF2: m <=startMaandM4+12-1}:
DP["prodM4",d]=0;
subject to M62_3 {j in startJaar..startJaarM4, d in
aantalDagen2[maandF2-1]+1..aantalDagen2[maandF2-1]+aantalDagen2[maandF2]+10,
m in maandF2..maandF2: m <=startMaandM4-1}:
BIJLAGE F. FASE 2: BRONCODE MOD-FILE 166
F
DP["prodM4",d]=0;
testvoorwanneerhijeenblackboxgeeftzienbijwelkeletterhijstoptikbenbenieudtdd
GFase 1 en 2: broncode run-file
Algemene opmerking hierbij: de meeste van de procedures zijn niet opgenomen enkel maar
vermeld aangezien de uitwerking ervan niet relevant is voor dit specifieke probleem en omdat
de bijlage anders te omvangrijk werd.
###################################################################
# Programmacode Hierarchische productieplanning fase 1 en 2: #
# Run-File #
###################################################################
model Fase1en2.mod;
data Fase1en2.dat;
# Definieren van opties voor beide modellen:
problem Fase1;
option presolve_eps 10e-6;
option cplex_options ’mipgap=0.01’;
option cplex_options "timelimit=10800";
problem Fase2;
option cplex_options "timelimit=3600";
option print_separator " ";
###########################################
#### Definieren van het aantal dagen ####
###########################################
167
BIJLAGE G. FASE 1 EN 2: BRONCODE RUN-FILE 168
G
let maxAantalDagen[1] := 31; let maxAantalDagen[2] := 28;
let maxAantalDagen[3] := 31; let maxAantalDagen[4] := 30;
let maxAantalDagen[5] := 31; let maxAantalDagen[6] := 30;
let maxAantalDagen[7] := 31; let maxAantalDagen[8] := 31;
let maxAantalDagen[9] := 30; let maxAantalDagen[10] := 31;
let maxAantalDagen[11] := 30; let maxAantalDagen[12] := 31;
let maxAantalDagen[13] := 31; let maxAantalDagen[14] := 28;
let maxAantalDagen[15] := 31; let maxAantalDagen[16] := 30;
let maxAantalDagen[17] := 31; let maxAantalDagen[18] := 30;
let maxAantalDagen[19] := 31; let maxAantalDagen[20] := 31;
let maxAantalDagen[21] := 30; let maxAantalDagen[22] := 31;
let maxAantalDagen[23] := 30; let maxAantalDagen[24] := 31;
for {j in 1..12}{
let aantalDagen[j] := maxAantalDagen[j];
let aantalDagen[j+12] := maxAantalDagen[j];
}
# Aangezien de startmaand ook slechts een halve maand kan zijn:
let aantalDagen[startMaand] := maxAantalDagen[startMaand] - startDag + 1;
##################
#### Fase 1 ####
##################
#### Definitie van het aantal dagen waarvoor fase 1 wordt doorlopen ####
for {j in 1..24}{
let aantalDagen1[j] := aantalDagen[j];
}
#### Inlezen van alle gegevens uit Excel ####
# We overlopen slechts 1 maal de procedure.
# Voor elke noodzakelijk parameter uit de restricties, voor elke variabele
# van de productieplanning en voor de beginvoorwaarden van de productieplanning
# moet echter zo’n procedure doorlopen worden.
# Als voorbeeld het inlezen van de datum uit een tabel in Excel.
# Inlezen datum:
set index;
param Datum{1..4};
table datumTabel "ODBC" "Inputvariabelen.xls" "tabelDatum" IN:
index <- [Index], Datum;
BIJLAGE G. FASE 1 EN 2: BRONCODE RUN-FILE 169
G
read table datumTabel;
let startDag := Datum[1]; # Geeft huidige dag weer
let startMaand := Datum[2]; # Geeft huidige maand weer
let startJaar := Datum[3]; # Geeft huidige jaar weer
#### Procedure voor restrictie 84, bepalen van de koude maanden ####
#### Procedure om de correcte stilstanden ingepland door het management ####
#### te definieren afhankelijk van de input ####
# Einddatum bepalen
# Procedure om stilstanden door te geven tussen de straten
# Procedure om het aantal ingeplande stilstanddagen per maand te bepalen
#### Inlezen van de beginvoorwaarden ####
# Inlezen stilstanddagen vorige maand
# Vastleggen parameters in verband met deze stilstanden van de initiele maand
# Kijken hoelang installatie 2 al stilstaat in verband met restrictie 45
# Inlezen productiedagen vorige mand
# Vastleggen parameters in verband met de productie in de vorige maand
# Inlezen beginvoorwaarden voor de omstellingen
# Aanpassen parameters die met deze omstellingen gepaard gaan
###################################
#### Parameters voor display ####
###################################
# initialiseren van de parameters voor de output van de resultaten
###############################
#### Oplossen van FASE 1 ####
###############################
# De maanden bepalen waarvoor de productiecijfers reeds vastliggen,
# initieel zijn er dat nog geen:
let maandF2 := startMaand;
# De eerste oplossing genereren van fase 1
BIJLAGE G. FASE 1 EN 2: BRONCODE RUN-FILE 170
G
solve Fase1;
#####################################
#### Display resultaten Fase 1 ####
#####################################
# Procedure voor het berekenen van alle noodzakelijke gegevens van de output
# o.a. kosten, totale voorraden, totale producties, ...
# Wegschrijven van alle resultaten naar .txt-files.
# Hier geven we een deel van deze procedure. Deze procedure komt later nog terug.
# De tekortkosten worden weggeschreven naar een .txt-file met naam outputF1-1.
display tekortKosten >outputF1-1.txt;
# Wegschrijven van de productieplanning naar Excel,
# een heel kort stukje van de code ziet er als volgt uit:
for {i in startMaand..12}{
printf "\tVoorr 1-%d\t\t%d\t\t\t\t\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d
\t\t\t\t%d\t\t%d\t\t%d\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d
\t\t%d\t\t%d\t\t%d\n",
i, voorraad["prodL",i-1] - tekorten["prodL",i-1],
voorraad["prodM",i-1] - tekorten["prodM",i-1],
voorraad["prodN",i-1] - tekorten["prodN",i-1],
voorraad["prodO",i-1] - tekorten["prodO",i-1],
voorraad["prodG",i-1] - tekorten["prodG",i-1],
voorraad["prodF",i-1] - tekorten["prodF",i-1],
voorraad["prodH1",i-1] - tekorten["prodH1",i-1],
voorraad["prodH2",i-1] - tekorten["prodH2",i-1],
voorraad["prodH3",i-1] - tekorten["prodH3",i-1],
voorraad["prodI",i-1] - tekorten["prodI",i-1],
voorraad["prodJ",i-1] - tekorten["prodJ",i-1],
voorraad["prodK",i-1] - tekorten["prodK",i-1],
voorraad["prodA1",i-1],
voorraad["prodA2",i-1] - tekorten["prodA2",i-1],
voorraad["prodB",i-1] - tekorten["prodB",i-1],
voorraad["prodC",i-1], voorraad["prodD1",i-1],
voorraad["prodD2",i-1],
voorraadMaandSom[i-1]
>productieplanning_outputF1-1.xls;
printf "\tProductie\t\t%d\t\t\t\t0\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d
\t\t\t\t%d\t\t%d\t\t%d\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t
\t%d\t\t%d\t\t%d\n",
productie["prodL",i], productie["prodM",i], productie["prodN",i],
BIJLAGE G. FASE 1 EN 2: BRONCODE RUN-FILE 171
G
productie["prodO",i], productie["prodG",i], productie["prodF",i],
productie["prodH1",i], productie["prodH2",i], productie["prodH3",i],
productie["prodI",i],productie["prodJ",i], productie["prodK",i],
productie["prodA1",i], productie["prodA2",i], productie["prodB",i],
productie["prodC",i], productie["prodD1",i], productie["prodD2",i],
productieMaandSom[i] >productieplanning_outputF1-1.xls;
printf "\tVerkoop\t\t%d\t\t\t\t\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t\t\t%d
\t\t%d\t\t%d\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n",
vraag["prodL",i], vraag["prodM",i], vraag["prodN",i], vraag["prodO",i],
vraag["prodG",i],vraag["prodF",i], vraag["prodH1",i], vraag["prodH2",i],
vraag["prodH3",i], vraag["prodI",i], vraag["prodJ",i], vraag["prodK",i],
vraag["prodA1",i], vraag["prodA2",i], vraag["prodB",i],vraag["prodC",i],
vraag["prodD1",i], vraag["prodD2",i], vraagMaandSom[i]
>productieplanning_outputF1-1.xls;
print >productieplanning_outputF1-1.xls;
}
# Wegschrijven van de maalplanning naar Excel
##################
#### Fase 2 ####
##################
# Initiele berekeningen noodzakelijk voor fase 2
#### Initialiseren input van fase 2 ####
let deltaD[startMaand-1] := 0;
let aantalDagen2[startMaand-1] := aantalDagen[startMaand-1];
let aantalDagen2[startMaand] := aantalDagen[startMaand] + deltaD[startMaand-1];
#### Initialiseren van de vorige maand ####
# Productiedagen van de vorige maand en bijhorende parameters
# Vrije dagen op het einde van de vorige maand
# Beginvoorwaarden van Tank 3
##############################################################
#### Doorlopen van de verschillende maanden voor fase 2 ####
##############################################################
repeat while (maandF2 <= startMaand+11){
# Vastleggen van de schattingen en de parameters uit fase 1
# die nodig zijn voor elke maand van fase 2: voorraden,
BIJLAGE G. FASE 1 EN 2: BRONCODE RUN-FILE 172
G
# geschatte productiehoeveelheden, stilstanden, productiecampagnes
# Bepalen van het set dagen van stilstanden door het management vastgelegd
# Initialiseren van de dagen waarop geen omstel mag plaatsvinden,
# inclusief de feestdagen
###############################
#### Oplossen van FASE 2 ####
###############################
solve Fase2;
# Bepalen van het aantal dagen dat er tekort of te veel zijn:
let deltaD[maandF2] := aantalDagen2[maandF2] - totMakespan;
##############################################################
#### Display resultaten Fase 2 van desbetreffende maand ####
##############################################################
####################################################
#### Analyseprocedure: terugkoppeling of niet ####
####################################################
if (deltaD[maandF2] < 0) then {
# Er zijn dus dagen tekort, fase 1 moet heruitgevoerd worden
# met aanpassing van het aantal beschikbare dagen van deze maand
let aantalDagen1[maandF2] := aantalDagen1[maandF2] + deltaD[maandF2];
###############################
#### Oplossen van FASE 1 ####
###############################
solve Fase1;
###################################
#### Display resultaten Fase 1 ####
###################################
} else {
# Er zijn geen dagen tekort, er kan naar de volgende maand worden overgegaan
# Vastleggen van de variabelen van fase 1 voor deze maand:
# Schatting, omstellingen, stilstanden, productiecampagnes
BIJLAGE G. FASE 1 EN 2: BRONCODE RUN-FILE 173
G
# updaten van de initiele waarden voor fase 2, de gevonden schedule
# wordt de beginvoorwaarde voor de volgende maand
let aantalDagen2[maandF2] := aantalDagen2[maandF2] - deltaD[maandF2];
# Vastleggen van het nieuwe aantal dagen voor de volgende maand voor fase 2
let aantalDagen2[maandF2+1] := aantalDagen[maandF2+1] + deltaD[maandF2];
# Updaten van de maand
let maandF2 := maandF2 + 1;
}
}
#####################################
#### Laatste output resultaten ####
#####################################
# Wegschrijven van de uiteindelijke productieplanning
# Wegschrijven van de uiteindelijke maalplanning
Bibliografie
Axsater, S. (1981). Aggregation of product data for hierarchical production planning. Ope-
rations Research 29 (4), 744–756.
Bitran, G. R., E. A. Haas, en A. C. Hax (1981). Hierarchical production planning: A single
stage system. Operations Research 29 (4), 717–743.
Bitran, G. R., E. A. Haas, en A. C. Hax (1982). Hierarchical production planning: A
two-stage system. Operations Research 30 (2), 232–251.
Bitran, G. R. en A. C. Hax (1977). On the Design of Hierarchical Production Planning
Systems. Decision Sciences 8 (1), 28–55.
Bitran, G. R. en A. C. Hax (1981). Disaggregation and resource allocation using convex
knapsack problems with bounded variables. Management Science 27 (4), 431–441.
Erschler, J., G. Fontan, en C. Merce (1986). Consistency of the disaggregation process in
hierarchical planning. Operations Research 34 (3), 464–469.
Liberatore, M. J. en T. Miller (1985). A Hierarchical Production Planning System. INTER-
FACES 15 (4), 1–11.
Qiu, M. M. en E. E. Burch (1997). Hierarchical production planning and scheduling in
a multi-product, multi-machine environment. International Journal of Production Re-
search 35 (11), 3023 – 3042.
Saad, G. H. (1990). Hierarchical production-planning systems: Extensions and modificati-
ons. The Journal of the Operational Research Society 41 (7), 609–624.
Vicens, E., M. E. Alemany, C. Andres, en J. J. Guarch (2001). A design and application me-
thodology for hierarchical production planning decision support systems in an enterprise
integration context. International Journal of Production Economics 74 (1-3), 5 – 20.
174