Applications of Optimization With Xpress
Applications of Optimization With Xpress
Revised translation from the French language edition of: Programmation linaire by Christelle Guret, Christian Prins, Marc Sevaux c 2000 Editions Eyrolles, Paris, France.
Published by: Dash Optimization Ltd. Blisworth House Blisworth Northants NN7 3BX United Kingdom
c 2000 Editions Eyrolles, Paris, France Revised translation rst published 2002
Translation and editing of this book has been supported by the EC Framework 5 project LISCOS (contract G1RD-1999-00034).
Cover design: James Atkins Design, www.jades.co.uk Manufacturing coordinator: Software Logistics, www.softwarelogistics.com
ISBN: 0-9543503-0-8
Contents
Foreword Preliminaries What you need to know before reading this book . . . . . . . . . . . . . . . . . . . . . . . . . . . Symbols and conventions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 4 4 4
6
7 7 7 9 11 11 12 13 15 15 16 17 18 19 19 20 21 22 24 25 25 26 27 28 28 28 30 30 31 33 33 34 34 34 35 36 37 38 38 39 39 39
1 What is modeling? Why use models? 1.1 The chess set problem: description . . . . . 1.1.1 A rst formulation . . . . . . . . . . . 1.2 Linear Programming . . . . . . . . . . . . . . 1.3 Solving the chess set problem . . . . . . . . 1.3.1 Building the model . . . . . . . . . . 1.3.2 The results . . . . . . . . . . . . . . . 1.3.3 Divisibility again . . . . . . . . . . . . 1.3.4 Unboundedness and infeasibility . . 1.4 Diagnosing infeasibility and unboundedness 1.5 The benets of modeling and optimization 1.6 Data in models . . . . . . . . . . . . . . . . . 1.7 References and further material . . . . . . .
2 Typical LP model constructs 2.1 Simple upper and lower bounds . . . . . . . . . . . . . 2.2 Flow constraints . . . . . . . . . . . . . . . . . . . . . . 2.3 Simple resource constraints . . . . . . . . . . . . . . . . 2.4 Material balance constraints . . . . . . . . . . . . . . . 2.5 Quality requirements . . . . . . . . . . . . . . . . . . . 2.6 Accounting constraints, non-constraining constraints 2.7 Blending constraints . . . . . . . . . . . . . . . . . . . . 2.8 Modes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.9 Soft constraints and panic variables . . . . . . . . . . 2.10 Objective functions . . . . . . . . . . . . . . . . . . . . 2.10.1 Minimax objective functions . . . . . . . . . . . 2.10.2 Ratio objective functions . . . . . . . . . . . . . 3 Integer Programming models 3.1 IP modeling objects: global entities . . . . . . . . 3.2 IP solving: the ideas behind Branch and Bound . . 3.3 Modeling with binary variables . . . . . . . . . . . 3.3.1 Do/dont do decisions . . . . . . . . . . . . . 3.3.2 Logical conditions . . . . . . . . . . . . . . . 3.3.2.1 Choice among several possibilities . 3.3.2.2 Simple implications . . . . . . . . . 3.3.2.3 Implications with three variables . 3.3.2.4 Generalized implications . . . . . . 3.3.3 Products of binary variables . . . . . . . . . 3.3.4 Dichotomies: either/or constraints . . . . . . 3.4 Binary variables do everything . . . . . . . . . . . 3.4.1 General integers . . . . . . . . . . . . . . . . 3.4.2 Partial integers . . . . . . . . . . . . . . . . . 3.4.3 Semi-continuous variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.4.4 Special Ordered Sets of type 1 (SOS1) . . . . 3.4.5 Special Ordered Sets of type 2 (SOS2) . . . . 3.5 Connecting real variables to binary variables . . . . 3.5.1 Modeling xed costs . . . . . . . . . . . . . . 3.5.2 Counting . . . . . . . . . . . . . . . . . . . . 3.5.3 Partial integers again . . . . . . . . . . . . . 3.5.4 Price breaks and economies of scale . . . . . 3.5.5 The product of a binary and a real variable 3.6 References and further material . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
39 40 42 42 42 43 43 44 45 46 46 46 47
4 Quadratic Programming 4.1 Revenue optimization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Portfolio optimization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3 References and further material . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
II
Application examples
48
49 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 55 56 56 57 57 60 61 62 62 62 63 65 65 66 67 68 68 69 71 73 73 73 74 74 75 75 76 77 77 77 78 79 80 81 81 81 83 83 83 84 86 86
Classication of the example problems 5 The basics of Xpress-MP 5.1 Introductory example . . . . . . . . 5.1.1 Using Xpress-Mosel . . . . . 5.1.2 Using Xpress-IVE . . . . . . . 5.2 Modeling with Mosel . . . . . . . . 5.2.1 The burglar problem . . . . 5.2.2 Reading data from text les 5.2.3 Reserved words . . . . . . . 6 Mining and process industries 6.1 Production of alloys . . . . . . . 6.1.1 Model formulation . . . 6.1.2 Implementation . . . . . 6.1.3 Results . . . . . . . . . . . 6.2 Animal food production . . . . 6.2.1 Model formulation . . . 6.2.2 Implementation . . . . . 6.2.3 Results . . . . . . . . . . . 6.3 Renery . . . . . . . . . . . . . . 6.3.1 Model formulation . . . 6.3.2 Implementation . . . . . 6.3.3 Results . . . . . . . . . . . 6.4 Cane sugar production . . . . . 6.4.1 Model formulation . . . 6.4.2 Implementation . . . . . 6.4.3 Results . . . . . . . . . . . 6.5 Opencast mining . . . . . . . . . 6.5.1 Model formulation . . . 6.5.2 Implementation . . . . . 6.5.3 Results . . . . . . . . . . . 6.6 Production of electricity . . . . . 6.6.1 Model formulation . . . 6.6.2 Implementation . . . . . 6.6.3 Results . . . . . . . . . . . 6.7 References and further material . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7 Scheduling problems 7.1 Construction of a stadium . . . . . . . . 7.1.1 Model formulation for question 1 7.1.2 Implementation of question 1 . . 7.1.3 Results for question 1 . . . . . . . 7.1.4 Model formulation for question 2 7.1.5 Implementation of question 2 . . 7.1.6 Results for question 2 . . . . . . . 7.2 Flow-shop scheduling . . . . . . . . . . .
Contents
ii
7.3
7.4
7.5
7.6
7.7
7.2.1 Model formulation . . . . . . . . . 7.2.2 Implementation . . . . . . . . . . . 7.2.3 Results . . . . . . . . . . . . . . . . . Job Shop Scheduling . . . . . . . . . . . . . 7.3.1 Model formulation . . . . . . . . . 7.3.2 Implementation . . . . . . . . . . . 7.3.3 Results . . . . . . . . . . . . . . . . . Sequencing jobs on a bottleneck machine 7.4.1 Model formulation . . . . . . . . . 7.4.2 Implementation . . . . . . . . . . . 7.4.3 Results . . . . . . . . . . . . . . . . . Paint production . . . . . . . . . . . . . . . 7.5.1 Model formulation . . . . . . . . . 7.5.2 Implementation . . . . . . . . . . . 7.5.3 Results . . . . . . . . . . . . . . . . . Assembly line balancing . . . . . . . . . . . 7.6.1 Model formulation . . . . . . . . . 7.6.2 Implementation . . . . . . . . . . . 7.6.3 Results . . . . . . . . . . . . . . . . . References and further material . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. 86 . 88 . 89 . 89 . 90 . 92 . 93 . 93 . 94 . 95 . 96 . 96 . 97 . 98 . 99 . 99 . 99 . 100 . 101 . 101 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 103 103 104 105 105 106 107 108 109 109 110 111 112 112 113 114 114 114 116 116 117 117 118 118 119 121 121 122 122 124 125 126 126 127 128 128 129 130 131 131 132
8 Planning problems 8.1 Planning the production of bicycles . . . . . . . . . 8.1.1 Model formulation . . . . . . . . . . . . . . 8.1.2 Implementation . . . . . . . . . . . . . . . . 8.1.3 Results . . . . . . . . . . . . . . . . . . . . . . 8.2 Production of drinking glasses . . . . . . . . . . . . 8.2.1 Model formulation . . . . . . . . . . . . . . 8.2.2 Implementation . . . . . . . . . . . . . . . . 8.2.3 Results . . . . . . . . . . . . . . . . . . . . . . 8.3 Material Requirement Planning . . . . . . . . . . . 8.3.1 Model formulation . . . . . . . . . . . . . . 8.3.2 Implementation . . . . . . . . . . . . . . . . 8.3.3 Results . . . . . . . . . . . . . . . . . . . . . . 8.4 Planning the production of electronic components 8.4.1 Model formulation . . . . . . . . . . . . . . 8.4.2 Implementation . . . . . . . . . . . . . . . . 8.4.3 Results . . . . . . . . . . . . . . . . . . . . . . 8.5 Planning the production of berglass . . . . . . . . 8.5.1 Model formulation . . . . . . . . . . . . . . 8.5.2 Implementation . . . . . . . . . . . . . . . . 8.5.3 Results . . . . . . . . . . . . . . . . . . . . . . 8.6 Assignment of production batches to machines . . 8.6.1 Model formulation . . . . . . . . . . . . . . 8.6.2 Implementation . . . . . . . . . . . . . . . . 8.6.3 Results . . . . . . . . . . . . . . . . . . . . . . 8.7 References and further material . . . . . . . . . . . 9 Loading and cutting problems 9.1 Wagon load balancing . . 9.1.1 Model formulation 9.1.2 Implementation . . 9.1.3 Results . . . . . . . . 9.2 Barge loading . . . . . . . 9.2.1 Model formulation 9.2.2 Implementation . . 9.2.3 Results . . . . . . . . 9.3 Tank loading . . . . . . . . 9.3.1 Model formulation 9.3.2 Implementation . . 9.3.3 Results . . . . . . . . 9.4 Backing up les . . . . . . 9.4.1 Model formulation 9.4.2 Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Contents
iii
9.4.3 Results . . . . . . . . . . . 9.5 Cutting sheet metal . . . . . . . 9.5.1 Model formulation . . . 9.5.2 Implementation . . . . . 9.5.3 Results . . . . . . . . . . . 9.6 Cutting steel bars for desk legs . 9.6.1 Model formulation . . . 9.6.2 Implementation . . . . . 9.6.3 Results . . . . . . . . . . . 9.7 References and further material
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
133 133 133 135 135 135 135 136 137 137 139 139 139 140 141 141 141 143 144 144 144 145 146 147 147 148 149 150 150 151 151 152 152 153 154 154 154 156 156 156 157 157 158 158 159 161 161 161 162 163 164 164 164 165 166 167 168 168 169 172 173
10 Ground transport 10.1 Car rental . . . . . . . . . . . . . . . . . . 10.1.1 Model formulation . . . . . . . . 10.1.2 Implementation . . . . . . . . . . 10.1.3 Results . . . . . . . . . . . . . . . . 10.2 Choosing the mode of transport . . . . . 10.2.1 Model formulation . . . . . . . . 10.2.2 Implementation . . . . . . . . . . 10.2.3 Results . . . . . . . . . . . . . . . . 10.2.4 Extension . . . . . . . . . . . . . . 10.3 Depot location . . . . . . . . . . . . . . . 10.3.1 Model formulation . . . . . . . . 10.3.2 Implementation . . . . . . . . . . 10.3.3 Results . . . . . . . . . . . . . . . . 10.4 Heating oil delivery . . . . . . . . . . . . 10.4.1 Model formulation . . . . . . . . 10.4.2 Implementation . . . . . . . . . . 10.4.3 Results . . . . . . . . . . . . . . . . 10.5 Combining different modes of transport 10.5.1 Model formulation . . . . . . . . 10.5.2 Implementation . . . . . . . . . . 10.5.3 Results . . . . . . . . . . . . . . . . 10.6 Fleet planning for vans . . . . . . . . . . 10.6.1 Model formulation . . . . . . . . 10.6.2 Implementation . . . . . . . . . . 10.6.3 Results . . . . . . . . . . . . . . . . 10.7 References and further material . . . . .
11 Air transport 11.1 Flight connections at a hub . . . . . . . . . . . . . . . . . . 11.1.1 Model formulation . . . . . . . . . . . . . . . . . . 11.1.2 Implementation . . . . . . . . . . . . . . . . . . . . 11.1.3 Results . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 Composing ight crews . . . . . . . . . . . . . . . . . . . . 11.2.1 Model formulation . . . . . . . . . . . . . . . . . . 11.2.2 Implementation . . . . . . . . . . . . . . . . . . . . 11.2.3 Results . . . . . . . . . . . . . . . . . . . . . . . . . . 11.3 Scheduling ight landings . . . . . . . . . . . . . . . . . . 11.3.1 Model formulation . . . . . . . . . . . . . . . . . . 11.3.2 Generalization to arbitrary types of time windows 11.3.3 Implementation . . . . . . . . . . . . . . . . . . . . 11.3.4 Results . . . . . . . . . . . . . . . . . . . . . . . . . . 11.4 Airline hub location . . . . . . . . . . . . . . . . . . . . . . 11.4.1 Model formulation . . . . . . . . . . . . . . . . . . 11.4.2 Implementation . . . . . . . . . . . . . . . . . . . . 11.4.3 Revised formulation . . . . . . . . . . . . . . . . . . 11.4.4 Results . . . . . . . . . . . . . . . . . . . . . . . . . . 11.5 Planning a ight tour . . . . . . . . . . . . . . . . . . . . . 11.5.1 Model formulation . . . . . . . . . . . . . . . . . . 11.5.2 Implementation and results . . . . . . . . . . . . . 11.6 References and further material . . . . . . . . . . . . . . . 12 Telecommunication problems
Contents
iv
12.1 Network reliability . . . . . . . . . . . . . . . . . 12.1.1 Model formulation . . . . . . . . . . . . 12.1.2 Implementation . . . . . . . . . . . . . . 12.1.3 Results . . . . . . . . . . . . . . . . . . . . 12.2 Dimensioning of a mobile phone network . . . 12.2.1 Model formulation . . . . . . . . . . . . 12.2.2 Implementation . . . . . . . . . . . . . . 12.2.3 Results . . . . . . . . . . . . . . . . . . . . 12.3 Routing telephone calls . . . . . . . . . . . . . . 12.3.1 Model formulation . . . . . . . . . . . . 12.3.2 Implementation . . . . . . . . . . . . . . 12.3.3 Results . . . . . . . . . . . . . . . . . . . . 12.4 Construction of a cabled network . . . . . . . . 12.4.1 Model formulation . . . . . . . . . . . . 12.4.2 Implementation . . . . . . . . . . . . . . 12.4.3 Results . . . . . . . . . . . . . . . . . . . . 12.5 Scheduling of telecommunications via satellite 12.5.1 Model formulation . . . . . . . . . . . . 12.5.2 Implementation . . . . . . . . . . . . . . 12.5.3 Results . . . . . . . . . . . . . . . . . . . . 12.6 Location of GSM transmitters . . . . . . . . . . . 12.6.1 Model formulation . . . . . . . . . . . . 12.6.2 Implementation . . . . . . . . . . . . . . 12.6.3 Results . . . . . . . . . . . . . . . . . . . . 12.7 References and further material . . . . . . . . . 13 Economics and nance 13.1 Choice of loans . . . . . . . . . . . . . . . 13.1.1 Model formulation . . . . . . . . 13.1.2 Implementation . . . . . . . . . . 13.1.3 Results . . . . . . . . . . . . . . . . 13.2 Publicity campaign . . . . . . . . . . . . . 13.2.1 Model formulation . . . . . . . . 13.2.2 Implementation . . . . . . . . . . 13.2.3 Results . . . . . . . . . . . . . . . . 13.3 Portfolio selection . . . . . . . . . . . . . 13.3.1 Model formulation . . . . . . . . 13.3.2 Implementation . . . . . . . . . . 13.3.3 Results . . . . . . . . . . . . . . . . 13.4 Financing an early retirement scheme . . 13.4.1 Model formulation . . . . . . . . 13.4.2 Implementation . . . . . . . . . . 13.4.3 Results . . . . . . . . . . . . . . . . 13.5 Family budget . . . . . . . . . . . . . . . 13.5.1 Model formulation . . . . . . . . 13.5.2 Implementation . . . . . . . . . . 13.5.3 Results . . . . . . . . . . . . . . . . 13.6 Choice of expansion projects . . . . . . . 13.6.1 Model formulation . . . . . . . . 13.6.2 Implementation . . . . . . . . . . 13.6.3 Results . . . . . . . . . . . . . . . . 13.7 Mean variance portfolio selection . . . . 13.7.1 Model formulation for question 1 13.7.2 Implementation for question 1 . . 13.7.3 Results for question 1 . . . . . . . 13.7.4 Model formulation for question 2 13.7.5 Implementation for question 2 . . 13.7.6 Results for question 2 . . . . . . . 13.7.7 Extension . . . . . . . . . . . . . . 13.8 References and further material . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
173 173 175 176 176 177 178 179 179 179 180 182 182 182 184 185 185 186 188 189 189 191 192 192 192 194 194 194 195 196 196 196 197 197 198 198 199 199 200 200 201 202 202 202 203 204 204 204 205 205 205 206 206 207 207 207 208 208 209
14 Timetabling and personnel planning 210 14.1 Assigning personnel to machines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 14.1.1 Model formulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Contents
14.2
14.3
14.4
14.5
14.6
14.7
14.1.1.1 Parallel machines . . . . . . . . . 14.1.1.2 Machines working in series . . . . 14.1.2 Implementation . . . . . . . . . . . . . . . 14.1.3 Results . . . . . . . . . . . . . . . . . . . . . Scheduling nurses . . . . . . . . . . . . . . . . . . 14.2.1 Model formulation for question 1 . . . . . 14.2.2 Implementation of question 1 . . . . . . . 14.2.3 Results for question 1 . . . . . . . . . . . . 14.2.4 Model formulation for question 2 . . . . . 14.2.5 Implementation of question 2 . . . . . . . 14.2.6 Results for question 2 . . . . . . . . . . . . Establishing a college timetable . . . . . . . . . . 14.3.1 Model formulation . . . . . . . . . . . . . 14.3.2 Implementation . . . . . . . . . . . . . . . 14.3.3 Results . . . . . . . . . . . . . . . . . . . . . Exam scheduling . . . . . . . . . . . . . . . . . . . 14.4.1 Model formulation . . . . . . . . . . . . . 14.4.2 Implementation . . . . . . . . . . . . . . . 14.4.3 Results . . . . . . . . . . . . . . . . . . . . . Production planning with personnel assignment 14.5.1 Model formulation . . . . . . . . . . . . . 14.5.2 Implementation . . . . . . . . . . . . . . . 14.5.3 Results . . . . . . . . . . . . . . . . . . . . . Planning the personnel at a construction site . . 14.6.1 Model formulation . . . . . . . . . . . . . 14.6.2 Implementation . . . . . . . . . . . . . . . 14.6.3 Results . . . . . . . . . . . . . . . . . . . . . References and further material . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
211 211 212 213 213 214 214 215 215 216 217 217 217 218 219 220 220 221 221 221 222 223 224 224 224 225 226 226 228 228 229 230 230 231 231 232 232 234 234 235 237 237 238 239 240 241 241 242 243 244 244 244 244 245 246 246
15 Local authorities and public services 15.1 Water conveyance / water supply management . 15.1.1 Model formulation . . . . . . . . . . . . . 15.1.2 Implementation . . . . . . . . . . . . . . . 15.1.3 Results . . . . . . . . . . . . . . . . . . . . . 15.2 CCTV surveillance . . . . . . . . . . . . . . . . . . 15.2.1 Model formulation . . . . . . . . . . . . . 15.2.2 Implementation . . . . . . . . . . . . . . . 15.2.3 Results . . . . . . . . . . . . . . . . . . . . . 15.3 Rigging elections . . . . . . . . . . . . . . . . . . . 15.3.1 Model formulation . . . . . . . . . . . . . 15.3.2 Implementation . . . . . . . . . . . . . . . 15.3.3 Results . . . . . . . . . . . . . . . . . . . . . 15.4 Gritting roads . . . . . . . . . . . . . . . . . . . . 15.4.1 Model formulation . . . . . . . . . . . . . 15.4.2 Implementation . . . . . . . . . . . . . . . 15.4.3 Results . . . . . . . . . . . . . . . . . . . . . 15.5 Location of income tax ofces . . . . . . . . . . . 15.5.1 Model formulation . . . . . . . . . . . . . 15.5.2 Implementation . . . . . . . . . . . . . . . 15.5.3 Results . . . . . . . . . . . . . . . . . . . . . 15.6 Efciency of hospitals . . . . . . . . . . . . . . . . 15.6.1 Model formulation . . . . . . . . . . . . . 15.6.1.1 General idea of the DEA method 15.6.1.2 Modeling our problem . . . . . . 15.6.2 Implementation . . . . . . . . . . . . . . . 15.6.3 Results . . . . . . . . . . . . . . . . . . . . . 15.7 References and further material . . . . . . . . . .
Index
253
Contents
vi
Foreword
In the past, many students have become acquainted with optimization through a course on Linear Programming. Until very recently computers were too expensive and optimization software only available to industrial groups and research centers with powerful machines. Courses on Linear Programming therefore were usually restricted to solving problems in two variables graphically and applying the famous simplex algorithm in tableau form to tiny problems. The size of the problems thus solved by hand rarely exceeded 6 to 8 variables. The practice of modeling was commonly neglected due to a lack of time and the unavailability of software to verify the models. Nowadays Linear Programming is still frequently taught from a very academic perspective. Of course, in the majority of course programs Linear Programming appears together with other classics of Operations Research such as the PERT method for project planning. But with the exception of a few students in applied mathematics who have learned to deal with applications, the others do not retain much: they have no precise idea of the possible applications, they do not know that now there are readily available software tools and most importantly, they have not been taught how to model. The idea of this book was born based on this observation. With PCs becoming ever more powerful and the rapid progress of the numerical methods for optimization the market of Linear/Mixed Integer Programming software is changing. Contrary to the rst products (subroutine libraries reserved for specialist use), the more recent generations of software do not require any programming. These tools are easy to use thanks to their user-friendly interface and a more and more natural syntax that is close to the mathematical formulae. In different study programs (sciences as well as business/economics) a signicant increase in the students interest and productivity has been observed when such tools are used. With such an approach, even students without any mathematical background are well able to model and solve real problems of considerable size, whilst they would be lost in a purely theory-oriented course about optimization methods. These students experience the satisfaction of mastering powerful tools and learn to appreciate the eld of Linear/Mixed Integer Programming. Later, at work, they may recall the potential of these tools and based on the experience they have gained, may use them where it is necessary. What else should one aim for to spread the use of Mathematical Programming? This book has been written for students of science and business/economics and also for decision makers, professionals, and technical personnel who would like to refresh their knowledge of Linear/Mixed Integer Programming and more importantly, to apply it in their activities. To focus on modeling and on the application examples, the theoretical aspects of Linear/Mixed Integer Programming are only briey mentioned in this book, without giving any detailed explanations. Ample references are provided and commented on to point the interested reader to where to nd more information about the different topics. To avoid a pre-digested textbook approach, the examples chosen for this book describe real situations. Although simplied compared to the real world so as to remain accessible for beginners, most examples are sufciently complicated not to be solvable by hand on a piece of paper and they all require a nontrivial modeling phase. The software used for the implementation and problem solving, Xpress-MP, may be downloaded from http://www.dashoptimization.com/applications_book.html free of charge in a version limited in size (but sufcient to solve the problems in this book). So the reader does not have to worry about how to solve the problems and is free to concentrate his efforts on the most noble task that nevertheless requires progressive and methodical training: the modeling. The opportunity to validate a model immediately using a software tool is gratifying: results are obtained immediately, modeling errors are discovered faster, and it is possible to perform various simulation runs by interactively modifying the problem parameters. It is not the aim of this book to turn the reader into an Xpress-MP specialist at the expense of the model-
ing work. Every problem is therefore rst modeled in mathematical form without making any reference to the implementation with the modeling software. The translation of the model into a program is given afterwards, accompanied by an explanation of any specic language features used, and followed by the presentation and discussion of the results. The mathematical model and the results are obviously independent of the software. All Xpress-MP model and data les are available from the Dash Optimization website and can be used to verify the results immediately. It would of course be possible to implement the models in a different way. To avoid establishing a heterogeneous catalogue of applications, the collection has been structured stressing the large variety of application areas of Linear/Mixed Integer Programming. The introductory chapters about modeling and the use of Xpress-MP are followed by ten chapters with applications. Every chapter is dedicated to a different application area and may be read independently of the rest. It always starts with a general description of the topic, followed by a choice of (on the average) six problems. A summary section at the end of every chapter provides additional material and references. Chapter 6 describes blending problems or the separation of components that are usually encountered in mining and process industries. These problems only rarely use integer variables and are the simplest and best suited for beginners. The two following chapters are dedicated to two other important groups of industrial applications, namely scheduling (Chapter 7) and production planning problems (Chapter 8). In many applications, it is required to ll a limited space (boxes, holds of ships, computer disks) with objects or, on the contrary, cut material to extract patterns whilst minimizing the trim loss. This type of problem is the subject of Chapter 9 about loading and cutting. Flow problems in the widest sense give rise to a large number of interesting optimization problems. This problem type is discussed across three representative application areas: ground transport (Chapter 10), air transport (Chapter 11), and the burgeoning world of telecommunications (Chapter 12). Some problems may be shifted between these three chapters, but other applications are more specic, like the tours driven by a vehicle in ground transport, the problems of ight connections in air transport, and all that concerns dimensioning and reliability of networks in telecommunications. Since this book is not aimed exclusively at scientists, industrialists, and logisticians, more recent and less well known application areas of Mathematical Programming have also been included. Chapter 13 is dedicated to problems in economics and nance. The subjects of Chapter 14 are timetabling and personnel planning problems. Mathematical Programming may equally be of use to local authorities, administrations, and public services in general: Chapter 15 describes six examples. The classication of the problems has been a subject of discussion: theoreticians usually prefer a classication based on the theoretical model type. For instance the so-called ow models are well known classics that concern several problems in this book (water conveyance, ground transport, telecommunications). Preference has been given to a classication by application area to allow a professional or a student of a given subject to identify himself with at least one entire chapter. Nevertheless, the other classication has not been omitted: the additions at the end of every chapter indicate the applications of the same theoretical type in other chapters of the book. An overview table at the beginning of the examples part also lists all models with their theoretical types. The bibliography entries are all grouped at the end of the book because certain references are cited in several chapters. However, the section References and further material at the end of every chapter comments on the references that are useful to learn more about a certain topic. The references have been chosen carefully to provide a blend of basic articles and works, sometimes already quite old, and very recent articles that illustrate the rapid progress of the discipline. The Xpress-MP software may be seen as a product of the progress achieved in optimization in recent years. The rst software tools in the 60s and 70s required the user to enter the problem in numerical form via matrices that are of little intuition, difcult to re-read and to modify. Starting in the 80s, algebraic modeling languages have been made available that enable users to write linear programs in a form close to the algebraic notation. An algebraic modeling language allows the user to write generic models using indexed variables and data arrays. This means that it is possible to separate the model from the data (stored in separate les) and to make it independent of the size of the problem. Such a high level language focuses the users attention on the modeling, reduces the possible sources of errors, accelerates model development and facilitates the understanding and modications to the model at a later time. The modeling and solving environment Xpress-Mosel [CH02] used in this book belongs to a new generation of optimization tools: it provides all the functionality of an algebraic modeling language and it also gives access to the problem solving. Through its programming facilities it becomes possible to implement solution heuristics and data pre- and post-treatment in the same environment as the model itself: all application examples (to a different extent) use this facility to formulate and solve problems and display the results. An interesting feature for more advanced uses is Mosels modular design through
Foreword
which, for instance, access to other solver or solution algorithm types or different data sources becomes possible. This feature is not used in this book, since we employ a single solver, the Xpress-Optimizer for Linear/Mixed Integer and Quadratic Programming. For working with Mosel models under Microsoft Windows the graphical user interface Xpress-IVE may be used: it provides debugging support, makes accessible additional information about the problem and the solution process, and allows the user to display his results graphically. As a default, on all supported operating systems, Mosel works with a command line interpreter based on standard text les. Only a few other books have been published with an aim similar to the present one: a book by Williams provides twenty case studies, in the third edition [Wil93] accompanied by implementations with XpressMP. The case studies are well suited for student project work, requiring several days of work. Unfortunately, this book only covers relatively few application areas. Another example is the book by Schrage [Sch97] about the software Lindo. This work contains more applications, but classied by theoretical models. The problems are implemented directly with the software, without using a modeler. Compared to the previously cited works, the present book contains a larger number of applications (sixty) structured by application areas. Although all models are implemented with Xpress-MP, every problem is rst modeled with a mathematical syntax which makes it possible to use the models with different implementations. Finally, many models are re-usable for related problems or large-size instances due to a generic way of modeling (maximum ow, minimum cost ow, assignment, transport, traveling salesman problem etc.). Updates to this book will be made available at http://www.dashoptimization.com/applications_book.html and you are encouraged to look there regularly. The partial funding of the work on this book by the EC Framework 5 project LISCOS (contract G1RD-199900034) is gratefully acknowledged. We would specially like to thank Yves Colombani for conceiving, designing and implementing Mosel. His vision has made Mosel the powerful and open software that it is today.
Foreword
Preliminaries
What you need to know before reading this book
Before reading this book you should be comfortable with the use of symbols such as x or y to represent unknown quantities, and the use of this sort of variable in simple linear equations and inequalities, for example: x+y 6 Experience of a basic course in Mathematical or Linear Programming is worthwhile, but is not essential. Similarly some familiarity with the use of computers would be helpful. For all but the simplest models you should also be familiar with the idea of summing over a range of variables. For example, if producej is used to represent the number of cars produced on production line j then the total number of cars produced on all N production lines can be written as:
N
producej
j=1
This says sum the output from each production line producej over all production lines j from j = 1 to j = N. If our target is to produce at least 1000 cars in total then we would write the inequality:
N
producej 1000
j=1
We often also use a set notation for the sums. Assuming that LINES is the set of production lines {1, . . , N}, we may write equivalently: producej 1000
jLINES
This may be read sum the output from each production line producej over all production lines j in the set LINES. Other common mathematical symbols that are used in the text are IN (the set of non-negative integer numbers {0, 1, 2, . . . }), and (intersection and union of sets), and (logical and and or), the allquantier (read for all), and (read exists). Computer based modeling languages, and in particular the language we use, Mosel, closely mimic the mathematical notation an analyst uses to describe a problem. So provided you are happy using the above mathematical notation the step to using a modeling language will be straightforward.
Constraint names start with an upper case letter, followed by mostly lower case (e.g. Prot, TotalCost). Data (arrays and sets) and constants are written entirely with upper case (e.g. DEM, JOBS, PRICE). The vertical bar symbol | is found on many keyboards as a vertical line with a small gap in the middle, but often confusingly displays on-screen without the small gap. In the UNIX world it is referred to as the pipe symbol. (Note that this symbol is not the same as the character sometimes used to draw boxes on a PC screen.) In ASCII, the | symbol is 7C in hexadecimal, 124 in decimal.
Preliminaries
Chapter 1
1.1
1.1.1
A rst formulation
Within limits, the joinery can vary the number of large and small chess sets produced: there are thus two decision variables in our model, one decision variable per product. What we want to do is to nd the best (i.e. optimal) values of these decision variables, where by best we mean that we get the largest prot. We shall give these variables abbreviated names: xs : xl : the number of small chess sets to make the number of large chess sets to make
The number of large and small chess sets we should produce to achieve the maximum contribution to prot is determined by the optimization process. In other words, we look to the optimizer to tell us the best values of xs, and xl. The values which xs and xl can take will always be constrained by some physical or technological limits. One of the main tasks in building a model is to write down in a formal manner the exact constraints that dene how the system can behave. In our case we note that the joinery has a maximum of 160 hours of machine time available per week. Three hours are needed to produce each small chess set, and two hours are needed to produce each large set. So if in the week we are planning to make xs small chess sets and
xl large chess sets, then in total the number of hours of machine time we are planning to use is: 3 xs + 2 xl where the 3 xs comes from the time making small sets, and the 2 xl from the time machining large sets. Note that we have already made some assumptions here. Firstly we have assumed that the lathe-hours to machine xs small sets is exactly xs times the lathe-hours required to machine one small set. This probably will not be exactly true in practice one tends to get faster at doing something the more one does it, so it will probably take a slightly smaller amount of time to machine the 2nd and subsequent sets than the rst set. But it is unlikely that this will be a very important effect in our small joinery. The second assumption we have made is much more likely to be inaccurate. We have assumed that the time for making small and large sets is the sum of the times for the sets. We have not allowed for any changeover time: resetting the lathes, cleaning up, getting different size tools etc. In some situations, the time that we lose in changeovers can be very large compared with the time we actually spend doing constructive work and then we have to resort to more complex modeling. But for the moment, we shall assume that the changeover times are negligible. Our rst constraint is: 3 xs + 2 xl 160 (lathe-hours) which says the amount of time we are planning to use must be less than or equal to the amount of time available, or equivalently we cannot plan to use more of the resource (time) than we have available. The allowable combinations of small and large chess sets are restricted to those that do not exceed the lathe-hours available. In addition, only 200 kg of boxwood is available each week. Since small sets use 1 kg for every set made, against 3 kg needed to make a large set, a second constraint is: 1 xs + 3 xl 200 (kg of boxwood) where the left hand side of the inequality is the amount of boxwood we are planning to use and the right hand side is the amount available. The joinery cannot produce a negative number of chess sets, so two further non-negativity constraints are: xs 0 xl 0 In a similar way, we can write down an expression for the total prot. Recall that for each of the large chess sets we make and sell we get a prot of $20, and one of the small chess set gives us a prot of $5. Assuming that we can sell all the chess sets we make (and note that this may not always be a reasonable assumption) the total prot is the sum of the individual prots from making and selling the xs small sets and the xl large sets, i.e. Prot = 5 xs + 20 xl Prot is the objective function, a linear function which is to be optimized, that is, maximized. In this case it involves all of the decision variables but sometimes it involves just a subset of the decision variables. Note that Prot may be looked at as a dependent variable, since it is a function of the decision variables. In maximization problems the objective function usually represents prot, turnover, output, sales, market share, employment levels or other good things. In minimization problems the objective function describes things like total costs, disruption to services due to breakdowns, or other less desirable process outcomes. Consider some possible values for xs, and xl (see Table 1.1). The aim of the joinery is to maximize prot, but we cannot select any combination of xs and xl that uses more of any of the resources than we have available. If we do plan to use more of a resource than is available, we say that the plan violates the constraint, and the plan is infeasible if one or more constraints is violated. If no constraints are violated, the plan is feasible. The column labeled OK? in the table tells us if the plan is feasible. Plans C and E are infeasible. In terms of prot, plan H looks good. But is it the best plan? Is there a plan that we have not considered that gives us prot greater than 1320? To answer this question we must move to the notion of optimization.
Table 1.1: Values for xs and xl xs A B C D E F G H 0 10 -10 53 50 25 12 0 xl 0 10 10 0 20 30 62 66 Lathe-hours 0 50 -10 159 190 135 160 130 Boxwood 0 40 20 53 110 115 198 198 OK? Yes Yes No Yes No Yes Yes Yes Prot 0 250 150 265 650 725 1300 1320 Notes Unprotable! We wont get rich doing this. Planning to make a negative number of small sets. Uses all the lathe-hours. There is spare boxwood. Uses too many lathe-hours. There are spare lathe-hours and spare boxwood. Uses all the resources Looks good. There are spare resources.
1.2
Linear Programming
We have just built a model for the decision process that the joinery owner has to make. We have isolated the decisions he has to make (how many of each type of chess set to manufacture), and taken his objective of maximizing prot. The constraints acting on the decision variables have been analyzed. We have given names to his variables and then written down the constraints and the objective function in terms of these variable names. At the same time as doing this we have made, explicitly or implicitly, various assumptions. The explicit assumptions that we noted were: For each size of chess set, manufacturing time was proportional to the number of sets made. There was no down-time because of changeovers between sizes of sets. We could sell all the chess sets we made. But we made many implicit assumptions too. For instance, we assumed that no lathe will ever break or get jammed; that all the lathe operators will turn up for work every day; that we never nd any aws in the boxwood that lead to some being unusable or a chess set being unacceptable; that we never have to discount the sale price (and hence the per unit prot) to get an order. And so on. We have even avoided a discussion of what is the worth of a fraction of a chess set is it a meaningless concept, or can we just carry the fraction that we have made over into next weeks production? All mathematical models necessarily contain some degree of simplication of the real world that we are attempting to describe. Some assumptions and simplications seem eminently reasonable (for instance, that we can get the total prot by summing the contributions of the individual prots from the two sizes); others may in some circumstances be very hopeful (no changeover time lost when we swap between sizes); whilst others may just be cavalier (all the lathe operators will arrive for work the day after the World Cup nals). Modeling is an art, not a precise science. Different modelers will make different assumptions, and come up with different models of more or less precision, and certainly of different sizes, having different numbers of decision variables. And at the same time as doing the modeling, the modeler has to be thinking about whether he will be able to solve the resulting model, that is nd the maximum or minimum value of the objective function and the values to be given to the decision variables to achieve that value. It turns out that many models can be cast in the form of Linear Programming models, and it is fortunate that Linear Programming (LP) models of very large size can be solved in reasonable time on relatively inexpensive computers. It is not the purpose of this book to discuss the algorithms that are used to solve LP problems in any depth, but it is safe to assume that problems with tens of thousands of variables and constraints can be solved with ease. So if you can produce a model of your real-world situation, without too many wild assumptions, in the form of an LP then you know you can get a solution. So we next need to see what a Linear Programming problem consists of. To do so, we rst introduce the notion of a linear expression. A linear expression is a sum of the following form A1 x1 + A2 x2 + A3 x3 +. . . +AN xN
Aj xj
j=1
where A1 , . . . , AN are constants and x1 , . . . , xN are decision variables. So for instance, if we have variables x, makeP and makeQ 2 x 3 makeP + 4 makeQ is a linear expression, but 2 x makeP 3 makeP + 4 makeQ is not, as the rst term contains the product of two variables. Next, we introduce the notion of linear inequalities and linear equations. For any linear expression N A xj and any constant B, the inequalities j=1 j
N N
Aj xj B and
j=1 j=1
Aj xj B
Aj xj = B
j=1
is a linear equation. So for example our lathe-hours constraint 3 xs + 2 xl 160 is a linear inequality, but 2 xs xl + 3 xs = 200 is not a linear equation because of the rst term, which is a product of two decision variables. Now, if we have decision variables x1 , x2 , x3 , . . . , xN , a linear expression C1 x1 + C2 x2 + C3 x3 +. . . +CN xN and a number of linear inequalities and linear equations Ai1 x1 + Ai2 x2 + Ai3 x3 +. . . +AiN xN Bi for i = 1, . . . , M1 Ai1 x1 + Ai2 x2 + Ai3 x3 +. . . +AiN xN = Bi for i = M1 + 1, . . . , M2 Ai1 x1 + Ai2 x2 + Ai3 x3 +. . . +AiN xN Bi for i = M2 + 1, . . . , M3 , then a Linear Programming problem is to
N
maximize or minimize
i=j N
Aij xj Bi for i = 1, . . . , M1
Aij xj = Bi for i = M1 + 1, . . . , M2
j=1 N
Aij xj Bi for i = M2 + 1, . . . , M3
j=1
and
The Bi are often called the right hand sides (RHS). So, for instance, the chess set model is a linear program as it has variables xs and xl and is to maximize subject to 5 xs + 20 xl 1 xs + 3 xl 200 (kg of boxwood) 3 xs + 2 xl 160 (lathe-hours) xs 0 xl 0
10
We have stressed the linearity condition, where the objective function and all of the constraints must be linear in the decision variables. But there are two further properties that we must have, Divisibility and Determinism. Divisibility means that in an acceptable solution any values of the decision variables are allowed within the restrictions imposed by the linear constraints. In particular, we are not constrained to accept only whole number (integer) values for some or all of the decision variables. We have already alluded to this, when we remarked on the debate as to whether a fraction of a chess set is worth something (or, more precisely, whether a fraction f of a chess set is worth exactly f times the worth of a whole chess set). The nal requirement we have of an LP problem is that it is deterministic all the coefcients in the constraints and the objective function are known exactly. Determinism is sometimes a very strong assumption, particularly if we are building planning models which extend some way into the future. Is it reasonable, for example, to assume that it will always take 7.5 days for the oil tanker to reach our renery from the Gulf? Or that all of the lathe operators will arrive for work every day next week? Problems where we must consider the variability in objective function coefcients, right hand sides or coefcients in the constraints are Stochastic Programming problems. We do not consider them in this book, because they are difcult to deal with, not because they are of little practical interest. In fact, it can be argued that all planning models have stochastic elements, and we will later demonstrate some methods for dealing with uncertainty in an LP framework.
1.3
1.3.1
When we were building our mathematical model we used the notation that items in italics (for example, xs) were the mathematical variables. The corresponding Mosel decision variables have the same name in non-italic courier font (for example, xs). Once the model has been dened, the objective function can be optimized and the optimal number of chess sets to make is obtained. Notice that the character * is used to denote multiplication of a decision variable by the constant associated with it in the constraint. Blanks are not signicant and the modeling language distinguishes between upper and lower case, so X1 would be recognized as different from x1. By default, Mosel assumes that all variables are constrained to be non-negative unless it is informed otherwise. There is therefore no need to specify non-negativity constraints on variables. It is possible to tell Mosel that variables are not non-negative: we shall see how to do this later.
11
Here are some notes on the perhaps non-obvious parts of the model. They follow the numbering in the model listing 1.2. All of the points will be elaborated later, so do not be overly concerned if you do not understand some point now. 1 and 7. We give the model a name. The end-model statement terminates the model. 2. We tell Mosel we shall be using the Xpress-MP Optimizer to maximize the problem. 3. We declare the make variables to be decision variables, Mosels mpvar variables. 4. The objective function and constraints are given here. 5. Here we tell Mosel to maximize the objective function Profit. 6. This part writes out the solution values. getobjval returns the optimal value of the objective function, while getsol(x) returns the optimal value of x.
1.3.2
The results
We shall see later how to run the Mosel model. Here is the output.
LP Solution: Objective: 1333.33 Make 0 small sets Make 66.6667 large sets
Considering the original model: maximize subject to 5 xs + 20 xl 1 xs + 3 xl 200 (kg of boxwood) 3 xs + 2 xl 160 (lathe-hours) xs 0 xl 0 we can check the answer. Mosel tells us that xl is the only non-zero variable, with value 66.6667. The prot is indeed 20 66. 6667 = 1333. 33. We can easily see that the amount of boxwood we use is 3 66. 6667 = 200, exactly what we have available; and the lathe-hours we use are 2 66. 6667 = 133. 3333, 66.6667 fewer than are available; and we satisfy the non-negativity constraints. Note that we do not use all the lathe-hours, but we do use all the boxwood. We may represent the solution to this problem graphically as in Figure 1.1. The grey shaded area is the feasible region. The values of the objective function Prot are marked with dotted lines.
xl
120
optimal solution
80
Profit
40
Profit Profit
=200 0
=160 0
=120
40
80 Lathe
120 Profit =
160
400
200 Profit =
240
800
xs
Boxwood
If we want to analyze the solution to this problem further, we may wish to obtain the constraint activities and their dual values (shadow prices), and also the reduced costs of the decision variables. We might add some more writing as follows to the Mosel model:
12
writeln("Activities/Dual Values") writeln(" Lathe: ", getact(Lathe)," / ", getdual(Lathe)) writeln(" Boxwood: ", getact(Boxwood)," / ", getdual(Boxwood)) writeln("Reduced Costs") writeln(" xs: ", getrcost(xs)) writeln(" xl: ", getrcost(xl))
The activity of a constraint is the evaluation of its left hand side (that is, the sum of all terms involving decision variables). The optimal solution only uses 133.333 lathe-hours, but all 200 kg of boxwood that are available. As the 160 available lathe-hours come from 4 machines that operate 40 hours per week, we could reduce the weekly working time to 35 hours (resulting in a total of 4 35 = 140 hours) without changing anything in the solution (Figure 1.2).
xl
120
optimal solution
80
Profit
=200
40
Profit Profit =160 0
=120
40
80 Lathe
120 Profit
160
=400
200
Profit =800
240
xs
Boxwood
If we modify the limit on the availability of boxwood, this will have an immediate effect on the solution: the dual value (also called shadow price) of 6.66667 for the boxwood constraint tells us that one additional unit (i.e. 1 kg) of boxwood will lead to an increase of the objective function by 6.66667, giving a total prot of $1340. Graphically, this may be represented as follows (Figure 1.3). The reduced cost values of the variables indicate the cost of producing one (additional) unit of every type of chess set: if we decided to produce one small chess set this would cost us 1.66667 more (in terms of resource usage) than what its sale contributes to the total prot. Or put otherwise, we need to increase the sales price of xs by 1.66667 to make small chess sets as protable as large ones. Figure 1.4 shows the effect on the solution when we increase the price of xs to 6.66667 (its break-even point): any point on the highlighted edge of the feasible region now leads to the same objective value of $1333.33, so we might choose to produce a small number of small chess sets with the same total prot.
1.3.3
Divisibility again
In the present example we are faced with the Divisibility problem mentioned earlier. In reality accepting fractional answers may be practical since a chess set that is not completed in one weeks production sched-
13
xl
120
optimal solution
80
Profit
40
Profit Profit
=200
=160
=120
40
80 Lathe
120 Profit
160
=400
200
Profit =800
240
xs
Boxwood
xl
120
optimal solutions
80
40
Prof Prof
40 80 Lathe 120 160 Prof it=8 0 200 Prof
it=2
000
it=1
600
240
xs
Boxwood
Prof
it=4 0
it=1
200
14
ule may be completed the following week. However, some optimization problems have variables that cannot be fractional in this way. Such problems require the techniques of Mixed Integer Programming, which we cover later (Chapter 3).
1.3.4
1.4
15
are not contradictory. These are the so called Irreducible Infeasible Sets (IIS) which good LP solvers can provide for infeasible problems. It is beyond the scope of this chapter to talk about how to apply IISs and we refer you to the Xpress-MP manuals for a full discussion. It has to be acknowledged that diagnosing infeasibilities is the hardest job in modeling and even the most experienced analyst sighs when faced with the Problem is Infeasible message from an optimization system. Since infeasibilities can arise from bad modeling or bad data there is no obvious rst place to look. Experienced modelers of course know that the data are the most likely things to be in error but even experienced modelers do make mistakes from time to time. There is one small crumb of comfort infeasibility has nothing to do with the objective function and is only inuenced by the constraints. Here are a few things to look for when you are facing an infeasible problem: Have I got the right sense of a constraint? (For instance, I may have put in a constraint when it should be a one; or an equality when an inequality would do.) Have I got the right ow direction for a ow variable (see Section 2.2)? (It is easy to get the sign wrong in ow balance constraints.) Have I got a non zero value for a resource availability? (Often missing data shows up us a zero value and if this turns into a zero right hand side for a resource availability we frequently get an infeasibility.)
1.5
Deployment
The problems of data accuracy and reconciliation are frequently the most difcult to tackle. By its very nature a model that attempts to capture the inuence of constraints coming from different parts of the organization will require the use of data that similarly have come from parts of the organization that may not normally communicate with each other. These data may have been collected in different ways, to different standards and indeed assumptions. The severe process of optimization, which by its nature will seek out extreme solutions if they exist, is very testing of the accuracy of data. Though one will try to use data that already exist in the organization one is sometimes faced with the problem of collecting primary data where existing data are just not adequate. Though we have posed the discussion above as a set of problems, a more reective view of the process of modeling and optimization shows that the thoughtful and critical analysis it requires is in fact one of its major benets. The integrative nature of a model requires that we have data of a consistent standard and consistent accuracy, ideals which any organization should strive for anyway. Of course, the most obvious benet of modeling and optimization is that we come up with a recommended answer which in some sense that we have dened gives us the best way of running the system
16
we are modeling. We may choose to reject the solution proffered and indeed there may be very good reasons for so doing. For instance a plan we are suggesting for tomorrow may differ radically in the set of tasks that are suggested but have almost the same objective function value as that we would get from doing exactly the same as we are doing today. In this case it makes perfect sense to forego a small amount of prot for the sake of continuity. The important thing, however, about a quantitative model is that we know how much prot we are foregoing and we can make a rational and informed decision, not just one based on hunch or intuition. We can get an idea of the sensitivity of our solution to the inevitable changes and variations in the data, which leads on to the idea of robust solutions, solutions which will in some sense remain good as the input data change. The nal major benet of modeling is that it enables us to understand the organization or part of the organization or system that we are studying in a more quantitative and demonstrably rational way, hopefully devoid of organizational politics. This understanding may lead us to consider ways of working or different processes that we have not considered before, which again might lead to considerable increase in protability or efciency. The boundaries of the model may then increase as we consider an enhanced system or start to consider the system evolving over time. One thing that is certain about models: as they develop and are worked upon they grow in size. At the advent of the personal computer, a Linear Programming model with 1000 constraints and perhaps 2000 decision variables was considered big, and in fact would probably not be solved on a PC. Now such a model would be considered to be small and models of one hundred to a thousand times that size are regularly solved. Not all of this size increase has come from expansions of the boundary of the typical model, most of it has come from the ability to solve models that have been disaggregated by considering subsets of machinery, or products, time periods, customer zones, labor categories etc. Models will continue to increase in size but it has to be admitted that the benets of models do not grow in proportion to the models size smaller models that capture the essence of the decision problem may give greater insights than bloated models where every factor is disaggregated to the most minute detail.
1.6
Data in models
The primary focus of this book is on the construction of clear, accurate and maintainable models, but we should pause to discuss the data that go into the model. One of the important characteristics of models is that they often bring together different aspects of the organization in an attempt to achieve an overall optimal solution. A consequence of this is that a model will often require data from many different sources, and there is a need for the accuracy of these data sources to be approximately comparable. There is little point in having some technological data accurate to 6 digits when some of the cost data have been derived from arbitrary accounting principles. In fact one of the major obstacles to successful modeling is the belief in many organizations that accounting data are accurate, whereas frequently much cost accounting data are derived from very questionable assumptions. Experienced modelers tend to be very distrustful of data in the initial stages of a project. By its very nature, optimization will nd extreme solutions, and it is very testing of the accuracy of data. In practice it often turns out that the original data have to be rejected and minor studies initiated with the objective of getting data of better quality. There is however a danger of over-stressing the need for accuracy in data when we should equally be thinking about the internal consistency of the data. As a perhaps extreme example, it would not affect our optimal policy (i.e. the values of the optimal decision variables) if all costs in a model were consistently underestimated by 50%. The value of the objective function of course would be wrong but the actions we propose would be correct. The problem comes when some sources of data are precise whilst others are consistently biased in some way. It is always best, if possible, to use data in their original format, rather than in some aggregated or disaggregated form, and to obtain data directly from the owner of the data, that is the person who is responsible for collecting the data and maintaining their accuracy. Such data will almost invariably be kept in a spreadsheet or a database system and so any high quality modeling system will have links to the popular spreadsheets and databases. That way the data can be extracted from the primary source, alleviating the danger of using out of date information. It is hard to make other than sweeping generalizations about the role of data gathering in LP modeling. Sometimes one is very fortunate and the data that the modeler requires are immediately available;
17
sometimes data of the required accuracy are just not present in the organization and the whole LP project has to be abandoned as the costs and time involved in gathering the primary data cannot be justied. Fortunately the latter is a rare event but the authors have found that most modelers consistently underestimate the time involved in acquiring good data.
1.7
18
Chapter 2
2.1
19
One might ask why have sendb5,Paris as a decision variable at all, as it is xed and there is no decision to make about its value?. If every day we always sent exactly 30 tonnes to Paris then it might be legitimate to remove this from the decision process, remembering to account for the resources that are used in the blend, the transport capacity that is used up in moving the blend, etc. But of course there will inevitably come a day when Paris needs more of Blend 5, and we have to spend time recalculating the resource availabilities, transport capacity etc., net of the new Parisian demand. We will get things wrong unless someone remembers to do the recalculation; and of course forgetting to redo the sums is likely when we are having to rejig our production plan because of the extra demands from other cities in France (it is Bastille Day tomorrow). What we gain by removing one variable from the model is not worth the risk arising from later inexibility. The last case, D, expresses the fact that sometimes a variable is not bound by the normal non-negativity constraint, and in this situation it is said to be free. Since, as we have mentioned before, all decision variables are by default assumed to be non-negative, we have to explicitly tell our modeling software that the decision variable here (which we shall call eow), denoting the ow from Britain to France where a positive value means that electricity is owing from Britain to France and a negative value means that it is owing in the reverse direction is not non-negative eow + In Mosel, this is indicated by the notation
eflow is_free
Free variables can be replaced by normal non-negative variables, e.g. eow = eowBF eowFB where eowBF (eowFB ) is the non-negative ow from Britain to France (respectively, France to Britain), but since optimization software can handle free variables directly there may be no reason to do this transformation. If, however, there is some asymmetry in the ows (perhaps a ow from Britain to France is taxed in some way by the French government, whereas a ow in the other direction is not taxed), the eowBF and eowFB variables may be required anyway by other parts of the model, so the substitution is harmless, or even necessary.
2.2
Flow constraints
Flow constraints arise where one has some sort of divisible item like electricity, water, chemical uids, trafc etc. which can be divided into several different streams, or alternatively streams can come together. Some word formulations might be A) I have got a tank with 1000 liters in it and 3 customers C1, C2 and C3 to supply. B) I buy in disk drives from 3 suppliers, S1, S2 and S3. Next month I want to have at least 5000 disk drives arriving in total. C) I have 2 water supplies into my factory, S1 and S2. I get charged by the water supplier for the amount of water that enters my site. I lose 1% of the water coming in from S1 by leakage and 2% of that from S2. My factory needs 100,000 gallons of water a day. Case A is where there is an outow from a single source, whilst case B is where we want to model a total inow. Case C is a little more complicated, as we have to model losses. In case A we have ow variables supply1 , supply2 and supply3 , being the amounts we supply to the three customers. The total amount supplied is the sum of these three decision variables i.e. supply1 + supply2 + supply3 , and this total must be less than or equal to the 1000 liters we have available. Thus we have supply1 + supply2 + supply3 1000 (providing we have dened the units of supply to be liters). Case B is very similar. The obvious decision variables are buy1 , buy2 and buy3 , and the total amount we buy is buy1 + buy2 + buy3 . Our requirement is for at least 5000 drives in total, so the constraint is buy1 + buy2 + buy3 5000 If we wanted exactly 5000 drives, then the constraint would be buy1 + buy2 + buy3 = 5000
20
Case C is more challenging. I have 2 water supplies into my factory, S1 and S2. I get charged by the water supplier for the amount of water that enters my site. I lose 1% of the water coming in from S1 by leakage and 2% of that from S2. My factory needs 100,000 gallons of water a day. There are several different ways we might approach the modeling. One way is to dene decision variables as follows: buy1 and buy2 are the amounts we buy from supplier 1 and 2 respectively, and get1 and get2 are the amounts that we actually get (after the losses). If we measure the decision variables in thousands of gallons, then we have the requirement constraint get1 + get2 = 100 and we can model the losses as follows (loss equations): get1 = 0. 99 buy1 get2 = 0. 98 buy2 since, for example, we only receive 98% of the water from supplier 2 that we have to pay for. Then the objective function would, among other entries, have terms PRICE1 buy1 + PRICE2 buy2 , where PRICE1 and PRICE2 are the prices per thousand gallons of water from the two suppliers. We have the option of using the loss equations to substitute for buy1 and buy2 (or, alternatively, get1 and get2 ), and doing so would reduce the number of equations and variables by 2. But as we have discussed before, it almost certainly is not worth the effort, and the LP solver should be clever enough to do the work for us automatically anyway if it thinks it will reduce the solution time.
2.3
21
Table 2.1: Technological coefcient matrix Resource 1 Product 1 Product 2 Product 3 ... Product P 1.28235 0.95474 12.33312 11.2322 Table 2.2: Simple technological coefcient matrix Connector Industry PC Home PC 8 5 Resource 2 Resource 3 ... Resource R 0.24 1.8361 6.128 0.8528 etc. 5.208
connectors. So in total if we make makeI Industrial computers and makeH Home computers we will use 8 makeI + 5 makeH connectors. This total must not be greater than the number available i.e. 8 makeI + 5 makeH 10000 In case B we said Each tonne of chemical C1 uses 50 grams of a rare catalyst and 1 kg of a certain ne chemical, whereas each tonne of chemical C2 requires 130 grams of the catalyst and 1.5 kg of the ne chemical. I can only afford to buy 10 kilograms of catalyst per month and I can only acquire 200 kg of the ne chemical each month. So we have two products and two resources.
Table 2.3: Resource use Catalyst C1 C2 50 130 Fine Chemical 1.0 1.5
We measure the catalyst in grams, and the ne chemical in kg. Dening decision variable make1 and make2 to be the number of tonnes of the two chemicals (C1 and C2) we plan to make, and using an argument similar to the one in case A), we get two constraints, one for the catalyst and one for the ne chemical. 50 make1 + 130 make2 1000 (catalyst) 1. 0 make1 + 1. 5 make2 200 (ne chemical) We have been careful to keep the units of measurement consistent. In general, we have one constraint for each resource, relating the amount we are planning to use to the amount available. Case C is now hardly challenging. If I do one unit of activity i it takes up COSTi of my disposable income. My disposable income next week is $150. The decision variables are doacti , the amount of activity i that I plan to do. Making the linearity assumption that if I do doacti units of activity i it costs me COSTi doacti , my total planned expenditure is i COSTi doacti and this can be no more than the money I have (assuming credit is not an option for me!). Then the constraint is COSTi doacti 150
i
2.4
22
flowin1
If the ow variables are measured in terms of mass or weight then we will have
MIN NOUT
L+
i=1
owini =
j=1
owoutj
A particular form of material balance constraint occurs when we are accounting for the ow of materials between time periods in a multi-time period model, that is, a model where we represent time as a series of intervals, not concerning ourselves with the details of when during an interval events happen. Suppose that we have a simple factory that only makes one product and that we are trying to decide the manufacturing levels (maket ) for the next NT periods, i.e. t ranges from 1 to NT. Another set of decision variables are sellt , the amount of the product that we decide to sell in time period t. If we have the possibility of storing product from one time period to the next time period we can introduce a further set of decision variables storet which are the amounts of product to have in stock (inventory) at the end of time period t. Let us consider the material balance in time period t. In words we can say the stock at the end of time period t is equal to the stock at the beginning of time period t, plus what we make, minus what we sell. We are faced with a slight problem now we do not know the decision variable for the stock at the beginning of time period t but we can see that, assuming there is no loss of stock, the stock at the beginning of time period t is the same at the end of time period t -1. So in different words, the previous statement can be phrased as the stock at the end of time period t is equal to the stock at the end of time period t 1, plus what we make in period t, minus what we sell in period t. In algebraic form this can be written stockt = stockt1 + maket sellt This is deceptively simple but it contains one aw: there is no time period preceding time period 1, so there is no stock0 variable. We need a special constraint that relates to time period 1 only, and says in words the stock at the end of time period 1 is equal to the opening inventory SINIT, plus what we make in time period 1, minus what we sell in time period 1, or in algebra stock1 = SINIT + make1 sell1 Other material balance constraints arise when we are talking about raw materials that we buy in from an outside supplier and use in our production process. A word description might be, for a particular raw material, the stock of the raw material at the end of time period t is equal to the stock at the end of time period t 1, plus the amount of the raw material that we buy in time period t, minus the amount of raw material that we use in making the products during time period t. Then considering one raw material we might have decision variables rbuyt , rstockt and ruset , so the constraints for all but the rst time period are rstockt = rstockt1 + rbuyt ruset We have to remember again that there is a special constraint for time period 1 as we already know the opening stock level in that period: it is what we have in stock right now. It is also likely that the ruset variables will be related to the decision variables in another part of the model which represent how much product we are going to make. If we have products indexed by p = 1, . . . , NP with technological coefcients REQpr , the number of units of raw material r required by 1 unit of product p, and decision variables makept denoting the amount of product p that we make in time period t, we can immediately write down an expression for the amount of raw material we use in time period t (ruset )
23
as ruset =
NP
REQpr makept
p=1
(see Section 2.3 Simple resource constraints above for an explanation of this). Since we have just written down an equation for ruset we might consider substituting for it in the constraint in which it occurs. This would generally not be a particularly good thing to do, but not particularly bad either. It would reduce the number of variables a little but we are probably going to have to use these variables somewhere else in the model anyway and so the substitution would have to take place everywhere the ruset variables appeared in the model. The model would certainly be less comprehensible, and consequently harder to maintain. A new form of material balance equations of the multi-period type occurs where we have xed demands for our product or products in the NT time periods. In other words, the selling decision variables (sellt in the example above) are xed. We have the choice of expressing this as a set of simple equality constraints with sellt variables e.g. sellt = MUSTSELLt or by substituting the sellt variables by MUSTSELLt everywhere they occur. This time the decision as to whether to substitute for the sellt variables is probably a matter of choice some modelers will eliminate variables while others might put in the simple equality constraint arguing that the sellt variables will probably at some stage in the future be of interest in themselves.
2.5
Quality requirements
Here are some word statements A) I cannot have more than 0.02% of sulphur in this gasoline. B) There must be at least 3% of protein in this dried apricot mixture. C) This foodstuff must have no less than 5% fat but no more than 10%. These sorts of quality requirements frequently occur when we are blending together various raw materials with differing properties to create a nal product. Typically each of the raw materials will come with a set of properties, for instance in foodstuffs it might be the fat content or the percentage of carbohydrates; in the petrochemical industry it might be sulphur content or the octane number. For some characteristics of the nal product we require that quality specications are adhered to. For bad things these are usually expressed as a maximum percentages; for desirable properties they will be expressed as a minimum percentage and other properties may have to lie between specied lower and upper bounds (perhaps so that the product has stability or other characteristics that we desire). An extreme form of the latter case is where we have to have an exact percentage of a particular characteristic in the nal product. Consider a number NR of raw materials and just one characteristic that we are concerned about in the nal product. Suppose that one unit of raw material r contains CONTr units of the characteristic (for instance CONT3 might be 0.1 if raw material number 3 is 10% fat and the characteristic we are considering is fat). As usual with LP we assume that we know the CONT data precisely. In many manufacturing processes it is reasonable to assume that the characteristic in the resulting end product comes from blending the raw materials linearly. For example if we blend together one kg of a gasoline with 0.01% sulphur and 1 kg of gasoline with 0.03% sulphur, then we will get 2 kg of the mixture with 0.02% sulphur. Whether this assumption of linearity is correct very much depends upon the physics or chemistry of the blending process and in some industries it certainly does not hold. However, making the assumption of linearity, we can see that the proportion of the characteristic in the nal product is given by total mass of constituents p = proportion = total mass of blend If the decision variables are ruser for the amount of raw material r to use, then we have p=
NR C ruser r=1 r NR ruser r=1
and we can apply the desired inequality (or equality) to this proportion. For instance, p 0. 1 (i.e. 10%) becomes NR C ruser r=1 r 0. 1 NR ruser r=1
24
At rst sight this does not seem like a linear inequality and indeed it is not as it is a constraint applying to the ratio of two linear expressions. However, by cross multiplying we can get the constraint into the form
NR NR
Cr ruser 0. 1
r=1 r=1
ruser
Note: we have to be careful when multiplying inequalities. The direction of the inequality is preserved if we multiply by a non-negative amount, but is reversed if we multiply by a negative amount. Here, we are multiplying both sides of the inequality by the sum of a set of non-negative variables, so the direction of the inequality is maintained. If we collect together two terms for each decision variable ruser we get the linear inequality
NR
(Cr 0. 1) ruser 0
r=1
2.6
totalcost =
i=1
rcosti
where rcosti = some_expressioni for i = 1 to 16. Obviously it is possible to eliminate the rcosti variables (the cost of operating region i) by substituting some_expressioni into the equation dening totalcost but it is very likely that we will want the costs of operating different regions to appear in some report, so we might as well let the LP system calculate the values of these variables for us. We call the rcosti variables accounting variables and the constraints that dene them accounting constraints. Whether you choose to use the LP system to do the accounting for you, or do them afterwards when producing reports, is a matter of taste. In the past, when LP systems were limited and one had to squeeze the problem into as few constraints as possible, it was obviously a good idea to eliminate accounting variables and then to calculate their values from the optimum values of the variables contributing to them. Now, where a few hundred extra constraints are of no consequence it is better to leave accounting variables and constraints in the model. There is however one subtlety that we must be aware of: it is possible that an accounting variable does not necessarily have to be non-negative. Suppose we had variables revenuei and expenditurei which were the revenue and expenditure of plant i. If we were to dene accounting variables proti and accounting constraints proti = revenuei expendi to pick up the values of the proti variables then we must remember that it is possible for a plant to have negative protability and so the proti variables must be declared as free variables (unless for some reason we have to run each plant in a protable mode). Forgetting that decision variables are by default non-negative is a common cause of error with accounting variables. However, if one just wants the LP system to do accounting for you, it is possible to add extra unconstrained linear expressions to a model, letting the LP system work out the value of the linear expression for you. It used to be the case that adding lots of these expressions could slow down the LP solution process, but modern solvers recognize such constraints and discard them during the solution process, only reinstating them when the rest of the LP has been solved.
2.7
Blending constraints
A very common use of LP modeling is to deal with the situation where we have a set of inputs each with certain percentages of different characteristics and we want to blend these inputs together to get a nal
25
product with certain desired characteristics. Blending typically falls into one of two major categories: either we use xed recipes where the proportion of different inputs is determined in advance (rather like the recipes you see in cookery books which specify the exact weights of the constitutes required to make a certain weight of cake) or we have variable recipes where it is up to us to decide, perhaps within limits, the proportions of the inputs that we are going to blend together. An example of a variable recipe might be in the manufacture of animal feed stuffs which can be made from a wide variety of different raw materials, not necessarily always mixed in the same proportions. An interesting example of recipes which pretend to be xed but in fact are variable are those found in books that tell you how to mix cocktails. They usually pretend that the proportions of gin, tequila, vermouth etc are xed, but of course anyone who has been in the position of having restricted stocks of any of these raw materials knows that within limits the recipes are very variable. Suppose we have 3 raw materials and the constraint in words is the ratios of raw material 1, raw material 2 and raw material 3 are 6:3:1. If we have decision variables raw1 , raw2 and raw3 representing the weight of the materials in the blend, then the total weight in the blend is raw1 + raw2 + raw3 and we have the constraints raw1 6 = raw1 + raw2 + raw3 10 raw2 3 = raw1 + raw2 + raw3 10 raw3 1 = raw1 + raw2 + raw3 10 These are ratio constraints, not linear equations, but as before we can convert them into linear equations by cross multiplying to get (1 0. 6) raw1 = 0. 6 raw2 + 0. 6 raw3 , i. e. 0. 4 raw1 = 0. 6 raw2 + 0. 6 raw3 The cross multiplication preserves the direction of the inequality since the denominator is always nonnegative. Similarly we get 0. 7 raw2 = 0. 3 raw1 + 0. 3 raw3 , and 0. 9 raw3 = 0. 1 raw1 + 0. 1 raw2 One of these equations is redundant as it is implied by the other two but it does no harm to put all three equations into the model. In fact it is probably a good idea to put all three equations down as inevitably at some time in the future we will have a fourth raw material and if we try to be too clever in eliminating redundant constraints we will forget that we have omitted a previously redundant equation, and make a mistake that will be hard to detect.
2.8
Modes
A generalization of blending constraints is where we have M inputs and N outputs which must be in strict proportions. As an example, this might be expressed as My 3 inputs have to be used in the ratio of 2 : 1.6 : 2.2 and they produce outputs of 1.6 of output 1 and 1.7 of output 2. So, for example we might put in 1 kg of input 1, 0.8 kg of input 2, and 1.1 kg of input 3, and get out 0.8 kg of output 1 and 0.85 kg of output 2. It is easy to see that if we have just one output then this is a simple xed ratio blending example. Such M-input/N-output constraints often arise where we have a plant that we can operate in different ways (modes), and the ratios differ for different modes. At any point in time, the plant can only be in one mode. Consider a very simple example, where we have 3 inputs, 2 outputs and 3 possible operating modes. We present the operating characteristics in the tables below, where we have dened a unit of a mode as 1 hour i.e. we have shown the kg of each input used, and output produced, by the plant. The decision variables are the number of hours the plant spends in each mode m, say usemodem . Then the usage of Input 1, for instance, is 20 usemode1 + 22 usemode2 + 24 usemode3 and the production of output 2 is 17 usemode1 + 20 usemode2 + 24 usemode3 .
26
Table 2.4: Fixed ratio blending example Quantities used/produced Mode 1 Mode 2 Mode 3 Input 1 Input 2 Input 3 Output 1 Output 2 20 16 22 16 17 22 14 21 15 20 24 13 18 14 24
In any given planning period we will also have a constraint on the total number of hours the plant spends in all the modes. For instance, if we are doing a weekly plan (168 hours), then we will have the constraint that usemode1 + usemode2 + usemode3 168 We are assuming that we can work at most 168 hours in the week, and that we do not lose any time changing from one mode to another. The latter assumption may be totally unrealistic for some plants, and if we cannot assume that change-over times are negligible then we have to use an Integer Programming formulation.
2.9
27
Panic variables do not just apply to resource availability constraints; they can also be added to demand constraints. For instance, we might have a constraint that a particular customer C has to have a total supply from our depots of 100 tonnes, modeled as owdC 100
dDEPOTS
If, however, it is just not possible to supply him then we may undersupply. There may be a contractual cost to doing this, in which case we know what the direct cost will be, or we might have some measure of the cost in terms of loss of goodwill (admittedly these costs are hard to estimate, and can be very subjective). If a panic variable is non-zero in an optimal solution, then we can infer one of two things: either we have put in too low a penalty cost, or we are truly being forced to use the panic variable to achieve feasibility. Rerunning the model with higher penalty costs will enable us to distinguish these cases. But in either case we have an implementable solution, and we are not left with an end-user staring at a computer screen wondering what on earth to do.
2.10
Objective functions
An objective function is not a constraint, but since it consists of a linear expression usually involving lots of variables its construction has many similarities to the process of building constraints. In fact, now we have so extensively covered modeling constraints there is little new to say about modeling an objective function. The objective is usually cost (when we minimize) or prot (when we maximize). Most LP systems minimize by default and the industry MPS standard for presenting an LP problem to an optimizer does not specify whether the objective is to be minimized or maximized, so everyone has at one time or another selected the wrong sense for optimization, and come up with a silly answer. One feels foolish, but it is usually obvious that a mistake has been made. Problems do exist where there is no objective function, and the LP optimizer is being used just to obtain a feasible solution, or to answer the question in a design study as to whether the constraints are too restrictive. But such problems are rare.
2.10.1
2.10.2
Obj =
j j
Nj xj Dj xj
Aij xj Ri
28
1 Dj xj
Dj d xj =
j
Dj y j
and into the normal LP constraints we can substitute for xj thus: Aij xj Ri
j
or (multiplied by d) d
j
Aij xj d Ri
or Aij d xj d Ri
j
i.e. or Aij yj d Ri
j
The resulting LP has variables d and yj . When it has been solved, the optimal values of the original xj variables can be recovered from the denition xj = yj / d. Note that we are in trouble if variable d can become 0. We also have to taken care if d is always negative, as the signs of the inequalities must be reversed when we multiply by d above.
29
Chapter 3
3.1
30
Special Ordered Sets of type 2 (SOS2 or S2): an ordered set of variables, of which at most two can be non-zero, and if two are non-zero these must be consecutive in their ordering. Why might some of these variables and sets, which collectively we call global entities, be used? We shall give a brief overview, and later we shall expand on these examples. Integer variables occur naturally, being most frequently found where the underlying decision variable really has to take on a whole number value for the optimal solution to make sense. If we are modeling the number of trains that leave a railway station in a half-hour interval, then the variable representing this number must take on an integer value it makes no sense to say that 11.23 trains are to leave. The idea of partial integers arose from a study where car engines in short supply were being allocated to different regions. Some of the regions were large, and took many engines, so it was permissible to round a solution saying the region should take 1654.19 engines to the integer value 1654. But for a regions taking only a few engines, it was not acceptable to round 6.32 engines to 6 engines. It is up to the decision maker to decide the limit L below which it is not acceptable to round a fractional answer to a nearby integer. The modeling system allows the decision maker to specify a different L for each partial integer variable, if so desired. So partial integers provide some computational advantages in problems where it is acceptable to round the LP solution to an integer if the optimal value of a decision variable is quite large, but unacceptable if it is small. Semi-continuous variables are useful where, if some variable is to be used at all, its value must be no less than some minimum amount. For example, in a blending problem we might be constrained by practical reasons either to use none of a component or at least 20 kg of it. This type of constraint occurs very frequently in practical problems. Semi-continuous integer variables often arise in shift planning modeling. If we are going to set up a machine, then we have to run it for a whole number of shifts, and in any case for at least some minimum number of shifts. For example, it might be possible only to run the machine for 0, or 12, 13, 14, ... shifts, with the case of running it for 1, 2, ..., 11 shifts making no economic sense. Special Ordered Sets of type 1 are often used in modeling choice problems, where we have to select at most one thing from a set of items. The choice may be from such sets as: the time period in which to start a job; one of a nite set of possible sizes for building a factory; which machine type to process a part on, etc. Special Ordered Sets of type 2 are typically used to model non-linear functions of a variable. They are the natural extension of the concepts of Separable Programming, but when embedded in a Branch and Bound code (see below Section 3.2) enable truly global optima to be found, and not just local optima. (A local optimum is a point where all the nearest neighbors are worse than it, but where we have no guarantee that there is not a better point some way away. A global optimum is a point which we know to be the best. In the Himalayas the summit of K2 is a local maximum height, whereas the summit of Everest is the global maximum height.) Theoretically, models that can be built with any of the entities we have listed above can equally well be modeled solely with binary variables. The reason why modern IP systems have some or all of the extra entities is that they often provide signicant computational savings in computer time and storage when trying to solve the resulting model. Most books and courses on Integer Programming do not emphasize this point adequately. We have found that careful use of the non-binary global entities often yields very considerable reductions in solution times over ones that just use binary variables.
3.2
31
infeasible. A binary or integer variable is taking a fractional value, a partial integer is below its critical limit and is fractional, or a Special Ordered Set condition is not satised. So we have to do something to move towards integrality. We introduce the notion of separation, which is most easily described in the case of an integer variable. Suppose one particular integer variables (say, variable v) optimal value in the LP solution is 12.3. Then the obvious remark that in a solution either v 12 or v 13 leads us to separate the initial problem into two sub-problems, one with the added constraint v 12 (call this the down branch) and the other with the added constraint v 13 (call this the up branch). If we can solve both sub-problems, then the better of the two solutions gives us the solution to the original problem. In other words, we have separated the original problem into two subproblems. We note that since each sub-problem is more constrained than the original problem, the solutions to the sub-problems will certainly be no better than the solution to the original problem. What do we do now? We have replaced solving the original problem by the task of solving two subproblems. So for both of the sub-problems we again apply the idea of relaxation, i.e. drop the discreteness conditions and solve as LP problems. At rst sight, this seems like nonsense we have replaced solving one problem by having to solve two sub-problems. However, there is a good argument why the two sub-problems should naturally be more integer than the original problem, where by integer we mean more likely to have an integer solution to the LP relaxation. In the LP solution to the original problem variable v wants to take the value 12.3, but in the two sub-problems we force it away from that value. So in the LP solution of the down branch sub-problem we will have v = 12 and in the LP solution of the up branch we will have v = 13. In both cases one of the previously fractional variables is taking an integer solution, so in some very vague way we can see that the sub-problems are naturally more integer than the original problem. However, the LP relaxation solutions to the sub-problems may still be integer infeasible, but now we know what to do. We apply the idea of separation again, selecting an integer infeasible variable. So the B&B process consists of successively separating on (branching on) variables which are not satisfying their discreteness condition, thereby creating two new sub-problems every time we separate. We can represent this as a tree, drawn upside-down in the usual computer science manner.
Obj = 112 v = 12.3
1
v 12 v 13
2
w 8 w 2
3
Obj = 128 (cut off)
7
infeasible
6
Obj = 120
5
Obj = 120 (cut off)
The nodes of the tree represent the solution of the LP relaxation. Beside each node we have written the value of the objective function of the LP relaxation at the node. Note that we assume we have been solving a minimization problem, so the values of the objective functions get worse (bigger) as we go down a branch of the tree, as we are continuously adding new constraints. If the LP solution at a node is integer feasible, we stop exploring down from that node, otherwise we separate on one of the integer infeasible variables, creating two descendant nodes. If the LP at a node is infeasible, we cannot continue from that node as adding constraints to an already infeasible problem will only make it more infeasible, and no descendant can possible give us a feasible integer solution. If in the course of the search we nd an integer solution, we may be able to exploit this fact through the notion of fathoming. In the gure above, we nd an integer solution with value 120 at node 6. Looking at node 3 we observe that adding constraints will only make its descendants have objective function values worse than 128, but we already have a solution with value 120. So we do not need to look at any descendants of node 3: it has been fathomed or cut-off. Similarly, node 5 is fathomed. And node 7 is fathomed by the fact that it is infeasible.
32
If we are fortunate and nd an integer solution early in the search, then you can see that a very large fraction of the possible nodes may be fathomed, and we will not have to search the entire tree. But if there are N discrete variables, in theory we might have to generate nearly 2N nodes, and thus have to solve that many LP problems, a formidable task. As you can see, there are three main decisions to make when doing a B&B search 1. which of the outstanding nodes to select for solving by LP (the node selection strategy) 2. which of the fractional integer variables to select for separation (the variable selection strategy) 3. which direction to branch on rst when you have separated (the branching direction strategy) Though any way of making these decisions will work in theory, since B&B is guaranteed to nd the optimal integer solution, given long enough time, the practical effectiveness of a B&B algorithm depends crucially on making the decisions correctly. In many cases it is best to leave the choice to the IP solver; however there is some opportunity for the modeler to inuence the solution process by passing knowledge of the semantics of the model to the out-of-the-box solver: often it is helpful to assign branching priorities to decision variables if the values of certain (sets of) variables have a strong impact on the rest of the solution (for instance, if we need to decide whether to open a factory and how much to produce there in different time periods, the decision on the opening should usually be made rst). The modeler may also indicate preferred branching directions for single variables (up or down branch rst) if he has some intuition of the value a variable is likely to take in the solution. Like other solvers, Xpress-MP has a set of default strategies which have been found to work well on most problems. However, the user should note carefully that sophistication in modeling is important in large scale MIP work. Theoretical developments in the last two decades have lead to insights as to how best to model IP problems, and how to choose between alternative formulations. We cannot over-stress the point that a good formulation can often speed an IP search by orders of magnitude.
3.3
3.3.1
Do/dont do decisions
The most common use of binary variables is when we are modeling activities that either have to be done in their entirety or not done at all. For instance, we might want to model whether we drive a particular truck between city A and city B on a particular day. In this case we either do drive the truck or we do not drive the truck at all: there are just two options. Typically we model the option of doing something by having a binary variable being equal to 1, and the option of not doing the thing with the binary variable being equal to 0. Thus we just have two choices, of which we must select one. Associated with the activity and with its binary variable, there may be some other properties. Suppose for instance we are considering what we do with the three trucks that we own. Truck 1 has a capacity of 20 tonnes, truck 2 has a capacity of 25 tonnes and truck 3 has a capacity of 30 tonnes. If on a particular day we decide to send truck 1 to a customer then we either send the entire truck or we do not send the entire truck. So we might have a decision variable (a binary variable) send1 taking the value 1 if we send truck 1 out or 0 if we do not send truck 1. Similarly we will have another binary variable send2 which is 1 if truck 2 goes out and 0 otherwise; and variable send3 taking on the value 1 if truck 3 goes out, and 0 otherwise. Elsewhere in the model we will probably be interested in the total tonnage that goes out on that particular day and we can see that this is 20 send1 + 25 send2 + 30 send3 because if truck 1 goes out (send1 = 1) it takes 20 tonnes, if truck 2 goes out it independently takes 25 tonnes, and if truck 3 goes out it carries 30 tonnes, so the total is 20 send1 + 25 send2 + 30 send3 . Suppose that we have a decision variable called out which gives the total tonnage leaving our depot on that particular day. Then we have the equation out = 20 send1 + 25 send2 + 30 send3
33
3.3.2
Logical conditions
To show many uses of binary variables we will take as an example a set of projects that we may or may not decide to do. We shall call the projects rather unimaginatively A, B, C, D, E, F, G and H and with each of these projects we will associate a decision variable (a binary variable) which is 1 if we decide to do the project and 0 if we decide not to do the project. We call the corresponding variables a, b, c, d, e, f, g and h. So decision variable a taking on the value 1 means that we do project A, whilst a taking on the value of 0 means that we do not do project A. We are now going to express some constraints in words and see how they can be modeled using these binary variables.
The next word constraint we consider is if we do project A then we must not do project B. How might we set about modeling this? The way to think of it is to notice that the property of notdoing B can be modeled very easily when we already have a binary variable b representing doing B. We invent a new variable b=1b
34
where b represents the doing of project B i.e., the project not doing B. If b = 1 then b = 0 (in other words, if we do project B then we do not do not B) whereas if b = 0 then b = 1 (if we do not do project B then we do project B). This is very convenient and b is called the complement of b. We can use this trick frequently. Just above we learned how to model if we do A then we must do B and now we are trying to model if we do A then we must not do B, i.e. if we do A then we must do B. As if we do A then we must do B was modeled by b a we can immediately see that the constraint if we do A then we must do B can be obtained by replacing b by b in the constraint, in other words b a. Replacing b by 1 b we get 1ba or 1a+b or alternatively a+b1 Now that we have obtained this constraint, it is quite obvious. What it says is that if we do project A (a = 1) then b must be 0. This is exactly what we wanted to model. The point of the somewhat long-winded argument we showed above, however, is that we have used the result from the rst logical constraint that we wanted to model, plus the fact that we have now introduced the notion of the complement of the project, to build up a newer and more complicated constraint from these two primitive concepts. This is what we will do frequently in what follows. We see an example of this by trying to model the word constraint if we do not do A then we must do B, in other word, if not A then B. We can go back immediately to our rst logical constraint if we do A then we must do B which was modeled as b a. Now we are actually replacing A by not A, so we can see immediately that our constraint is b1a which is a+b1 Again this constraint is obvious now that we have got to it. If we do not do A then a = 0, so b 1 and since the maximum value of b is 1 then this immediately means that b = 1. Again we have just taken our knowledge of how to model if A then B and the notion of the complement of a variable to be able to build up a more complex constraint. The next constraint to consider is if we do project A we must do project B, and if we do project B we must do project A. We have seen that the rst is modeled as b a and the second as a b. Combining these two constraints we get a=b in other words projects A and B are selected or rejected together, which is exactly what we expressed in our word constraint.
35
so that if either b = 1 or c = 1, then we necessarily have a = 1. A harder constraint to model is the following if we do both B and C then we must do A. How might we model this? One way to think about it is to express it in the following way: if we do both B and C then we must not do not-A, or, we can do at most two of B, C or not-A which we would model as b + c + (1 a) 2 or in other words b+ca1 or perhaps more conventionally ab+c1 Looking at this last inequality, we can see that there is no effect on a when b and c are 0, or when just one of b and c is 1, but a does have to be 1 when both b and c are 1. A binary variable having to be greater than or equal to 1 means that the binary variable has to be precisely 1.
1 The biggest value that the expression inside the parentheses can take is 3, if b = c = d = e = 1. The 3 in front of the parenthesis means that in the worst case a must be 1 (so a is equal to 1). But we must verify that the constraint is true if, say, just b = c = 1 (and d and e are equal to 0). In this case we have that a 1 (1 + 1 + 0 + 0 1) i.e. a 1 . But since a can only take on the values 0 or 1 then the constraint 3 3 1 a 3 means that a must be 1. This is exactly what we want.
We can generalize this to modeling the statement if we do M or more of N projects (B, C, D, ...) then we must do project A by the constraint a b + c + d+. . . M + 1 NM+1
So far we have only given one way of modeling each of these constraints. We return to the constraint if we do B or C then we must do A which we modeled as two constraints a b and a c. It is possible to model this with just one constraint if we take this as a special case of the M or more from N constraint we have just modeled. If we do B or C then we must do A is the same as if we do M or more of N projects (B, C, D, ...) then we must do project A with M = 1 and N = 2. So the constraint is a b+cM+1 i.e. NM+1 b+c1+1 a i.e. 21+1 1 a (b + c) 2
So this single constraint is exactly the same in terms of binary variables as the two constraints which we produced before. Which of these two representations is better? In fact the representation in terms of two constraints is better. But both of the two are correct and both will give a correct answer if put into an Integer Programming system. It is just that the rst pair of constraints will in general give a solution more rapidly. More and more complicated constraints can be built up from the primitive ideas we have explored so far. Since these more complicated constraints do not occur very frequently in actual practical modeling we shall not explore them further. Table 3.2 summarizes the formulations of logical conditions we have seen in the different paragraphs of Section 3.3.2.
36
Table 3.2: Formulation of logical conditions using binary variables At most one of A, B,...,H Exactly two of A, B,...,H If A then B Not B If A then not B If not A then B If A then B, and if B then A If A then B and C If A then B or C If B or C then A If B and C then A If two or more of B, C, D or E then A If M or more of N projects (B, C, D, ...) then A a+b+c+d+e+f +g+h1 a+b+c+d+e+f +g+h=2 ba b=1b a+b1 a+b1 a=b b a and c a b+c a a b and a c 1 or alternatively: a 2 (b + c) ab+c1 1 a 3 (b + c + d + e 1) a b+c+d+...M+1 NM+1
3.3.3
We can see that the column headed b3 = b1 b2 ? is true if and only if we have a Yes in the three columns b3 b1 ?, b3 b2 ? and b3 b1 + b2 1?, so the three linear equations do exactly represent and are true at exactly the same time as the product is true. This is a particularly long winded way of demonstrating the equivalence of the product term and the three linear equations and in fact now we have got it it is actually quite easy to see why these three inequalities are correct. Since b3 is b1 multiplied by something that is less than or equal to 1, b3 will always be less than or equal to b1 and by a similar argument b3 will always be less than or equal to b2 . The only further case we have to consider is when both b1 and b2 are equal to 1 and then we have to force b3 to be equal to 1. This is done by the constraint b3 b1 + b2 1 which is non restrictive if only one or none of b1 and b2 are 1 but forces b3 to be 1 when b1 = b2 = 1. Looking at the constraint this way immediately enables us to model for instance b4 = b1 b2 b3 , in other words the product of three variables, as the four constraints b4 b1
37
b4 b2 b4 b3 b4 b1 + b2 + b3 2 If any of b1 , b2 and b3 are 0 then b4 must be 0 but if b1 , b2 and b3 are 1 then b4 must be greater than or equal to 3 2, i.e. b4 must be greater than or equal to 1 so b4 must be 1.
3.3.4
x2
c2
L
Z= 5
7 Z=
3 Z=
Point L (x1 = 0, x2 = 3. 5, Z = 3. 5) is a local optimum. Point G (x1 = 3, x2 = 3, Z = 3) is the global minimum. We can model this with one additional binary variable b. 2 x1 + x2 6 b x1 + 2 x2 7 (1 b) To show that this is true, we just have to consider the two cases: b=0: b=1: 2 x1 + x2 + x3 0 2 x1 + x2 + x3 6 x1 + 2 x2 + 3 x3 7 x1 + 2 x2 + 3 x3 0 Constraint 2 is satised Constraint 1 is satised
Z= 1
2
G
4 6 8
x1
c1
Figure 3.2: Example of either/or constraints
3.4
38
3.4.1
General integers
Consider an integer variable v which must take a value between 0 and 10. We could replace this integer variable with four binary variables b1 , b2 , b3 , and b4 everywhere in the model using the expression v = b1 + 2 b2 + 4 b3 + 8 b4 remembering that we also have to have the constraint b1 + 2 b2 + 4 b3 + 8 b4 10 This is the binary expansion of v. It has the major disadvantage that we now have four global entities rather than just one global entity. Furthermore, a particular integer value of v, for example 6, can be achieved by many fractional settings of the binary variables. For instance, v = 6 can be achieved by {b1 = b2 = b3 = 0, b4 = 0. 75} or {b1 = 0, b2 = 1, b3 = 1, b4 = 0}, and there are a host of other possibilities. Thus even though v is integer it can be achieved by fractional values of the binary variables and these fractional values would force our integer programming code to do more branching. Since all commercial integer programming codes allow one to use general integer variables, and with the disadvantage of expanding integers in terms of binary variables, it is usually silly to use binary variables where we really have an underlying integer.
3.4.2
Partial integers
We will postpone the demonstration of how to model partial integer variables in terms of binaries until later (Section 3.5.3), when we have discussed linking binary variables and real variables.
3.4.3
Semi-continuous variables
Suppose we have a semi-continuous variable s which can take on either the value 0 or any value between some lower limit L and some upper limit U. If we introduce a binary variable b then we can represent the semi-continuity of s by the following pair of constraints Lbs sUb We shall see why this is true. There are two cases to consider. Either b = 0, in which case s is constrained to be 0, or b = 1, in which case s is constrained to lie between L and U. These are exactly the two conditions that we want to impose. Why are semi-continuous variables useful? It seems a very small penalty just to have to replace a semicontinuous variable by one extra binary variable. The answer is that the semi-continuous property may be satised by the variable s, but if we introduce a binary variable the integrality of that binary variable may not be satised. Consider the case where s either has to take on the value 0 or it has to take on a real value in the range between 5 and 10. Suppose that we solve the LP relaxation and we get a value for s of 7.5 and we get a value of b of 0.75. This certainly satises the two inequalities but the branch and bound search would note that the binary variable was not satised (it is not either 0 or 1) and so we would have to go on branching and bounding. But the underlying semi-continuity of s is satised; s does indeed lie between its lower bound 5 and its upper bound 10 and so we would not have to branch any further on the s. Thus not having semi-continuous variables in the modeling language or in the optimizer can lead to more branching and bounding in the branch and bound search, and indeed if you need to use semi-continuous variables you should look for an optimizer that has these built into it.
3.4.4
39
Clearly since these are binary variables adding up to 1, only one of them can be 1 and one of them must be 1 So the SOS1 property applies. If that was all there was to special ordered sets then it would not be much of an invention. But in fact there is rather more that can be said because we have forgotten about the word ordered; in the denition. Suppose that the capacity of the various options for the factories are Small 10,000 tonnes, Medium 20,000 tonnes, Big 38,000 tonnes and of course the No factory has 0 tonnes capacity. One of the things we will be interested in is the selected capacity of the factory that we will be building, and somewhere in the model we would have a decision variable size and an equation size = 0 bN + 10000 bS + 20000 bM + 38000 bB . We can use the coefcients in this equation (which we call the reference row) to order the variables. The order emerging is bN , bS , bM , bB where we have ordered them by their coefcients in the Reference Row. Now suppose that we have solved the linear programming relaxation and got the following solution: bN = 0. 5, bS = 0, bM = 0, bB = 0. 5 indicating that we are going to build half of the 0 sized factory and half of the big factory (remember these are the values of the LP relaxation where we have relaxed the integrality of the binary variables).
bN = 0.5, bB = 0.5
1
bN 0 and bS 0 (size 20,000) bM 0 and bB 0 (size 10,000)
The branch and bound search will look at that solution and say that there are only two fractional variables bN and bB and so it will branch on one or other of those variables. But there is a lot more information in the variables than the fact that they are fractional or not fractional. We are being told by the LP solution that the tonnage that we require from that factory is a half of the biggest one: in other words 19,000 tonnes. Now consider branching on, say, bN . Either we are forcing the factory to have zero capacity if we branched on bN up to 1, or we are forcing the factory to be open. It would be much better to have some branching scheme that understood and tried to exploit the fact that the indicated capacity is about 19,000 tonnes. This is precisely what the special ordered set property indicates to the branch and bound tree, and the branching occurs on sets of variables rather than on the individual variables which form the Special Ordered Set. The details of precisely how to branch on sets of variables rather than individual variables are outside the scope of this chapter. It is, however, an observed fact that modeling these selection constraints in terms of Special Ordered Sets generally gives a faster branch and bound search. Again as with the case of general integer variables, the solution we get will be exactly the same whichever way we model. The only benet of using Special Ordered Sets is that the search procedure will generally be noticeably faster.
3.4.5
x=
i=1
Ri yi (reference row)
40
F 2 F 4 F 1 F 3 F 5
b1
b2
b3 b4
R1
R2
R3
R4
R5
weights:
f=
i=1 5
Fi yi
yi = 1 (convexity row)
i=1
The SOS2 property of having at most two non-zero yi , and if there are two non-zero then they must be adjacent, means that we are always on the piece-wise linear function. If we did not have the adjacency condition, then by having, say, y1 = y3 = 0. 5 (all the others 0) we could cheat at x = R2 as the function value is not F2 but (F1 + F3 ) / 2, considerably lower (see Figure 3.5).
F 2 F 4 F 1 F 3 F 5
b1
b2
b3
b4
R1
R2
R3
R4
R5
Consider the constraints y1 b1 y2 b1 + b2 y3 b2 + b3 y4 b3 + b4 y5 b4 b1 + b2 + b3 + b4 = 1 The last constraint ensures that one and only one bi is 1 in an acceptable solution. For instance, if b3 is 1, the constraints on the yi ensure that y1 = y2 = y5 = 0, leaving only the adjacent y3 and y4 to be (possibly) non-zero. The other case to consider is when one of the end bi is 1, say b1 . Then y3 = y4 = y5 = 0, and y1 and y2 , which are adjacent, can be non-zero. So the constraints ensure the SOS2 property, at the expense of introducing N 1 additional binary variables if there are N points.
41
The same remarks that applied to a reduction in the search times with SOS1 applies to SOS2. It is found in practice that branching on subsets of the variables within a SOS2, rather than on the individual binary variables, is generally benecial.
3.5
3.5.1
Cost
C
XMAX
Here x represents the throughput of the piece of equipment and the cost consists of two parts. If the throughput is zero then the cost is zero, whereas if the throughput takes a value which is different from 0 then the cost is Cost = K + C x, where C is the per unit cost of output x. We introduce a binary variable b which is equal to zero if x is equal to zero and equal to 1 if x is strictly greater than zero. Then the cost equals b K + C x, but we have to ensure that if b is zero then x is zero. We can do this by introducing the constraint x Xmax b where Xmax is the largest value that x can take. We shall see why this is correct. If b = 0 then x is constrained to be less than or equal to zero and so x is zero, whereas if b = 1 we just have the constraint that x Xmax , i.e. that x is not more than its maximum value (which might be for instance the maximum output of that particular piece of equipment).
3.5.2
Counting
A frequent use of binary variables in modeling is where we wish to be able to count whether a real variable x is different from 0. Often we want to have a constraint that only a certain number of real variables are strictly greater than 0. An example might be where we have a whole variety of different ingredients that could go into a blend and we have a constraint that perhaps at most 10 of these ingredients can actually go into the blend. If the quantity of item i going into the blend is xi and we require no more than 10 of these to be non zero, for each item i we introduce a binary variable bi and have constraints of the form xi VOL bi where VOL is the volume of the blend to be made. These constraints ensure that if a particular xi is greater than zero then the corresponding bi must be equal to 1. Then the constraint that says that no more than 10 of the ingredients must be non zero could be expressed as
10
bi 10
i=1
42
3.5.3
3.5.4
Cost
COST2
COST3
COST1
B1
B2
B3
In the gure we see that if we buy a number of items between 0 and B1 then for each item we pay an amount COST1 , whereas if the quantity we buy lies between B1 and B2 we pay an amount COST2 for each item. Finally if we buy an amount between B2 and B3 then we pay an amount COST3 for each item. For the sake of concreteness we assume that if we order exactly B1 items then we get the unit price COST2 , whereas if we order just a little less than B1 then we would get the unit price COST1 , and similarly for all the other price breaks. This sort of pricing is called all item discount pricing. To model these item price breaks we should use binary variables b1 , b2 and b3 , where bi is 1 if we have bought any items at a unit cost of COSTi .
43
Now introduce the real decision variables x1 , x2 and x3 which represent the number of items bought at price COST1 , COST2 and COST3 respectively. Note that we cannot buy any items at price COST2 until we have bought the maximum number of items at the higher price COST1 , otherwise the solution would be easy as we buy all items at the least expensive unit price! The total amount x that we buy is given by x = x1 + x2 + x3 We claim that the following set of constraints models the all-item discounts. B1 b2 x1 B1 b1 (B2 B1 ) b3 x2 (B2 B1 ) b2 x3 (B3 B2 ) b3 b1 b2 b3 (3.5.1) (3.5.2) (3.5.3) (3.5.4)
Equations (3.5.1) say that if we have bought any in the second price range (b1 = b2 = 1) then x1 is xed to B1 . Equations (3.5.2) ensure that if b2 = 0, then x2 = 0, whereas if b2 = 1 then x2 is only constrained by the maximum amount that can be bought at the price COST2 . Equation (3.5.3) ensures that x3 = 0 if b3 = 0, and that if b3 = 1 then we cannot buy more than the maximum number at price COST3 . Equations (3.5.4) ensure that we can only buy at a lower price if we have bought at all the higher prices.
Cost
COST3
COST2
COST1
B1
B2
B3
Now consider Figure 3.8 which represents the situation where we are buying a certain number of items and we get discounts incrementally. The unit cost for items between 0 and B1 is C1 , whereas items between B1 and B2 cost C2 each, and items between B2 and B3 cost C3 each. We can model this using Special Ordered Sets of type 2 (SOS2). At the points 0, B1 , B2 and B3 we introduce real valued decision variables wi (i = 0, 1, 2, 3). We also dene cost break points CBPi that correspond to the total cost of buying quantities 0, B1 , B2 and B3 . So CBP0 = 0 CBP1 = C1 B1 CBP2 = CBP1 + C2 (B2 B1 ) CBP3 = CBP2 + C3 (B3 B2 ) We then have w0 + w1 + w2 + w3 = 1 TotalCost = 0 w0 + CBP1 w1 + CBP2 w2 + CBP3 w3 x = 0 w0 + B1 w1 + B2 w2 + B3 w3 and the wi form a SOS2 with reference row coefcients given by the coefcients in the denition of x. For a solution to be valid, at most two of the wi can be non-zero, and if there are two non-zero they must be contiguous, thus dening one of the line segments.
3.5.5
44
Suppose we have some upper bound U on the value of x. Then consider the following constraints yx y x U (1 b) y Ub (3.5.5) (3.5.6) (3.5.7)
If b = 0, then (3.5.7) means that y = 0. If b = 1, then (3.5.7) is harmless, and we have y x from (3.5.5) and y x from (3.5.6), i.e. y = x, which is what is desired.
3.6
45
Chapter 4
Quadratic Programming
Quadratic Programming (QP) is the name given to the problem of nding the minimum (or maximum) of a quadratic function of the decision variables subject to linear equality or inequality constraints. Note that QP problems do not allow quadratic terms in the constraints, only in the objective function. QP problems occur much less frequently than LP or MIP problems, so we shall not discuss them in much depth. Mixed Integer Quadratic Programs (MIQP) are QPs where some or all of the decision variables have to take on discrete values; in other words, they are MIPs with a quadratic objective function. The discrete constraints can be any of the global objects that we have seen above (binaries, integers, etc.) Since QPs are just LPs with quadratic objective functions, the only thing special to note is modeling the objective function. We now give two typical examples.
4.1
Revenue optimization
If a company wishes to plan the amount q of a product to be sold, and at the same time determine the unit price p at which it is to be sold, then the objective function will contain a quadratic term p q, which is the revenue (price quantity) from selling the product.
4.2
Portfolio optimization
Portfolio optimization is the classic example of QP. Given various opportunities (assets) in which an investor can place his money, the problem is to minimize the risk of achieving a given level of return. The problem explicitly takes into account the fact that overall risk is not just the sum of the riskiness of the individual assets, as their future performances are highly likely to be correlated: shares tend to go up and down together, and shares in a particular sector tend to be highly correlated. The past variability of a shares price movements can be considered a measure of its risk. We shall take a small example. Suppose we have B 1 million to invest in three stocks. Let Ri be the random C variable representing the annual return on B 1 invested in stock i. Analysis of historical data has lead us C to estimate the returns as E(R1 ) = 0. 09, E(R2 ) = 0. 07, and E(R3 ) = 0. 06 where E(x) denotes the expectation of x. The variance of the annual returns have been estimated as var(R1 ) = 0. 20, var(R2 ) = 0. 07, and var(R3 ) = 0. 15, and the covariances as cov(R1 , R2 ) = 0. 03, cov(R1 , R3 ) = 0. 04, cov(R2 , R3 ) = 0. 05. If xi is the number of (millions of) Euros invested in stock i, then the annual return is x1 R1 + x2 R2 + x3 R3 and the expected annual return is x1 E(R1 ) + x2 E(R2 ) + x3 E(R3 ) If we are seeking a return of at least 7.5%, we must have 0. 09 x1 + 0. 07 x2 + 0. 06 x3 0. 075 and the constraint that says we spend all the money x1 + x2 + x3 = 1
46
The variance of the portfolio, which we want to minimize, is var(x1 R1 + x2 R2 + x3 R3 ) = var(x1 R1 ) + var(x2 R2 ) + var(x3 R3 ) +2 cov(x1 R1 , x2 R2 ) + 2 cov(x1 R1 , x3 R3 ) +2 cov(x2 R2 , x3 R3 ) =
2 2 2 x1 var(R1 ) + x2 var(R2 ) + x3 var(R3 )
+0. 06 x1 x2 + 0. 08 x1 x3 + 0. 10 x2 x3 The usual non-negativity constraints apply to the xi . So we have a QP: the objective function has quadratic terms (there are no linear terms, which are allowable in a general QP), and we have linear (in)equalities.
4.3
Quadratic Programming
47
49
Table 4.1: Classication in order of appearance (Chapters 6 and 7) Problem name and type A-1 Production of alloys Blending problem Difculty * Features formulation of blending constraints; data with numerical indices, solution printout, if-then, getsol formulation of blending constraints; data with string indices, as, formatted solution printout, use of getsol with linear expressions, strfmt formulation of blending constraints; sparse data with string indices, dynamic initialization, dynamic arrays, finalize, create, union of sets ceil, is_binary
**
A-4 Cane sugar production Minimum cost ow (in a bipartite graph) A-5 Opencast mining Minimum cost ow A-6 Production of electricity Dispatch problem B-1 Construction of a stadium Project scheduling (Method of Potentials)
** ** ***
encoding of arcs, solving LP-relaxation only inline if, is_integer 2 problems; selection with |, sparse/dense format, naming and redening constraints, subroutine: procedure for solution printing, forward declaration alternative formulation using SOS1 formulating disjunctions (BigM); dynamic array, range, exists, forall-do 3 different objectives; subroutine: procedure for solution printing, if-then solution printing, repeat-until, cast to integer, selection with |, round encoding of arcs, range
B-2 Flow shop scheduling Flow shop scheduling B-3 Job shop scheduling Job shop scheduling
**** ***
B-4 Sequencing jobs on a bottleneck machine Single machine scheduling *** B-5 Paint production Asymmetric Traveling Salesman Problem (TSP) B-6 Assembly line balancing Assembly line balancing
***
**
50
Table 4.2: Classication in order of appearance (Chapters 8 and 9) Problem name and type Difculty *** Features modeling inventory forall-do balance; inline if, C-1 Planning the production of bicycles Production planning (single product) C-2 Production of drinking glasses Multi-item production planning
**
C-3 Material requirement planning Material requirement planning ** working with index (sub)sets, dynamic initial(MRP) ization, finalize, create, as C-4 Planning the production of electronic components Multi-item production planning ** modeling stock balance constraints; inline if C-5 Planning the production of berglass Production planning with time*** representation of multi-period production as dependent production cost ow; encoding of arcs, exists, create, isodd, getlast, inline if C-6 Assignment of production batches to machines Generalized assignment problem * D-1 Wagon load balancing Nonpreemptive scheduling parallel machines on **** heuristic solution requiring sorting algorithm, formulation of maximin objective; nested subroutines: function returning heuristic solution value and sorting procedure, ceil, getsize, if-then, break, exit, all loop types (forall-do, repeat-until, while-do), setparam, cutoff value incremental problem denition with 3 different objectives, procedure for solution printing 2 objectives; data preprocessing, as, dynamic creation of variables, procedure for solution printing, if-then-else 2 versions of mathematical model, symmetry breaking; data preprocessing, ceil, range
**
***
D-4 Backing up les Bin-packing problem D-5 Cutting sheet metal Covering problem D-6 Cutting steel bars for desk legs Cutting-stock problem
**
51
Table 4.3: Classication in order of appearance (Chapters 10 and 11) Problem name and type E-1 Car rental Transport problem E-2 Choosing the mode of transport Minimum cost ow Difculty *** Features data preprocessing, set operations, sqrt and 2, if-then-elif formulation with extra nodes for modes of transport; encoding of arcs, finalize, union of sets, nodes labeled with strings modeling ows as fractions, denition of model cuts elimination of inadmissible subtours, cuts; selection with |, denition of model cuts modeling implications, weak and strong formulation of bounding constraints; triple indices maxlist, minlist, max, min
**
E-3 Depot location Facility location problem E-4 Heating oil delivery Vehicle routing problem (VRP)
***
****
E-6 Fleet planning for vans NN F-1 Flight connections at a hub Assignment problem F-2 Composing ight crews Bipartite matching
*** * ****
2 problems, data preprocessing, incremental denition of data array, encoding of arcs, logical or (cumulative version) and and, procedure for printing solution, forall-do, max, finalize generalization of model to arbitrary time windows; calculation of specic BigM, forall-do quadruple indices; improved (re)formulation (rst model not usable with student version), union of index (range) sets loop over problem solving, TSP subtour elimination algorithm; procedure for generating additional constraints, recursive subroutine calls, working with sets, forall-do, repeat-until, getsize, not
F-3 Scheduling ight landings Scheduling problem with time windows F-4 Airline hub location Hub location problem
***
***
salesman
*****
52
Table 4.4: Classication in order of appearance (Chapters 12 and 13) Problem name and type G-1 Network reliability Maximum ow with unitary capacities Difculty *** Features encoding of arcs, range, exists, create, algorithm for printing paths, forall-do, while-do, round
G-2 Dimensioning of a mobile phone network NN ** if-then, exit G-3 Routing telephone calls Multi-commodity network ow *** encoding of paths, finalize, getsize problem G-4 Construction of a cabled network Minimum weight spanning tree *** formulation of constraints to exclude subcyproblem cles G-5 Scheduling of telecommunications via satellite Preemptive open shop scheduling ***** data preprocessing, algorithm for preemptive scheduling that involves looping over optimization, Gantt chart printing G-6 Location of GSM transmitters Covering problem * modeling an equivalence; sparse data format H-1 Choice of loans NN H-2 Publicity campaign NN H-3 Portfolio selection NN * * ** calculation of net present value forall-do sets of integers, second formulation with semi-continuous, parameters inline if, selection with | formulation of monthly balance constraints including different payment frequencies; as, mod, inline if, selection with | experiment with solutions: solve LP problem explicitly, round some almost integer variable and re-solve parameters, forall-do, min, max, loop over problem solving
**
***
53
Table 4.5: Classication in order of appearance (Chapters 14 and 15) Problem name and type I-1 Assigning personnel to machines Assignment problem Difculty **** Features formulation of maximin objective; heuristic solution + 2 different problems (incremental denition) solved, working with sets, while-do, forall-do, negative index values 2 problems, using mod to formulate cyclic schedules; forall-do, set of integer many specic constraints, tricky (pseudo) objective function; finalize
***
***
I-4 Exam schedule NN ** symmetry breaking, no objective I-5 Production planning with personnel assignment NN *** 2 problems, dened incrementally with partial re-denition of constraints (named constraints), exists, create, dynamic array I-6 Planning the personnel at a construction site NN ** formulation of balance constraints using inline if J-1 Water conveyance / water supply management Maximum ow problem ** encoding of arcs, finalize, selection with | J-2 CCTV surveillance Maximum vertex cover problem ** encoding of network, exists J-3 Rigging elections Partitioning problem **** algorithm for data preprocessing; le inclusion, 3 nested/recursive procedures, working with sets, if-then, forall-do, exists, finalize J-4 Gritting roads Directed Chinese postman prob- **** algorithm for nding Eulerian path/graph for lem printing; encoding of arcs, dynamic array, exists, 2 functions implementing Eulerian circuit algorithm, round, getsize, break, while-do, if-then-else J-5 Location of income tax ofces p-median problem **** modeling an implication, all-pairs shortest path algorithm (Floyd-Warshall); dynamic array, exists, procedure for shortest path algorithm, forall-do, if-then, selection with | J-6 Efciency of hospitals Data Envelopment Analysis (DEA) *** description of DEA method; loop over problem solving with complete re-denition of problem every time, finalize, naming and declaring constraints
54
Chapter 5
5.1
Introductory example
A small joinery makes two different sizes of boxwood chess sets. The small set requires 3 hours of machining on a lathe, and the large set requires 2 hours. There are four lathes with skilled operators who each work a 40 hour week, so we have 160 lathe-hours per week. The small chess set requires 1 kg of boxwood, and the large set requires 3 kg. Unfortunately, boxwood is scarce and only 200 kg per week can be obtained. When sold, each of the large chess sets yields a prot of $20, and one of the small chess set has a prot of $5. The problem is to decide how many sets of each kind should be made each week to so as to maximize prot. In Chapter 1 the transformation of this description into a mathematical model was discussed in some detail and will therefore not be repeated here. An implementation of the model has also already been given (see Section 1.3). We assume that the following Mosel model has been entered into a text le named chess.mos (mos is the standard le extension expected by Mosel):
model Chess uses "mmxprs" declarations xs, xl: mpvar end-declarations Profit:= 5*xs + 20*xl Boxwood:= 1*xs + 3*xl <= Lathe:= 3*xs + 2*xl <= maximize(Profit)
200 160
writeln("LP Solution:") ! Solution printing writeln(" Objective: ", getobjval) writeln("Make ", getsol(xs), " small sets") writeln("Make ", getsol(xl), " large sets") end-model
55
5.1.1
Using Xpress-Mosel
Mosel is an advanced modeling and solving language and environment, where optimization problems can be specied and solved with the utmost precision and clarity. The modeling component of Mosel provides an easy to use yet powerful language for describing optimization problems. Through its modular architecture, Mosel provides access to data in different formats (including spreadsheets and databases) and gives access to a variety of solvers, which can nd optimal or near-optimal solutions to a problem. Mosel is provided either as a standalone program (the Mosel Command Line Interpreter used in this book) or in the form of libraries that make it possible to embed a model into a larger application written in a programming language. To run the model we have entered into the le chess.mos, we start Mosel at the command prompt, and type the following sequence of commands
mosel exec chess quit
which will start Mosel, compile the model and (if no syntax error has been detected) run the model, and then quit Mosel. We will see output something like that below, where we have highlighted Mosels output in bold face.
mosel ** Xpress-Mosel ** (c) Copyright Dash Associates 1998-2002 > exec chess LP Solution: Objective: 1333.33 Make 0 small sets Make 66.6667 large sets Returned value: 0 > quit Exiting.
The same steps may be done immediately from the command line:
mosel -c "exec chess"
The -c option is followed by a list of commands enclosed in double quotes. If after having started Mosel you type a command that is not recognized by the Mosel Command Line Interpreter (for instance: h), Mosel displays the full list of commands (or the possible completions to valid commands) with short explanations. The different options that may be used from the operating systems command line can be obtained by typing mosel -h. The distribution of Mosel contains several modules that add extra functionality to the language. A full list of the functionality of a module can be obtained by using the exam command; for instance to see what is provided by the Xpress-Optimizer module mmxprs:
mosel -c "exam mmxprs"
For a complete description of the Mosel Language and the Mosel Command Line Interpreter, the reader is referred to the Mosel Reference Manual, available at http://www.dashoptimization.com/applications_book.html From the same address, individual manuals for the Mosel modules can also be downloaded.
5.1.2
Using Xpress-IVE
Xpress-IVE, sometimes called just IVE, is the Xpress Interactive Visual Environment, a complete modeling and optimization development environment running under Microsoft Windows. It presents Mosel in an easy-to-use Graphical User Interface (GUI), with a built-in text editor. IVE can be used for the development, management and execution of multiple models and is ideal for developing and debugging prototype models. To execute the model le chess.mos you need to carry out the following steps.
56
Start up IVE. Open the model le by choosing File > Open. The model source is then displayed in the central window (the IVE Editor). Click the Run button (green triangle) or alternatively, choose Build > Run. The resulting screen display is shown in Figure 5.1. The Build pane at the bottom of the workspace is automatically displayed when compilation starts. If syntax errors are found in the model, they are displayed here, with details of the line and character position where the error was detected and a description of the problem, if available. Clicking on the error takes the user to the offending line. When a model is run, the Output/Input pane at the right hand side of the workspace window is selected to display program output. Any output generated by the model is sent to this window. IVE will also provide graphical representations of how the solution is obtained, which are generated by default whenever a problem is optimized. The right hand window contains a number of panes for this purpose, dependent on the type of problem solved and the particular algorithm used. IVE also allows the user to draw graphs by embedding subroutines in Mosel models (see the documentation on the website for further detail). IVE makes all information about the solution available through the Entities pane in the left hand window. By expanding the list of decision variables in this pane and hovering over one with the mouse pointer, its solution and reduced cost are displayed. Dual and slack values for constraints may also be obtained.
5.2
5.2.1
57
VALUEi be the value of item i and WEIGHTi its weight. A mathematical formulation of the problem is then given by: maximize
iITEMS
i ITEMS : takei {0, 1} This problem is an example of a knapsack problem. It may be implemented with Mosel as follows:
model "Burglar 1" uses "mmxprs" declarations ITEMS = 1..8 WTMAX = 102 VALUE: array(ITEMS) of real WEIGHT: array(ITEMS) of real take: array(ITEMS) of mpvar end-declarations
! Index range for items ! Maximum weight allowed ! Value of items ! Weight of items ! 1 if we take item i; 0 otherwise
! Item: 1 2 3 4 5 6 7 8 VALUE := [15, 100, 90, 60, 40, 15, 10, 1] WEIGHT:= [ 2, 20, 20, 30, 40, 30, 60, 10] ! Objective: maximize total value MaxVal:= sum(i in ITEMS) VALUE(i)*take(i) ! Weight restriction sum(i in ITEMS) WEIGHT(i)*take(i) <= WTMAX ! All variables are 0/1 forall(i in ITEMS) take(i) is_binary maximize(MaxVal) ! Solve the MIP-problem
! Print out the solution writeln("Solution:\n Objective: ", getobjval) forall(i in ITEMS) writeln(" take(", i, "): ", getsol(take(i))) end-model
The structure of this model and Mosel models in general is the following: Model: Every Mosel program starts with the keyword model, followed by a name, and terminates with end-model. Declarations: All objects must be declared in a declarations block, unless they are dened unambiguously through an assignment (e.g. i:=1 denes i as an integer and assigns it the value 1; in our example the objective function MaxVal is dened by assigning it a linear expression). There may be several such declarations blocks at different places in a model. Problem denition: Typically, a model starts with the specication of the data (here: assignment of values to VALUE and WEIGHT), followed by the statement of the problem (here: denition of the objective function MaxVal, denition of one inequality constraint, and restricting the variables to be binaries)
58
Solving: With the procedure maximize, we call Xpress-Optimizer to maximize the objective function MaxVal. Since there is no default solver in Mosel, we specify that Xpress-Optimizer is to be used with the statement uses "mmxprs" at the beginning of the program. Output printing: The last two lines print out the value of the optimal solution and the solution values for the decision variables. Line breaks: It is possible to place several statements on a single line, separating them by semicolons (like x1 <= 4; x2 >= 7). Conversely, since there are no special line end or continuation characters, every line of a statement that continues over several lines must end with an operator (+, >= etc.) or characters like , that make it obvious that the statement is not terminated. Comments: As shown in the example, the symbol ! signies the start of a comment, which continues to the end of the line. Comments over multiple lines start with (! and terminate with !). We shall now explain certain features used in this model in more detail: Ranges and sets:
ITEMS = 1..8
denes a range set, that is, a set of consecutive integers from 1 to 8. This range is used as an index set for the data arrays (VALUE and WEIGHT) and for the array of decision variables take. Instead of a using numerical indices, we could, for instance, have dened ITEMS as a set of strings by replacing the current denition ITEMS = 1..8 with the following denition (without making any other changes to the model):
ITEMS = {"camera", "necklace", "vase", "picture", "tv", "video", "chest", "brick"} ! Index set for items
Arrays:
VALUE: array(ITEMS) of real
denes a one-dimensional array of real values indexed by the range ITEMS. Multi-dimensional arrays are declared in the obvious way e.g.
VAL3: array(ITEMS, 1..20, ITEMS) of real
declares a 3-dimensional real array. Arrays of decision variables (type mpvar) are declared likewise, as shown in our example. All objects (scalars and arrays) declared in Mosel are always initialized with a default value: real, integer: 0 boolean: false string: (i.e. the empty string) The values of data arrays may either be assigned in the model as we show in the example or initialized from le (see Section 5.2.2). Summations:
MaxVal:= sum(i in Items) VALUE(i)*x(i)
Simple Looping:
forall(i in ITEMS) take(i) is_binary
illustrates looping over all values in an index range. Recall that the index range ITEMS is 1, ..., 8, so the statement says that take(1), take(2), ..., take(8) are all binary variables. There is another example of the use of forall at the penultimate line of the model when writing out all the solution values. Other types of loops are used in some of the application examples (see the classication tables at the beginning of Part II). Integer Programming variable types: To make an mpvar variable, say variable xbinvar, into a binary (0/1) variable, we just have to say
xbinvar is_binary
To make an mpvar variable an integer variable, i.e. one that can only take on integral values in a MIP problem, we would have
xintvar is_integer
59
5.2.2
! ! ! !
initializations from burglar.dat VALUE WEIGHT end-initializations declarations take: array(ITEMS) of mpvar end-declarations
! Objective: maximize total value MaxVal:= sum(i in ITEMS) VALUE(i)*take(i) ! Weight restriction sum(i in ITEMS) WEIGHT(i)*take(i) <= WTMAX ! All variables are 0/1 forall(i in ITEMS) take(i) is_binary maximize(MaxVal) ! Solve the MIP-problem
! Print out the solution writeln("Solution:\n Objective: ", getobjval) forall(i in ITEMS) writeln(" take(", i, "): ", getsol(take(i))) end-model
The initializations block tells Mosel where to get data from to initialize sets and arrays. The order of the data items in the le does not have to be the same as that in the initializations block. Note that the contents of the set ITEMS is dened indirectly through the index values of the arrays VALUE and WEIGHT. We only declare the variables once the data has been initialized and hence, the set ITEMS is known. In the application examples, where appropriate, we show how to work with dynamic arrays of data and decision variables (see the classication tables at the beginning of Part II). The data may also be given in the form of a single record, say, KNAPSACK. The initialization then takes the following form:
initializations from burglar2.dat [VALUE, WEIGHT] as KNAPSACK end-initializations
60
[ [ [ [ [ [
90 60 40 15 10 1
In the examples of this book we always read data from text les. However, with Mosel it is also possible to read and write data from/to other sources (such as spreadsheets and databases) or input data in memory. For further information, the reader is referred to the documentation on the website.
5.2.3
Reserved words
The following words are reserved in Mosel. The upper case versions are also reserved (i.e. AND and and are keywords but not And). Do not use them in a model except with their built-in meaning. and, array, as boolean, break case declarations, div, do, dynamic elif, else, end false, forall, forward, from, function if, in, include, initialisations, initializations, integer, inter, is_binary, is_continuous, is_free, is_integer, is_partint, is_semcont, is_semint, is_sos1, is_sos2 linctr max, min, mod, model, mpvar next, not of, options, or parameters, procedure, public, prod range, real, repeat set, string, sum then, to, true union, until, uses while
61
Chapter 6
6.1
Production of alloys
The company Steel has received an order for 500 tonnes of steel to be used in shipbuilding. This steel must have the following characteristics (grades).
Table 6.1: Characteristics of steel ordered Chemical element Carbon (C) Copper (Cu) Manganese (Mn) Minimum grade 2 0.4 1.2 Maximum grade 3 0.6 1.65
The company has seven different raw materials in stock that may be used for the production of this steel. Table 6.2 lists the grades, available amounts and prices for all raw materials.
Table 6.2: Raw material grades, availabilities, and prices Raw material Iron alloy 1 Iron alloy 2 Iron alloy 3 Copper alloy 1 Copper alloy 2 Aluminum alloy 1 Aluminum alloy 2 C% 2.5 3 0 0 0 0 0 Cu % 0 0 0.3 90 96 0.4 0.6 Mn % 1.3 0.8 0 0 4 1.2 0 Availability in t 400 300 600 500 200 300 250 Cost in B/t C 200 250 150 220 240 200 165
The objective is to determine the composition of the steel that minimizes the production cost.
6.1.1
Model formulation
We use RAW to represent the set of raw materials and COMP for the set of components (chemical elements) that are relevant for the grade requirements. We want to determine the quantity user of every
62
raw material r that is used to produce the quantity produce of steel to satisfy the given demand DEM. We denote by Prc the percentage of the chemical element c in raw material r and COSTr the buying price per kg of r. Furthermore, the minimum and maximum grades PMINc and PMAXc are given for every component c. We obtain the following mathematical model: minimize
rRAW
produce = c COMP :
c COMP :
rRAW
The objective, given by (6.1.1), is to minimize the total cost that is calculated as the sum of the raw material prices times the quantity used. The constraint (6.1.2) indicates that the resulting product weight is equal to the sum of the weights of the raw materials used for its production. The constraints (6.1.3) and (6.1.4) impose the limits on the grade of the nal product. They have been obtained based on the observation that if the steel contains user tonnes of a raw material that contains Prc percent of a chemical element c, then the quantity of this element in the steel is given by the sum Prc userf
rRAW
and the percentage of the element c in the nal product is given by the ratio
rRAW
Prc user
produce Adding the lower bound PMINc to express the constraint on the minimum grade of c results in the following relation: P userf rRAW rc PMINc produce This relation is non-linear but it can be transformed by multiplying it with produce and we nally obtain the linear constraint (6.1.3). The constraint (6.1.4) is derived following the same scheme. The constraints (6.1.5) make sure that only the available quantities of raw material are used. The constraint (6.1.6) guarantees that the produced amount of steel satises the demand. The last set of constraints (6.1.7) establishes the non-negativity condition for all variables of the problem.
6.1.2
Implementation
The algebraic model translates into the following Mosel program. The correspondence between the two is easy to see. In this model, just like for most others in this book, we read in all data from a separate le. Note that whilst we simply number the raw materials in the model formulation, we read in their names after solving the problem to obtain a more readable solution output.
model "A-1 Production of Alloys" uses "mmxprs" declarations COMP = 1..3 RAW = 1..7 P: array(RAW,COMP) of real PMIN,PMAX: array(COMP) of real AVAIL: array(RAW) of real COST: array(RAW) of real DEM: real use: array(RAW) of mpvar
! Components (chemical elements) ! Raw materials (alloys) ! ! ! ! ! Composition of raw materials (in percent) Min. & max. requirements for components Raw material availabilities Raw material costs per tonne Amount of steel to produce
63
initializations from a1alloy.dat P PMIN PMAX AVAIL COST DEM end-initializations ! Objective function Cost:= sum(r in RAW) COST(r)*use(r) ! Quantity of steel produced = sum of raw material used produce = sum(r in RAW) use(r) ! Guarantee min. and max. percentages of every chemical element forall(c in COMP) do sum(r in RAW) P(r,c)*use(r) >= PMIN(c)*produce sum(r in RAW) P(r,c)*use(r) <= PMAX(c)*produce end-do ! Use raw materials within their limit of availability forall(r in RAW) use(r) <= AVAIL(r) ! Satisfy the demand produce >= DEM ! Solve the problem minimize(Cost) ! Solution printing declarations NAMES: array(RAW) of string end-declarations initializations from a1alloy.dat NAMES end-initializations ! Get the names of the alloys
writeln("Total cost: ", getobjval) writeln("Amount of steel produced: ", getsol(produce)) writeln("Alloys used:") forall(r in RAW) if(getsol(use(r))>0) then write(NAMES(r), ": ", getsol(use(r))," ") end-if write("\nPercentages (C, Cu, Mn): ") forall(c in COMP) write( getsol(sum(r in RAW) P(r,c)*use(r))/getsol(produce), "% writeln end-model
")
PMIN: [2 0.4 1.2] PMAX: [3 0.6 1.65] AVAIL: [400 300 600 500 200 300 250] COST: [200 250 150 220 240 200 165] DEM: 500
! Min. & max. requirements ! Raw material availabilities ! Raw material costs ! Amount of steel to produce
NAMES: ["iron 1" "iron 2" "iron 3" "copper 1" "copper 2" "aluminum 1" "aluminum 2"]
The solution printout introduces the if-then statement of Mosel, it may also be used in its forms
64
if-then-else or if-then-elif-then-else. Another observation concerning the solution printout is that the getsol function may be applied not only to variables but also to linear expressions.
6.1.3
Results
The required 500 tonnes of steel are produced with 400 tonnes of iron alloy 1, 39.776 tonnes of iron alloy 3, 2.761 tonnes of copper alloy 2, and 57.462 tonnes of aluminum alloy 1. The percentages of Carbon, Copper, and Manganese are 2%, 0.6%, and 1.2% respectively. The total cost of production is B 98121.60. C
6.2
Granules
Powder
Every food product needs to fulll certain nutritional requirements. The percentages of proteins, lipids and bers contained in the raw materials and the required percentages in the nal products are listed in Table 6.3.
Table 6.3: Contents of nutritional components in percent Raw material Oat Maize Molasses Required contents Proteins 13.6 4.1 5 9.5 Lipids 7.1 2.4 0.3 2 Fiber 7 3.7 25 6
There are limits on the availability of raw materials. Table 6.4 displays the amount of raw material that is available every day and the respective prices.
Table 6.4: Raw material availabilities and prices Raw material Oat Maize Molasses Available amount in kg 11900 23500 750 Cost in B/kg C 0.13 0.17 0.12
The cost of the different production steps are given in the following table.
Table 6.5: Production costs in B /kg C Grinding 0.25 Blending 0.05 Granulating 0.42 Sieving 0.17
With a daily demand of nine tonnes of granules and twelve tonnes of powder, which quantities of raw materials are required and how should they be blended to minimize the total cost?
65
6.2.1
Model formulation
This model is very similar to the preceding except that we now want to produce two products and that instead of the minimum and maximum grades we have to fulll certain nutritional requirements. Let FOOD = {1, 2} (1 = granules, 2 = powder) be the set of food product types that are produced, RAW the set of raw materials, and COMP = {1, 2, 3} the set of nutritional components (with 1 = protein, 2 = lipids, 3 = ber). We further use COSTr to denote the price per kg of raw material r, PCOSTp for the cost of production process p in B /kg, REQc for the required content of nutritional component c, Prc for the C content of c in raw material r, AVAILr for the maximum available quantity of raw material r, and DEMf for the daily demand of food product f. With variable userf representing the quantity of raw material r used for the production of food type f and producef the amount of food f produced, we obtain the following model: minimize
rRAW fFOOD
COSTr userf +
rRAW fFOOD r=molasses
PCOSTgrinding userf
+
rRAW fFOOD
PCOSTblending userf +
rRAW
+
rRAW
f FOOD :
f FOOD, c 1. . 2 :
rRAW
f FOOD :
rRAW
r RAW :
fFOOD
The objective function (6.2.1) that is to be minimized is the sum of all costs. The rst term is the price paid for the raw materials, the following terms correspond to the production costs of the different process steps. Grinding is applied to all raw materials except molasses, blending to all raw material. Granules (f = 1) are obtained through granulating and powder (f = 2) by sieving the blended product. The constraint (6.2.2) expresses the fact that the produced quantity of every food type corresponds to the sum of the raw material used for its production. Through the constraints (6.2.3) and (6.2.4) we obtain the required content of nutritional components. They are based on the same reasoning that we saw for the grades in the previous example. The percentage for the content of a nutritional component c in a food product f is given by the following ratio:
rRAW
Prc userf
producef
(6.2.8)
This percentage must be at least REQc for the rst two components (protein, lipid) and at most REQc for the third one (ber). For the rst two, this results in a relation of type (6.2.9), for the third in the relation (6.2.10).
rRAW
Prc userf
REQc REQc
(6.2.9) (6.2.10)
Both relations are non-linear since the variables producef appear in the denominator, but as before it is possible to transform them into linear constraints by multiplying them by producef . Doing so, we obtain the constraints (6.2.3) and (6.2.4). The constraints (6.2.5) guarantee that the quantities of raw material used remain within their limits of availability. The constraints (6.2.6) serve to satisfy the demand. And the last set of constraints (6.2.7) establishes that all variables are non-negative.
66
6.2.2
Implementation
Below follows the implementation of this problem with Mosel. Note that in this implementation some of the indexing sets are of numerical type and others are sets of strings. Any indexing set may be assigned its contents at its declaration (a constant set), like FOOD and COMP, or it may be created dynamically as is the case for for the (unnamed) indexing set of PCOST that is lled in when this array is read from le.
model "A-2 Animal Food Production" uses "mmxprs" declarations FOOD = 1..2 ! Food types COMP = 1..3 ! Nutritional components RAW = {"oat", "maize", "molasses"} ! Raw materials P: array(RAW,COMP) of real ! Composition of raw materials (in percent) REQ: array(COMP) of real ! Nutritional requirements AVAIL: array(RAW) of real ! Raw material availabilities COST: array(RAW) of real ! Raw material prices PCOST: array(set of string) of real ! Cost of processing operations DEM: array(FOOD) of real ! Demands for food types use: array(RAW,FOOD) of mpvar produce: array(FOOD) of mpvar end-declarations ! Quantity of raw mat. used for a food type ! Quantity of food produced
initializations from a2food.dat P REQ PCOST DEM [AVAIL, COST] as RAWMAT end-initializations ! Objective function Cost:= sum(r in RAW,f in FOOD) COST(r)*use(r,f) + sum(r in RAW,f in FOOD|r<>"molasses") PCOST("grinding")*use(r,f) + sum(r in RAW,f in FOOD) PCOST("blending")*use(r,f) + sum(r in RAW) PCOST("granulating")*use(r,1) + sum(r in RAW) PCOST("sieving")*use(r,2) ! Quantity of food produced corresponds to raw material used forall(f in FOOD) sum(r in RAW) use(r,f) = produce(f) ! Fulfill nutritional requirements forall(f in FOOD,c in 1..2) sum(r in RAW) P(r,c)*use(r,f) >= REQ(c)*produce(f) forall(f in FOOD) sum(r in RAW) P(r,3)*use(r,f) <= REQ(3)*produce(f) ! Use raw materials within their limit of availability forall(r in RAW) sum(f in FOOD) use(r,f) <= AVAIL(r) ! Satisfy demands forall(f in FOOD) produce(f) >= DEM(f) ! Solve the problem minimize(Cost) ! Solution printing writeln("Total cost: ", getobjval) write("Food type"); forall(r in RAW) write(strfmt(r,9)) writeln(" protein lipid fiber") forall(f in FOOD) do write(strfmt(f,-9)) forall(r in RAW) write(strfmt(getsol(use(r,f)),9,2)) forall(c in COMP) write(" ", strfmt(getsol(sum(r in RAW) P(r,c)*use(r,f))/getsol(produce(f)),3,2),"%") writeln end-do end-model
The data le a2food.dat has the following contents. Whereas strings in Mosel model les must always be surrounded by single or double quotes, in data les this is only required if a string contains blanks or other non-alphanumeric characters, or starts with a numerical value.
67
Similarly to the way the raw material availabilities and prices are listed in Table 6.4, the data for the arrays AVAIL and COST are given in a single record labeled RAWMAT. In the initializations block, the names of the data arrays that are to be read from a single record need to be surrounded by [ and ], followed by the keyword as and the label (name) of the record.
P: [(oat 1) 13.6 7.1 7 (maize 1) 4.1 2.4 3.7 (molasses 1) 5 0.3 25 ] REQ: [9.5 2 6] RAWMAT: [(oat) [11900 0.13] (maize) [23500 0.17] (molasses) [750 0.12]] ! Composition of raw materials
! Cost of processing operations PCOST: [(grinding) 0.25 (blending) 0.05 (granulating) 0.42 (sieving) 0.17] DEM: [9000 12000] ! Demands for food types
In this example we again show how the solution may be printed after the problem has been solved. The output is printed in table format with the help of strfmt that for a given string (rst parameter) reserves the indicated space (second parameter) or for a number the total space and the number of digits after the decimal point (third parameter). If the second parameter has a negative value, the output is printed left justied. Since there is only little variation in the solution printing for the large majority of examples, it will be omitted in the listings from now on.
6.2.3
Results
The minimum cost for producing the demanded nine tonnes of granule and twelve tonnes of powder is B 15086.80. The composition of the food products is displayed in Table 6.6. C
Table 6.6: Optimal composition of food products Food type Granule Powder Oat 5098.56 6798.07 Maize 3719.53 4959.37 Molasses 181.91 242.55 Protein 9.50% 9.50% Lipid 5.02% 5.02% Fiber 6.00% 6.00%
6.3
Renery
A renery produces butane, petrol, diesel oil, and heating oil from two crudes. Four types of operations are necessary to obtain these products: separation, conversion, upgrading, and blending. The separation phase consists of distilling the raw product into, among others, butane, naphtha, gasoil, and a residue. The residue subsequently undergoes a conversion phase (catalytic cracking) to obtain lighter products. The different products that come out of the distillation are puried (desulfurization or sweetening) or upgraded by a reforming operation that augments their octane value. Finally, to obtain the products that will be sold, the renery blends several of the intermediate products in order to fulll the prescribed characteristics of the commercial products. The following drawing gives a simplied overview on the production processes in this renery. After the distillation, crude 1 gives 3% butane, 15% naphtha, 40% gasoil, and 15% residue. Crude 2 results in 5% butane, 20% naphtha, 35% gasoil, and 10% residue. The reforming of the naphtha gives 15% butane and 85% of reformate (reformed naphtha). The catalytic cracking of the residue results in 40% of cracked naphtha and 35% of cracked gasoil (note that these percentages do not add up to 100% because the process also produces 15% of gas, 5% coke and another type of residue that are not taken into consideration in our example). The petrol is produced with three ingredients: reformed naphtha (reformate), butane, and cracked naphtha. The diesel oil is obtained by blending sweetened gasoil, cracked gasoil, and cracked naphtha. The heating oil may contain gasoil and cracked naphtha without any restrictions on their proportions. Certain conditions on the quality of the petrol and diesel oil are imposed by law. There are three important characteristics for petrol: the octane value, vapor pressure and volatility. The octane value is a
68
Reforming
Crudes Residue
Petrol blending
Petrol
Cat. cracking
Gasoil
Cracked gasoil
HO blending
Heating oil
Desulfurization
Sweetened gasoil
Diesel blending
Diesel oil
Distillation
Figure 6.2: Simplied representation of a renery
measure of the anti-knock power in the motor. The vapor pressure is a measure of the risk of explosion during storage, especially with hot weather. The volatility is a measure for how easy the motor is started during cold weather. Finally, the maximum sulfur content of the diesel oil is imposed by antipollution specications. The following table summarizes the required characteristics of the nal products and the composition of the intermediate ones. Fields are left empty if no particular limit applies. We work with the assumption that all these characteristics blend linearly by weight (in reality, this is only true for the sulfur contents).
Table 6.7: Characteristics of intermediate and nal products Characteristic Octane value Vapor pressure Volatility Sulfur (in %) Butane 120 60 105 Reformate 100 2.6 3 Cracked naphtha 74 4.1 12 0.12 Cracked gasoil 0.76 Desulfurized gasoil 0.03 Petrol 94 12.7 17 Diesel oil 0.05
In the next month the renery needs to produce 20,000 tonnes of butane, 40,000 tonnes of petrol, 30,000 tonnes of diesel oil, and 42,000 tonnes of heating oil. 250,000 tonnes of crude 1 and 500,000 tonnes of crude 2 are available. The monthly capacity of the reformer are 30,000 tonnes, for the desulfurization 40,000 tonnes and for the cracking 50,000 tonnes. The cost of processing is based on the use of fuel and catalysts for the different operations: the costs of distillation, reforming, desulfurization, and cracking are B 2.10, B 4.18, B 2.04 and B 0.60 per tonne respectively. C C C C
6.3.1
Model formulation
Let producebutane , producepetrol , producediesel , and produceheating be the quantities to produce of butane, petrol, diesel oil, and heating oil. These four products form the set FINAL of nal products. We need to determine the composition of each of these products. We shall use the following variables for the intermediate products: producepetbutane , producereformate , producepetcrknaphtha for the quantities of butane, reformate and cracked naphtha used in the production of petrol (the three products are grouped in the set IPETROL); similarly, producedslgasoil , producedslcrknaphtha , and producedslcrkgasoil for the quantities of sweetened gasoil, cracked naphtha, and cracked gasoil used in the production of diesel oil (set IDIESEL) and producehogasoil , producehocrknaphtha , and producehocrkgasoil for the quantities of sweetened gasoil, cracked naphtha, and cracked gasoil blended to heating oil (set IHO). We also dene production variables producep for the quantities of intermediate products resulting from the different production processes, namely for the sets IDIST = {distbutane, naphtha, residue, gasoil} (products resulting from distillation), IREF = {refbutane, reformate} (products resulting from reforming), and ICRACK = {crknaphtha, crkgasoil} (products resulting from cracking). All nal and intermediate products are regrouped in the set ALLPRODS = FINAL IDIST IREF ICRACK IPETROL IHO IDIESEL. In addition to the production variables, we dene variables usec for the quantity of crude c CRUDES used in the production. Our objective is to minimize the production costs, that is, the cost of distilling the crudes plus the cost of reforming, desulfurizing or cracking the intermediate products resulting from the distillation. Hence the
69
COSTc usec +
pIDIST
COSTp producep
(6.3.1)
The following constraints (6.3.2) establish restrictions on the maximum quantities of every component of the raw materials, where DISTcp stands for the contents of the intermediate product p of the crude c. p IDIST : producep
cCRUDES
DISTcp usec
(6.3.2)
For instance, the total quantity of naphtha going into the reformer (producenaphtha ) cannot exceed the DISTc,naphtha usec . maximum quantity of naphtha that is obtained from the distillation of the crudes cCRUDES Similar relations are given for the reforming (6.3.3) and cracking (6.3.4) processes (in both cases, there is only a single input product) where REFp denotes the percentage composition of naphtha and CRACKp the percentage composition of the residue: p IREF : producep REFp producenaphtha p ICRACK : producep CRACKp produceresidue (6.3.3) (6.3.4)
The products coming out of the cracking and desulfurization processes may be used for several of the nal products. We therefore have the following three equations. Cracked naphtha is used in the production of petrol, heating oil, and diesel oil (6.3.5). Cracked gasoil (6.3.6) and sweetened gasoil (6.3.7) are both used for heating oil and diesel oil. producecrknaphtha = producepetcrknaphtha + producehocrknaphtha + producedslcrknaphtha producecrkgasoil = producehocrkgasoil + producedslcrkgasoil producegasoil = producehogasoil + producedslgasoil (6.3.5) (6.3.6) (6.3.7)
The following four constraints (6.3.8) (6.3.11) state how the quantities of the nal products are obtained from the intermediate products: butane is produced by distillation and reforming and used in the production of petrol (6.3.8). The quantities of the three other nal products (petrol, diesel oil, and heating oil) result from blending as the sum of the intermediate product quantities used in their production. producebutane = producedistbutane + producerefbutane producepetbutane producepetrol =
pIPETROL
producep producep
pIDIESEL
producediesel = produceheating =
pIHO
producep
Furthermore, we have a set of constraints to obey the legal restrictions on the composition of petrol and diesel oil. For instance, the octane value of petrol must be better than 94. This constraint translates to the following relation (with OCTp the octane value of the components):
pIPETROL
OCTp producep
producepetrol
94
(6.3.12)
This constraint is non-linear since it contains a variable in the denominator. To turn it into a linear constraints, we simply multiply everything by producepetrol . We then obtain the following constraint (6.3.13): OCTp producep 94 producepetrol (6.3.13)
pIPETROL
The following constraints (6.3.14) (6.3.16) establish the corresponding relations for the vapor pressure and volatility of petrol and the sulfur contents of diesel oil. VAPp producep 12. 7 producepetrol
pIPETROL
70
We also need constraints that establish the limits on production capacities for reforming (6.3.17), desulfurization (6.3.18) and cracking (6.3.19). The amount usec of every crude c that is used in production is limited by the available amount AVAILc . The constraints (6.3.21) guarantee that the demand DEMp for all nal products is satised. To this system we add the non-negativity condition for all variables (6.3.22) and (6.3.23). producenp 30000 producegd + producegh 50000 producerp + producerd + producerh 40000 c CRUDES : usec AVAILc p FINAL : producep DEMp p ALLPRODS : producep 0 c CRUDES : usec 0 The lines (6.3.1) to (6.3.11), and (6.3.13) to (6.3.23) dene the LP model. Compared to the two other blending problems in Sections 6.1 and 6.2 the formulation of this problem looks quite messy: this is typical for production situations where we have a relatively small number of products going through a large number of stages that are related in complicated ways. There are many different types of constraints, and often lots of exceptions and special cases. (6.3.17) (6.3.18) (6.3.19) (6.3.20) (6.3.21) (6.3.22) (6.3.23)
6.3.2
Implementation
The translation of the model in the previous section into the following formulation with Mosel is straightforward. Contrary to the implementations of the previous examples, this time we do not dene the index sets for the data arrays directly in the model but initialize the contents of the data arrays (and the corresponding index sets) dynamically from le. The only set dened directly in the model is IHO since it does not appear as an index set for any data array its denition could also be read from le. The set of all products ALLPRODS is dened as the union of all nal and intermediate products.
model "A-3 Refinery planning" uses "mmxprs" declarations CRUDES: set of string ! Set of crudes ALLPRODS: set of string ! Intermediate and final products FINAL: set of string ! Final products IDIST: set of string ! Products obtained by distillation IREF: set of string ! Products obtained by reforming ICRACK: set of string ! Products obtained by cracking IPETROL: set of string ! Interm. products for petrol IDIESEL: set of string ! Interm. products for diesel IHO={"hogasoil", "hocrknaphtha", "hocrkgasoil"} ! Interm. products for heating oil DEM: array(FINAL) of real ! Min. production COST: array(set of string) of real ! Production costs AVAIL: array(CRUDES) of real ! Crude availability OCT, VAP, VOL: array(IPETROL) of real ! Octane, vapor pressure, and ! volatility values SULF: array(IDIESEL) of real ! Sulfur contents DIST: array(CRUDES,IDIST) of real ! Composition of crudes (in %) REF: array(IREF) of real ! Results of reforming (in %) CRACK: array(ICRACK) of real ! Results of cracking (in %) end-declarations initializations from a3refine.dat DEM COST OCT VAP VOL SULF AVAIL DIST REF CRACK end-initializations finalize(FINAL); finalize(CRUDES); finalize(IPETROL); finalize(IDIESEL) finalize(IDIST); finalize(IREF); finalize(ICRACK) ALLPRODS:= FINAL+IDIST+IREF+ICRACK+IPETROL+IHO+IDIESEL declarations use: array(CRUDES) of mpvar produce: array(ALLPRODS) of mpvar
71
end-declarations ! Objective function Cost:= sum(c in CRUDES) COST(c)*use(c) + sum(p in IDIST) COST(p)*produce(p) ! Relations intermediate products resulting of distillation - raw materials forall(p in IDIST) produce(p) <= sum(c in CRUDES) DIST(c,p)*use(c) ! Relations between intermediate products ! Reforming: forall(p in IREF) produce(p) <= REF(p)*produce("naphtha") ! Cracking: forall(p in ICRACK) produce(p) <= CRACK(p)*produce("residue") produce("crknaphtha") >= produce("petcrknaphtha") + produce("hocrknaphtha") + produce("dslcrknaphtha") produce("crkgasoil") >= produce("hocrkgasoil") + produce("dslcrkgasoil") ! Desulfurization: produce("gasoil") >= produce("hogasoil") + produce("dslgasoil") ! Relations final products - intermediate products produce("butane") = produce("distbutane") + produce("refbutane") produce("petbutane") produce("petrol") = sum(p in IPETROL) produce(p) produce("diesel") = sum(p in IDIESEL) produce(p) produce("heating") = sum(p in IHO) produce(p) ! Properties of petrol sum(p in IPETROL) OCT(p)*produce(p) >= 94*produce("petrol") sum(p in IPETROL) VAP(p)*produce(p) <= 12.7*produce("petrol") sum(p in IPETROL) VOL(p)*produce(p) >= 17*produce("petrol") ! Limit on sulfur in diesel oil sum(p in IDIESEL) SULF(p)*produce(p) <= 0.05*produce("diesel") ! Crude availabilities forall(c in CRUDES) use(c) <= AVAIL(c) ! Production capacities produce("naphtha") <= 30000 produce("gasoil") <= 50000 produce("residue") <= 40000 ! Satisfy demands forall(p in FINAL) produce(p) >= DEM(p) ! Solve the problem minimize(Cost) end-model
The dynamic initialization of the index sets necessitates a special treatment of the arrays of variables use and produce. If we declared these arrays at the same time as the data arrays, this would result in empty, dynamic arrays since the index sets are not known before the data has been read from le. Whilst the entries of dynamic arrays of types other than mpvar are created when the entry is addressed, this is not the case for arrays of variables. There are two possibilities for handling this situation: In the implementation shown above we dene the variables in a separate declarations block after the data has been read from le. This block is preceded by a series of finalize statements. With the help of the finalize procedure, the (dynamic) index sets are turned into constant sets, that is, their contents cannot be modied any more. As a consequence, all arrays with these sets as their indices and that are declared after this point are created as arrays of xed size. Alternatively, we may declare the array of type mpvar together with the data arrays and create the required variables explicitly by adding the following lines after the data has been read from le and the two sets ALLPROD and CRUDES have been nalized:
forall(p in ALLPROD) create(produce(p)) forall(c in CRUDES) create(use(c))
In larger applications, typically most data (and the corresponding index sets) are initialized dynamically so that the variable denition needs to be done with one of the two methods described above.
72
To keep the example implementations in this book as easy as possible, we usually dene the index sets as constants directly in the model so that the denition of variables does not require any special care.
6.3.3
Results
The total production cost is B 1,175,400. We produce 40,000 tonnes of petrol from 6,500 tonnes of butane, C 25,500 tonnes of reformate, and 8,000 tonnes of cracked naphtha. With this composition, we obtain an octane value of 98.05, the vapor pressure is 12.23, and the volatility of the petrol is 21.38. The required 30,000 tonnes of diesel oil are produced with 30,000 tonnes of sweetened gasoil, which gives a sulfur content of 0.03%. The 42,000 tonnes of heating oil are composed of 20,000 tonnes of sweetened gasoil, 8,000 tonnes of cracked naphtha, and 14,000 tonnes of cracked gasoil. In addition to this production we also have the required 20,000 tonnes of butane.
6.4
Every lot may be processed by any of the three, fully equivalent production lines of the sugar house. The processing of a lot takes two hours. It must be nished at the latest at the end of the life span of the wagon load. The manager of the sugar house wishes to determine a production schedule for the currently available lots that minimizes the total loss of sugar.
6.4.1
Model formulation
This problem also concerns the primary sector but it is different from the blending problems we have seen so far in this chapter. Let WAGONS = {1, . . . , NW} be the set of wagons, NL the number of production lines and DUR the duration of the production process for every lot. The hourly loss for every wagon w is given by LOSSw and its life span by LIFEw . We observe that in an optimal solution the production lines need to work without any break otherwise we could reduce the loss in sugar by advancing the start of the lot that follows the break. This means that the completion time of every lot is of the form s DUR, with s > 0 and integer. The maximum value of s is the number of time slots (of length DUR) that the sugar house will work, namely NS = ceil ( NW / NL ), where ceil stands for rounded to the next larger integer. If NW / NL is an integer, every line will process exactly NS lots. Otherwise, some lines will process NS 1 lots, but at least one line processes NS lots. In all cases, the length of the optimal schedule is NS DUR hours. We call SLOTS = {1, . . . , NS} the set of time slots. Every lot needs to be assigned to a time slot. We dene binary variables processws that take the value 1 if and only if lot w is assigned to slot s (constraints (6.4.1)). Every lot needs to be assigned to a slot (6.4.2), and any slot may take up to NL lots because there are NL parallel lines (6.4.3). w WAGONS, s SLOTS : processws {0, 1} w WAGONS :
sSLOTS
processws = 1 processws NL
s SLOTS :
wWAGONS
The life span of the sugar lots is given in hours and not in periods of DUR hours. The maximum slot number for a wagon load w is therefore LIFEw / DUR. The constraints (6.4.4) establish this bound for
73
every lot w. Note that the number of the time slot is expressed through a sum of decision variables: due to the constraints (6.4.2) only the index of the slot s for which processws = 1 will be counted for lot w. w WAGONS :
sSLOTS
(6.4.4)
The loss of sugar per wagon load w and time slot s is s DUR LOSSw . The objective function (total loss of sugar) is therefore given by the following expression (6.4.5): minimize
wWAGONS sSLOTS
(6.4.5)
The lines (6.4.1) to (6.4.5) dene the model for our problem. This linear problem is a minimum cost ow problem of a particular type. It is related to the transportation problems (like the car rental problem in Chapter 10). For minimum cost ow problems, the optimal LP solution calculated by the simplex algorithm is integer feasible. We could therefore replace the integrality constraints in our model by non-negativity constraints.
6.4.2
Implementation
The following model is the Mosel implementation of the linear problem. It uses the function ceil to calculate the maximum number of time slots.
model "A-4 Cane sugar production" uses "mmxprs" declarations NW = 11 NL = 3 WAGONS = 1..NW SLOTS = 1..ceil(NW/NL) LOSS: array(WAGONS) of real LIFE: array(WAGONS) of real DUR: integer
! Number of wagon loads of sugar ! Number of production lines ! Time slots for production ! Loss in kg/hour ! Remaining time per lot ! Duration of the production ! 1 if wagon processed in slot, ! 0 otherwise
process: array(WAGONS,SLOTS) of mpvar end-declarations initializations from a4sugar.dat LOSS LIFE DUR end-initializations
! Objective function TotalLoss:= sum(w in WAGONS, s in SLOTS) s*DUR*LOSS(w)*process(w,s) ! Assignment forall(w in WAGONS) sum(s in SLOTS) process(w,s) = 1 ! Wagon loads per time slot forall(s in SLOTS) sum(w in WAGONS) process(w,s) <= NL ! Limit on raw product life forall(w in WAGONS) sum(s in SLOTS) s*process(w,s) <= LIFE(w)/DUR forall(w in WAGONS, s in SLOTS) process(w,s) is_binary ! Solve the problem minimize(TotalLoss)
6.4.3
Results
If we solve the problem without the constraints limiting the life span of the wagon loads we obtain a minimum loss of 1518 kg of sugar. In this case the lots are processed in the order of decreasing loss. With the complete set of constraints we obtain a total loss of 1620 kg of sugar. The corresponding schedule of lots is shown in the following table (there are several equivalent solutions).
74
Table 6.9: Optimal schedule for the cane sugar lots Slot 1 lot 3 (74 kg) lot 6 (108 kg) lot 7 (124 kg) Slot 2 lot 1 (172 kg) lot 5 (52 kg) lot 8 (196 kg) Slot 3 lot 9 (114 kg) lot 10 (168 kg) lot 11 (180 kg) Slot 4 lot 2 (208 kg) lot 4 (224 kg)
6.5
Opencast mining
An opencast uranium mine is being prospected. Based on the results of some test drillings the mine has been subdivided into exploitation units called blocks. The pit needs to be terraced to allow the trucks to drive down to its bottom. The uranium deposit extends from east to west. The pit is limited in the west by a village and in the east by a group of mountains. Taking into account these constraints, 18 blocks of 10,000 tonnes on three levels have been identied (Figure 6.3). To extract a block, three blocks of the level above it need to be extracted: the block immediately on top of it, and also, due to the constraints on the slope, the blocks to the right and to the left.
2 9
3 10 15
4 11 16
5 12 17
6 13 18
7 14
It costs B 100 per tonne to extract a block of level 1, B 200 per tonne for a block of level 2, and B 300 per C C C tonne for a block of level 3, with the exception of the hatched blocks that are formed of a very hard rock rich in quartz and cost B 1000 per ton. The only blocks that contain uranium are those displayed in a gray C shade (1, 7, 10, 12, 17, 18). Their market value is 200, 300, 500, 200, 1000, and B 1200/tonne respectively. C Block 18, although rich in ore, is made of the same hard rock as the other hatched blocks. Which blocks should be extracted to maximize the total benet?
6.5.1
Model formulation
Let BLOCKS be the set of blocks, VALUEb the value per tonne of a block b, and COSTb the cost per tonne of extracting it. The benet of extracting block b per tonne is then given by VALUEb COSTb . The possible extraction sequences of blocks can be represented by a directed graph G = (BLOCKS, ARCS), where ARCS stands for the set of arcs between blocks. An arc (b, a) means that block b can only be extracted if block a has already been taken. For instance, block 16 gives rise to three arcs in G: (16,10), (16,11), and (16,12) and blocks 10, 11, and 12 again to three arcs each, as shown in the following graph. To decide which blocks are extracted we introduce binary variables extractb that take the value 1 if and only if block b is extracted. We obtain the following, very compact problem with 0-1 variables: maximize
bBLOCKS
The objective function (6.5.1) that is to be maximized is the sum of the benets from the blocks that are extracted. The constraints (6.5.2) make sure that the blocks are extracted in the right order: if b is extracted (extractb = 1) then a also needs to be extracted (extracta = 1). The constraints (6.5.3) dene the binary variables.
75
2 10 16 11 12 3 4 5 6
Figure 6.4: Precedence graph for extraction of block 16
It would be possible to replace the constraints (6.5.2) by their aggregate form (6.5.4). In large problems that also include many other variables and constraints this formulation may help reduce the total number of constraints. This reformulation provides a weaker, i.e. relaxed, formulation than the original constraints. In our example this has the disadvantage that whilst for the original formulation the solution of the linear relaxation is already integer, this is no longer true for the relaxed formulation. b BLOCKS, (b, a) ARCS : 3 extractb extracta
aBLOCKS (b,a)ARCS
(6.5.4)
6.5.2
Implementation
The following model implements the LP of the previous section with Mosel. The graph is coded as a two-dimensional array that for every block of levels 2 and 3 contains its three predecessors in the level above it. For instance for block 16, it contains the line (16 1) 10 11 12 which is the short form of (16 1) 10 (16 2) 11 (16 3) 12.
model "A-5 Opencast mining" uses "mmxprs" declarations BLOCKS = 1..18 LEVEL23: set of integer COST: array(BLOCKS) of real VALUE: array(BLOCKS) of real ARC: array(LEVEL23,1..3) of integer extract: array(BLOCKS) of mpvar end-declarations initializations from a5mine.dat COST VALUE ARC end-initializations ! Objective: maximize total profit Profit:= sum(b in BLOCKS) (VALUE(b)-COST(b))* extract(b) ! Extraction order forall(b in LEVEL23) forall(i in 1..3) extract(b) <= extract(ARC(b,i)) forall(b in BLOCKS) extract(b) is_binary ! Solve the problem maximize(Profit) end-model
! ! ! ! !
Set of blocks Blocks in levels 2 and 3 Exploitation cost of blocks Value of blocks Arcs indicating order of extraction
! 1 if block b is extracted
As mentioned earlier, for the model formulation we are using in the implementation the solution to the linear problem is integer. As a general rule, it may be helpful not to declare any special types of
76
variables at the rst attempt at solving a problem: the problem studied may have a specic structure for which the integrality constraints are redundant (this is the case for the present example) or for a certain data set all variables may be integral in the optimal LP solution. Switching integrality conditions off without removing them from the model can also be obtained by adding a parameter to the call to the optimization algorithm. For instance in this example
maximize(XPRS_LIN,Profit)
Another reason not to establish immediately all integrality constraints may be size limitations in the optimization software that is used (the student version of Xpress-Optimizer is limited to 800 variables + constraints out of which at most 500 may be MIP variables or SOS sets). A problem that denes too many integer variables cannot be executed, even if the optimal integer solution could be obtained by solving the LP.
6.5.3
Results
The maximal prot is B 4,000,000. Blocks 1 to 7, 10 to 13, and 17 are extracted. Blocks 8, 9, 14 to 16, and C 18 remain in the pit.
6.6
Production of electricity
Power generators of four different types are available to satisfy the daily electricity demands (in megawatts) summarized in the following table. We consider a sliding time horizon: the period 10pm-12am of day d is followed by the period 0am-6am of day d + 1.
Table 6.10: Daily electricity demands (in MW) Period Demand 0am6am 12000 6am9am 32000 9am12pm 25000 12pm2pm 36000 2pm6pm 25000 6pm10pm 30000 10pm12am 18000
The power generators of the same type have a maximum capacity and may be connected to the network starting from a certain minimal power output. They have a start-up cost, a xed hourly cost for working at minimal power, and an hourly cost per additional megawatt for anything beyond the minimal output. These data are given in the following table.
Table 6.11: Description of power generators Available number Type 1 Type 2 Type 3 Type 4 10 4 8 3 Min. output in MW 750 1000 1200 1800 Max. capacity in MW 1750 1500 2000 3500 Fix cost B/h C 2250 1800 3750 4800 Add. MW cost B/h C 2.7 2.2 1.8 3.8 Start-up cost 5000 1600 2400 1200
A power generator can only be started or stopped at the beginning of a time period. As opposed to the start, stopping a power plant does not cost anything. At any moment, the working power generators must be able to cope with an increase by 20% of the demand forecast. Which power generators should be used in every period in order to minimize the total daily cost?
6.6.1
Model formulation
Let TIME = {1, . . . , NT} be the set of time periods per day and TYPES the set of generator types. For a given time period t, DEMt denotes the electricity demand in the network and LENt the length (number of hours) of the period. For any power generator type p, PMINp and PMAXp are the minimum and maximum capacity respectively, and AVAILp is the available number of generators. The start-up cost is CSTARTp , the hourly cost for working at minimum level is CMINp , and the cost per additional MW hour is CADDp . To formulate this model and account for the different types of cost we need three sets of variables. startpt is the integer number of power generators of type p that start working at the beginning of time period t (6.6.1). workpt is the number of power generators of type p that are working in time period t. This integer number is bounded by the available number of generators AVAILp , constraints (6.6.2). paddpt represents the additional production beyond the minimum output level of generators of type p in time
77
period t. p TYPES, t TIME : startpt IN p TYPES, t TIME : workpt {0, 1, 2, . . . , AVAILp } p TYPES, t TIME : paddpt 0 (6.6.1) (6.6.2) (6.6.3)
For a power generator of type p the additional production is limited by PMAXp PMINp . For every type and time period we can therefore link the additional output with the number of working generators: p TYPES, t TIME : paddpt (PMAXp PMINp ) workpt (6.6.4)
To satisfy the demand in every period we write the constraints (6.6.5). The rst sum is the total basis output by the generators of different types. The second sum is the total additional output beyond the minimum level by all power generators. t TIME :
pTYPES
(6.6.5)
Without starting any new generators, those that are working must be able to produce 20% more than planned: t TIME : PMAXp workpt 1. 20 DEMt (6.6.6)
pTYPES
If no generators were stopped, the number of power generators starting to work in a period t would correspond to the difference between the numbers of generators working in periods t and t 1. Since generators may be stopped (not explicitly counted as there is no impact on the cost), the number of generators starting to work is at least the value of this difference (6.6.7). The constraints (6.6.8) are for the particular case of the transition from the last period of a day to the rst period of the following day. p TYPES, t {2, . . . , NT} : startpt workpt workp,t1 p TYPES : startp1 workp1 workp,NT (6.6.7) (6.6.8)
The daily cost (6.6.9) comprises the start-up cost, the cost for working at the minimum level and the cost for any additional production. These last two costs are proportional to the length of the time periods. minimize
pTYPES tTIME
(6.6.9)
The lines (6.6.1) to (6.6.9) form the nal mixed integer model.
6.6.2
Implementation
The algebraic model translates into the following Mosel model. The constraints (6.6.7) and (6.6.8) are obtained with a single line, using the inline if function of Mosel. Note further that we do not dene variables start as integer since they result from a difference of integer variables work through constraints (6.6.7) and therefore automatically take integer values.
model "A-6 Electricity production" uses "mmxprs" declarations NT = 7 TIME = 1..NT TYPES = 1..4 LEN, DEM: array(TIME) of integer PMIN,PMAX: array(TYPES) of integer CSTART: array(TYPES) of integer CMIN: array(TYPES) of integer CADD: array(TYPES) of real AVAIL: array(TYPES) of integer start: array(TYPES,TIME) of mpvar work: array(TYPES,TIME) of mpvar padd: array(TYPES,TIME) of mpvar
! Time periods ! Power generator types ! ! ! ! ! ! Length and demand of time periods Min. & max output of a generator type Start-up cost of a generator Hourly cost of gen. at min. output Cost/hour/MW of prod. above min. level Number of generators per type
! No. of gen.s started in a period ! No. of gen.s working during a period ! Production above min. output level
78
end-declarations initializations from a6electr.dat LEN DEM PMIN PMAX CSTART CMIN CADD AVAIL end-initializations ! Objective function: total daily cost Cost:= sum(p in TYPES, t in TIME) (CSTART(p)*start(p,t) + LEN(t)*(CMIN(p)*work(p,t) + CADD(p)*padd(p,t))) ! Number of generators started per period and per type forall(p in TYPES, t in TIME) start(p,t) >= work(p,t) - if(t>1, work(p,t-1), work(p,NT)) ! Limit on power production above minimum level forall(p in TYPES, t in TIME) padd(p,t) <= (PMAX(p)-PMIN(p))*work(p,t) ! Satisfy demands forall(t in TIME) sum(p in TYPES) (PMIN(p)*work(p,t) + padd(p,t)) >= DEM(t) ! Security reserve of 20% forall(t in TIME) sum(p in TYPES) PMAX(p)*work(p,t) >= 1.20*DEM(t) ! Limit number of available generators; numbers of generators are integer forall(p in TYPES, t in TIME) do work(p,t) <= AVAIL(p) work(p,t) is_integer end-do ! Solve the problem minimize(Cost) end-model
6.6.3
Results
The optimal LP solution to this problem is a cost of B 985164.3. The optimal integer solution has a cost of C B 1,465,810. For every time period and generator type the following table lists the total output and the C part of the production that is above the minimum level.
Table 6.12: Plan of power generator use Type 0am6am 6am9am 9am12pm 12pm2pm 2pm6pm 6pm10pm 10pm12am 3 2250 0 4 5750 1750 2 4800 1600 0 0 0 4 4600 1600 4 6000 2000 8 16000 6400 3 5400 0 4 3000 0 4 4200 200 8 16000 6400 1 1800 0 7 8600 3350 4 6000 2000 8 16000 6400 3 5400 0 3 2250 0 4 4950 950 8 16000 6400 1 1800 0 3 2600 350 4 6000 2000 8 16000 6400 3 5400 0 3 2250 0 4 5950 1950 4 8000 3200 1 1800 0 1 No. used Tot. output Add. output 2 No. used Tot. output Add. output 3 No. used Tot. output Add. output 4 No. used Tot. output Add. output
By looking at this table we may deduce when power generators are started and stopped: one generator of type 1 starts at the beginning of period 2, and three at the beginning of period 4, four generators stop after period 4. The four generators of type 2 work continuously. Six generators of type 3 start working in period 2, four generators of this type are stopped after period 6 and two more at the end of every day. All three generators of type 4 start at the beginning of period 2, two of which are switched off in the next period, then switched on, switched off, and switched on again and at the end of every day all three are stopped.
79
6.7
80
Chapter 7
Scheduling problems
Scheduling problems are an important class of problems in Operations Research. They consist of distributing the execution of a set of tasks over time subject to various constraints (sequence of tasks, due dates, limited resource availability), with the objective to optimize a criterion like the total duration, the number of tasks that nish late etc. These problems may come from many different elds: project management, industrial production, telecommunications, information systems, transport, timetabling. With the exception of the well known case of project scheduling, these problems are difcult to solve to optimality if they grow large. Nevertheless, instances of smaller size have become solvable by LP, due to the power of current software. This chapter only deals with project and production scheduling problems. The Section 7.1 concerns the construction of a stadium, a typical case of project scheduling in civil engineering. The next three problems are about the management of workshops: Section 7.2 presents a workshop organized in lines (owshop), that all products are run through in the same order. In the job-shop of Section 7.3 every product has a different processing order on the machines of the workshop. Section 7.4 deals with the case of a critical machine, the bottleneck of a workshop. The problem in Section 7.5 consists of distributing the workload of an amplier assembly line to maximize the throughput. This book also discusses scheduling problems in other domains: in air transport (Chapter 11), telecommunications (Chapter 12) and for establishing a timetable (Chapter 14).
7.1
Construction of a stadium
A town council wishes to construct a small stadium in order to improve the services provided to the people living in the district. After the invitation to tender, a local construction company is awarded the contract and wishes to complete the task within the shortest possible time. All the major tasks are listed in the following table. The durations are expressed in weeks. Some tasks can only start after the completion of certain other tasks. The last two columns of the table refer to question 2 which we shall see later. Question 1: Which is the earliest possible date of completing the construction? Question 2: The town council would like the project to terminate earlier than the time announced by the builder (answer to question 1). To obtain this, the council is prepared to pay a bonus of B 30K for every C week the work nishes early. The builder needs to employ additional workers and rent more equipment to cut down on the total time. In the preceding table he has summarized the maximum number of weeks he can save per task (column "Max. reduct.") and the associated additional cost per week. When will the project be completed if the builder wishes to maximize his prot?
7.1.1
81
Table 7.1: Data for stadium construction Task 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Description Installing the construction site Terracing Constructing the foundations Access roads and other networks Erecting the basement Main oor Dividing up the changing rooms Electrifying the terraces Constructing the roof Lighting of the stadium Installing the terraces Sealing the roof Finishing the changing rooms Constructing the ticket ofce Secondary access roads Means of signalling Lawn and sport accessories Handing over the building Duration 2 16 9 8 10 6 2 2 9 5 3 2 1 7 4 3 9 1 Predecessors none 1 2 2 3 4,5 4 6 4,6 4 6 9 7 2 4,14 8,11,14 12 17 Max. reduct. 0 3 1 2 2 1 1 0 2 1 1 0 0 2 2 1 3 0 Add. cost per week (in 1000 B) C 30 26 12 17 15 8 42 21 18 22 12 6 16
7 4
13 10 9 12 8 11 16 17 18 F
14 15
Figure 7.1: Precedence graph of construction tasks
Scheduling problems
82
into constraints (7.1.1): if there is an arc between i and j, then the completion time of i (starti + DURi ) must not be larger than the start time of j. (i, j) ARCS : starti + DURi startj (7.1.1)
The objective is to minimize the completion time of the project, that is the start time of the last, ctitious task N. We complete the mathematical model with the following lines: minimize startN i TASKS : starti 0 (7.1.2) (7.1.3)
7.1.2
Implementation of question 1
The translation of the mathematical model into Mosel is straightforward. The set of arcs is implemented as a two-dimensional binary matrix ARC, an element ARCij = 1 if and only if the arc (i, j) exists. At its denition, we do not x the index sets of this array and use the keyword range instead, which results in the denition of a dynamic array for which only those entries exist that are read in from the data le. The latter only contains the list of dened arcs (using an array format that is usually referred to as sparse format as opposed to the dense format where all entries must be dened). Note that the objective function of this problem is simply a single variable (the ctitious end task).
model "B-1 Stadium construction (First part)" uses "mmxprs" declarations N = 19 TASKS=1..N ARC: array(range,range) of real DUR: array(TASKS) of real start: array(TASKS) of mpvar end-declarations initializations from b1stadium.dat ARC DUR end-initializations ! Precedence relations between tasks forall(i,j in TASKS | ARC(i,j)=1) start(i) + DUR(i) <= start(j) ! Solve the first problem: minimize the total duration minimize(start(N)) end-model
! Number of tasks in the project ! (last = fictitious end task) ! Matrix of the adjacency graph ! Duration of tasks ! Start times of the tasks
7.1.3
7.1.4
Scheduling problems
83
14 4 1 0 2 10 20 3 7
13
11 16 8
15 10
5 30
6 40
9 50
12
17 60 64 18
For the last task, the variable saveN represents the number of weeks the project nishes earlier than the solution obj1 calculated in answer to question 1. The new completion time of the project startN must be equal to the previous completion time minus the advance saveN , which leads to the constraint (7.1.5). startN = obj1 saveN (7.1.5)
The constraints (7.1.1) need to be modied to take into account the new variables savei . The new completion time of a task is equal to its start, plus its duration, minus the savings, or starti + DURi savei . We rename these constraints to (7.1.6). (i, j) ARCS : starti + DURi savei startj (7.1.6)
The objective has also been redened by the second question. We now want to maximize the builders prot. For every week nished early, he receives a bonus of BONUS kB. In exchange, the savings in time C for a task i costs COSTi kB (column Add. cost per week of Table 7.1). The new objective function will be C labelled (7.1.7). (7.1.7) maximize BONUS saveN COSTi savei
iTASKS\{N}
The new mathematical model consists of relations (7.1.6), (7.1.7), (7.1.3), (7.1.4), and (7.1.5), and the non-negativity conditions for variables savei .
7.1.5
Implementation of question 2
It is possible to implement the model for question 2 as an addition to the model for question 1 shown above, all in a single Mosel program. This makes it possible to retrieve the solution value of the rst problem and use it in the denition of the second problem without the need for any interaction. Since we need to make some additions to the rst model, we repeat the complete example. The additions to the previous implementation of the rst part are the following: A solution printing subroutine: we want to print the solution to the problem twice (that is, the start times assigned to tasks). To avoid having to repeat the same lines of code several times we dene a subroutine that is called whenever we want to print a solution. The third line of the model now contains the declaration of the procedure print_sol that is dened at the end of the program. This declaration (using the keyword forward) is required if a user-dened subroutine is called before it is dened. A subroutine has a similar structure to a model in Mosel; we shall see more examples of subroutines in the following chapters. The precedence constraints are named: Mosel denes models incrementally. If we simply add the new denition of the precedence constraints in the second part of the model, we also keep the previous denition of these constraints. By naming the constraints and re-assigning them we override the rst denition. A real number obj1 is used to store the solution value of the rst problem. After solving the second problem, we print the solution value of this problem using the function getsol (we could equally have used getobjval, this is just to make clear which is the constraint that denes the current objective function). If it is applied to a constraint, the function getsol returns its evaluation with the current solution (note that a constraint is stored in the form variableterms RHSvalue which is the expression that is evaluated by the function).
Scheduling problems
84
model "B-1 Stadium construction (Complete model)" uses "mmxprs" forward procedure print_sol declarations N = 19 TASKS=1..N ARC: array(range,range) of real DUR: array(TASKS) of real start: array(TASKS) of mpvar obj1: real end-declarations initializations from b1stadium.dat ARC DUR end-initializations ! Precedence relations between tasks forall(i,j in TASKS | ARC(i,j)=1) Prec(i,j):= start(i) + DUR(i) <= start(j) ! Solve the first problem: minimize the total duration minimize(start(N)) obj1:=getobjval ! Solution printing print_sol ! **** Extend the problem **** declarations BONUS: integer MAXW: array(TASKS) of real COST: array(TASKS) of real save: array(TASKS) of mpvar end-declarations initializations from b1stadium.dat MAXW BONUS COST end-initializations ! Second objective function Profit:= BONUS*save(N) - sum(i in 1..N-1) COST(i)*save(i) ! Redefine precedence relations between tasks forall(i,j in TASKS | ARC(i,j)=1) Prec(i,j):= start(j) - start(i) + save(i) >= DUR(i) ! Total duration start(N) + save(N) = obj1 ! Limit on number of weeks that may be saved forall(i in 1..N-1) save(i) <= MAXW(i) ! Solve the second problem: maximize the total profit maximize(Profit) ! Solution printing writeln("Total profit: ", getsol(Profit)) print_sol !----------------------------------------------------------------procedure print_sol writeln("Total duration: ", getsol(start(N)), " weeks") forall(i in 1..N-1) write(strfmt(i,2), ": ", strfmt(getsol(start(i)),-3), if(i mod 9 = 0,"\n","")) writeln end-procedure end-model
! Number of tasks in the project ! (last = fictitious end task) ! ! ! ! Matrix of the adjacency graph Duration of tasks Start times of tasks Solution of the first problem
! ! ! !
Bonus per week finished earlier Max. reduction of tasks (in weeks) Cost of reducing tasks by a week Number of weeks finished early
Scheduling problems
85
7.1.6
13 7 14 4 1 0 2 10 3 20 15 10 5 30 6 11 16 8 9 40 12 17 50 54 18
7.2
Flow-shop scheduling
A workshop that produces metal pipes on demand for the automobile industry has three machines for bending the pipes, soldering the fastenings, and assembling the links. The workshop has to produce six pieces, for which the durations of the processing steps (in minutes) are given in the following table. Every workpiece rst goes to bending, then to soldering, and nally to assembly of the links. Once started, any operations must be carried out without interruption, but the workpieces may wait between the machines.
Table 7.2: Processing durations in minutes Workpiece Bending Soldering Assembly 1 3 5 5 2 6 4 2 3 3 2 4 4 5 4 6 5 5 4 3 6 7 5 6
Every machine only processes one piece at a time. A workpiece may not overtake any other by passing onto the following machine. This means that if at the beginning a sequence of the workpieces is established, they will be processed on every machine in exactly this order. Which is the sequence of workpieces that minimizes the total time for completing all pieces?
7.2.1
Model formulation
From now on, we work with MACH = {1, . . . , NM} the set of machines and JOBS = {1, . . . , NJ} the set of pieces (jobs) to produce. The processing duration of a piece j on a machine m is given by DURm,j . Every workpiece has to run through the machines 1, . . . , NM in exactly this order, without being able to overtake other pieces. We can therefore dene a schedule by the initial order of the workpieces. The duration of the schedule is given as the time instant when the machine NM nishes the last job. The sequence of the jobs can be dened with the help of binary variables rankjk that are 1 if and only if piece j has the rank (position) k in the starting sequence (7.2.1). The set of starting positions RANKS is the same as the set of jobs JOBS since every job needs to be assigned a rank (7.2.2), and every rank must be occupied by one job only (7.2.3). These constraints are typical of assignment problems (see also the assignment of personnel to workstations in Chapter 14). j JOBS, k RANKS : rankjk {0, 1} k RANKS :
jJOBS
rankjk = 1 rankjk = 1
j JOBS :
kRANKS
Scheduling problems
86
In this problem it is relatively difcult to calculate the starting or completion times of the operations from the ranks. To obtain these values, we introduce two additional sets of variables emptymk and waitmk (7.2.4) (7.2.5). The variables emptymk (with m in MACH and k in 1, . . . , NJ 1) denote the time between the processing of the jobs with rank k and k + 1 on a machine m, i.e. the time that the machine m is idle after the termination of the workpiece with rank k. A variable waitmk (with m in 1, . . . , NM and k in RANKS) is the waiting time for the job with rank k between its processing on machines m and m + 1. The workpieces can be processed without any pause on the rst machine that does not have to wait for any preceding machines, so the variables empty1k are therefore always 0 (7.2.6). Similarly, the rst workpiece in the sequence can pass through all machines without any waiting times, which means the variables waitm1 can also be xed to 0 (7.2.7). m MACH, k = 1, . . . , NJ 1 : emptymk 0 m = 1, . . . , NM 1, k RANKS : waitmk 0 k = 1, . . . , NJ 1 : empty1k = 0 m = 1, . . . , NM 1 : waitm1 = 0 (7.2.4) (7.2.5) (7.2.6) (7.2.7)
To simplify the formulation of the following constraints, we introduce the notation durmk for the processing duration of the job of rank k on machine m, dened by the relations (7.2.8). Through the constraints (7.2.3) only a single variable rankjk takes the value 1 in this sum, and only the duration of the corresponding workpiece will be counted. Using this notation and the variables emptymk we are now able to write down the objective function (7.2.9). m MACH, k RANKS : durmk =
jJOBS NM1 NJ1 NM1 NJ1
DURmj rankjk
(7.2.8)
minimize
m=1
durm1 +
k=1
emptyNM,k =
m=1 jJOBS
DURmj rankj1 +
k=1
emptyNM,k
(7.2.9)
The rst sum results in the point of time when the last machine (machine NM) starts working: this is the total time required for the rst job on all preceding machines (1, . . . , NM 1). The second sum is the total duration of idle times between processing operations on the last machine. The following graphic represents these quantities. Normally, we also needed to count the durations of all operations on the last machine, but this is a constant and may be omitted.
dur 11 dur 21
...
dur NM,1 emptyNM,1 dur NM,2
The tricky bit that is now left is to link the variables waitmk and emptymk to the variables rankjk . To do so, we introduce dnextmk , the time between the completion of job k on machine m and the start of job k + 1 on machine m + 1.
emptymk dur mk dur m,k+1
Machine m
wait mk
wait m,k+1
Machine m+1
dur m+1,k
emptym+1,k
dur m+1,k+1
Scheduling problems
87
With the help of Figure 7.5, it is easy to see that the equations (7.2.10) hold. These can be developed to the constraints (7.2.11). m = 1, . . . , NM 1, k = 1, . . . , NJ 1 : dnextmk = emptymk + durm,k+1 + waitm,k+1 = waitmk + durm+1,k + emptym+1,k m = 1, . . . , NM 1, k = 1, . . . , NJ 1 : emptymk +
jJOBS
(7.2.10)
(7.2.11)
The resulting model is given through the lines (7.2.1) to (7.2.7), (7.2.9), and (7.2.11). This is a mixed-integer problem since only the variables rankjk are constrained to be integer (more exactly, binary).
7.2.2
Implementation
The following Mosel program implements the mathematical model of the previous section. In order to extract the resulting schedule more easily, variables startmk have been added that indicate the start of the job with rank k on machine m. These variables are linked to the rankjk variables via an additional set of constraints.
model "B-2 Flow shop" uses "mmxprs" declarations NM = 3 NJ = 6 MACH = 1..NM RANKS = 1..NJ JOBS = 1..NJ DUR: array(MACH,JOBS) of integer
rank: array(JOBS,RANKS) of mpvar ! 1 if job j has rank k, 0 otherwise empty: array(MACH,1..NJ-1) of mpvar ! Space between jobs of ranks k and k+1 wait: array(1..NM-1,RANKS) of mpvar ! Waiting time between machines m ! and m+1 for job of rank k start: array(MACH,RANKS) of mpvar ! Start of job rank k on machine m ! (optional) end-declarations initializations from b2flowshop.dat DUR end-initializations ! Objective: total waiting time (= time before first job + times between ! jobs) on the last machine TotWait:= sum(m in 1..NM-1,j in JOBS) (DUR(m,j)*rank(j,1)) + sum(k in 1..NJ-1) empty(NM,k) ! Every position gets a jobs forall(k in RANKS) sum(j in JOBS) rank(j,k) = 1 ! Every job is assigned a rank forall(j in JOBS) sum(k in RANKS) rank(j,k) = 1 ! Relations between the end of job rank k on machine m and start of job on ! machine m+1 forall(m in 1..NM-1,k in 1..NJ-1) empty(m,k) + sum(j in JOBS) DUR(m,j)*rank(j,k+1) + wait(m,k+1) = wait(m,k) + sum(j in JOBS) DUR(m+1,j)*rank(j,k) + empty(m+1,k) ! Calculation of start times (to facilitate the interpretation of results) forall(m in MACH, k in RANKS) start(m,k) = sum(u in 1..m-1,j in JOBS) DUR(u,j)*rank(j,1) + sum(p in 1..k-1,j in JOBS) DUR(m,j)*rank(j,p) + sum(p in 1..k-1) empty(m,p) ! First machine has no idle times
Scheduling problems
88
forall(k in 1..NJ-1) empty(1,k) = 0 ! First job has no waiting times forall(m in 1..NM-1) wait(m,1) = 0 forall(j in JOBS, k in RANKS) rank(j,k) is_binary ! Solve the problem minimize(TotWait) end-model
It may be noted that it is possible to use an alternative formulation with Special Ordered Sets of type 1 (SOS1) instead of constraining variables rankjk to be binary. The corresponding line in the program above needs to be replaced by one of the following two lines:
forall(j in JOBS) sum(k in RANKS) k*rank(j,k) is_sos1
or
forall(k in RANKS) sum(j in JOBS) j*rank(j,k) is_sos1
In the rst case, we dene a SOS1 for every job, where the rank number is used as weight coefcient in the set; in the second case, a SOS1 is established for every rank position using the job numbers as weight coefcients. Exactly one variable of a SOS1 takes a value different from 0, and due to the constraints (7.2.2) and (7.2.3) this value will be 1.
7.2.3
Results
The minimum waiting time calculated for the last machine is 9. With the variables startmk we can deduce a total duration of 35. A schedule (there are several possibilities) that has this minimum duration is shown in the following table.
Table 7.3: Optimal schedule of workpieces Rank number Workpiece number Start on machine 1: Start on machine 2: Start on machine 3: 1 3 0 3 5 2 1 3 6 11 3 4 6 11 16 4 6 11 18 23 5 5 18 23 29 6 2 23 29 33
7.3
Green
Paper 2 Paper 3
Blue
Paper 2
Yellow
Paper 3
Paper 3 Paper 1
Paper 2
The processing times differ depending on the surface that needs to be printed. The times (in minutes) for applying every color of the three paper types are given in the following table.
Scheduling problems
89
Table 7.4: Times required for applying every color Machine 1 2 3 Color Blue Green Yellow Paper 1 45 10 Paper 2 20 10 34 Paper 3 12 17 28
Knowing that every machine can only process one wallpaper at a time and that a paper cannot be processed by several machines simultaneously, how should the paper printing be scheduled on the machines in order to nish the order as early as possible?
7.3.1
Model formulation
Let JOBS be the set of jobs (paper types) and MACH the set of machines. We are going to use the variables startmj for the start of job j on machine m (supposing the the schedule starts at time 0). We write DURmj for the processing duration of job j on machine m. The variable nish indicates the completion time of the entire schedule. Since we want to minimize the completion time, the objective function is simply (7.3.1). minimize nish (7.3.1) The schedule terminates when all paper types are completed, that is, when the last operation for every types nishes. The completion time of the schedule therefore needs to satisfy the following constraints (7.3.2) (7.3.4). nish start31 + DUR31 nish start32 + DUR32 nish start23 + DUR23 (7.3.2) (7.3.3) (7.3.4)
The constraints between processing operations are of two types: the so-called conjunctive constraints represent the precedences between the operations for a single paper type, and the disjunctive constraints express the fact that a machine can only execute a single operation at a time. To start, we consider the conjunctive constraints. Paper 1 rst goes onto the machine printing the blue color (machine 1), and then onto the one printing yellow (machine 3). This means that the processing of paper 1 on machine 1 needs to be nished when the processing on machine 3 starts, and hence, the constraint (7.3.5) needs to hold. start11 + DUR11 start31 (7.3.5) Similarly, paper 2 is rst processed on machine 2, then on machine 1 and then on machine 3, which leads to the constraints (7.3.6) and (7.3.7). start22 + DUR22 start12 start12 + DUR12 start32 (7.3.6) (7.3.7)
For paper 3, that is processed in the order machine 3, machine 1, machine 2, we obtain the following constraints (7.3.8) and (7.3.9). start33 + DUR33 start13 start13 + DUR13 start23 (7.3.8) (7.3.9)
We now still need to model the disjunctions. Machine 1 has to process all three wallpaper types. Since a machine can only perform a single operation at any time, either paper 1 is printed before paper 2 or paper 2 is printed before paper 1. This is expressed by the following: start11 + DUR11 start12 start12 + DUR12 start11 These two mutually exclusive constraints can be written as the constraints (7.3.10) and (7.3.11), where M is a large positive number and y1 is a binary variable that takes the value 1 if paper 1 comes before paper 2 on machine 1, and 0 otherwise. start11 + DUR11 start12 + M (1 y1 ) start12 + DUR12 start11 + M y1 (7.3.10) (7.3.11)
Scheduling problems
90
Let us see why this claim is correct. If paper 1 comes before paper 2 on machine 1, then y1 has the value 1 and we obtain the constraints start11 + DUR11 start12 and start12 + DUR12 start11 + M. The rst constraint requires that the processing of paper 2 on machine 1 takes places after the printing of paper 1 is terminated. Whatever value start11 and start12 may take, the second constraint is automatically fullled due to the large value M. If, on the contrary, paper 2 is processed before paper 1 on machine 1, then y1 has the value 0 and we obtain the constraints start11 + DUR11 start12 + M and start12 + DUR12 start11 . This time, the rst constraint is automatically fullled and the second guarantees that the processing of wallpaper 2 is terminated before the start of paper 1. Proceeding in this way, we can translate all pairs of disjunctions between operations on the same machine by dening a binary variable yd for every disjunction (d = 1, . . . , ND). We thus obtain the following constraints (7.3.12) (7.3.23): start11 + DUR11 start13 + M (1 y2 ) start13 + DUR13 start11 + M y2 start12 + DUR12 start13 + M (1 y3 ) start13 + DUR13 start12 + M y3 start22 + DUR22 start23 + M (1 y4 ) start23 + DUR23 start22 + M y4 start31 + DUR31 start32 + M (1 y5 ) start32 + DUR32 start31 + M y5 start31 + DUR31 start33 + M (1 y6 ) start33 + DUR33 start31 + M y6 start32 + DUR32 start33 + M (1 y7 ) start33 + DUR33 start32 + M y7 (7.3.12) (7.3.13) (7.3.14) (7.3.15) (7.3.16) (7.3.17) (7.3.18) (7.3.19) (7.3.20) (7.3.21) (7.3.22) (7.3.23)
The constraints (7.3.12) (7.3.15) establish the rest of the disjunctions on machine 1, constraints (7.3.16) and (7.3.17) the disjunction of papers 2 and 3 on machine 2, and the constraints (7.3.18) (7.3.23) the disjunctions between the processing of the three papers on machine 3. To avoid numerical instabilities, the value of M should not be chosen too large. It is, for instance, possible to use as its value an upper bound UB on the schedule determined through some heuristic. In this case the following constraint (7.3.24) needs to be added to the mathematical model, which may also help to reduce the number of nodes explored by the tree search. nish UB (7.3.24)
In our small example, we are going to use as the value for M the sum of all processing times as this gives a rough but safe upper bound. To complete the formulation of the model, we need to add the non-negativity constraints for the start time variables (7.3.25) and constrain the yd to be binaries (7.3.26). m MACH, j JOBS : startmj 0 d {1, . . . , ND} : yd {0, 1} (7.3.25) (7.3.26)
By renumbering the operations (tasks) using a single subscript (resulting in the set TASKS) we obtain a more general model formulation. The precedence relations and disjunctions can be represented as a disjunctive graph G = (TASKS, ARCS, DISJS) where ARCS is the set of arcs (precedences) and DISJS the set of disjunctions. There is an arc (i, j) between two tasks i and j if i is the immediate predecessor of j. A disjunction [i, j] indicates that tasks i and j are disjoint. With these conventions we obtain the following model (7.3.27) (7.3.32). minimize nish j TASKS : startj + DURj nish (i, j) ARCS : starti + DURi startj [i, j] DISJ : starti + DURi startj + M yij startj + DURj starti + M (1 yij ) j TASKS : startj 0 [i, j] DISJ : yij {0, 1} (7.3.27) (7.3.28) (7.3.29) (7.3.30) (7.3.31) (7.3.32)
The objective function remains the same as before. The constraints (7.3.2) (7.3.4) are generalized by the constraints (7.3.28): the completion time of the schedule is greater than or equal to the completion
Scheduling problems
91
time of the last operation for every paper time, and hence to the completion times of all operations. The constraints (7.3.29) state the conjunctions (precedences) and (7.3.30) the disjunctions. The last two sets of constraints are the non-negativity conditions for the start time variables (7.3.31) and the constraints turning the disjunction variables yij into binaries.
7.3.2
Implementation
The following Mosel program implements the mathematical model given in lines (7.3.27) (7.3.32) of the previous section, that is, it uses a single index set TASKS for numbering the operations instead of a double machine-paper type index for start time variables and durations. In the set of examples on the books website a second implementation is provided that uses the double subscript of the rst mathematical model (lines (7.3.1) (7.3.25) of the previous section). The sequence of operations for every paper type is given in the form of a list of precedences: an entry in the table ARCij is dened if task i immediately precedes task j. The disjunctions are input in a similar way: an entry in the table DISJij is dened if and only if tasks i and j are processed on the same machine and are therefore in disjunction.
model "B-3 Job shop" uses "mmxprs" declarations TASKS=1..8
DUR: array(TASKS) of integer ! Durations of jobs on machines ARC: dynamic array(TASKS,TASKS) of integer ! Precedence graph DISJ: dynamic array(TASKS,TASKS) of integer ! Disjunctions between jobs start: array(TASKS) of mpvar finish: mpvar y: array(range) of mpvar end-declarations initializations from b3jobshop.dat DUR ARC DISJ end-initializations BIGM:= sum(j in TASKS) DUR(j) ! Some (sufficiently) large value ! Start times of tasks ! Schedule completion time ! Disjunction variables
! Precedence constraints forall(j in TASKS) finish >= start(j)+DUR(j) forall(i,j in TASKS | exists(ARC(i,j)) ) start(i)+DUR(i) <= start(j) ! Disjunctions d:=1 forall(i,j in TASKS | i<j and exists(DISJ(i,j)) ) do create(y(d)) y(d) is_binary start(i)+DUR(i) <= start(j)+BIGM*y(d) start(j)+DUR(j) <= start(i)+BIGM*(1-y(d)) d+=1 end-do ! Bound on latest completion time finish <= BIGM ! Solve the problem: minimize latest completion time minimize(finish) end-model
The implementation of this model uses some features of the Mosel language that have not yet been introduced: In the declarations block the reader may have noted the keywords dynamic array and range. Both indicate that the corresponding arrays are dened as dynamic arrays. range indicates an unknown index set that is a consecutive sequence of integers (which may include 0 or negative values). We do not have to enumerate the array of variables y so that there is no need to name its index set. We could proceed in the same way for the arrays ARC and DISJ, but since we know that their index sets are subsets of TASKS (which is also used later on for enumerating the array entries) we use this name for the index sets.
Scheduling problems
92
However, the set TASKS is dened as a constant set directly at its declaration, which means that any array with this index will be created with a xed size. For both arrays, ARC and DISJ only very few entries are dened, and it is therefore preferable to force them to be initialized dynamically with the data read from le this is done with the keyword dynamic. In the forall loops enumerating the precedence arcs and the disjunctions, we use the function exists to test whether an array entry is dened. For arrays with few dened entries (sparse arrays) this is a very efcient way of enumerating these entries. Note that for an efcient use of exists the index sets in the loop must be the same as those used in the denition of the array that the condition bears on. Another new feature is the forall-do loop used in the formulation of the disjunctions: so far we have only seen the inline version that loops over a single statement. The full version needs to be used if the loop applies to a block of program statements.
7.3.3
Results
After solving this problem we obtain a total completion time of 97. The start and completion times for all jobs are given in the following table (there are several possible solutions).
Table 7.5: Starting times of operations Paper 1 Blue Green Yellow 42 87 87 97 Paper 2 10 30 0 10 30 64 Paper 3 30 42 42 59 0 28
This schedule may be represented as a bar chart, also called a Gantt chart, that has the time as its horizontal axis. Every task (job) is represented by a rectangle, the length of which is proportional to its duration. All operations on a single machine are placed in the same line.
Paper 2
Paper 1
Paper 3
Paper 1
10
20
30
40
50
60
70
80
90
100
7.4
Scheduling problems
93
Table 7.6: Task time windows and durations Job Release date Duration Due date 1 2 5 10 2 5 6 21 3 4 8 15 4 0 4 10 5 0 2 5 6 8 4 15 7 9 2 22
7.4.1
Model formulation
We are going to deal with the different objective functions in sequence, but the body of the model will remain the same. For writing a model that corresponds to the three objectives at a time, we are going to use binary variables rankjk (j, k JOBS = {1, . . . , NJ}) that have the value 1 if job j has the position (rank) k and 0 in all other cases. There can be only one job per position k and every job j takes a single position. This leads to constraints (7.4.1) and (7.4.2). k JOBS :
jJOBS
rankjk = 1 rankjk = 1
kJOBS
(7.4.1) (7.4.2)
j JOBS :
The processing time for the job in position k is given by the sum jJOBS DURj rankjk (where DURj denotes the duration given in the table in the previous section). Only for the job j in position k does the variable rankjk have the value 1. By multiplying with the duration of job j, we are able to retrieve the duration of the job at position k. Using this technique we can write the constraints of our problem. If startk is the start time of the job at position k, this value must be at least as great as the release date (given as RELj ) of the job assigned to this position. This gives the constraints (7.4.3): k JOBS : startk
jJOBS
RELj rankjk
(7.4.3)
Another constraint used by all models species that two jobs cannot be processed simultaneously. The job in position k + 1 must start after the job in position k has nished, hence the constraints (7.4.4). k {1, . . . , NJ 1} : startk+1 startk +
jJOBS
DURj rankjk
(7.4.4)
Objective 1: The rst objective is to minimize the makespan (completion time of the schedule), or equivalently, to minimize the completion time of the last job (job with rank k). The line (7.4.5) models this objective. The complete model is then given by the following: minimize startNJ +
jJOBS
DURj rankj,NJ
k JOBS :
jJOBS
rankjk = 1 rankjk = 1
kJOBS
j JOBS :
k JOBS : startk
jJOBS
RELj rankjk
Objective 2: For minimizing the average processing time, we introduce additional variables compk (representing the completion times of the job in position k) to simplify the notation. We add the following two sets of constraints to the problem to obtain these completion times: k JOBS : compk = startk +
jJOBS
DURj rankjk
(7.4.12) (7.4.13)
k JOBS : compk 0
Scheduling problems
94
The new objective (7.4.14) consists of minimizing the average processing time, or equivalently, minimizing the sum of the job completion times. minimize compk (7.4.14)
kJOBS
The complete model for the second objective consists of lines (7.4.14) and (7.4.6) to (7.4.13). Objective 3: If we now aim to minimize the total tardiness, we again introduce new variables this time to measure the amount of time that jobs nish after their due date. We write latek for the variable that corresponds to the tardiness of the job with rank k. Its value is the difference between the completion time of a job j and its due date DUEj . If the job nishes before its due date, the value must be 0. We thus obtain the constraints (7.4.15) and (7.4.16). k JOBS : latek = max(0, compk
jJOBS
DUEj rankjk )
(7.4.15) (7.4.16)
k JOBS : latek 0 The new objective function (7.4.17) minimizes the total tardiness of all jobs: minimize
kJOBS
latek
(7.4.17)
The new model is given by the constraints (7.4.17), (7.4.6) to (7.4.13), and (7.4.15) to (7.4.16).
7.4.2
Implementation
The Mosel implementation below solves the same problem three times, each time with a different objective, and prints the resulting solutions. To simplify the representation, we use the completion time variables already in the formulation of the rst objective. For the calculation of the tardiness of jobs, this implementation uses the fact that by default all variables are non-negative. That means that if the constraint that calculates the difference between the completion time and the due date results in a negative lower bound for latek , then the Xpress-Optimizer will set this variable to 0.
model "B-4 Sequencing" uses "mmxprs" forward procedure print_sol(obj:integer) declarations NJ = 7 JOBS=1..NJ REL: array(JOBS) of integer DUR: array(JOBS) of integer DUE: array(JOBS) of integer rank: array(JOBS,JOBS) of mpvar start: array(JOBS) of mpvar comp: array(JOBS) of mpvar late: array(JOBS) of mpvar finish: mpvar end-declarations initializations from b4seq.dat DUR REL DUE end-initializations ! One job per position and one position per job forall(k in JOBS) sum(j in JOBS) rank(j,k) = 1 forall(j in JOBS) sum(k in JOBS) rank(j,k) = 1 ! Sequence of jobs forall(k in 1..NJ-1) start(k+1) >= start(k) + sum(j in JOBS) DUR(j)*rank(j,k) ! Start times forall(k in JOBS) start(k) >= sum(j in JOBS) REL(j)*rank(j,k) ! Completion times
! Number of jobs
! Release dates of jobs ! Durations of jobs ! Due dates of jobs ! ! ! ! ! =1 if job j at position k Start time of job at position k Completion time of job at position k Tardiness of job at position k Completion time of the entire schedule
Scheduling problems
95
forall(k in JOBS) comp(k) = start(k) + sum(j in JOBS) DUR(j)*rank(j,k) forall(j,k in JOBS) rank(j,k) is_binary ! Objective function 1: minimize latest completion time forall(k in JOBS) finish >= comp(k) minimize(finish) print_sol(1) ! Objective function 2: minimize average completion time minimize(sum(k in JOBS) comp(k)) print_sol(2) ! Objective function 3: minimize total tardiness forall(k in JOBS) late(k) >= comp(k) - sum(j in JOBS) DUE(j)*rank(j,k) minimize(sum(k in JOBS) late(k)) print_sol(3) !----------------------------------------------------------------! Solution printing procedure print_sol(obj:integer) writeln("Objective ", obj, ": ", getobjval, if(obj>1, " completion time: " + getsol(finish), "") ) write("\t") forall(k in JOBS) write(strfmt(getsol(sum(j in JOBS) j*rank(j,k)),4)) write("\nStart\t") forall(k in JOBS) write(strfmt(getsol(start(k)),4)) write("\nEnd\t") forall(k in JOBS) write(strfmt(getsol(comp(k)),4)) write("\nDue\t") forall(k in JOBS) write(strfmt(getsol(sum(j in JOBS) DUE(j)*rank(j,k)),4)) if(obj=3) then write("\nLate\t") forall(k in JOBS) write(strfmt(getsol(late(k)),4)) end-if writeln end-procedure end-model
Similarly to the implementation of the rst problem in this chapter, we dene a procedure for printing out the solution that is called after every optimization run. In this example, we want to introduce some variations in the way the solutions are printed depending on the optimization criterion, we therefore pass the number of the latter as parameter to the subroutine. For selecting the information that is to be printed we use two different versions of the if statement: the inline if and if-then that includes a block of statements. The reader may have been wondering why we did not use the probably more obvious pair start end for naming the variables in this example: end is a keyword of the Mosel language (see Section 5.2.3), which means that neither end nor END may be redened by a Mosel program. It is possible though, to use versions combining lower and upper case letters, like End, but to prevent any possible confusion we do not recommend their use.
7.4.3
Results
The minimum makespan of the schedule is 31, the minimum sum of completion times is 103 (which gives an average of 103 / 7 = 14. 71). A schedule with this objective value is 4 5 2 6 7 3 1. If we compare the completion times with the due dates we see that the jobs 1, 2, 3, and 6 nish late (with a total tardiness of 21). The minimum tardiness is 18. A schedule with this tardiness is 5 1 4 6 2 7 3 where jobs 4 and 7 nish one time unit late and job 3 is late by 16, it terminates at time 31 instead of being ready at its due date 15. This schedule has an average completion time of 15.71.
7.5
Paint production
As a part of its weekly production a paint company produces ve batches of paints, always the same, for some big clients who have a stable demand. Every paint batch is produced in a single production process, all in the same blender that needs to be cleaned between two batches. The durations of blending paint
Scheduling problems
96
batches 1 to 5 are respectively 40, 35, 45, 32, and 50 minutes. The cleaning times depend on the colors and the paint types. For example, a long cleaning period is required if an oil-based paint is produced after a water-based paint, or to produce white paint after a dark color. The times are given in minutes in the following table CLEAN where CLEANij denotes the cleaning time between batch i and batch j.
Table 7.7: Matrix of cleaning times 1 1 2 3 4 5 0 5 13 9 3 2 11 0 15 13 7 3 7 13 0 5 7 4 13 15 23 0 7 5 11 15 11 3 0
Since the company also has other activities, it wishes to deal with this weekly production in the shortest possible time (blending and cleaning). Which is the corresponding order of paint batches? The order will be applied every week, so the cleaning time between the last batch of one week and the rst of the following week needs to be counted for the total duration of cleaning.
7.5.1
Model formulation
We may try to model this problem as an assignment problem like the assignment of personnel to workposts (Chapter 14) and the problem of ight connections (Chapter 11). Let JOBS = {1, . . . , NJ} be the set of batches to produce, DURj the processing time for batch j, and CLEANij the cleaning time between the consecutive batches i and j. We introduce decision variables succij that take the value 1 if and only if batch j succeeds batch i. This means that we need to decide which successor is assigned to every batch i. We thus nd the classical formulation of an assignment problem. minimize
iJOBS jJOBS,j=i
i JOBS : j JOBS :
iJOBS,i=j
succij = 1
Note that we do not use any variables succij with i = j since a batch may not appear more than once in the production cycle. It would be possible to include these variables and penalize them through a large value in the diagonal of CLEAN. The constraints (7.5.2) and (7.5.3) guarantee that every batch has a single successor and a single predecessor. The objective function (7.5.1) sums up the processing time of i and the cleaning time between i and j for every pair of batches (i, j). Due to the constraints (7.5.2) and (7.5.3), for every batch i these durations will only be counted for the batch j that immediately succeeds i (that is, the j for which succij = 1 holds). Unfortunately, this model does not guarantee that the solution forms a single cycle. Solving it indeed results in a total duration of 239 with an invalid solution that contains two sub-cycles 1 3 2 1 and 4 5 4. In Linear Programming, the constraints that force a set of assignment variables to form a single cycle are tricky. A rst possibility is to add the constraints (7.5.5) to our model. S {2, . . . , NJ} :
(i,j)S
succij |S| 1
(7.5.5)
If a solution contains a sub-cycle with a subset S of batches, the sum of the succij at 1 in S has the same value as the number of batches in S. For example, there are three batches (1, 2, and 3) in the rst sub-cycle of the previous solution. By imposing a smaller cardinality, the constraints (7.5.5) force the sequence of batches to enter and leave the set S. These constraints concern all subsets S that do not contain the rst batch (or any other xed batch), because otherwise even the single cycle we wish to generate would be excluded. This formulation generates an exponential number of constraints (2NJ1 ). We therefore choose a weaker formulation with a real variable yj per batch and NJ (NJ 1) constraints (7.5.7). j JOBS : yj 0 i JOBS, j = 2, . . . , NJ, i = j : yj yi + 1 NJ (1 succij ) (7.5.6) (7.5.7)
Scheduling problems
97
To understand these constraints, suppose the solution of the assignment problem consists of several subcycles and we choose a sub-cycle that does not contain the batch 1, such as 4 5 4. The constraints (7.5.7) with succij = 1 for this sub-cycle are: y5 y4 + 1 y4 y5 + 1 By combining these constraints, we obtain y4 1 y5 y4 + 1 or 1 1, a contradiction. A solution that is divided into sub-cycles is therefore not feasible for the assignment problem with the additional constraints (7.5.7). If, on the contrary, the cycle is not subdivided, then values for yj exist that fulll the constraints. This is for instance the case if yj denotes the rank of the batch j in the cycle, choosing batch 1 as the starting position (with y1 = 1). For the variables succij at 1, the constraints result in yj yi + 1 and are therefore satised. For the 0-valued variables succij they evaluate to yi yj NJ 1 and are also satised since the yj take values between 1 and NJ, and hence their difference does not exceed NJ 1. To summarize, the mathematical model for our paint problem is the assignment problem in lines (7.5.1) to (7.5.4) with the additional constraints in (7.5.6) and (7.5.7).
7.5.2
Implementation
The transformation of the mathematical model into a Mosel program is fairly straightforward.
model "B-5 Paint production" uses "mmxprs" declarations NJ = 5 JOBS=1..NJ
DUR: array(JOBS) of integer ! Durations of jobs CLEAN: array(JOBS,JOBS) of integer ! Cleaning times between jobs succ: array(JOBS,JOBS) of mpvar y: array(JOBS) of mpvar end-declarations initializations from b5paint.dat DUR CLEAN end-initializations ! Objective: minimize the duration of a production cycle CycleTime:= sum(i,j in JOBS | i<>j) (DUR(i)+CLEAN(i,j))*succ(i,j) ! One successor and one predecessor per batch forall(i in JOBS) sum(j in JOBS | i<>j) succ(i,j) = 1 forall(j in JOBS) sum(i in JOBS | i<>j) succ(i,j) = 1 ! Exclude subtours forall(i in JOBS, j in 2..NJ | i<>j) y(j) >= y(i) + 1 - NJ * (1 - succ(i,j)) forall(i,j in JOBS | i<>j) succ(i,j) is_binary ! Solve the problem minimize(CycleTime) ! Solution printing writeln("Minimum cycle time: ", getobjval) writeln("Sequence of batches:\nBatch Duration Cleaning") first:=1 repeat second:= integer(sum(j in JOBS | first<>j) j*getsol(succ(first,j)) ) writeln(" ",first, strfmt(DUR(first),8), strfmt(CLEAN(first,second),9)) first:=second until (second=1) end-model ! =1 if batch i is followed by batch j, ! =0 otherwise ! Variables for excluding subtours
The listing above again includes the solution printing and it makes use of some new features: we use a repeat-until loop for enumerating the batches in the order that they have been scheduled. For every
Scheduling problems
98
batch (first) we calculate its successor (second) that then becomes on its turn the one for which we search a successor. The loop stops when we are back at the starting point (batch 1). The calculation of the successor is based on the solution values of the successor variables. This sum is of type real, but has an integer value, and we need to transform it to the type integer. The function integer that is employed here truncates the value that it is applied to (in many cases it is preferable to use the function round instead, which rounds to the nearest integer).
7.5.3
Results
The minimum cycle time for this problem is 243 minutes which is achieved with the following sequence of batches: 1 4 3 5 2 1. This time includes 202 minutes of (incompressible) processing time and 41 minutes of cleaning. This problem is highly combinatorial: for NJ batches, there are (NJ 1)! possible cycles. In this simple example, it would be possible to enumerate by hand the 24 possibilities but already for 10 batches there are 9! = 362,880 different sequences and for 20 batches, 19! 1. 2 1017 sequences.
7.6
7.6.1
Model formulation
Let TASKS be the set of tasks, DURi the duration of task i, MACH the set of workstations (numbered in the order of the production ow). The precedence relations can be represented as a directed graph G = (TASKS, ARCS), where ARCS denotes the set of arcs. An arc (i, j) from task i to j symbolizes that i is the immediate predecessor of j. To assign the tasks, we dene binary variables processim with processim = 1 if and only if task i is assigned to workstation m. The constraints (7.6.1) are required to assure that every task goes to a single workstation. i TASKS : processim = 1 (7.6.1)
mMACH
An assignment is valid only if it fullls the precedence constraints, which means that for every arc (i, j) the workstation processing i must have a number that is smaller or equal to the workstation number for
Scheduling problems
99
6 4 6 2 3 1 8 6 3 7 7 9 11 4 4 5 11 8 10 13 2 9 3 12
j. This relation is established with the constraints (7.6.2). Note how the numbers of the workstations for i and j are calculated with sums of the assignment variables: due to constraints (7.6.1) only the index m for which processim = 1 will be counted. (i, j) ARCS :
mMACH
k processim
mMACH
k processjm
(7.6.2)
We now introduce a real variable cycle 0 that represents the cycle time. The constraints (7.6.3) indicate that this variable is an upper bound on the workload assigned to every workstation. m MACH :
iTASKS
(7.6.3)
We thus obtain the following mathematical model, where all variables with the exception of cycle are binaries. The objective function (7.6.4) consists of minimizing cycle. minimize cycle i TASKS :
mMACH
In this problem formulation, we assume the the production line already exists with its NM workstations and that we wish to balance the workload. For (re-)designing production lines, it would possible to work with a given market demand (number of ampliers per day) and a given cycle time to minimize the number of workstations that form the new production line. To be able to generate solutions for this problem, the maximum duration of tasks obviously must not exceed the given cycle time. To solve this new version of the problem, we may take the preceding model, delete the objective function and replace the variable cycle by a constant (the desired cycle time). We then try to solve the system (7.6.5) to (7.6.9), initializing the number of machines NM with some lower bound, such as the total duration of all tasks divided by the cycle time and rounding the resulting value to the next larger integer. If this system has no solution, we increment the value of NM and restart the solution algorithm. This process converges since a trivial solution exists with one task per workstation.
7.6.2
Implementation
The following Mosel program implements the mathematical model dened by lines (7.6.4) (7.6.9) in the previous section. It poses a frequently recurring problem, namely the encoding of the graph G. One
Scheduling problems
100
possibility consists of dening a binary matrix B (called an adjacency matrix), with Bij = 1 if and only if the arc (i, j) is in G. The second method that is used here lists only the existing arcs and therefore has a lower memory consumption for sparse graphs like G: the graph is represented by a table ARC with a line per arc and two columns. The arc represented by the line a has the source ARCa1 and the sink ARCa2 . The rst data line contains the number 1 and 2 for the arc (1,2), the second 1 and 3 for (1,3) and so on. Since we initialize the arc numbers dynamically with the data read from le (the range of arc numbers RA is not xed in the program), the index-tuples for the entries of the array ARC need to be given in the data le b6linebal.dat.
model "B-6 Assembly line balancing" uses "mmxprs" declarations MACH=1..4 TASKS=1..12
DUR: array(TASKS) of integer ! Durations of tasks ARC: array(RA:range, 1..2) of integer ! Precedence relations between tasks process: array(TASKS,MACH) of mpvar cycle: mpvar end-declarations initializations from b6linebal.dat DUR ARC end-initializations ! One workstation per task forall(i in TASKS) sum(m in MACH) process(i,m) = 1 ! Sequence of tasks forall(a in RA) sum(m in MACH) m*process(ARC(a,1),m) <= sum(m in MACH) m*process(ARC(a,2),m) ! Cycle time forall(m in MACH) sum(i in TASKS) DUR(i)*process(i,m) <= cycle forall(i in TASKS, m in MACH) process(i,m) is_binary ! Minimize the duration of a production cycle minimize(cycle) end-model ! 1 if task on machine, 0 otherwise ! Duration of a production cycle
7.6.3
Results
The mixed integer solver nds a minimum cycle time of 20 minutes. The assignment of tasks to workstations and the resulting workload per workstation are given in the following table. It is easy to verify that the precedence constraints hold.
Table 7.9: Assignment with minimum cycle time Workstation number Assigned tasks Workload 1 1,2,4,5 19 2 3,7,11 20 3 6,8 19 4 9,10,12 18
7.7
Scheduling problems
101
correspond to the stages of the project. This graph, called AOA (activities on arcs) is used by the PERT method [Eva64]. In the representation that we have used the nodes correspond to the tasks, this is the AON (activities on nodes) encoding that is used by the Method of Potentials [Pri94a] [GM90]. Historically, the PERT method stems from the USA and the Method of Potentials from France. Besides the encoding of the graph, the two methods are largely equivalent, to the point that certain software provides both methods. Nevertheless, the AOA representation becomes quite impractical outside the context of project scheduling, for instance for workshop planning. In this case, the AON notation is used systematically. The question 2 concerns the PERT-cost problem, or scheduling with project crashing, in which the objective is to minimize the total cost if the tasks have exible durations and the costs depend on these durations. Depending on the assumptions, several model formulations are possible: for example, an additional cost that is proportional to the number of days saved per task, or a cost inversely proportional to the duration of a task. The reader may nd other practical cases in Wasil [WA88]. The ow shop problem (Section 7.2) is a classical scheduling problem. The mathematical formulation we have used is due to Wagner [Wag59]. Other solution methods are described by French [Fre82], pages 132-135, and Pinedo [Pin95a], pages 99-101. Curiously, these works forget to mention the constraints (7.2.6) (7.2.7) that are absolutely necessary for obtaining correct results. The ow-shop problem is NP-hard in the general case, and Mathematical Programming only allows solving problems limited to about thirty operations. For large cases, simple heuristics like NEH (from the name of the authors Nawaz, Enscore and Ham [NEH83]) or metaheuristics like tabu search [WH89] are used. The two-machine case is easy and may be solved by an algorithm by Johnson that is described in the two books just quoted. The problem in Section 7.3 is a classical scheduling problem called job shop. This problem is NP-hard in the general case. Modeling as a MIP is often inefcient for large problems. Nevertheless, the generic model formulation given here is used by Applegate and Cook with cutting plane techniques [AC91] where the authors obtain interesting results for difcult instances. But the problem is usually solved by listbased heuristics or with exact methods based on a formulation with disjunctive graphs [CCE+ 93], [Fre82], [Pin95b]. Note that the generic model formulation is also valid for the general ow shop problem (whilst the model of Section 7.2 only applies to the permutation ow shop). Different solution algorithms are available for one-machine problems (Section 7.4). The aim of this exercise was to give a common model formulation for the three objectives. Other models using variables relative to the position of jobs may be found in [LQ92] [Sev98]. The paint production problem (Section 7.5) is a representative of a family of scheduling problems where the preparation before every task depends on the chosen order (sequence-dependent setup times). We have in fact used one of the models for the famous traveling salesman problem (TSP). In this problem, the jobs (batches) become cities and the cleaning times the cost of traveling from one city to the next. The objective is to nd the minimum cost for the journey of a sales representative that starts from his home in city 1, visits every city once, and nally returns to his starting point. Here we have considered the asymmetric case, that is, the cleaning time between batch i and batch j is in general different from the one between j and i. In Chapter 11, we study a symmetric TSP, with distances between cities as the crow ies. It is solved with a different technique, by progressively adding constraints of type (5). Since the TSP is NP-hard, the models presented often take too long to be solved for more than twenty cities. Beyond this limit, specialized tree search methods [HK70] need to be used. Demonstration versions of such methods are available [Ros85] [EM92], and a Pascal code is given by Syslo [SDK83]. For cases with hundreds of cities one needs to give up on optimality and use heuristic techniques, some of which like tabu search (e.g. [GTdW93]) or simulated annealing ([KGV83]) are in practice quite efcient. Such heuristics are explained with some detail in [Pri94a]. The problem of assembly line balancing (Section 7.6) is NP-hard for the two given versions (minimizing the cycle time or the number of workstations). Without precedence constraints, the rst version is equivalent to a scheduling problem with parallel machines (see the wagon loading problem in Chapter 9) whilst the second is reduced to a bin-packing problem (the problem of saving les to disks in Chapter 9). Problems of about twenty tasks can be dealt with in Mathematical Programming, beyond this limit heuristics may be used like the one by Dar-El [DE73], described together with another heuristic in the book on production planning by Buffa and Sarin, pages 660-671 [BS87]. Scholl has recently published a book dedicated to assembly line balancing problems [Sch99].
Scheduling problems
102
Chapter 8
Planning problems
The term planning is often used with three different meanings in the context of production management: long-term planning that is used for taking strategic decisions, mid-term planning that corresponds to the tactical level, and short-term planning for operational decisions. Long-term planning concerns the direction a company is taking over several years, like the depot location problem in Chapter 10. Shortterm planning takes detailed production decisions for the shop oor, with a time horizon of a few days. Most importantly it comprises scheduling problems such as those described in Chapter 7. The present chapter is dedicated to tactical planning, currently referred to as production planning. This decision level often covers a time horizon of one or several months, working for instance with time slices of the length of a week. It takes a macroscopic view of the production system: the detailed constraints for workshops and machines are ignored, the operations are dealt with in an aggregated fashion. The objective is to determine the best quantities to produce in every time period whilst, in a majority of cases, minimizing the cost incurred through production and storage. Section 8.1 presents a simple case of single product planning, namely bicycles. The following section (8.2) deals with the production of several products (different types of glasses). In Section 8.3 we plan the production of toy lorries with all their components. This is a typical case of Material Requirement Planning (MRP). The two following problems have more complex cost functions: the production of electronic components in Section 8.4 includes costs for changing the level of production, and for the production of berglass in Section 8.5 the cost depends on the time period. The problem of Section 8.6 stands apart: it concerns the assignment of product batches to machines of different capacities and speeds.
8.1
Currently there are 2,000 bicycles in stock. The storage costs have been calculated as B 5 per unit held in C stock at the end of a month. We assume that the storage capacity at the company is virtually unlimited (in practice this means that the real capacity, that is quite obviously limited, does not impose any limits in our case). We are at the rst of January. Which quantities need to be produced and stored in the course of the next twelve months in order to satisfy the forecast demand and minimize the total cost?
8.1.1
Model formulation
The variables that we need to determine are the numbers of bicycles pnormt and povert to be produced respectively in normal working hours and in overtime hours during month t, and the number of bicycles storet held in stock at the end of the month. Let MONTHS = {1, . . . , 12} be the set of time periods. The objective is to minimize the total cost, that is, the sum of cost of production (in normal and additional hours) and the storage cost. We write CNORM and COVER for the production cost of a bicycle in normal
103
and overtime hours, and CSTOCK the monthly storage cost per bicycle. With these conventions we obtain the objective function (8.1.1). minimize
tMONTHS
(8.1.1)
In every month t, the available quantity of bicycles is given as the sum of bicycles in stock at the end of month t 1 and the bicycles produced in normal and overtime hours during this month. This sum must equal the number of bicycles sold in the course of month t, plus the number of bicycles held in stock at the end of month t. This key relation is called the inventory balance equation, and forms an important component of mathematical models for production planning problems. Let us call the initial stock level ISTOCK and DEMt the forecasted demand for month t. The balance constraint for the rst month is then given by relation (8.1.2) pnorm1 + pover1 + ISTOCK = DEM1 + store1 The constraints (8.1.3) establish this relation for all following months. t MONTHS, t = 1 : pnormt + povert + storet1 = DEMt + storet (8.1.3) (8.1.2)
The production capacity in normal working hours is limited by the given capacity CAP, and the additional production in overtime hours is limited to 50% of this capacity; hence the constraints (8.1.4) and (8.1.5). t MONTHS : pnormt CAP t MONTHS : povert 0. 5 CAP And nally, we note that all variables are non-negative (constraints (8.1.6)). t MONTHS : pnormt 0, povert 0, storet 0 (8.1.6) (8.1.4) (8.1.5)
8.1.2
Implementation
The mathematical model may be translated into the following Mosel program.
model "C-1 Bicycle production" uses "mmxprs" declarations TIMES = 1..12 DEM: array(TIMES) of integer CNORM,COVER: integer CSTOCK: integer CAP: integer ISTOCK: integer pnorm:array(TIMES) of mpvar pover:array(TIMES) of mpvar store:array(TIMES) of mpvar end-declarations
! Range of time periods ! ! ! ! ! Demand per months Prod. cost in normal / overtime hours Storage cost per bicycle Monthly capacity in normal working hours Initial stock
! No. of bicycles produced in normal hours ! No. of bicycles produced in overtime hours ! No. of bicycles stored per month
initializations from c1bike.dat DEM CNORM COVER CSTOCK CAP ISTOCK end-initializations ! Objective: minimize production cost Cost:= sum(t in TIMES) (CNORM*pnorm(t) + COVER*pover(t) + CSTOCK*store(t)) ! Satisfy the demand for every period forall(t in TIMES) pnorm(t) + pover(t) + if(t>1, store(t-1), ISTOCK) = DEM(t) + store(t) ! Capacity limits on normal and overtime working hours per month forall(t in TIMES) do pnorm(t) <= CAP pover(t) <= 0.5*CAP end-do
Planning problems
104
In this implementation we use the inline if function to condense the balance constraints for the rst and all following periods into a single constraint. For t = 1 the expression evaluates to
pnorm(1) + pover(1) + ISTOCK = DEM(1) + store(1)
8.1.3
Results
The minimum cost for production and storage is B 11,247,000. The following table list the production C plan for the coming year (in thousands) its rst line recalls the forecast monthly demand. In January to April and September to December the demands can be satised with production in normal hours. In April, 3000 bicycles need to be stored to satisfy the higher demand in May. In June to August overtime work is required to produce the required quantities.
Table 8.2: Quantities to produce and store in thousand units Jan Demand Normal Additional Store 30 28 Feb 15 15 Mar 15 15 Apr 25 28 3 May 33 30 Jun 40 30 10 Jul 45 30 15 Aug 45 30 15 Sep 26 26 Oct 14 14 Nov 25 25 Dec 30 30
Note that in practice one might not like a solution like this: the inventory at the month end is almost always 0, so if there were a surge in demand (e.g. unusually good weather) the company would be in trouble.
8.2
For every glass type the initial stock is known, as well as the required nal stock level (in thousands). Per batch of every glass type, the production and storage costs in B are given, together with the required C working time for workers and machines (in hours), and the required storage space (measured in numbers of trays). The number of working hours of the personnel is limited to 390 hours per week, and the machines have a weekly capacity of 850 hours. Storage space for up to 1000 trays is available. Which quantities of the different glass types need to be produced in every period to minimize the total cost of production and storage?
Planning problems
105
Table 8.4: Data for the six glass types Production cost V1 V2 V3 V4 V5 V6 100 80 110 90 200 140 Storage cost 25 28 25 27 10 20 Initial stock 50 20 0 15 0 10 Final stock 10 10 10 10 10 10 Timeworker 3 3 3 2 4 4 Timemachine 2 1 4 8 11 9 Storage space 4 5 5 6 4 9
8.2.1
Model formulation
This problem is a generalization of the bicycle problem in Section 8.1: we now have several products, each using the same resources. To express the model in a simple way, we need to consider the time periods one after the other. Let PRODS be the set of products (glass types) and WEEKS = {1, . . . , NT} the set of time periods. We write DEMpt for the demand for product p in time period t. These demands are given above in Table 8.3. We also have CPRODp and CSTOCKp the production and storage cost for glass type p. This cost is identical for all time periods, but it would be easy to model a different cost per time period by adding an index for the time period. TIMEWp and TIMEMp denote the worker and machine times respectively required per unit of product p, and correspondingly, SPACEp the storage area. The initial stock ISTOCKp is given, as is the desired nal stock level FSTOCKp per product. All these data are listed in Table 8.4 above. We write CAPW and CAPM for the capacities of workers and machines respectively, and CAPS for the capacity of the storage area. To solve this problem, we need variables producept to represent the production of glass type p in time period t. The variables corresponding to the stock level of every product p at the end of period t are called storept . By convention, the initial stock level ISTOCKp may be considered as the stock level at the end of time period 0 and we use the notation storep0 to simplify the formulation of the stock balance constraints (8.2.1): p PRODS, t WEEKS : storept = storep,t1 + producept DEMpt (8.2.1)
These stock balance constraints state that the quantity storept of product that is held in stock at the end of a time period t equals the stock level storep,t1 at the end of the preceding period plus the production producept of the time period t minus the demand DEMpt of this time period. The company wishes to have a certain amount of product in stock at the end of the planning period. These constraints on the nal stock levels are expressed by the constraints (8.2.2): p PRODS : storep,NT FSTOCKp (8.2.2)
We now formulate the various capacity constraints for every time period. The following constraints guarantee that the capacity limits on manpower (8.2.3), machine time (8.2.4), and storage space (8.2.5) are kept: t WEEKS :
pPRODS
t WEEKS : t WEEKS :
pPRODS
We may now formulate the cost function that is to be minimized (8.2.6). This function is the sum of production and storage costs for all products and time periods. minimize
pPRODS tWEEKS
(8.2.6)
We obtain the complete mathematical model by combining lines (8.2.1) to (8.2.6), to which we need to add the non-negativity constraints for the production variables (8.2.13) and for the stored quantities
Planning problems
106
(8.2.14). minimize
pPRODS tWEEKS
p PRODS, t WEEKS : storept = storep,t1 + producept DEMpt p PRODS : storep,NT FSTOCKp t WEEKS :
pPRODS
t WEEKS : t WEEKS :
pPRODS
8.2.2
Implementation
The mathematical model may be implemented with Mosel as follows.
model "C-2 Glass production" uses "mmxprs" declarations NT = 12 WEEKS = 1..NT PRODS = 1.. 6 CAPW,CAPM: integer CAPS: integer DEM: array(PRODS,WEEKS) of integer CPROD: array(PRODS) of integer CSTOCK: array(PRODS) of integer ISTOCK: array(PRODS) of integer FSTOCK: array(PRODS) of integer TIMEW,TIMEM: array(PRODS) of integer SPACE: array(PRODS) of integer
! Number of weeks in planning period ! Set of products ! ! ! ! ! ! ! ! ! Capacity of workers and machines Storage capacity Demand per product and per week Production cost per product Storage cost per product Initial stock levels Min. final stock levels Worker and machine time per unit Storage space required by products
produce: array(PRODS,WEEKS) of mpvar ! Production of products per week store: array(PRODS,WEEKS) of mpvar ! Amount stored at end of week end-declarations initializations from c2glass.dat CAPW CAPM CAPS DEM CSTOCK CPROD ISTOCK FSTOCK TIMEW TIMEM SPACE end-initializations ! Objective: sum of production and storage costs Cost:= sum(p in PRODS, t in WEEKS) (CPROD(p)*produce(p,t) + CSTOCK(p)*store(p,t)) ! Stock balances forall(p in PRODS, t in WEEKS) store(p,t) = if(t>1, store(p,t-1), ISTOCK(p)) + produce(p,t) - DEM(p,t) ! Final stock levels forall(p in PRODS) store(p,NT) >= FSTOCK(p) ! Capacity constraints forall(t in WEEKS) do sum(p in PRODS) TIMEW(p)*produce(p,t) <= CAPW sum(p in PRODS) TIMEM(p)*produce(p,t) <= CAPM sum(p in PRODS) SPACE(p)*store(p,t) <= CAPS end-do ! Solve the problem minimize(Cost) end-model
Planning problems
107
In the model formulation above as before we use the if function in the formulation of the stock balance constraints. It is also possible to employ the notation storep0 for the initial stock levels as in the mathematical model. Since store is an array of variables, we still need to use the array ISTOCK for reading in the data from le and then x the storage variables for time period 0 to these values (additional set of bound constraints):
declarations store: array(PRODS,0..NT) of mpvar end-declarations
! Stock balances forall(p in PRODS, t in WEEKS) store(p,t) = store(p,t-1) + produce(p,t) - DEM(p,t) ! Fix the initial stock levels forall(p in PRODS) store(p,0) = ISTOCK(p)
In this model, it is easy to change the objective function, for instance to take into account only the production costs (rst part of the objective) or the storage costs (second part of the objective) Remark: in the implementation of this model, it may be tempting to dene names like prod for the production variables or PROD for the set of products, but both these names cannot be used because prod is a keyword of the Mosel language (see the complete list of reserved words in Section 5.2.3).
8.2.3
Results
The solution of this problem gives us a total cost of B 185,899. C Table 8.5 displays the quantities of the different glass types to produce in every week of the planning period and the quantities held in stock at the end of every week. Some production and storage quantities are fractional but every unit corresponds to 1000 glasses. We may therefore round the results to three digits after the decimal point to obtain a result with integral numbers of glasses without modifying the total cost too much. Taking for example the quantities to be produced in the rst period: 8,760 glasses of type 1, 18,000 glasses of type 3, 16,000 glasses of type 4, 47,680 glasses of type 5, 12,000 glasses of type 6 and none of type 2 (the demand for this type is covered by the initial stock). When looking at the constraints in more detail, we nd that the available manpower is fully used most of the time (in the rst week, 351 hours are worked, in all other weeks the limit of 390 hours is reached) and the machines are used to their full capacity in certain time periods (weeks 1-3 and 5), but the available storage space is in excess of the actual needs.
Table 8.5: Quantities to produce and store of every glass type (in thousands) Week 1 Prod. Store 2 Prod. Store 3 Prod. Store 4 Prod. Store 5 Prod. Store 6 Prod. Store 1 2 3 4 5 6 7 8 9 29 21 10 28 26.5 39.25 12 10 11 12 8.76 5.48 38.76 22.24 0 16 3 18 35 16 45 47.68 14.64 24.68 19.32 12 18 0.56 30.2 27.36 8.64 23 20 4.8 10.36 23 20 11 10 12 34 17 10 9 21 23 15 24 38 41 20 19 37 35.08 14.35 23.48 22.77 43.75 0 31.4 30.75 44.23 45 70.75 40.75 20 19 18 35 0.75 27.25 0.75 30 28 42 10 23 30 22 10 0 13 27 10 12 30 47 10 2.75 0 0 35 20 10 49 29.25 5.75 19 27.25 10
As opposed to the bicycle problem in Section 8.1, in this problem nal stock levels have been given. The specication of nal stock levels is quite a tricky issue in production planning models. If one does not specify levels, then models will typically run stocks down to zero at the end of the planning horizon, a situation which will usually be unacceptable in practice. If the nal stock levels are different from the initial stock levels, as in this example, then care must be taken in interpreting average costs, as some benet has accrued if stock levels are being run down, and vice versa if stock is being increased.
Planning problems
108
8.3
Blue lorry (or red) 1 Assembled chassis 2 Bumper 2 Wheel 2 Axle 1 Steel bar
Figure 8.1: Breakdown of components (Gozinto graph)
1 Assembled cabin 2 1
2 Headlight
The subsets (axles, chassis, blue or red cabin) may be assembled by the company using the components, or subcontracted. The following table lists the costs for assembling and for subcontracting these subsets, together with the capacities of the company. The assembly costs do not take into account the buying prices of their components.
Table 8.7: Subcontracting and assembly costs, assembly capacities Axle Subcontracting Assembly Capacity B 12.75 C B 6.80 C 600 Assembled chassis B 30 C B 3.55 C 4000 Assembled cabin B3 C B 3.20 C 3000 Blue lorry B 2.20 C 4000 Red lorry B 2.60 C 5000
For the next month, Minorette has the same demand forecast of 3000 pieces for the two types of lorries. At present, the company has no stock. Which quantities of the different items should Minorette buy or subcontract to satisfy the demand while minimizing the production cost?
8.3.1
Model formulation
Let ITEMS be the complete set of all products with the subsets FINAL of nal products, ASMBL of products resulting from assembly, and PREPROD of products used in the assembly of others. We write REQqp for the requirement of component p in the assembly of q. For instance, for an axle we need two wheels and one steel bar, that is REQaxle,wheel = 2 and REQaxle,steelbar = 1. Let CBUYp be the price paid when buying item p. Since subcontracting a product means buying it from its producer, we consider that this cost is the price for buying a preproduct that is not assembled and is the cost of subcontracting for the assembled pieces. We write CPRODp for the cost of assembling a product p. The variables that we need to determine are the quantities to produce producep of the assembled products p and those to buy (or subcontract) buyp
Planning problems
109
of every preproduct p. This gives the following mathematical model: minimize CBUYp buyp +
pPREPROD pASMBL
CPRODp producep
REQqp produceq
p ASMBL : buyp
qASMBL
The objective function (8.3.1) minimizes the production cost, that is, the buying price or cost for subcontracting and the assembly cost. The constraints (8.3.2) indicate that the produced quantities of the nal products (blue and red lorries) must be greater than or equal to the demand DEMp . The constraints (8.3.3) guarantee that the total quantity of item p that is bought or produced is sufcient to produce all articles q that contain p. The constraints (8.3.4) establish the limits on the assembly capacities CAPp for every assembled product p. The constraints (8.3.5) and (8.3.6) are the integrality constraints for the variables. Note that an alternative formulation to the model displayed above consists of dening buying and assembly costs for all items: preproducts that cannot be assembled receive the value innity as their assembly cost, and this value is also assigned as the buying price to the nal products. With these costs, we may dene variables producep and buyp for all products and in the objective function (1) and the constraints (3) simply sum over all variables the innity cost values force the corresponding variables to take the value 0. Whilst easier to write down, this second formulation introduces large coefcient values into the model that typically lead to numerical instabilities and should therefore be avoided.
8.3.2
Implementation
The following Mosel program implements the mathematical model of lines (8.3.1) to (8.3.6). All data and index sets are dened in the data le and initialized dynamically when executing the program.
model "C-3 Toy production" uses "mmxprs" declarations ITEMS: set of string FINAL: set of string ASMBL: set of string PREPROD: set of string CAP: array(ASMBL) of integer DEM: array(FINAL) of integer CPROD: array(ASMBL) of real CBUY: array(ITEMS) of real REQ: array(ASMBL,PREPROD) of integer end-declarations initializations from c3toy.dat DEM CBUY REQ [CPROD, CAP] as ASSEMBLY end-initializations finalize(ASMBL); finalize(PREPROD); finalize(FINAL); finalize(ITEMS) declarations produce: array(ASMBL) of mpvar buy: array(PREPROD) of mpvar end-declarations
! ! ! ! ! ! ! ! !
of of of of
Capacity of assembly lines Demand of lorries Assembly costs Purchase costs Items req. for assembling a product
Planning problems
110
! Satisfy demands forall(p in FINAL) produce(p) >= DEM(p) ! Assembly balance forall(p in PREPROD) buy(p) + if(p in ASMBL, produce(p), 0) >= sum(q in ASMBL) REQ(q,p)*produce(q) ! Limits on assembly capacity forall(p in ASMBL) produce(p) <= CAP(p) forall(p in PREPROD) buy(p) is_integer forall(p in ASMBL) produce(p) is_integer ! Solve the problem minimize(Cost) end-model
As opposed to most other models presented in this book, in this implementation we do not x the index sets directly in the Mosel program but initialize all data dynamically from le. We only dene the variables once the data has been read in and the index sets have been nalized that is, the arrays of variables are created with xed sizes. If we dened the variables in the same declarations block as the data arrays, this array would be created as a dynamic array, just like the data arrays. But unlike the data arrays, in a dynamic array of variables every entry needs to be created explicitly, using the function create. It is therefore also possible to implement the Mosel program as shown below, though it should be noted that the above version with xed-size arrays is slightly more efcient:
declarations ITEMS: set of string FINAL: set of string ASMBL: set of string PREPROD: set of string CAP: array(ASMBL) of integer DEM: array(FINAL) of integer CPROD: array(ASMBL) of real CBUY: array(ITEMS) of real REQ: array(ASMBL,PREPROD) of integer produce: array(ASMBL) of mpvar buy: array(PREPROD) of mpvar end-declarations initializations from c3toy.dat DEM CBUY REQ [CPROD, CAP] as ASSEMBLY end-initializations forall(p in ASMBL) create(produce(p)) forall(p in PREPROD) create(buy(p))
! ! ! ! ! ! ! ! !
of of of of
Capacity of assembly lines Demand of lorries Assembly costs Purchase costs Items req. for assembling a product
In this example, the data of the arrays CPROD and CAP are contained in a single record ASSEMBLY and these two arrays are therefore read jointly using the keyword as to indicate the label of the record.
8.3.3
Results
The minimum total cost for satisfying the demand of toy lorries is B 238,365. The next two tables summaC rize the quantities of products that are bought, subcontracted, or assembled at the factory.
Table 8.8: Quantities of preproducts bought Wheel 1200 Windscreen 0 Steel bar 600 Blue container 3000 Bumper 600 Red tank 3000 Chassis 300 Blue motor 3000 Cabin 0 Red motor 3000 Door window 0 Headlight 12000
Planning problems
111
Table 8.9: Production and subcontracting of assembled products Axle Produce Subcontract 600 0 Assembled chassis 300 5700 Assembled cabin 0 6000 Blue lorry 3000 Red lorry 3000
8.4
What is the production plan that minimizes the sum of costs incurred through changes of the production level, production and storage costs?
8.4.1
Model formulation
The mathematical model developed for the problem in Section 8.2 has many similarities to this model. We denote the variables and constants in the same way. Let PRODS be the set of components, MONTHS = {1, . . . , NT} the set of planning periods, DEMpt the demand for product p in time period t, CPRODp and CSTOCKp respectively the cost of producing and storing one unit of product p, and ISTOCKp and FSTOCKp the initial and nal stock levels of product p. The variables producept and storept represent respectively the quantity produced and the amount of product p in stock at the end of period t. With the convention storep0 = ISTOCKp the stock balance constraints are given by (8.4.1) and the nal stock levels are guaranteed by constraints (8.4.2). p PRODS, t MONTHS : storept = storep,t1 + producept DEMpt p PRODS : storep,NT FSTOCKp (8.4.1) (8.4.2)
To measure the changes to the level of production, we need to additional sets of variables, reducet and addt that represent the reduction or increase of the production in time period t. A change the the level of production is simply the difference between the total quantity produced in period t and the total quantity produced in period t 1. If this difference is positive, we have an increase in the production level, and a reduction otherwise. The change is expressed through the value of addt reducet . Since the level of production cannot increase and reduce at the same time, one of the two variables is automatically at 0; whilst the other represents either the increase or the reduction of the production. This leads to the equation (8.4.3). t {2, . . . , NT} :
pPRODS
producept
pPRODS
(8.4.3)
Planning problems
112
The objective function is like the one of problem 8.2 with, in addition, the cost of changes to the production level. We write CADD and CRED for the cost of increasing and reducing the production respectively. These costs are proportional to the changes. They form the second part of the objective function (8.4.4). minimize
pPRODS tMONTHS NT
+
t=2
(8.4.4)
Note that there are no variables reduce1 or add1 because there is no change at the beginning of the planning period. The complete linear program contains the lines (8.4.4) to (8.4.3), to which we need to add the nonnegativity constraints (8.4.9) and (8.4.10) for all variables: minimize
pPRODS tMONTHS NT
+
t=2
p PRODS, t MONTHS : storept = storep,t1 + producept DEMpt p PRODS : storep,NT FSTOCKp t {2, . . . , NT} :
pPRODS
producept
pPRODS
8.4.2
Implementation
As we have noted, the model of this problem is close to the one of the problem in Section 8.2. A similar likeness can be observed between the two implementations with Mosel.
model "C-4 Electronic components" uses "mmxprs" declarations NT = 6 MONTHS = 1..NT PRODS = 1..4 DEM: array(PRODS,MONTHS) of integer CPROD: array(PRODS) of integer CSTOCK: array(PRODS) of real CADD,CRED: real ISTOCK,FSTOCK: array(PRODS) of integer produce: array(PRODS,MONTHS) of mpvar store: array(PRODS,MONTHS) of mpvar reduce: array(MONTHS) of mpvar add: array(MONTHS) of mpvar end-declarations
! Number of time periods (months) ! Set of components ! ! ! ! ! ! ! ! ! Demand of components per month Production costs Storage costs Cost of additional/reduced prod. Initial and final stock levels Quantities produced per month Stock levels at end of every month Reduction of production per month Increase of production per month
initializations from c4compo.dat DEM CPROD CSTOCK CADD CRED ISTOCK FSTOCK end-initializations ! Objective: total cost of production, storage, and change of prod. level Cost:= sum(p in PRODS, t in MONTHS) (CPROD(p)*produce(p,t) + CSTOCK(p)*store(p,t)) + sum(t in 2..NT) (CRED*reduce(t) + CADD*add(t)) ! Stock balance constraints (satisfy demands) forall(p in PRODS, t in MONTHS) store(p,t) = if(t>1, store(p,t-1), ISTOCK(p)) + produce(p,t) - DEM(p,t) ! Changes to the level of production
Planning problems
113
forall(t in 2..NT) sum(p in PRODS) (produce(p,t) - produce(p,t-1)) = add(t) - reduce(t) ! Guarantee final stock levels forall(p in PRODS) store(p,NT) >= FSTOCK(p) ! Solve the problem minimize(Cost) end-model
8.4.3
Results
When solving the problem we obtain a total cost of B 683,929. The production level for the rst four C periods is 7060 units in total, in period 5 it decreases to 6100 units and remains at this level for the last period. The following table lists the corresponding production plan (there are several possible plans).
Table 8.11: Optimal production plan 1 X43-M1 X43-M2 Y54-N1 Y54-N2 Total 1490 1300 2150 2120 7060 2 3000 800 1500 1760 7060 3 2000 800 3640 620 7060 4 4000 1000 1060 1000 7060 5 2000 1100 1200 1800 6100 6 2550 910 2130 510 6100
The stock levels are relatively low. With the exception of the last period where a nal stock is required, products X43-M1 and X43-M2 are never held in stock. The product Y54-N1 is held in stock in periods 3 and 6 (740 and 30 units), and the product Y54-N2 is held in stock in the periods 1, 2, 5, and 6 with 720, 880, 700, and 10 units respectively.
8.5
Which is the production plan that minimizes the total cost of production and storage?
8.5.1
Model formulation
This problem is not much different from the previous ones and it would be easy to solve it using one of the formulations presented earlier in this chapter. To introduce some variation, we are going to use a transshipment ow formulation. Other models of this family will be discussed in the context of transport problems in Chapter 10. To start, we draw a network that represents the problem (Figure 8.2). This network consists of six nodes for the production in every time period, and six more nodes for the demand in every time period. In the general case, we obtain a network of 2NT nodes if NT is the number of time periods. The production nodes form the upper half of the graph. The have been assigned the odd indices 1 to 11 corresponding to time periods 1 to 6. Every node n has a weight CAPn that corresponds to the production
Planning problems
114
140 1 5
100 3 8
110 5 6
100 7 6
120 9 7
100 11 6
2 100
4 120
6 100
8 90
10 120
12 110
capacity of the period. The demand nodes are in the lower half of the graph, with the even indices 2 to 12 equally corresponding to time periods 1 to 6. Every demand node n has a weight DEMn that corresponds to the demand of the time period. An arc with the cost of the production in a period goes from every production node to the demand node of the same period. A second set of arcs weighted with the storage costs connects every demand node to the demand node of the following time period. A production plan corresponds to a ow in this network. Let owmn denote the ow on the arc (m, n). The ow on a vertical arc represents the quantity (in cubic meters) of berglass produced in the corresponding time period. The ow on a horizontal arc represents the quantity of product carried over to the next time period (stock level). The aim is to compute the minimum cost ow that satises the demands and does not exceed the production capacities. The resulting model is a transshipment problem because there are no capacities on the arcs. With COSTmn the cost of an arc (m, n), we obtain the following objective function (total cost of the ow): minimize COSTmn owmn
(m,n)ARCS
(8.5.1)
For every time period, the amount carried over to the next period (stock) equals the stock at the beginning of the period plus the production of the period minus the demand of the period. This equation results in the constraint (8.5.2) for the rst period since there is no initial stock. In other words, the quantity stored at the end of the period (ow on arc (2,4)) equals the amount produced in period 1 (ow on arc (1,2)) minus the demand DEM2 . (8.5.2) ow24 = ow12 DEM2 The general stock balance equation (8.5.3) applies to all other periods but the last. For every even index n, the ow between n 2 and n represents the production in period n / 2, whilst the ow between n 1 and n represents the stock carried over from the preceding period. The ow between n and n + 2 represents the stock at the end of the current period. LAST denotes the last node in the graph (= node with the largest sequence number). n = 4, . . . , LAST 2, n even : own,n+2 = own2,n + own1,n DEMn For the last period, we do not wish to create any nal stock, so we obtain the constraint (8.5.4). owLAST2,LAST + owLAST1,LAST DEMLAST = 0 We also need to fulll the constraints on the production capacity (8.5.5). n = 1, . . . , LAST 1, n odd : own,n+1 CAPn (8.5.5) (8.5.4) (8.5.3)
We obtain the following mathematical model. It is not required to state that the ow variables owmn are integer since this property is automatically given in the optimal solution to the linear problem (this results from LP theory that is not covered in this book). minimize COSTmn owmn
(m,n)ARCS
ow24 = ow12 DEM2 n = 4, . . . , LAST 2, n even : own,n+2 = own2,n + own1,n DEMn owLAST2,LAST + owLAST1,LAST DEMLAST = 0 n = 1, . . . , LAST 1, n odd : own,n+1 CAPn (m, n) ARCS : owmn 0
Planning problems
115
8.5.2
Implementation
The mathematical model leads to the following Mosel program. The demand and capacity data (= node weights) have been grouped into a single array WEIGHT, indexed by the node number. The graph with the cost of the arcs is encoded as a two-dimensional array ARC, an entry ARCmn of which is dened if the arc (m, n) is in the network. The value of the entry corresponds to the cost of the arc. The array ARC is given in sparse format in the data le c5fiber.dat.
model "C-5 Fiberglass" uses "mmxprs" declarations NODES: range
! Production and demand nodes ! odd numbers: production capacities ! even numbers: demands ! Cost of flow on arcs ! Node weights (capacities/demand) ! Flow on arcs
ARC: array(NODES,NODES) of real WEIGHT: array(NODES) of integer flow: array(NODES,NODES) of mpvar end-declarations initializations from c5fiber.dat ARC WEIGHT end-initializations
forall(m,n in NODES | exists(ARC(m,n))) create(flow(m,n)) ! Objective: total cost of production and storage Cost:= sum(m,n in NODES | exists(ARC(m,n))) ARC(m,n)*flow(m,n) ! Satisfy demands (flow balance constraints) forall(n in NODES | isodd(n)=FALSE) if(n<getlast(NODES), flow(n,n+2), 0) = if(n>2, flow(n-2,n), 0) + flow(n-1,n) - WEIGHT(n) ! Production capacities forall(n in NODES | isodd(n)) flow(n,n+1) <= WEIGHT(n) ! Solve the problem minimize(Cost) end-model
In this Mosel program, the variables are dened as a dynamic array and therefore need to be created once their index range is known, that is, after the data dening the arcs of the network has been read from le. We remind the reader that the use of the function exists allows Mosel to enumerate only the dened entries of a sparse array, provided that the index sets are named and are the same as those used for the declaration of the array. The implementation above introduces two new functions: isodd indicates whether the integer value it is applied to is even or odd. getlast returns the last entry of an array (that is, the entry with the highest index value).
8.5.3
Results
The optimal solution calculated by the Mosel program is a total cost of B 3,988 with the quantities of C berglass to be produced and stored in every period shown in Table 8.13.
Table 8.13: Production and storage per week Week Production Stock 1 140 40 2 80 0 3 110 10 4 100 20 5 110 10 6 100 0
Planning problems
116
8.6
The production cost of a batch depends on the machine that processes it. The hourly usage cost for every machine depends on its technology, its age, its consumption of consumables (such as electricity, machine oil) and the personnel required to operate it. These differences are amplied by the variation in the processing durations of a batch depending on the machine. Table 8.15 lists the production costs in thousand B. On which machine should each batch be executed if the production manager wishes to C minimize the total cost of production?
Table 8.15: Production cost depending on the assignment (in kB ) C Machine 1 2 3 4 5 1 17 23 16 19 18 2 21 16 20 19 19 3 22 21 16 22 15 Production batches 4 5 6 7 18 16 25 22 15 24 17 24 20 21 15 16 16 16 25 20 19 17 19 16 8 18 25 19 17 16 9 19 18 19 21 23 10 18 21 18 19 15
8.6.1
Model formulation
In its generic form, this problem is a generalized assignment problem. Let MACH be the set of machines and PRODS the set of batches to produce. We write DURmp for the processing duration of batch p on machine m and COSTmp for the cost incurred if batch p is assigned to machine m. CAPm denotes the maximum capacity (in hours) of the machine m. We introduce binary variables usemp that take the value 1 if and only if the batch p is assigned to the machine m. The objective function (8.6.1) that is to be minimized is the total production cost. minimize
mMACH pPRODS
COSTmp usemp
(8.6.1)
As a rst set of constraints, we need to ensure that every batch is assigned to a single machine. This is done with constraints (8.6.2). This type of constraint is typical for classical assignment problems, just like the problem of ight connections in Chapter 11. p PRODS :
mMACH
usemp = 1
(8.6.2)
Every machine may only work within its capacity limits, and this constraint is established by relations (8.6.3). In these constraints we sum up the durations of the batches assigned to the same machine and specify that this sum does not exceed the maximum total capacity of the machine. This type of constraint is a knapsack constraint (see Chapter 9). m MACH :
pPRODS
(8.6.3)
Planning problems
117
p PRODS : m MACH :
pPRODS
8.6.2
Implementation
The conversion of such a compact mathematical model into a Mosel program is straightforward.
model "C-6 Machine assignment" uses "mmxprs" declarations MACH = 1..5 PRODS = 1..10
CAP: array(MACH) of integer ! Machine capacities DUR: array(MACH,PRODS) of integer ! Production durations COST: array(MACH,PRODS) of integer ! Production costs use: array(MACH,PRODS) of mpvar end-declarations initializations from c6assign.dat DUR CAP COST end-initializations ! Objective: total production cost Cost:= sum(m in MACH, p in PRODS) COST(m,p)*use(m,p) ! Assign a single machine to every batch forall(p in PRODS) sum(m in MACH) use(m,p) = 1 ! Limits on machine capacities forall(m in MACH) sum(p in PRODS) DUR(m,p)*use(m,p) <= CAP(m) forall(m in MACH, p in PRODS) use(m,p) is_binary ! Solve the problem minimize(Cost) end-model ! 1 if machine assigned to batch, ! 0 otherwise
8.6.3
Results
After solving this problem, we obtain a total cost of B 173k. The following table (there are several C solutions with the same objective value) shows the assignment:
Table 8.16: Optimal assignment Machine 1 2 3 4 5 Assigned batches 1, 9 2, 5 3, 6, 8 7, 10 4 Total duration 17 18 25 13 13
Planning problems
118
8.7
Planning problems
119
assigned to machines or workshops with different capacities and processing times. Instances of large size have to be treated with specialized techniques, like the tree-based method by Fisher et al. that uses the Lagrangian relaxation of the linear program [FJVW86].
Planning problems
120
Chapter 9
9.1
Before implementing a Mathematical Programming solution, one may wish to try to see whether it is possible to solve this problem instance with the following simple heuristic: until all boxes are distributed to the wagons we choose in turn the heaviest unassigned box and put it onto the wagon with the least load.
121
9.1.1
Model formulation
This packing problem is similar to bin packing problems (see also the tank loading problem in Section 9.3 and the backup of les in Section 9.4). Here the number of containers (wagons) is xed, and the objective is to minimize the heaviest load. In bin packing problems, the capacity of the containers (bins) is xed, but the objective is to minimize the number of bins used. Let BOXES be the set of boxes, WAGONS the set of wagons, WEIGHTb the weight of box b and WMAX the maximum carrying load of a wagon. The assignment of the boxes to the wagons can be dened through binary variables loadbw that take the value 1 if and only if box b is assigned to wagon w. In this problem we wish to minimize the maximum load of the wagons. Such an objective is sometimes referred to as minimax objective. Similarly, there are maximin problems in which the objective is to maximize a minimum, like the assignment of personnel to workposts in Chapter 11. Minimax or maximin optimization problems are also called bottleneck problems. The procedure to represent a bottleneck criterion in a linear model is always the same: We dene a non-negative variable maxweight to represent the maximum weight over all the wagon loads. Constraints are established to set maxweight as the upper bound on every wagon load. The objective function consists of minimizing maxweight. By proceeding this way, in the optimal solution the minimization will force maxweight to take the value that corresponds to the weight of the heaviest wagon load. We derive the following 0-1 problem. The constraints (9.1.2) ensure that every box is assigned to a single wagon. The constraints (9.1.3) establish maxweight as the upper bound on the wagon loads. The objective (9.1.1) is to minimize maxweight. All variables are binary (9.1.4) with the exception of maxweight which is simply a non-negative real. minimize maxweight b BOXES : b BOXES : loadbw = 1
wWAGONS
For two containers (wagons), it would be possible to dene a much simpler mathematical model. The problem then turns into the task of partitioning the boxes into two subsets with weights as close as possible. In the best case, we obtain subsets of the weight TOTALW / 2 (with TOTALW = bBOXES WEIGHTb the total weight of all boxes). We may therefore reduce the problem to choosing boxes to place onto the rst wagon in such a way as to obtain a load as close as possible (from below) to TOTALW / 2. For this purpose, we need to dene binary variables loadb with loadb = 1 if box b goes onto wagon 1, and loadb = 0 (or 1 loadb = 1) if the box is loaded onto wagon 2. The boxes that are not loaded onto wagon 1 go onto wagon 2. Thus, if the rst wagon receives a load of weight TOTALW / 2 , the second wagon has the load TOTALW / 2 + . maximize
bBOXES
WEIGHTb loadb
This slightly simpler problem where we try to ll as much as possible of a single container (here the rst wagon with a capacity limited by TOTALW / 2) is called a knapsack problem (see also the barge loading problem in Section 9.2).
9.1.2
Implementation
The mathematical model of lines (9.1.1) (9.1.4) is easily translated into a Mosel program. The role of the lower bound on the maximum weight variable that has been added to the model formulation is explained in the discussion of the results in the next section.
122
Before dening and solving the MP problem, we test whether we can nd heuristically a distribution of loads to the wagons that ts the given capacity limit WMAX. The solution heuristic requires the boxes to be given in decreasing order of their weight. We therefore implement a sorting heuristic using a Shell sort method: First sort, by straight insertion, small groups of numbers. Next, combine several small groups and sort them (possibly repeat this step). Finally, sort the whole list of numbers. The spacings between the numbers of groups sorted during each pass through the data are called the increments. A good choice is the sequence that can be generated by the recurrence i1 = 1, ik+1 = 3ik +1, k = 1, 2, . . . Our implementation of the sorting algorithm assumes that the entries of the array to sort are numbered 1, . . . , N.
model "D-1 Wagon load balancing" uses "mmxprs" forward function solve_heur:real forward procedure shell_sort(A:array(range) of integer) declarations BOXES = 1..16 WAGONS = 1..3 WEIGHT: array(BOXES) of integer WMAX: integer
! Set of boxes ! Set of wagons ! Box weights ! Weight limit per wagon
load: array(BOXES,WAGONS) of mpvar ! 1 if box loaded on wagon, 0 otherwise maxweight: mpvar ! Weight of the heaviest wagon load end-declarations initializations from d1wagon.dat WEIGHT WMAX end-initializations ! Solve the problem heuristically and terminate the program if the ! heuristic solution is good enough if solveheur<=WMAX then writeln("Heuristic solution fits capacity limits") exit(0) end-if ! Every box into one wagon forall(b in BOXES) sum(w in WAGONS) load(b,w) = 1 ! Limit the weight loaded into every wagon forall(w in WAGONS) sum(b in BOXES) WEIGHT(b)*load(b,w) <= maxweight ! Bounds on maximum weight maxweight <= WMAX maxweight >= ceil((sum(b in BOXES) WEIGHT(b))/3) forall(b in BOXES,w in WAGONS) load(b,w) is_binary ! Minimize the heaviest load minimize(maxweight) !----------------------------------------------------------------! Heuristic solution: one at a time place ! onto the wagon with the least load function solve_heur:real declarations ORDERW: array(BOXES) of integer ! Load: array(WAGONS,range) of integer ! CurWeight: array(WAGONS) of integer ! CurNum: array(WAGONS) of integer ! end-declarations the heaviest unassigned box
Box weights in decreasing order Boxes loaded onto the wagons Current weight of wagon loads Current number of boxes per wagon
! Copy the box weights into array ORDERW and sort it in decreasing order
123
forall(b in BOXES) ORDERW(b):=WEIGHT(b) shellsort(ORDERW) ! Distribute the loads to the wagons using the LPT heuristic forall(b in BOXES) do v:=1 ! Find wagon with the smallest load forall(w in WAGONS) v:=if(CurWeight(v)<CurWeight(w), v, w) CurNum(v)+=1 ! Increase the counter of boxes on v Load(v,CurNum(v)):=b ! Add box to the wagon CurWeight(v)+=ORDERW(b) ! Update current weight of the wagon end-do returned:= max(w in WAGONS) CurWeight(w) end-function ! Return the solution value
!----------------------------------------------------------------! Sort an array in decreasing order using a Shell sort method procedure shell_sort(A:array(range) of integer) N:=getsize(A) inc:=1 ! Determine the starting increment repeat inc:=3*inc+1 until (inc>N) repeat inc:=inc div 3 forall(i in inc+1..N) do v:=A(i) j:=i while (A(j-inc)<v) do A(j):=A(j-inc) j -= inc if j<=inc then break; end-if end-do A(j):= v end-do until (inc<=1) end-procedure end-model ! Loop over the partial sorts ! Outer loop of straight insertion
In this Mosel program for the rst time we use a function (all subroutines dened so far were procedures, that is, they do not have a return value). What changes besides the keyword function instead of procedure is that the type of the return value (here: real) is declared in the subroutine prototype and the actual value is assigned to returned in the body of the function. In the implementation of the Shell sort algorithm we also encounter some new features: The function getsize returns the size (= number of dened elements) of an array or set. The main sorting loop uses the three different types of loops available in Mosel: repeat-until, forall, and while. Like the forall loop, the while loop has an inline version that applies to a single statement and the version while-do to loop over a block of statements. The break statement can be used to interrupt one or several loops. In our case it stops the inner while loop. Since we are jumping out of a single loop, we could just as well write break 1. If we wrote break 3, the break would make the algorithm jump 3 loop levels higher, that is outside of the repeat-until loop. Another feature introduced by this implementation is the Mosel function exit to terminate the execution of a model: if the heuristic solves the problem, there is no need to dene the mathematical model and start the optimization algorithm.
9.1.3
Results
The heuristic returns a maximum load of 101 quitals (the two other wagons are loaded with 97 quintals each). This means that the heuristic solution does not satisfy the capacity limit of the wagons (100 quintals) and we need to use an optimizin algorithm to nd out whether it is possible to transport all the boxes.
124
If we try running the mathematical model above without the lower bound constraint on the variable maxweight, the MIP search is not nished after several hundred thousand nodes (or several minutes of running time on a Pentium III PC) because the formulation is very weak (there are, for instance, many equivalent solutions, simply obtained through permuting the numbering of boxes): an optimal MIP solution is found quickly1 but it takes a long time to prove its optimality. A lower bound on the maximum weight is given by the ideal case that all wagons take the same load, that is WEIGHTb / 3. Since all box weights are integers and boxes cannot be fragmented, we bBOXES can improve this bound by rounding it to the next larger integer (expressed through ceil). We have WEIGHTb / 3 = ceil 295 / 3 = ceil(98. 33333) = 99. With this bound, the optimal LP ceil bBOXES solution has the value 99. Due to this lower bound, the MIP search stops as soon as an integer feasible solution with the value 99 is found. Since the boxes cannot be divided, it was not obvious that we would be able to nd an integer solution within the carrying capacity of 100 quintals per wagon.
Table 9.2: Wagon loads Wagon 1 2 3 Total weight 99 98 98 Boxes 2, 3, 7, 9, 12, 14, 16 4, 5, 6, 8, 11, 15 1, 10, 13
An alternative to the additional lower bound constraint on the maximum weight is to adapt the cutoff value used by the optimizer: whenever an integer feasible solution is found during the Branch and Bound search, the optimizer uses this value as the new, upper bound on the objective function. Since in this problem we can only have integer-valued solutions, we can deduce a value (close to) 1 better than this bound, to force the optimizer to look for the next integer solution. We add the following line to our Mosel program before calling the optimization algorithm:
setparam("XPRS_MIPADDCUTOFF",-0.99999)
Once the MIP search has found a solution with value 99, the optimizer sets the new upper bound to 99 0. 99999 = 98. 00001. The optimal solution of the root LP (without the lower bound constraint on maxweight) is 98.33333 which is larger than this bound, and the search therefore terminates. Table 9.2 displays one of many possible assignments of boxes to wagons with the objective value 99.
9.2
Barge loading
A shipper on the river Rhine owns a barge of carrying capacity 1500 m3 . Over time he has specialized in the transport of wheat. He has seven regular customers who load and unload practically at the same places. The shipper knows his costs of transport from long experience and according to his personal preferences has concluded agreements with his clients for the price charged to them for the transport of their wheat. The following table summarizes the information about the seven clients. Every client wishes to tranport a certain number of lots, deciding himself the size of his lots in m3 . The table lists the price charged by the shipper for every transported lot. The last column of the table contains the cost incurred by the shipper per transported m3 . This cost differs depending on the distance covered.
Table 9.3: Lots to transport Client 1 2 3 4 5 6 7 Available quantity (no. of lots) 12 31 20 25 50 40 60 Lot size (in m3 ) 10 8 6 9 15 10 12 Price per lot (in B) C 1000 600 600 800 1200 800 1100 Transport cost (in B/m3 ) C 80 70 85 80 73 70 80
The objective of the shipper is to maximize his prot from transporting the wheat with lots that may be divided.
1 The reader is reminded that it is possible to visualize the output of the optimizer by adding the line setparam("XPRS_VERBOSE",true) before the optimization statement. In Xpress-IVE, the tree search can be visualized directly.
125
Question 1: As a rst step, assuming that every client has an unlimited quantity of wheat, which clients wheat should be transported? Question 2: If in addition the actual availability of wheat lots from the customers is taken into account, which strategy should the shipper adopt? Question 3: What happens if the lots cannot be divided?
9.2.1
Model formulation
The models for all three questions are given in this subsection. In each case, the objective is to maximize the shippers prot. Let CAP be the total carrying capacity of the barge. We write CLIENTS for the set of clients, AVAILc for the number of lots available from a client c, SIZEc the corresponding lot size, PRICEc the price charged to this customer, and COSTc the transport cost per m3 incurred by the shipper. With the given data, we calculate the shippers prot PROFc per transported lot of client c. This prot is obtained easily via equation (9.2.1): from the price charged to a customer we need to deduct the transport cost for a lot stemming from this customer. c CLIENTS : PROFc = PRICEc COSTc SIZEc (9.2.1)
The shippers prot per transported lot of every client calculated through this equation is summarized in the following table.
Table 9.4: Prot per lot Client Prot/lot (in B) C Prot/m3 (in B) C 1 200 20 2 40 5 3 90 15 4 80 8.8889 5 105 7 6 100 10 7 140 11.6667
We introduce the decision variables loadc whose value is the number of lots transported for client c. Since the lots may be divided, these variables may take fractional values. The model only has a single constraint, namely to limit the volume of wheat transported by the barge (constraints (9.2.3)). Using the prot data calculated above, we may now easily express the objective function (9.2.2). maximize
cCLIENTS
PROFc loadc
c CLIENTS : loadc 0
If we have to take into account the number of lots available from each client, we simply have to add the bound constraints (9.2.5) that state that the transported number of lots loadc is within the limit of availability. c CLIENTS : loadc AVAILc (9.2.5) In the last case, the lots may not be fragmented, that is, the variables loadc may only take integer values. We therefore have to add the following constraints (9.2.6) to the model. c CLIENTS : loadc IN (9.2.6)
9.2.2
Implementation
To simplify the statement of the objective function, in the following Mosel implementation of the mathematical model the prot per client is calculated separately, as is done in the previous section. The resulting model is very simple because it contains only a single constraint. The additional constraints are progressively added to the problem denition. After every optimization run we call the procedure print_sol to display the results.
model "D-2 Ship loading" uses "mmxprs" forward procedure print_sol(num:integer) declarations
126
CLIENTS = 1..7 AVAIL: array(CLIENTS) of integer SIZE: array(CLIENTS) of integer PRICE: array(CLIENTS) of integer COST: array(CLIENTS) of integer PROF: array(CLIENTS) of integer CAP: integer load: array(CLIENTS) of mpvar end-declarations initializations from d2ship.dat AVAIL SIZE PRICE COST CAP end-initializations
! Set of clients ! ! ! ! ! ! Number of lots per client Lot sizes Prices charged to clients Cost per client Profit per client Capacity of the ship
forall(c in CLIENTS) PROF(c):= PRICE(c) - COST(c)*SIZE(c) Profit:= sum(c in CLIENTS) PROF(c)*load(c) ! Limit on the capacity of the ship sum(c in CLIENTS) SIZE(c)*load(c) <= CAP ! Problem 1: unlimited availability of lots at clients maximize(Profit) print_sol(1) ! Problem 2: limits on availability of lots at clients forall(c in CLIENTS) load(c) <= AVAIL(c) maximize(Profit) print_sol(2) ! Problem 3: lots must be integer forall(c in CLIENTS) load(c) is_integer maximize(Profit) print_sol(3) !----------------------------------------------------------------! Solution printing procedure print_sol(num:integer) writeln("Problem ", num, ": profit: ", getobjval) forall(c in CLIENTS) write( if(getsol(load(c))>0 , " " + c + ":" + getsol(load(c)), "")) writeln end-procedure end-model
9.2.3
Results
We examine the results obtained for the three questions in turn. In the rst case, the optimizer returns a total prot of B 30,000 and the only load taken are 150 lots from client 1. The other clients have to look C for a different transport opportunity. This answer is quite obvious: the barge should be lled with the wheat from the client that provides the highest prot for the space it occupies (ratio PROFc / SIZEc , values displayed in the second line of Table 9.4). But in reality, the available quantities of wheat are limited. When we solve this second, more constrained problem, the value of the objective function decreases to B 17,844.44. The transported quantities belong C to ve clients as shown in the table below. In this case, we are also able to deduce the solution through logic. It sufces to load the hold starting with the client who provides the best prot-per-volume ratio (PROFc / SIZEc ). We continue to load the hold with the wheat from the second best client (in the order of decreasing prot-per-volume ratio) and so on, until the hold is full. The process stops when the hold is full, so the last lot is likely to be incomplete. In our example, the order of clients according to the decreasing prot-per-volume ratio is 1, 3, 7, 6, 4, 5, and 2. All wheat of clients 1,3,7, and 6 is taken, lling 1360 m3 of the hold. The remaining 140 m3 are lled with wheat from client 4, that is 15.5556 of his lots. If the lots are forced to take integer values only (question 3), the solution is similar to the previous one,
127
Table 9.5: Transported lots Client Question 1 Question 2 Question 3 1 150 12 12 2 0 0 0 3 0 20 20 4 0 15.5556 15 5 0 0 1 6 0 40 39 7 0 60 60
with a few small changes. The transported quantities for clients 1, 3, and 7 remain the same. Only 15 lots of client 4 and 39 of client 6 are taken and in addition 1 lot of client 5. The value of the objective function correspondingly decreases to B 17,805. Note that in the general case, there may be large differences C between the lots chosen in the cases of fragmentable or integer lots. This type of problem is called a knapsack problem.
9.3
Tank loading
Five tanker ships have arrived at a chemical factory. They are carrying loads of liquid products that must not be mixed: 1200 tonnes of Benzol, 700 tonnes of Butanol, 1000 tonnes of Propanol, 450 tonnes of Styrene, and 1200 tonnes of THF. Nine tanks of different capacities are available on site. Some of them are already partially lled with a liquid. The following table lists the characteristics of the tanks (in tonnes). Into which tanks should the ships be unloaded (question 1) to maximize the capacity of the tanks that remain unused, or (question 2) to maximize the number of tanks that remain free?
Table 9.6: Characteristics of tanks Tank Capacity Current product Quantity 1 500 0 2 400 Benzol 100 3 400 0 4 600 0 5 600 0 6 900 0 7 800 THF 300 8 800 0 9 800 0
9.3.1
Model formulation
Let TANKS be the set of tanks and LIQ the set of liquid products. We write ARRl for the quantity of liquid l that is about to arrive at the factory. CAPt is the capacity of tank t, which initially contains a quantity QINITt of liquid type TINITt (this type is only dened if QINITt > 0). All quantities are in tonnes. The model formulation relies on the following property: it is possible to ll the tanks optimally by giving priority to the tanks that already contain a liquid l for unloading the corresponding liquid before it is lled into any empty tanks. To understand why this correct, assume that a quantity x of liquid l is lled into an empty tank a, and another tank b already contains liquid l with a remaining capacity of y > 0. If x > y, we do not make any changes to the empty tanks (concerning their number or total capacity) if we rst ll b before lling x y into a. If x y, we save tank a by lling x into tank b. We therefore obtain a solution that is at least as good by giving priority to b until this tank is full or all of liquid l has been unloaded. After the prioritized lling of the partially lled tanks, our problem remains to ll the empty tanks with quantities RESTl dened by the relations (9.3.1): these are the quantities of product that remain once the capacities of the partially lled tanks are exhausted. As for the rest of the data, we suppose that the values RESTl are larger than zero, otherwise it sufces to remove from the problem the tanks that are completely lled and the liquids that have been entirely unloaded. l LIQ : RESTl = ARRl
tTANKS TINITt =l
(CAPt QINITt )
(9.3.1)
The model can then be formulated in a straightforward manner using binary variables loadlt that are dened only for tanks t that are empty after the prioritized lling (9.3.5). A variable loadlt is 1 if the liquid l is unloaded into the tank t. The constraints (9.3.4) guarantee that every empty tank is lled with at most one liquid. The constraints (9.3.3) ensure that the set of tanks that are lled with the liquid l have a sufciently large total capacity. The objective function (9.3.2) minimizes the total capacity of the tanks that are used and so answers the rst question, namely maximize the total capacity of the tanks remaining empty. To maximize the number of unused tanks, it sufces to remove the coefcients CAPt
128
CAPt loadlt
(9.3.2)
l LIQ :
tTANKS QINITt =0
(9.3.3)
t TANKS, QINITt = 0 :
lLIQ
loadlt 1
(9.3.4) (9.3.5)
9.3.2
Implementation
The following Mosel program implements the mathematical model developed in the previous section. Since the loadlt variables are only created for the tanks that are entirely empty at the beginning, there is no need to test the condition QINITt = 0 in the sums over these variables.
model "D-3 Tank loading" uses "mmxprs" forward procedure print_sol declarations TANKS: range LIQ: set of string CAP: array(TANKS) of integer TINIT: array(TANKS) of string QINIT: array(TANKS) of integer ARR: array(LIQ) of integer REST: array(LIQ) of integer load: array(LIQ,TANKS) of mpvar end-declarations initializations from d3tanks.dat CAP ARR [TINIT, QINIT] as FILLED end-initializations finalize(LIQ) forall(t in TANKS | QINIT(t)=0, l in LIQ) do create(load(l,t)) load(l,t) is_binary end-do ! Complete the initially partially filled tanks and calculate the remaining ! quantities of liquids forall(l in LIQ) REST(l):= ARR(l) - sum(t in TANKS | TINIT(t)=l) (CAP(t)-QINIT(t)) ! Objective 1: total tank capacity used TankUse:= sum(l in LIQ, t in TANKS) CAP(t)*load(l,t) ! Objective 2: number of tanks used TankNum:= sum(l in LIQ, t in TANKS) load(l,t) ! Do not mix different liquids forall(t in TANKS) sum(l in LIQ) load(l,t) <= 1 ! Load the empty tanks within their capacity limits forall(l in LIQ) sum(t in TANKS) CAP(t)*load(l,t) >= REST(l) ! Solve the problem with objective 1 minimize(TankUse) print_sol
! Set of tanks ! Set of liquids ! ! ! ! ! Tank capacities Initial tank contents type Quantity of initial contents Arriving quantities of chemicals Rest after filling part. filled tanks
129
! Solve the problem with objective 2 minimize(TankNum) print_sol !----------------------------------------------------------------! Solution printing procedure print_sol writeln("Used capacity: ", getsol(TankUse) + sum(t in TANKS | QINIT(t)>0) CAP(t), " Capacity of empty tanks: ", sum(t in TANKS) CAP(t) getsol(TankUse) sum(t in TANKS | QINIT(t)>0) CAP(t)) writeln("Number of tanks used: ", getsol(TankNum) + sum(t in TANKS | QINIT(t)>0) 1) forall(t in TANKS) if(QINIT(t)=0) then write(t, ": ") forall(l in LIQ) write( if(getsol(load(l,t))>0 , l, "")) writeln else writeln(t, ": ", TINIT(t)) end-if end-procedure end-model
9.3.3
Results
When evaluating the results, we need to take into account that our model only works with the tanks that are completely empty initially: the capacities (or for objective 2 the number) of the tanks that are partially lled in the beginning need to be added to the objective values calculated by the program. For the rst objective, we obtain a total capacity used of 5200 tonnes, tank 4 with a capacity of 600 tonnes remains empty (there are several equivalent solutions). Table 9.7 shows the distribution of chemicals to the other tanks and the unused capacity possibly remaining if these tanks are not completely lled.
Table 9.7: Optimal tank lling Product Benzol Butanol Propanol Styrene THF Tanks 2, 6 9 3, 5 1 7, 8 Remaining capacity 0 100 0 50 100
In the graphical representation of the solution in Figure 9.1 the unused tank capacities are represented by grey-shaded areas and the initial ll heights are indicated with dashed lines.
Styr.
Benzol
Prop.
Prop.
Benzol
THF
THF
Butan.
In total, 8 tanks are used in the optimal solution for the rst objective. After solving the problem with the second objective, we nd that 8 is indeed the smallest number of tanks that may be used for unloading all liquids.
130
9.4
Backing up les
Before leaving on holiday, you wish to backup your most important les onto oppy disks. You have got empty disks of 1.44Mb capacity. The sixteen les you would like to save have the following sizes: 46kb, 55kb, 62kb, 87kb, 108kb, 114kb, 137kb, 164kb, 253kb, 364kb, 372kb, 388kb, 406kb, 432kb, 461kb, and 851kb. Assuming that you do not have any program at hand to compress the les and that you have got a sufcient number of oppy disks to save everything, how should the les be distributed in order to minimize the number of oppy disks used?
9.4.1
Model formulation
Let FILES be the set of les to backup and DISKS = {1, . . . , ND} the set of oppy disks. Let CAP be the capacity of a disk and SIZEf the size of le f in kbyte. We use variables savefd that take the value 1 if le f is saved to disk d, and 0 in all other cases. We also dene a variable used for every disk d that takes the value 1 if any les are saved to this disk and 0 otherwise. The objective is to minimize the number of disks that are used, which corresponds to minimizing the sum of variables used , subject to the constraints: a) A le must be saved onto a single disk. This constraint corresponds to the relation (9.4.1). f FILES :
dDISKS
savefd = 1
(9.4.1)
b) The capacity of disks is limited, which translates into the constraints (9.4.2). d DISKS :
fFILES
(9.4.2)
The variable used on the right side of this constraint links the variables savefd and used : if savefd has the value 1, then the le f is saved onto the disk d and hence, the disk d is used and variable used needs to take the value 1. The relation (9.4.2) forces used to take the value 1 if at least one variable savefd (f FILES) has the value 1. We obtain the following MIP model: minimize
dDISKS
used savefd = 1
dDISKS
f FILES : d DISKS :
fFILES
It is possible to model this problem with fewer variables: we keep the Boolean variables savefd from the preceding model (but not the variables used ) and introduce an additional variable diskuse that corresponds to the number of disks that are used. We obtain a second model formulation as follows: minimize diskuse f FILES : diskuse
dDISKS
f FILES :
dDISKS
d DISKS :
The objective function is very simple in this case (9.4.8). We suppose that the disks are lled starting with the disk numbered d = 1, then disk number 2, and so on. Due to the constraints (9.4.1) or (9.4.10), the
131
disk that contains the le f has the index k that may be calculated through the relation (9.4.14). k=
dDISKS
d savefd
(9.4.14)
The value of diskuse must be at least as large as the highest index number of the disks that are used, hence the constraints (9.4.9). The constraints (9.4.10), that indicate that a le must be stored onto a single disk, are identical to the constraints (9.4.1) of the previous model. The capacity limits are established through the constraints (9.4.11). Finally, all variables savefd must be binaries and diskuse non-negative (it is not necessary to dene this variable explicitly as integer because this constraints will automatically be satised in the optimal solution). In this model, the minimization will reduce the value of diskuse as much as possible and backup the les in such a way that the index value of the largest disk becomes as small as possible. This model has ND Boolean variables fewer than the previous one.
9.4.2
Implementation
The following Mosel program implements the second mathematical model (lines (9.4.8) to (9.4.13)). Note that based on the given le sizes we calculate heuristically an upper bound on the number of disks that we may need for backing up all the les: we divide the sum of all le sizes by the capacity of a oppy disk, round this value to the next larger integer. The resulting value may be used as an upper bound in cases like the given data set where most of the les that need to be saved are very small compared to the capacity of a disk. The only bound value for the number of disks that is save in the general case is the number of les that need to be saved. (Consider, for instance, the case of 5 les of size 0.75Mb: 5 0. 75 = 3. 75, dividing this by 1.44 and rounding the result to the next larger integer we obtain 3, but we actually need 5 disks since only a single le ts onto every disk.)
model "D-4 Bin packing" uses "mmxprs" declarations ND: integer FILES = 1..16 DISKS: range CAP: integer SIZE: array(FILES) of integer end-declarations initializations from d4backup.dat CAP SIZE end-initializations ! Provide a sufficiently large number of disks ND:= ceil((sum(f in FILES) SIZE(f))/CAP) DISKS:= 1..ND declarations save: array(FILES,DISKS) of mpvar diskuse: mpvar end-declarations
! Number of floppy disks ! Set of files ! Set of disks ! Floppy disk size ! Size of files to be saved
! Limit the number of disks used forall(f in FILES) diskuse >= sum(d in DISKS) d*save(f,d) ! Every file onto a single disk forall(f in FILES) sum(d in DISKS) save(f,d) = 1 ! Capacity limit of disks forall(d in DISKS) sum(f in FILES) SIZE(f)*save(f,d) <= CAP forall(d in DISKS,f in FILES) save(f,d) is_binary ! Minimize the total number of disks used minimize(diskuse) end-model
132
9.4.3
Results
In the optimal solution, three disks are used. The les may be distributed to the disks as shown in the following table (there are several possible solutions).
Table 9.8: Distribution of les to disks Disk 1 2 3 File sizes (in kb) 46 87 137 164 253 364 388 55 62 108 372 406 432 114 461 851 Used space (in Mb) 1.439 1.435 1.426
In problems like this, where the objective function is very weak and we have essentially a feasibility problem, it may speed the Branch and Bound search to break the symmetry of the problem. The les have been numbered in an arbitrary way, as have the disks, so there is no loss of generality if we x one assignment, for example assigning the biggest le to the rst disk. Such symmetry breaking devices can be quite useful in combinatorial problems, as they sometimes prevent the LP relaxation from taking fractional combinations of solutions that would otherwise be integer feasible.
9.5
9.5.1
Model formulation
In this type of highly combinatorial problem, one exploits the fact that only a relatively small number of combinations of rectangles can be cut from the large sheets. These cutting patterns can easily be enumerated; Figure 9.2 represents the sixteen subsets that can be found. The sets shown are maximal subsets, that is, no further small rectangle of the order may be added to them. The Figure only displays one of several possible arrangements of every pattern. Let SIZES be the set of rectangles of different sizes of the order, and PATTERNS the set of cutting patterns represented in the graphic. For every size, the demand DEMs is given. Every pattern has an associated cost COSTp (COSTp = 1 if we simply wish to minimize the number of large sheets used). The composition of the cutting patterns is given by the matrix CUTsp dened by Table 9.9.
Table 9.9: Summary of cutting patterns Pattern 36 x 50 24 x 36 20 x 60 18 x 30 1 1 2 0 0 2 1 1 0 1 3 1 0 0 3 4 0 2 2 0 5 0 1 2 1 6 0 0 2 3 7 0 3 1 0 8 0 2 1 2 9 0 1 1 3 10 0 0 1 5 11 0 5 0 0 12 0 4 0 1 13 0 3 0 3 14 0 2 0 5 15 0 1 0 6 16 0 0 0 8
Once having nished the tedious work of enumerating the cutting patterns, writing the mathematical model is easy. We need to calculate the number of sheets to cut with every pattern in order to produce all ordered rectangular pieces whilst minimizing the total number of sheets used. We introduce integer variables usep (9.5.3) that denote the number of times a cutting pattern p is used. The constraints (9.5.2) indicate that the number of rectangles of every type needs to satisfy the demand. The objective function (9.5.1) is the total cost (or simply the number) of large sheets used in cutting. minimize s SIZES : COSTp usep
pPATTERNS
p PATTERNS : usep IN
133
24x36
18x30
P1
36x50
P2
24x36
36x50
P3
24x36
36x50
20x60
24x36
20x60
18x30
P4
20x60 24x36
P5
20x60 24x36
P6
20x60
24x36
24x36
18x30
18x30
24x36
18x30
18x30
18x30 24x36
P7
20x60 24x36
P8
20x60 24x36
P9
20x60
24x36
24x36 24x36
24x36
P10
20x60
P11
24x36 24x36
P12
24x36
24x36 24x36
24x36
P13
24x36
P14
24x36
P15
18x30 18x30
P16
134
9.5.2
Implementation
The following Mosel program implements the mathematical model described in the previous section.
model "D-5 Sheet metal cutting" uses "mmxprs" declarations PATTERNS = 1..16 SIZES = 1..4 DEM: array(SIZES) of integer CUT: array(SIZES,PATTERNS) of integer use: array(PATTERNS) of mpvar end-declarations initializations from d5cutsh.dat DEM CUT end-initializations ! Objective: total number of sheets used Sheets:= sum(p in PATTERNS) use(p) ! Satisfy demands forall(s in SIZES) sum(p in PATTERNS) CUT(s,p)*use(p) >= DEM(s) forall(p in PATTERNS) use(p) is_integer ! Solve the problem minimize(Sheets) end-model
! Set of cutting patterns ! Set of sheet sizes ! Demands for the different sizes ! Cutting patterns ! Use of cutting patterns
9.5.3
Results
The solver nds an optimal integer solution that uses 11 large sheets out of which the pattern 1 is cut 6 times, patterns 2 and 3 once, pattern 6 twice and pattern 10 once (note that there are several equivalent solutions). From this distribution come exactly the numbers of small sheets required to satisfy the order. We have thus minimized the total number of large sheets and produced exactly the required quantity, which is not necessarily the case in larger examples. The mathematical model is very compact in its generic form after the cutting patterns have been enumerated. In practical applications it may be too difcult to carry out this task by hand and some specialized program will have to be employed to generate these patterns in order to prevent the omission of admissible combinations.
9.6
9.6.1
Model formulation
This problem is similar to the previous problem of cutting sheet metal. The model formulation exploits the fact that only a small number of cutting patterns exist for the steel bars. The shorter bars of 1.5 m may, for instance, be cut into two pieces of 70 cm which leaves an offcut of 10 cm that cannot be used for any other type of leg. The same bar could alternatively be cut into one piece of 60cm and one of 70 cm, a loss of 20 cm. The following table summarizes the different possibilities. Let SIZES be the set of leg/desk heights and DEMs the demand for desks of a size s. Since every desk has four legs, we need to multiply the demand by 4 to obtain the required number of desk legs. The sets
135
Table 9.10: Possible cutting patterns for every bar type Pattern number Bar type 1 (1.5m) 1 2 3 4 5 6 7 8 9 10 11 12 40cm 0 0 2 0 2 3 0 0 1 3 0 5 Leg types 60cm 70cm 0 1 0 2 1 0 1 2 0 0 3 0 2 1 1 0 0 0 2 1 2 1 0 0 Loss (in cm) 10 20 0 30 10 30 0 10 20 10 20 0
PAT1 and PAT2 of cutting patterns for bars of type 1 and 2 respectively are combined to form the set of all patterns PATTERNS = PAT1 PAT2. We write LENb for the length of bar type b. The objective is to minimize the trim loss, that is, the difference between the total length of the original steel bars used for cutting and the total length of the desk legs ordered. With variables usep denoting the number of times a cutting pattern p is used, the rst two terms of the objective function (9.6.1) represent the total length of the bars that are used and the last term the total length of the ordered desk legs. minimize
pPAT1
LEN1 usep +
pPAT2
LEN2 usep
sSIZES
4 DEMs s
s SIZES :
p PATTERNS : usep IN
In the objective function, the term corresponding to the length of the ordered desk legs may be omitted because it is a constant value that has no inuence on the minimization process. The constraints (9.6.2), in which CUTps indicates the number of legs of length s contained in the cutting pattern p, guarantee that the demands are satised. The constraints (9.6.3) force the variables usep to take non-negative integer values only.
9.6.2
Implementation
A translation of the mathematical model to a Mosel is given by the following program. Note that the set operator + is used to build the union of two sets (PAT1 and PAT2).
model "D-6 Cutting steel bars" uses "mmxprs" declarations PAT1 = 1..6; PAT2 = 7..12 PATTERNS = PAT1 + PAT2 SIZES: set of integer DEM: array(SIZES) of integer CUT: array(PATTERNS,SIZES) of integer LEN: array(range) of integer use: array(PATTERNS) of mpvar end-declarations initializations from d6cutbar.dat DEM CUT LEN end-initializations ! Objective: total loss Loss:= sum(p in PAT1) LEN(1)*use(p) + sum(p in PAT2) LEN(2)*use(p) sum(s in SIZES) 4*DEM(s)*s ! Satisfy demands
! Sets of cutting patterns ! Set of all cutting patterns ! Desk heights ! Demands for the different heights ! Cutting patterns ! Lengths of original steel bars ! Use of cutting patterns
136
forall(s in SIZES) sum(p in PATTERNS) CUT(p,s)*use(p) >= 4*DEM(s) forall(p in PATTERNS) use(p) is_integer ! Solve the problem minimize(Loss) end-model
In this model we not only use ranges of integers as index sets (PAT1, PAT2, PATTERNS, and the unnamed index set of LEN) as in most other examples but also a set of integers, SIZES. The form set of integer is more general than a range set that always contains consecutive integer numbers. In the present case, we want SIZES to contain only the three different leg heights (and not in addition all the integer values between the smallest and the largest height). This is a nice way of using data directly as index values.
9.6.3
Results
The minimal loss calculated by the optimization is 2020cm. The ordered desk legs are cut from 2 bars of 1.5m (using cutting patterns 1 and 3 once) and 385 bars of 2m (using 195 times pattern 7, 7 times pattern 8, 97 times pattern 11, and 86 times pattern 12). With this combination of cutting patterns, exactly the quantity of legs is produced that is needed to satisfy the order of desks.
9.7
137
generated in its entirety. The promising columns are then added progressively. When the method works well, the optimum is found after generating only a small fraction of the columns of the complete model. For large-sized instances one needs to use metaheuristics like tabu search [LMV99] or genetic algorithms [Jak96]. Patterns that are equivalent in terms of trim loss may have different cutting costs. See Chu for methods that minimize the cost [CA99]. The formulation in 9.5 is a set covering problem like the placement of mobile phone transmitters in Chapter 12. This formulation is relatively efcient and works with up to a hundred patterns, but this limit is small compared to the enormous number of patterns that arise if the rectangles that need to be cut are small compared to the original sheets. Sweeney et al. provide a comprehensive bibliography with over 400 references for loading and cutting problems [SRP92].
138
Chapter 10
Ground transport
As with air transport in Chapter 11, transport by road and rail is rich in optimization problems. The main difference between the two types of networks is the high density of the network and the multiplicity of players in ground transport. The opening of frontiers and strong competition between transport providers has made the use of optimization methods a vital means of reducing transport costs and thus being able to stand out from competitors. Section 10.1 presents a vehicle rental problem in which the cars have to be returned to the agencies at the least cost in order to establish the ideal eet strengths. In Section 10.2 a problem of distributing among different modes of transport is described: a given quantity of goods has to be transported between two points in a network which provides different modes of transport with a known cost and limited capacities. Section 10.3 deals with a classical problem at the strategic level, the choice of depot locations that minimizes the cost of opening depots and of delivering to clients. In Section 10.4 we solve a problem optimizing the routes for the delivery of heating oil. Section 10.5 describes a combined (intermodal) transport problem that differs from the problem in 10.2 through costs for changing the mode. The problem of planning a eet of vans terminates this chapter.
10.1
Car rental
A small car rental company has a eet of 94 vehicles distributed among its 10 agencies. The location of every agency is given by its geographical coordinates X and Y in a grid based on kilometers. We assume that the road distance between agencies is approximately 1.3 times the Euclidean distance (as the crow ies). The following table indicates the coordinates of all agencies, the number of cars required the next morning, and the stock of cars in the evening preceding this day.
Table 10.1: Description of the vehical rental agencies Agency X coordinate Y coordinate Required cars Cars present 1 0 0 10 8 2 20 20 6 13 3 18 10 8 4 4 30 12 11 8 5 35 0 9 12 6 33 25 7 2 7 5 27 15 14 8 5 10 7 11 9 11 0 9 15 10 2 15 12 7
Supposing the cost for transporting a car is B 0.50 per km, determine the movements of cars that allow the C company to re-establish the required numbers of cars at all agencies, minimizing the total cost incurred for transport.
10.1.1
Model formulation
For every agency a in the given set AGENTS, we write Xa and Ya for its geographic coordinates. REQa is the number of cars required at an agency a and STOCKa the present number of cars for each agency. The difference between these two values indicates whether there is an excess number (positive value) or a need for additional vehicles (negative value). The problem consists of nding the minimum cost ow of vehicles from the set EXCESS of agencies with an excess of cars to the set NEED of agencies that have a decit of cars. A ow that re-establishes the required numbers of cars necessarily exists because the sum of excesses is equal to the sum of decits. As a rst step, we dene variables moveab to represent the ow between two agencies: a EXCESS, b NEED : moveab IN (10.1.1)
139
Every agency with an excess number of cars needs to get rid of these (10.1.2), and every agency in need of cars has to complete its eet by receiving the missing number (10.1.3). a EXCESS :
bNEED
(10.1.2) (10.1.3)
b NEED :
aEXCESS
The objective function to be minimized is the total cost of transporting cars (10.1.4), where COST denotes the transport cost per car per kilometer and DISTab is the distance between two agencies a and b. minimize
aEXCESS bNEED
(10.1.4)
This minimum cost ow problem is a transportation problem recognizable by a set of sources with availabilities and a set of sinks (destinations) with demands. For minimum cost ow problems, the simplex algorithm always nds an integer solution when solving the LP. The constraints (10.1.1) may therefore be replaced by simple non-negativity constraints.
10.1.2
Implementation
The following Mosel program implements the mathematical model above. After reading in the data, we test whether the number of cars in stock and the required number of cars are the same and stop the program if this is not the case. Otherwise, the two subsets of agencies with an excess or in need of cars are calculated. These sets are used subsequently in the declaration of the array of decision variables and the distance matrix.
model "E-1 Car rental" uses "mmxprs" declarations AGENTS = 1..10 REQ: array(AGENTS) of integer STOCK: array(AGENTS) of integer X,Y: array(AGENTS) of integer COST: real NEED: set of integer EXCESS: set of integer end-declarations
! Car rental agencies ! ! ! ! ! ! Required number of cars Number of cars in stock Coordinates of rental agencies Cost per km of moving a car Agencies needing more cars Agencies with too many cars
initializations from e1carrent.dat REQ STOCK X Y COST end-initializations if sum(a in AGENTS) (STOCK(a)-REQ(a)) <> 0 then writeln("Problem is infeasible") exit(0) end-if ! Calculate sets of agencies with excess or deficit of cars forall(a in AGENTS) if STOCK(a) - REQ(a) < 0 then NEED += {a} elif STOCK(a) - REQ(a) > 0 then EXCESS += {a} end-if finalize(NEED); finalize(EXCESS) declarations DIST: array(EXCESS,NEED) of real move: array(EXCESS,NEED) of mpvar end-declarations
! Calculate distances between agencies forall(a in EXCESS,b in NEED) DIST(a,b):= 1.3*sqrt((X(a)-X(b))^2 + (Y(a)-Y(b))^2)
Ground transport
140
! Objective: total transport cost Cost:= sum(a in EXCESS,b in NEED) COST*DIST(a,b)*move(a,b) ! Agencies with excess availability forall(a in EXCESS) sum(b in NEED) move(a,b) = STOCK(a) - REQ(a) ! Agencies in need of cars forall(b in NEED) sum(a in EXCESS) move(a,b) = REQ(b) - STOCK(b) forall(a in EXCESS,b in NEED) move(a,b) is_integer ! Solve the problem minimize(Cost) end-model
This implementation introduces the exponential operator . Note that instead of using the predened Mosel function sqrt(r) we could also write r0.5 for the square root r.
10.1.3
Results
The optimizer calculates a total transport cost of B 152.64. The following table displays the required C movements of cars between agencies to obtain the desired distribution of the eet with this minimum cost.
Table 10.2: Optimal plan for transporting vehicles 2 5 8 9 Need 1 0 0 0 2 2 3 1 0 0 3 4 4 0 3 0 0 3 6 5 0 0 0 5 7 1 0 0 0 1 10 0 0 4 1 5 Excess 7 3 4 6
10.2
10.2.1
Model formulation
We are going to model this problem as a minimum cost ow problem with a xed total throughput. We rst construct a graph G = (NODES, ARCS). To start, we put into the set of nodes NODES a layer of nodes for the depots and a second one for the recycling centers (follow the construction with the help of Figure 10.1). The set of arcs ARCS contains the possible connections between depots and recycling centers. A transport plan corresponds to a ow in G, that is a ow owij on every arc (i, j). An arc (i, j) is characterized by a minimum ow MINCAPij (0 except for rail transport), a capacity or maximum ow MAXCAPij (innity except for rail transport), and a transport cost COSTij per tonne. The two modes of transport from a depot to a center require two different arcs. Such a graph, with at most p arcs in the same sense between two nodes is called a p-graph. Such a graph cannot be coded as a (two-dimensional) matrix: for instance the element COSTij of a cost matrix can only dene a single cost. To obtain a graph with at most one arc between any pair of nodes, it is sufcient to create a ctitious
Ground transport
141
node per mode of transport, for every connection between a depot i and a center j. For instance, there is one connection by road and one by rail between depot D2 (node 3) and the center C1 (node 12). To avoid generating a 2-graph with two arcs (3,12), we create a node 6 for the rail transport and node 7 for road transport. The railway connection becomes the path (3,6,12), the road connection (3,7,12). The capacities and costs are only established for the arcs (3,6) and (3,7).
Depots D1 2
(0 ,-,
Rail/Road
12 0, ,5 )
Centers
(0,-,0)
6 rail
(0,-,12
(1
C1 12
,0)
7
(0,,14)
(0,-,0) (0,-,0)
11 )
,50
D2
0,0 )
road
(0
(0,4
8 rail
(0,-,0)
C2
(0,-,0)
(0,3
13
5,0 )
15
D3 4
(0,-,9)
(10,5
9
0,4)
(0,-,0)
road
(0,-,0)
,1
1)
50
0,
(1
The graph does not take into account the stock levels at the depots. To include these, we create a source node (ctitious node 1) that is connected to every depot d by an arc (1, d) with a capacity MAXCAP1d that corresponds to the stock level at d. Therefore, the ow leaving the depot d cannot exceed this value. To facilitate the formulation of the mathematical model we also create a sink node (ctitious node 15) to which every center is connected. The resulting graph is represented in Figure 10.1, with the triple (MINCAPij , MAXCAPij , COSTij ) for every arc (i, j). A stands for innite capacity. The mathematical model contains the ow conservation constraints (10.2.2), also called Kirchhoffs law: the sum of the incoming ows at every node (except for source and sink) equals the sum of outgoing ows. The ow on every arc has at least the minimum value MINCAPij (constraints (10.2.3)), without exceeding the maximum capacity MAXCAPij (constraints (10.2.4)). The constraint (10.2.5) imposes a total ow quantity MINQ = 180 tonnes. It stipulates that the total ow leaving the source (node 1) equals MINQ. It would equally be possible to establish the equivalent constraint that the total ow into the sink is equal to MINQ, since the ow is conserved through the network. In this constraint we could replace the equality sign by , since the total quantity transported will be forced to its lower bound when the cost, and hence the sum of ows, is minimized. We are left with the explanation of the objective function in line (10.2.1). Since COSTij is the cost per tonne, the cost of a quantity owij transported via the arc (i, j) is COSTij owij . And hence the total cost of transport to be minimized is the sum of the ow quantities in the entire set of arcs. Finally, due to the way we have dened the graph, we obtain a fairly compact mathematical model. Note that the non-negativity constraints are implicitly given through the constraints (10.2.3). minimize
(i,j)ARCS
(0 ,65 ,0)
(0, 4 -,1 )
10
0,10 )
(0,-,0)
C3 14
(0 ,-,
5 D4
(10,5
5)
rail
(0,-,0)
(0,-,14)
11 road
Ground transport
142
(10.2.4) (10.2.5)
An alternative to this graph-based formulation of the problem would be to represent the quantity of product transported from a depot d to a client c using mode m as a decision variable transportdcm for every admissible triple (d, c, m). The total transported quantity is then given by the sum of all dened variables transportdcm , and the objective function is the sum of COSTdcm transportdcm for all admissible triples (d, c, m). The minimum and maximum capacities of certain modes of transport are given as bound constraints on the corresponding variables transportdcm , similarly to constraints (10.2.3) and (10.2.4) above. For our specic problem, this formulation may be easier than the graph-based formulation. However, for the implementation and further discussion of this problem we use the generic minimum cost ow model given by lines (10.2.1) and (10.2.5).
10.2.2
Implementation
This problem raises a classical problem, namely the coding of a graph. It is possible to represent a graph through an N N matrix (where N is the total number of nodes), and dene the ow variables for the pairs of nodes (i, j) that are connected by an arc. However, for sparse graphs like the present one, it is often preferable (and more efcient) to represent the graph as a list of arcs. This representation is used in the following Mosel implementation, as opposed to the representation in the mathematical model above. An arc a = (i, j) is referred to by its counter a and not via the node pair (i, j). The list of arcs is given in the form of a two-dimensional array A with Aa1 = i and Aa2 = j. The ow variables are dened once the data has been read (and hence, the set of arcs is known). Note that the nodes in this implementation are not numbered but labeled SOURCE, D2, C4 etc. to ease the interpretation of the results.
model "E-2 Minimum cost flow" uses "mmxprs" declarations NODES: set of string MINQ : integer A: array(ARCS:range,1..2) of string COST: array(ARCS) of integer MINCAP,MAXCAP: array(ARCS) of integer end-declarations initializations from e2minflow.dat A MINQ MINCAP MAXCAP COST end-initializations finalize(ARCS) ! Calculate the set of nodes NODES:= union(a in ARCS) {A(a,1),A(a,2)} declarations flow: array(ARCS) of mpvar end-declarations ! Objective: total transport cost Cost:= sum(a in ARCS) COST(a)*flow(a) ! Flow balance: inflow equals outflow forall(n in NODES | n<>"SOURCE" and n<>"SINK") sum(a in ARCS | A(a,2)=n) flow(a) = sum(a in ARCS | A(a,1)=n) flow(a) ! Min and forall(a flow(a) flow(a) end-do max flow capacities in ARCS | MAXCAP(a) > 0) do >= MINCAP(a) <= MAXCAP(a)
! ! ! ! !
Set of nodes Total quantity to transport Arcs Transport cost on arcs Minimum and maximum arc capacities
! Flow on arcs
! Minimum quantity to transport sum(a in ARCS | A(a,1)="SOURCE" ) flow(a) >= MINQ ! Solve the problem minimize(Cost)
Ground transport
143
end-model
This model introduces another aggregate operator of Mosel: the set of nodes NODES is constructed as the union of all nodes connected by arcs in the set ARCS.
10.2.3
Results
The minimum cost is B 1,715k. Figure 10.2 displays the solution: arcs that are used for transporting goods C are labeled with the transported quantities, unused arcs and nodes are printed with dotted lines. For example, the entire stock of 50 tonnes at depot D1 is transported by road to the recycling center C2.
Depots D1
30
Rail/Road 6 rail
30
Centers
C1 12
2 7
50
30
D2 3
30 50
8 rail
15
C2
65
35
15
13 9
50
15
D3 4
35 65
road
85
10 rail 5 D4
50
85
C3 14
11
Figure 10.2: Optimal transport plan
It may be noted that such a problem with minimum ows on its arcs may well have no solution. This is the case, for instance, if MINQ = 10 because the four arcs of rail transport leaving the depots each require at least a minimum ow of 10 tonnes.
10.2.4
Extension
This model may be used to solve any type of minimum cost ow problem. For example, it would be possible to add demands for the centers. For a center c, it is sufcient to place the demand as a minimum value for the ow on the arc (c, sink) to guarantee the satisfaction of the demand. However, a necessary condition for the existence of a solution needs to be fullled: the sum of product availabilities at the depots must be greater than or equal to the sum of the demands at the centers.
10.3
Depot location
A large company wishes to open new depots to deliver to its sales centers. Every new set-up of a depot has a xed cost. Goods are delivered from a depot to the sales centers close to the site. Every delivery has a cost that depends on the distance covered. The two sorts of cost are quite different: set-up costs are capital costs which may usually be written off over several years, and transport costs are operating costs. A detailed discussion of how to combine these two costs is beyond the scope of this book we assume here that they have been put on some comparable basis, perhaps by taking the costs over a year.
Ground transport
144
There are 12 sites available for the construction of new depots and 12 sales centers need to receive deliveries from these depots. The following Table 10.3 gives the costs (in thousand B) of satisfying the entire demand of each customer C (sales center) from a depot (not the unit costs). So, for instance, the cost per unit of supplying customer 9 (who has a total demand of 30 tonnes according to Table 10.5) from depot 1 is B 60000/30t, i.e. B 2000/t. C C Certain deliveries that are impossible are marked with the innity symbol .
Table 10.3: Delivery costs for satisfying entire demand of customers Depot 1 2 3 4 5 6 7 8 9 10 11 12 1 100 120 140 160 190 200 100 120 140 160 190 200 2 80 90 110 125 150 180 80 90 110 125 150 180 3 50 60 80 100 130 150 50 60 80 100 130 150 4 50 70 80 100 50 70 80 100 5 60 65 75 80 60 65 75 80 Customer 6 7 100 110 130 150 100 110 130 150 120 140 160 190 200 100 120 140 160 190 200 100 8 90 110 125 150 180 80 90 110 125 150 180 80 9 60 80 100 130 150 50 60 80 100 130 150 50 10 70 80 100 50 70 80 100 50 11 65 75 80 60 65 75 80 60 12 110 130 150 100 110 130 150 100
In addition, for every depot we have the following information: the xed cost for constructing the depot that needs to be included into the objective function and its capacity limit, all listed in Table 10.4.
Table 10.4: Fix costs and capacity limits of the depot locations Depot Cost (kB) C Capacity (t) 1 3500 300 2 9000 250 3 10000 100 4 4000 180 5 3000 275 6 9000 300 7 9000 200 8 3000 220 9 4000 270 10 10000 250 11 9000 230 12 3500 180
The quantities demanded by the sales centers (customers), are summarized in the following table.
Table 10.5: Demand data Customer Demand (t) 1 120 2 80 3 75 4 100 5 110 6 100 7 90 8 60 9 30 10 150 11 95 12 120
In every case, the demand of a customer needs to be satised but a sales center may be delivered to from several depots. Which depots should be opened to minimize the total cost of construction and of delivery, whilst satisfying all demands?
10.3.1
Model formulation
To formulate the mathematical model, we write DEMc for the demand by customer (sales center) c, and CAPd for the maximum capacity of depot d. The xed cost of constructing depot d is given by CFIXd , the cost of delivery from depot d to customer c as COSTcd . Furthermore, let DEPOTS be the set of all possible depot locations and CUST the set of customers to be delivered to from these depots. To solve the problem, we need to know which depots will be opened. So we dene binary variables buildd that take the value 1 if site d is chosen, and otherwise 0. In addition, we also need to know which depot(s) deliver(s) goods to a customer. We introduce variables fowdc for the fraction of the demand of customer c that is satised from depot d. These variables take their values in the interval [0, 1]; we therefore have the constraints (10.3.1). d DEPOTS, c CUST : fowdc 1 The demand of every customer needs to be entirely satised: c CUST :
dDEPOTS
(10.3.1)
fowdc = 1
(10.3.2)
Ground transport
145
We now have to model the fact that the total amount leaving depot d must be no more than its capacity CAPd , but that the ow is zero if the depot is not built. The constraints (10.3.3) capture this. d DEPOTS :
cCUST
(10.3.3)
Let us now see why. Since fowdc is the fraction of customer cs satised demand, fowdc DEMc is the amount going from d to c. The total outow from d must be no more than CAPd if d is built (buildd = 1), and must be 0 if buildd = 0. The total cost to be minimized consists of the costs for constructing the depots and the delivery costs. These are the two sums comprising the objective function (10.3.4). The complete mathematical model is given by the following. minimize
dDEPOTS
CFIXd buildd +
dDEPOTS cCUST
COSTdc fowdc
d DEPOTS :
10.3.2
Implementation
The following Mosel program is a straightforward translation of the mathematical model.
model "E-3 Depot location" uses "mmxprs" declarations DEPOTS = 1..12 CUST = 1..12 COST: array(DEPOTS,CUST) of integer CFIX: array(DEPOTS) of integer CAP: array(DEPOTS) of integer DEM: array(CUST) of integer fflow: array(DEPOTS,CUST) of mpvar build: array(DEPOTS) of mpvar end-declarations initializations from e3depot.dat COST CFIX CAP DEM end-initializations ! Objective: total cost TotCost:= sum(d in DEPOTS, c in CUST) COST(d,c)*fflow(d,c) + sum(d in DEPOTS) CFIX(d)*build(d) ! Satisfy demands forall(c in CUST) sum(d in DEPOTS) fflow(d,c) = 1 ! Capacity limits at depots forall(d in DEPOTS) sum(c in CUST) DEM(c)*fflow(d,c) <= CAP(d)*build(d) forall(d in DEPOTS) build(d) is_binary forall(d in DEPOTS, c in CUST) fflow(d,c) <= 1 ! Solve the problem minimize(TotCost) end-model
! Set of depots ! Set of customers ! ! ! ! Delivery cost Fix cost of depot construction Depot capacity Demand by customers
We could add an additional set of constraints stating the relation if there is any delivery from depot d, then this depot must be built (and its inverse if a depot is not built, then there is no delivery from this
Ground transport
146
depot). This relation is implied by the constraints (10.3.3) but the additional (disaggregated) constraints provide a tighter formulation. That is, if these constraints are added to the model they draw the solution value of the LP relaxation closer to the MIP solution. The additional constraints may be added directly to the model, but since the model is fully stated through the version printed above, we could turn them into model cuts as shown below. By dening these constraints as model cuts we leave the choice to the optimizer whether to use these additional constraints or not. Note that any constraint that is to become a model cut needs to be named and declared globally in the Mosel program as shown in the following program extract (linear constraints in Mosel have the type linctr).
declarations modcut: array(DEPOTS,CUST) of linctr end-declarations forall(d in DEPOTS, c in CUST) do modcut(d,c):= fflow(d,c) <= build(d) setmodcut(modcut(d,c)) end-do
10.3.3
Results
The optimization algorithm calculates a minimum total cost of B 18,103k. The ve depots 1, 5, 8, 9, and C 12 are built. The following table details how the customers are delivered to from these depots. All depots built, except depot 5 are used to their maximum capacity.
Table 10.6: Delivery plan Depot 1 5 8 9 12 1 120 2 5 40 35 3 75 4 100 5 110 Customer 6 7 100 90 8 60 9 30 10 85 65 11 95 12 120
10.4
The next table contains the distance matrix between the clients and the renery.
Table 10.8: Distance matrix (in km) Brain-surDonges lAuthion Donges Brain-s.-lAuthion Craquefou Gurande Haie Fouassire Msanger Ponts-de-C 0 148 55 32 70 140 73 148 0 93 180 99 12 72 Craquefou 55 93 0 85 20 83 28 Gurande 32 180 85 0 100 174 99 Haie Fouassire 70 99 20 100 0 85 49 Msanger 140 12 83 174 85 0 73 Pontsde-C 73 72 28 99 49 73 0
The transport company uses tankers with a capacity of 39000 liters for the deliveries. Determine the tours for delivering to all clients that minimize the total number of kilometers driven.
Ground transport
147
10.4.1
Model formulation
This problem may be seen as a generalization of the famous Traveling Salesman Problem (TSP), an example of which we see in Section 11.5. In this case there are several salesmen, who each have to have a tour starting and nishing at Donges. We have to determine not only the cities in the tours, but also how many tours there are to be, and the order the cities in each tour are visited. We introduce variables precij that take the value 1 if town i immediately precedes town j in a tour, and 0 otherwise. Let SITES = {1, . . . , NS} be the number of sites. Site 1 is the renery, so that we have the subset CLIENTS = {2, . . . , NS} of sites to which we deliver. Let DISTij be the distance between two towns i and j, DEMi the quantity ordered by client i, and CAP the maximum capacity of the tankers. We also use variables quanti for the total amount of oil delivered on the route that includes client i up to and including client i. For example, if the route including 10 is 1,3,11,10,6,1, then quant10 would be DEM3 + DEM11 + DEM10 . With these notations, we may formulate the following mathematical model: minimize j CLIENTS : i CLIENTS : DISTij precij
iSITES jSITES,i=j
precij = 1
iSITES,i=j
precij = 1
jSITES,j=i
i CLIENTS : DEMi quanti CAP i CLIENTS : quanti CAP + (DEMi CAP) prec1i i, j CLIENTS, i = j : quantj quanti + DEMj CAP + CAP precij + (CAP DEMj DEMi ) precji i CLIENTS : quanti 0 i, j SITES, i = j : precij {0, 1}
The objective (10.4.1) of this problem is to minimize the total number of kilometers driven. Every customer site has to be delivered to once. This is expressed through the two sets of constraints (10.4.2) and (10.4.3) that make the delivery enter and leave every town (except the depot) exactly once. The quantity quanti must be at least as large as the quantity ordered by client i and within the capacity limit CAP of the tankers (10.4.4). Furthermore, if client i is the rst of a tour, then quanti is equal to the quantity ordered by this client. This constraint is expressed through the two sets of constraints (10.4.4) and (10.4.5). Indeed, if i is the rst client of a tour, then prec1i is 1 and, after simplication, the constraint (10.4.5) is equivalent to the constraint (10.4.9). quanti DEMi (10.4.9) From (10.4.9) and (10.4.4) it follows that quanti is equal to the demand of client i. If i is not the rst of a tour, prec1i is 0 and the constraint (10.4.5) is equivalent to the constraint (10.4.10), which is redundant since it is already expressed in constraint (10.4.4). quanti CAP (10.4.10)
Let us now consider the case where i is not the rst customer of the tour. Then quanti must equal the sum of quantities delivered between the renery and i inclusively. This means that if client j comes after client i in a tour, we can write that quantj must be equal to the quantity delivered on the tour from the renery to i, plus the quantity ordered by j. This relation is stated by the constraint (10.4.6). If indeed j is the immediate successor of i in a tour, then precij is 1 and precji is 0, and the constraint (10.4.6) is equivalent to the constraint (10.4.11). quantj quanti + DEMj (10.4.11)
When j does not come immediately after i, constraint (10.4.6) still remains valid. If j is the immediate predecessor of i, the constraint (10.4.6) becomes (10.4.12). quantj quanti DEMi (10.4.12)
This constraint means that the quantity delivered from the renery up to j is no less than the quantity delivered between the depot and the successor i of j on the tour, a quantity that needs to be reduced by
Ground transport
148
the delivery at i. If j is the immediate predecessor of i, then i is the immediate successor of j. We therefore obtain in addition to (10.4.12) the constraint (10.4.13) by swapping the indices in (10.4.11). quanti quantj + DEMi The combination of constraints (10.4.12) and (10.4.13) is equivalent to the equation (10.4.14). quanti = quantj + DEMi (10.4.14) (10.4.13)
If i and j are not next to each other on a tour, we obtain the constraint (10.4.15). Since the terms on the right hand side of the inequality sign are less than or equal to DEMj , this constraint is redundant since it is subsumed by the constraint (10.4.4). quantj quanti + DEMj CAP (10.4.15)
And nally, constraints (10.4.7) and (10.4.8) indicate that the variables quanti are non-negative and that the precij are binary variables.
2 4
1 Refinery
To close we would like to remark that the assignment of variables quanti to every node i guarantees that the capacity limits of the tankers are not exceeded, whilst making any tour impossible that does not include the depot. Without these variables, it would be possible to obtain solutions like the one represented in Figure 10.3. This solution satises the constraints (10.4.2) and (10.4.3) because every node is entered and left exactly once, but it is infeasible because the tour does not pass through the renery. Assigning the strictly increasing values quanti all along a tour excludes this type of solution.
10.4.2
Implementation
The following Mosel program implements the mathematical model of lines (10.4.1) (10.4.8).
model "E-4 Oil delivery" uses "mmxprs" declarations NS = 7 SITES = 1..NS CLIENTS = 2..NS
DEM: array(SITES) of integer ! Demands DIST: array(SITES,SITES) of integer ! Distances between locations CAP: integer ! Lorry capacity prec: array(SITES,SITES) of mpvar quant: array(CLIENTS) of mpvar end-declarations initializations from e4deliver.dat DEM DIST CAP end-initializations ! Objective: total distance driven ! 1 if i immediately precedes j, ! 0 otherwise ! Quantity delivered up to i
Ground transport
149
Length:= sum(i,j in SITES | i<>j) DIST(i,j)*prec(i,j) ! Enter and leave every city only once (except the depot) forall(j in CLIENTS) sum(i in SITES| i<>j) prec(i,j) = 1 forall(i in CLIENTS) sum(j in SITES| i<>j) prec(i,j) = 1 ! If i is the first client of a tour, then quant(i)=DEM(i) forall(i in CLIENTS) quant(i) <= CAP + (DEM(i)-CAP)*prec(1,i) ! If j comes just after i in a tour, then quant(j) is greater than the ! quantity delivered during the tour up to i plus the quantity to be ! delivered at j (to avoid loops and keep capacity limit of the tanker) forall(i,j in CLIENTS| i<>j) quant(j) >= quant(i) + DEM(j) - CAP + CAP*prec(i,j) + (CAP-DEM(j)-DEM(i))*prec(j,i) forall(i in CLIENTS) do quant(i) <= CAP quant(i) >= DEM(i) end-do forall(i,j in SITES | i<>j) prec(i,j) is_binary ! Solve the problem minimize(Length) end-model
It is possible to dene an additional set of constraints stating that quanti is greater than or equal to the sum of the quantities to deliver to client i and to his predecessor on the tour. These constraints may help improve the lower bound on the variables quanti for sites i that are not visited rst in a tour. Since the model is fully stated through the version printed above we turn them into model cuts, leaving the choice to the optimizer whether to use these additional constraints or not. The reader is reminded that any constraint that is to become a model cut needs to be named and declared globally in the Mosel program.
declarations modcut: array(CLIENTS) of linctr end-declarations forall(i in CLIENTS) do modcut(i):= quant(i) >= DEM(i) + sum(j in SITES| i<>j) DEM(j)*prec(j,i) setmodcut(modcut(i)) end-do
10.4.3
Results
The optimal solution involves making two delivery tours. One tour delivers a total of 22000 liters of heating oil, visiting rst Gurande and then Haie Fouassire. The other tour goes from the renery to Msanger, then Brain-sur-lAuthion, Les Ponts-de-C, and Craquefou, delivering a total of 37000 liters. A total distance of 497 km needs to be driven for these tours.
10.5
The next table (10.10) summarizes the costs for changing the mode of transport in $ per tonne. The cost is independent of location.
Ground transport
150
Table 10.10: Cost for changing the mode of transport from \ to Rail Road Air Rail 0 8 15 Road 5 0 10 Air 12 10 0
How should we organize the transport of the load at the least cost?
10.5.1
Model formulation
Let MODES be the set of modes of transport. The connection between a pair of consecutive cities is referred to as a leg of the route, the complete transport trajectory being given by the set LEGS of all legs. Let CTRANSml be the transport cost using mode m on leg l, and CCHGmn the cost for changing from mode m to mode n which is independent of the site where it takes place in our example. We need two types of binary variables to handle the two types of costs: a rst group (10.5.1) of variables useml that have the value 1 if mode m is used for leg l of the total trajectory, and a second group (10.5.2) of variables changemnl with value 1 if there is a change from mode m to mode n between legs l and l + 1. m MODES, l LEGS : useml {0, 1} m, n MODES, l {1, . . . , NL 1} : changemnl {0, 1} A single mode of transport has to be used on each leg (10.5.3). l LEGS :
mMODES
(10.5.1) (10.5.2)
useml = 1
(10.5.3)
A single change of the mode of transport may take place at every intermediate city (10.5.4). In this case, the change from a mode to the same mode does not cost anything since the load stays on board the same vehicle. It would of course be possible to have a non-zero cost if the load changed to a different vehicle of the same type. (10.5.4) l {1, . . . , NL 1} : changemnl = 1
m,nMODES
In the city between the legs l and l + 1, we have a change of the mode from m to n (proposition A) if and only if the mode m is used for leg l and mode n is used on leg l + 1 (proposition B). The constraints (10.5.5) provide a linear formulation of the implication A B: if changemnl = 1, then useml = 1 and usen,l+1 = 1. Theoretically, taking these constraints isolated from the rest, it would be possible to have useml = usen,l+1 = 1 with changemnl = 0, but this case is excluded through the constraints (10.5.4). m, n MODES, l {1, . . . , NL 1} : useml + usen,l+1 2 changemnl (10.5.5)
An alternative formulation of these constraints are the two sets of constraints (10.5.6) and (10.5.7). m, n MODES, l {1, . . . , NL 1} : useml changemnl m, n MODES, l {1, . . . , NL 1} : usen,l+1 changemnl (10.5.6) (10.5.7)
These alternative constraints are stronger: they exclude more fractional solutions than the constraints (10.5.5), at the cost of dening twice as many constraints. The objective function (10.5.8), in $ per tonne, comprises the transport cost for every leg of the trajectory (depending on the mode of transport used) and the sum of the costs for changing the mode in the intermediate cities.
NL1
minimize
mMODES lLEGS
CTRANSml useml +
mMODES nMODES l=1
CCHGmn changemnl
(10.5.8)
10.5.2
Implementation
The mathematical model translates into the following Mosel program. The implementation uses the weak constraints (10.5.5).
Ground transport
151
model "E-5 Combined transport" uses "mmxprs" declarations NL = 4 LEGS = 1..NL MODES: set of string CTRANS: array(MODES,LEGS) of integer CCHG: array(MODES,MODES) of integer end-declarations initializations from e5combine.dat CTRANS CCHG end-initializations finalize(MODES) declarations use: array(MODES,LEGS) of mpvar ! 1 if a mode is used, 0 otherwise change: array(MODES,MODES,1..NL-1) of mpvar ! 1 if change from mode m to n ! at end of leg, 0 otherwise end-declarations ! Objective: total cost Cost:= sum(m in MODES, l in LEGS) CTRANS(m,l)*use(m,l) + sum(m,n in MODES,l in 1..NL-1) CCHG(m,n)*change(m,n,l) ! One mode of transport per leg forall(l in LEGS) sum(m in MODES) use(m,l) = 1 ! Change or maintain mode of transport between every pair of legs forall(l in 1..NL-1) sum(m,n in MODES) change(m,n,l) = 1 ! Relation between modes used and changes forall(m,n in MODES,l in 1..NL-1) use(m,l) + use(n,l+1) >= 2*change(m,n,l) forall(m in MODES, l in LEGS) use(m,l) is_binary forall(m,n in MODES,l in 1..NL-1) change(m,n,l) is_binary ! Solve the problem minimize(Cost) end-model
! Legs of the transport ! Modes of transport ! Transport cost ! Cost of changing mode of transport
10.5.3
Results
The minimum total cost calculated by the optimizer is $104/t. This value is obtained from $100/t of transport costs and $4/t for changing the mode of transport. The following table displays the results in detail.
Table 10.11: Modes of transport used and respective costs 12 Mode of transport Cost (in $/t) rail 30 Change at 2 0 23 rail 25 Change at 3 0 34 rail 40 Change at 4 5 45 road 50
At the 1st January, the chain has 200 vans, for which the rental period terminates at the end of February.
Ground transport
152
To satisfy its needs, the chain has a choice among three types of contracts that may start the rst day of every month: 3-months contracts for a total cost of $1700 per van, 4-months contracts at $2200 per van, and 5-months contracts at $2600 per van. How many contracts of the different types need to be started every month in order to satisfy the companys needs at the least cost and to have no remaining vans rented after the end of June?
rent 34 rent 33 rent 43 rent 42 rent 52 rent 51
Month
10.6.1
Model formulation
Let NINIT be the number of vans already rented at the beginning of the planning period. We dene integer variables rentcm to denote the number of contracts of type c (c CONTR = {3, 4, 5}) to start at the beginning of month m (m MONTHS = {1, . . . , 6}). To clarify the constraint formulation we are using, let us rst look at a specic formulation. Take for example the constraint for month 5 (May) represented in Figure 10.4: the running contracts may be 5-months contracts signed in January, 4 or 5-months contracts signed in February, 3 or 4-months contracts signed in March, or 3-months contracts signed in April. These contracts must satisfy the requirement of 425 vans for the month of May. Note that for instance a 5month contract cannot be signed in March because it does not terminate at the end of June, nor can any contract be signed in May. m=1: m=2: m=3: m=4: m=5: m=6: NINT + rent31 + rent41 + rent51 430 NINT + rent31 + rent41 + rent51 + rent32 + rent42 + rent52 410 rent31 + rent41 + rent51 + rent32 + rent42 + rent52 + rent33 + rent43 440 rent41 + rent51 + rent32 + rent42 + rent52 + rent33 + rent43 + rent34 390 rent51 + rent42 + rent52 + rent33 + rent43 + rent34 425 rent52 + rent43 + rent34 450
It is possible to write these constraints in a generic way. Let NM denote the number of months, COSTc the cost per van of contracts of duration c, and REQm the requirement of vans in month m. minimize
cCONTR mMONTHS min(m,NMc+1)
COSTc rentcm
(10.6.1)
m = 1, 2 : NINIT +
min(m,NMc+1)
rentcn REQm
cCONTR n=max(1,mc+1)
(10.6.2)
m = 3, . . . , NM :
rentcn REQm
cCONTR n=max(1,mc+1)
(10.6.3) (10.6.4)
The objective function is to minimize the total cost for all contracts that are signed (10.6.1). A contract lasts c months, therefore the requirement of vans in any month m is covered by the contracts of type c signed in the months max(1, m c + 1) and min(m, NM c + 1). The constraints (10.6.3) specify that starting from March the signed contracts have to cover the need for vans of the month. For January and February, the constraints (10.6.2) also include the number of vans initially available NINIT. The constraints (10.6.4) establish the integrality constraints for the variables. From LP theory it is possible to show that this mathematical program is equivalent to a minimum cost ow problem that is known to have integer values at the (linear) optimum. It is therefore possible to replace the constraints (10.6.4) by simple non-negativity conditions.
Ground transport
153
10.6.2
Implementation
The constraints (10.6.2) and (10.6.3) of the mathematical model are combined into a single statement in the following Mosel program.
model "E-6 van rental" uses "mmxprs" declarations NM = 6 MONTHS = 1..NM CONTR = 3..5 REQ: array(MONTHS) of integer COST: array(CONTR) of integer NINIT: integer rent: array(CONTR,MONTHS) of mpvar end-declarations initializations from e6vanrent.dat REQ COST NINIT end-initializations ! Objective: total cost Cost:= sum(c in CONTR, m in MONTHS) COST(c)*rent(c,m) ! Fulfill the monthly requirements forall(m in MONTHS) if(m<=2, NINIT, 0) + sum(c in CONTR, n in maxlist(1,m-c+1)..minlist(m,NM-c+1)) rent(c,n) >= REQ(m) ! Solve the problem minimize(Cost) end-model
! Months ! Contract types ! Monthly requirements ! Cost of contract types ! Vans rented at beginning of plan ! New rentals every month
In this implementation, we use the Mosel functions maxlist and minlist to calculate respectively the maximum and minimum value of a list of numbers. In this example, each time only two numbers are given as arguments to these functions, but in the general case the lists may have any nite number of entries, such as maxlist(2,-10,A(3),B(7,-5)) (where A and B are assumed to be arrays of integers or reals). These two functions should not be confused with the aggregate operators max and min that provide a similar functionality, but are used with set expressions, such as max(i in ISET) A(i) (where A is an array of integers or reals indexed by ISET).
10.6.3
Results
The optimization algorithm nds a minimum total cost of $1,261,000. The table shows the new contracts signed every month and the resulting totals.
Table 10.13: Plan of van rentals New contracts 3 months 4 months 5 months Total January 230 0 0 430 February 0 0 0 430 March 0 210 0 440 April 240 0 0 450 May 0 0 0 450 June 0 0 0 450
Note that the requirement to have no vehicles on contract at the start of July is very distorting.
10.7
Ground transport
154
Linear Programming was invented, transport problems had already been studied in the 1930s and 40s, in the USA by Hitchcock [Hit41], in the USSR by Kantorovitch. There are efcient specialized algorithms like the stepping stone algorithm [BJ90]. The choice of modes of transport in Section 10.2 is a minimum cost ow problem in a graph. Fast algorithms for this problem that work directly on the graph are available. An algorithm with a good simplicity/performance ratio is the one by Busacker and Gowen; a Pascal source is provided in [Pri94a]. Other algorithms are given by Ahuja et al [AMO93]. The problem of depot location (facility location problem) in Section 10.3 is a mixed-integer problem with continuous variables for the transported quantities and binary variables for the construction decisions. This problem is NP-hard, even with depots of innite capacity. Tree-based methods like the one by Erlenkotter [Erl78] are able to solve problems of a certain size (100 customers). A book by Daskin describes a large number of other location problems [Das95]. The heating oil delivery problem in Section 10.4 is a typical case of a vehicle routing problem (VRP). The formulation given here is only suitable for small instances (20-30 customers). Some specialized tree search methods are able to solve to optimality instances with up to 100 customers [LDN84] [BMR94], even for the case that the delivery to clients needs to take place in certain time windows [DDS92]. Beyond this limit of 100 customers, it is recommended to use heuristic methods like the one by Clarke and Wright [CW64]. An overview on classical heuristics is given by Christodes [CMT79b]. Metaheuristics like tabu search nd good solutions for large sized instances [GHL94]. The mathematical program for the intermodal transport problem in Section 10.5 uses an excessively large number of variables when the number of cities and especially the number of modes of transport grow larger. Luckily, it may be solved efciently with a Dynamic Programming method (a kind of recursive optimization) [Kas98]. The case studied here is relatively simple because the cities form a unique path. The problem gets very hard for an arbitrary graph. Like the problem of personnel planning for a construction site in Chapter 14, the van eet planning problem in Section 10.6 belongs to a category of optimization problems in which the requirements for a period are satised by resources that are used during more than one period. Another problem of this type consists of assigning shifts or other tasks to persons that are available for a certain number of hours. The associated mathematical programs have a series of consecutive coefcients of value 1 in their columns. It is possible to show that they are equivalent to minimum cost ow problems [AMO93].
Ground transport
155
Chapter 11
Air transport
The domain of air transport is a fertile ground for original and difcult optimization problems. The erce competition between airlines has led to the development of Operations Research departments at the largest ones (such as American Airlines, Delta Airlines, British Airways, and more recently, the renaissance of such a department at Air France). This chapter illustrates the diversity of applications, involving passenger ows, ight crews, aircraft movements, location of hubs (ight connection platforms), and ight trajectories. In the rst problem (Section 11.1), the incoming planes at an airport need to be assigned to the ights leaving from the airport in order to minimize the number of passengers (and hence the luggage) who have to change planes. The problem in Section 11.2 consists of forming ight crews according to various compatibility and performance criteria. Section 11.3 describes an interesting and original problem, namely scheduling the landing sequence of planes on a runway. The choice of the architecture of a network (location of hubs) is dealt with in Section 11.4. The subject of Section 11.5 is a case of emergency logistics (the provision of a disaster-stricken country with fresh supplies).
11.1
For example, if the ight incoming from Bordeaux continues on to Berlin, 35 passengers and their luggage may stay on board during the stop at Paris. The ight from Nice arrives too late to be re-used on the connection to Berlin, the same is true for the ight from Toulouse that cannot be used for the destinations Berlin, Bern and Brussels (the corresponding entries in the table are marked with ). How should the arriving planes be re-used for the departing ights to minimize the number of passengers who have to change planes at Roissy?
11.1.1
Model formulation
Let PLANES be the set of aircraft (the number of which also corresponds the numbers of ight origins and ight destinations) and PASSij the number of passengers transferring at the hub from origin i to the ight with destination j. We introduce binary variables contij that take the value 1 if and only if the plane
156
coming from i continues its journey to destination j. The following LP represents the problem: maximize
iPLANES jPLANES
j PLANES : i PLANES :
jPLANES
contij = 1
The initial objective was to minimize the number of passengers that change planes, but this objective is equivalent to the objective (11.1.1) that maximizes the number of passengers staying on board their plane at the hub. The constraints (11.1.2) indicate that every destination is served by exactly one ight, and the constraints (11.1.3) that one and only one ight leaves every origin. The constraints (11.1.4) specify that the variables are binaries. Note that since this problem is an instance of the well known assignment problem the optimal LP solution calculated by the simplex algorithm always takes integer values. It is therefore sufcient simply to dene non-negativity constraints for these variables. The upper bound of 1 on the variables results from the constraints (11.1.2) and (11.1.3).
11.1.2
Implementation
In the data array PASS, that is read in from the le f1connect.dat by the following Mosel implementation of the mathematical model, the of the table are replaced by large negative coefcients (1000). This negative cost prevents the choice of inadmissible ight connections. Another possibility would be to leave the corresponding entries of the array PASS undened and to test in the denition of the variables whether a connection may be used. This formulation has the advantage of using fewer variables if not all ight connections are feasible, but it cannot be used if there are admissible ight connections that are not taken by any passengers.
model "F-1 Flight connections" uses "mmxprs" declarations PLANES = 1..6
! Set of airplanes
PASS: array(PLANES,PLANES) of integer ! Passengers with flight connections cont: array(PLANES,PLANES) of mpvar end-declarations initializations from f1connect.dat PASS end-initializations ! Objective: number of passengers on connecting flights Transfer:= sum(i,j in PLANES) PASS(i,j)*cont(i,j) ! One incoming and one outgoing flight per plane forall(i in PLANES) sum(j in PLANES) cont(i,j) = 1 forall(j in PLANES) sum(i in PLANES) cont(i,j) = 1 ! Solve the problem: maximize the number of passengers staying on board maximize(Transfer) end-model ! 1 if flight i continues to j
11.1.3
Results
In the optimal solution, 112 passengers stay on board their original plane. The following table lists the corresponding ight connections
Air transport
157
Table 11.2: Optimal ight connections Plane arriving from Bordeaux Clermont-Ferrand Marseille Nantes Nice Toulouse continues to destination London Bern Brussels Berlin Rome Vienna Number of passengers 38 8 11 38 10 7
11.2
A valid ight crew consists of two pilots that both have each at least 10/20 for the same language and 10/20 on the same aircraft type. Question 1: Is it possible to have all pilots y? Subsequently, we calculate for every valid ight crew the sum of their scores for every aircraft type for which both pilots are rated at least 10/20. This allows us to dene for every crew the maximum score among these marks. For example, pilots 5 and 6 have marks 13 and 10 on bombers and 12 and 18 on supply planes. The score for this crew is therefore max(13 + 10, 12 + 18) = 30. Question 2: Which is the set of crews with maximum total score?
11.2.1
Model formulation
Let PILOTS be the set of pilots. This type of problem is easily modeled through an undirected compatibility graph G = (PILOTS, ARCS). Every node represents a pilot, two nodes p and q are connected by an undirected arc (or edge) a = [p, q] if and only if pilots p and q are compatible, that is, they have a language and a plane type in common for which both are rated at least 10/20. The arcs are assigned weights corresponding to the maximum score SCOREa of the ight crew. Figure 11.1 shows the resulting graph with the scores for question 2. A valid set of crews corresponds in G to a subset of arcs such that any two among them have no node in common. In Graph Theory, such a set is called a matching. For question 1 we are looking for the maximum cardinality matching, for question 2 for the matching with maximum total weight. The graph suggests we formulate the model as follows. maximize
aARCS
CREWa ya
(11.2.1)
Air transport
158
1 24
30 28
27
25
4 29 5 30
27 21
26
30
6 36
28
30 8
25
r PILOTS :
ya 1
a=[p,q]ARCS p=rq=r
(11.2.2)
a ARCS : ya {0, 1}
(11.2.3)
For every edge a = [p, q] in the graph, a binary variable ya indicates whether this edge is used or not (11.2.3). Through constraints (11.2.2) every node r is contained in at most one edge. The objective function (11.2.1) accumulates the weight of the chosen edges for question 2. For question 1, we maximize the number of ight crews to see whether all pilots are taken: the coefcients SCOREa need to be removed from the objective function. Note that the matching of maximum cardinality is a special case of matching with maximum weight, with all weights equal to 1.
11.2.2
Implementation
The Mosel program below rst calculates the set of admissible crews based on the language skills and ight experience of the pilots: for every pair of pilots p and q the algorithm rst checks whether they have compatible language skills, and if this is the case then their ight experience is compared. The two pilots are retained as an admissible crew if they both have sufcient experience on the same aircraft type. The crews are saved in a two-dimensional array CREW indexed by the set of arcs, that is, the two pilots p and q of an arc a = [p, q] are represented by CREW(a,1) and CREW(a,2). With the convention p < q, every pair of pilots is listed only once. The following program solves the problem twice, once with the objective function for question 1 and once for question 2.
model "F-2 Flight crews" uses "mmxprs" forward procedure print_sol declarations PILOTS = 1..8 ARCS: range RL, RT: set of string
! Set of pilots ! Set of arcs representing crews ! Sets of languages and plane types
LANG: array(RL,PILOTS) of integer ! Language skills of pilots PTYPE: array(RT,PILOTS) of integer ! Flying skills of pilots CREW: array(ARCS,1..2) of integer ! Possible crews end-declarations initializations from f2crew.dat LANG PTYPE end-initializations ! Calculate the possible crews ct:=1 forall(p,q in PILOTS| p<q and (or(l in RL) (LANG(l,p)>=10 and LANG(l,q)>=10)) and
Air transport
159
(or(t in RT) (PTYPE(t,p)>=10 and PTYPE(t,q)>=10)) ) do CREW(ct,1):=p CREW(ct,2):=q ct+=1 end-do finalize(ARCS) declarations fly: array(ARCS) of mpvar end-declarations
! First objective: number of pilots flying NFlying:= sum(a in ARCS) fly(a) ! Every pilot is member of at most a single crew forall(r in PILOTS) sum(a in ARCS | CREW(a,1)=r or CREW(a,2)=r) fly(a) <= 1 forall(a in ARCS) fly(a) is_binary ! Solve the problem maximize(NFlying) ! Solution printing writeln("Number of crews: ", getobjval) print_sol ! **** Extend the problem **** declarations SCORE: array(ARCS) of integer end-declarations
forall(a in ARCS) SCORE(a):= max(t in RT | PTYPE(t,CREW(a,1))>=10 and PTYPE(t,CREW(a,2))>=10) (PTYPE(t,CREW(a,1)) + PTYPE(t,CREW(a,2))) ! Second objective: sum of scores TotalScore:= sum(a in ARCS) SCORE(a)*fly(a) ! Solve the problem maximize(TotalScore) writeln("Maximum total score: ", getobjval) print_sol !----------------------------------------------------------------! Solution printing procedure print_sol forall(a in ARCS) if(getsol(fly(a))>0) then writeln(CREW(a,1), " - ", CREW(a,2)) end-if end-procedure end-model
A feature of Mosel shown by the above implementation is the incremental denition of the array CREW that stores the list of crews (and hence of its index set ARCS). After the calculation of the crews is completed the (dynamic) index set ARCS is nalized so that the array of variables fly is dened as a static array on this index set. Another feature that is new in this model is the cumulative or used for testing the pilots compatibility. The expression
or(l in RL) (LANG(l,p)>=10 and LANG(l,q)>=10)
evaluates to true if for at least one l the values of LANG(l,p) and LANG(l,q) are both greater than or equal to 10.
Air transport
160
11.2.3
Results
In answer to the rst question, the program nds that four crews are ying, that is, all eight pilots. For the second question, the optimization calculates a maximum total score of 125 for the four crews [1,2], [3,7], [4,5], and [6,8].
11.3
Due to turbulence and the duration of the time during which a plane is on the runway, a security interval has to separate any two landings. An entry in line p of column q in the following Table 11.5 denotes the minimum time interval (in minutes) that has to lie between the landings of planes p and q, even if they are not consecutive. Which landing schedule minimizes the total penalty subject to arrivals within the given time windows and the required intervals separating any two landings?
Table 11.5: Matrix of minimum intervals separating landings 1 1 2 3 4 5 6 7 8 9 10 3 15 15 15 15 15 15 15 15 2 3 15 15 15 15 15 15 15 15 3 15 15 8 8 8 8 8 8 8 4 15 15 8 8 8 8 8 8 8 5 15 15 8 8 8 8 8 8 8 6 15 15 8 8 8 8 8 8 8 7 15 15 8 8 8 8 8 8 8 8 15 15 8 8 8 8 8 8 8 9 15 15 8 8 8 8 8 8 8 10 15 15 8 8 8 8 8 8 8
11.3.1
Model formulation
Let PLANES be the set of planes due to arrive at the airport. A plane p has an arrival time window [STARTp , STOPp ] with the target arrival time TARGETp . The penalty CEARLYp applies per minute of early arrival, and CLATEp per minute of late arrival. The minimum interval between the landings of two planes p and q is denoted by DISTpq . In the given data instance any two time windows are overlapping. We therefore formulate a model for this overlapping situation and describe later how to generalize it for any type of time windows. We need to dene variables landp for the landing time of every plane p. They are bounded by the earliest
Air transport
161
and latest arrival times (11.3.1). p PLANES : STARTp landp STOPp (11.3.1)
To account for the interval separating the landing times of any two planes p and q, binary variables precpq are required with precpq = 1 if the landing of aircraft p precedes the landing of q. p, q PLANES, p = q : precpq {0, 1} (11.3.2)
The constraints (11.3.3) specify that p arrives before q or q arrives before p. The constraints (11.3.4) guarantee the separation of the landings; these are classical disjunctive (exclusion) constraints that are used for instance in scheduling to prevent the overlapping of two tasks on the same machine. M denotes some large positive constant. p, q PLANES, p = q : precpq + precqp = 1 p, q PLANES, p = q : landp + DISTpq Mpq precqp landq (11.3.3) (11.3.4)
If the plane p arrives before q, we have precpq = 1, and hence precqp = 0 through (11.3.3). The constraint (11.3.4) for p and q results in landp + DISTpq landq ensuring the required separation of the two ights. If precpq = 0, then precqp = 1 and the constraint (11.3.4) is trivially satised because the left side of the inequality is a large negative value. To avoid problems with numerical stability, the value of Mpq should not be chosen too large, Mpq = STOPp + DISTpq STARTq is sufcient for every constraint (11.3.4). To halve the number of variables, we dene the binary variables precpq with p < q to take the value 1 if p lands before q and 0 otherwise. The constraints (11.3.2) are replaced by (11.3.5) and the constraints (11.3.3) become redundant. (11.3.5) p, q PLANES, p < q : precpq {0, 1} The constraints (11.3.4) are rewritten to (11.3.6) and (11.3.7). (11.3.6) are the disjunctive constraints for the pairs of planes (p, q) with p > q and (11.3.7) the disjunctions for p < q. If for instance, p < q (constraints (11.3.7)) and p arrives before q, then precpq = 1 and hence 1 precpq = 0, and landp + DISTpq landq . If p < q but q arrives before p, then precpq = 0 and (11.3.7) is trivially satised. p, q PLANES, q < p : landp + DISTpq landq + M precqp p, q PLANES, p < q : landp + DISTpq landq + M (1 precpq ) (11.3.6) (11.3.7)
Taking into account the early or late arrival of a plane p with respect to its targeted arrival time TARGETp is a delicate matter. We introduce a variable earlyp for the earliness and a variable latep for the lateness. We may then write the objective function (11.3.8) with the penalties per minute of early or late arrival, CEARLYp and CLATEp . minimize
pPLANES
(11.3.8)
The variables earlyp and latep are bounded from above (constraints (11.3.9) and (11.3.10)) so that the arrival is scheduled within the time window [STARTp , STOPp ]. p PLANES : 0 earlyp TARGETp STARTp p PLANES : 0 latep STOPp TARGETp The landing time is linked to the earliness or lateness by the constraints (11.3.11). p PLANES : landp = TARGETp earlyp + latep (11.3.11) (11.3.9) (11.3.10)
The fact that we are minimizing prevents earlyp and latep from both being non-zero simultaneously in (11.3.11). We nally obtain a MIP model consisting of the lines (11.3.1), and (11.3.5) (11.3.11).
11.3.2
Air transport
162
There may also be a set SEP of pairs (p, q) with disjoint time windows and guaranteed separation: for instance the time windows [10,50], [70,110] and a separation time of 15 that will obviously be satised. More formally, the relation dening such a pair of time windows is (STOPp + DISTpq < STARTq ) (STOPq + DISTqp < STARTp ). The third set NONSEP of plane pairs that may be dened contains all pairs with disjoint time windows without guaranteed separation, such as [10,50], [70,110] with a separation interval of 30. To obtain a general model, we need to add the following sets of constraints (11.3.12) to (11.3.15) to the constraints (11.3.6) (11.3.7) that only concern the plane pairs in OVERLAP. The constraints (11.3.12) and (11.3.13) force the variables to be 0 or 1 in the case of disjoint time windows. The constraints (11.3.14) and (11.3.15) are simple precedence constraints as in the stadium construction problem of Chapter 7. (p, q) SEP NONSEP, STOPp < STARTq : precpq = 1 (p, q) SEP NONSEP, STOPq < STARTp : precpq = 0 (p, q) NONSEP, STOPp < STARTq : landp + DISTpq landq (p, q) NONSEP, STOPq < STARTp : landq + DISTqp landp (11.3.12) (11.3.13) (11.3.14) (11.3.15)
11.3.3
Implementation
The following Mosel program implements the mathematical model of Section 11.3.1. The variables precpq are dened for all pairs p and q, but only those precpq with p < q are used in the constraints so that the remainder of these variables (all pairs with p q) do not appear in the problem.
model "F-3 Landing schedule" uses "mmxprs" declarations PLANES = 1..10
! Set of airplanes Start, end of arrival time windows Planned arrival times ! Cost of earliness/lateness Minimum interval between planes Sufficiently large positive values
START, STOP: array(PLANES) of integer ! TARGET: array(PLANES) of integer ! CEARLY, CLATE: array(PLANES) of integer DIST: array(PLANES,PLANES) of integer ! M: array(PLANES,PLANES) of integer ! prec: array(PLANES,PLANES) of mpvar land: array(PLANES) of mpvar early,late: array(PLANES) of mpvar end-declarations initializations from f3landing.dat START STOP TARGET CEARLY CLATE DIST end-initializations
forall(p,q in PLANES) M(p,q):= STOP(p) + DIST(p,q) - START(q) ! Objective: total penalty for deviations from planned arrival times Cost:= sum(p in PLANES) (CEARLY(p)*early(p) + CLATE(p)*late(p)) ! Keep required intervals between plan arrivals forall(p,q in PLANES | p>q) land(p) + DIST(p,q) <= land(q) + M(p,q)*prec(q,p) forall(p,q in PLANES | p<q) land(p) + DIST(p,q) <= land(q) + M(p,q)*(1-prec(p,q)) ! Relations between earliness, lateness, and effective arrival time forall(p in PLANES) do early(p) >= TARGET(p) - land(p) late(p) >= land(p) - TARGET(p) land(p) = TARGET(p) - early(p) + late(p) end-do forall(p in PLANES) do START(p) <= land(p); land(p) <= STOP(p) early(p) <= TARGET(p)-START(p) late(p) <= STOP(p)-TARGET(p) end-do forall(p,q in PLANES | p<q) prec(p,q) is_binary ! Solve the problem
Air transport
163
minimize(Cost) end-model
As mentioned earlier in this book, the obvious pair START END for naming the beginning and end of the time windows cannot be used because END is a reserved word in Mosel (see Section 5.2.3 for the complete list of reserved words).
11.3.4
Results
The program calculates a total deviation cost of 700. The following table lists the scheduled arrivals together with the targeted arrival times and the resulting deviations (planes arriving earlier or later than the announced target time). It may be worth mentioning that the LP solution to this problem has an objective value of 0, with many fractional variables precpq .
Table 11.6: Arrival times and deviations Plane Scheduled arrival Target time Deviation 1 165 155 10 2 258 258 0 3 89 98 0 4 106 106 0 5 118 123 -5 6 126 135 -9 7 134 138 -4 8 142 140 2 9 150 150 0 10 180 180 0
We shall assume that the transport cost between two cities i and j is proportional to the distance that separates them. The distances in miles are given in the next table.
Table 11.8: Distances between pairs of cities Boston Atlanta Boston Chicago Marseille Nice 945 Chicago 605 866 Marseille 4667 3726 4471 Nice 4749 3806 4541 109 Paris 4394 3448 4152 415 431
The airline is planning to use two cities as connection platforms (hubs) to reduce the transport costs. Every city is then assigned to a single hub. The trafc between cities assigned to a given hub H1 to the cities assigned to the other hub H2 is all routed through the single connection from H1 to H2 which allows the airline to reduce the transport cost. We consider that the transport cost between the two hubs decreases by 20%. Determine the two cities to be chosen as hubs in order to minimize the transport cost.
11.4.1
Model formulation
We write CITIES for the set of cities and NHUBS for the number of hubs. Let DISTij be the distance between two cities i and j and QUANTij the quantity to be transported from i to j. The transport cost per tonne of
Air transport
164
freight depends on the cities that are chosen as hubs. The freight to be transported from any city i to any city j transits through two (not necessarily distinct) hubs k and l. Let COSTijkl be the transport cost from i to j through the hubs k and l. This cost is equal to the transport cost from i to k, plus the cost from k to l, plus the transport cost from l to j. The cost from k to l corresponds to 80% of the normal cost from k to l displayed in Table 11.8 since this is an inter-hub transport. Let the binary variable owijkl be 1 if the freight from i to j is transported via the hubs k and l in this order, and 0 otherwise. We also introduce variables hubi that are 1 if city i is a hub and 0 otherwise. The objective function (11.4.1) minimizes the total transport cost. The constraint (11.4.2) indicates that we wish to create exactly NHUBS hubs. Through the constraints (11.4.3) every pair of cities (i, j) is assigned to a single pair of hubs. The constraints (11.4.4) and (11.4.5) imply that if a variable owijkl is at 1, then the variables hubk and hubl are 1. In other words, any freight to be transported from i to j may only transit through k and l if both, k and l, are hubs. To complete the model, the constraints (11.4.6) and (11.4.7) dene the variables as binaries. Remark: in the constraints (11.4.3) k may be equal to l which this means that freight may transit via a single hub. This is the case if two origin/destination cities are assigned to the same hub. The inter-hub transport cost is 0 in this case. minimize
iCITIES jCITIES kCITIES lCITIES
(11.4.1) (11.4.2)
hubi = NHUBS
iCITIES
i, j CITIES :
kCITIES lCITIES
owijkl = 1
i, j, k, l CITIES : owijkl hubk i, j, k, l CITIES : owijkl hubl i CITIES : hubi {0, 1} i, j, k, l CITIES : owijkl {0, 1}
11.4.2
Implementation
In the following Mosel program implementation of the mathematical model, rst the cost COSTijkl for freight transport from i to j via the hubs k and l is calculated, using the inter-hub transport reduction factor FACTOR that is dened in the data le.
model "F-4 Hubs" uses "mmxprs" declarations CITIES = 1..6 NHUBS = 2
! Cities ! Number of hubs of real ! (i,j,k,l) Transport cost from i to j via hubs k and l Quantity to transport Distance between cities Reduction of costs between hubs
COST: array(CITIES,CITIES,CITIES,CITIES) ! QUANT: array(CITIES,CITIES) of integer ! DIST: array(CITIES,CITIES) of integer ! FACTOR: real !
flow: array(CITIES,CITIES,CITIES,CITIES) of mpvar ! flow(i,j,k,l)=1 if ! freight from i to j goes via k & l hub: array(CITIES) of mpvar ! 1 if city is a hub, 0 otherwise end-declarations initializations from f4hub.dat QUANT DIST FACTOR end-initializations ! Calculate costs forall(i,j,k,l in CITIES) COST(i,j,k,l):= DIST(i,k)+FACTOR*DIST(k,l)+DIST(l,j) ! Objective: total transport cost Cost:= sum(i,j,k,l in CITIES) QUANT(i,j)*COST(i,j,k,l)*flow(i,j,k,l) ! Number of hubs
Air transport
165
sum(i in CITIES) hub(i) = NHUBS ! One hub-to-hub connection per freight transport forall(i,j in CITIES) sum(k,l in CITIES) flow(i,j,k,l) = 1 ! Relation between forall(i,j,k,l in flow(i,j,k,l) <= flow(i,j,k,l) <= end-do flows and hubs CITIES) do hub(k) hub(l)
forall(i in CITIES) hub(i) is_binary forall(i,j,k,l in CITIES) flow(i,j,k,l) is_binary ! Solve the problem minimize(Cost) end-model
11.4.3
Revised formulation
The formulation of the mathematical model in lines (11.4.1) to 11.4.7), and as a consequence its implementation with Mosel, uses a large number of variables for this relatively small problem (more than 1300 binaries). Looking at the distance data more carefully, one can see that the six airports are clustered geographically: the American airports are relatively close to each other and far from the European ones, that are again close to each other. We may therefore reasonably assume that one hub will be located in the US and one in Europe. The American airports will be connected via the US hub and the European airports will use the European hub. This implies that we are able to exclude a large number of indexcombinations (e.g. EU airports connected to a US hub). We dene the sets EU of European airports and US of US airports, the union of which is the set CITIES of our previous model formulation. In addition to the geographical considerations, we may reduce even further the number of variables by accumulating the quantities to be transported between any pair of destinations to a single value and only working with destination pairs i and j where i < j. The index tuples for variables ow that remain after these operations are: i, j, k US, i < j : (i, j, k, k) (intra-American ights) i, j, k EU, i < j : (i, j, k, k) (intra-European ights), and i, k US, j, l EU : (i, j, k, l) (inter-continental ights). For our problem there are just more than 100 variables. All constraints of the previous problem remain the same except that we only sum over the variables that have been dened. We may even add two additional sets of constraints based on the observation that the intra-American (11.4.8) and intra-European (11.4.9) ights will use only a single hub: i, j US, i < j :
kUS
owijkk = 1 owijkk = 1
kEU
(11.4.8) (11.4.9)
i, j EU, i < j :
The Mosel implementation of the revised formulation is given below. Note that the array of decision variables flow is dened as a dynamic array so that we only create the entries that are required. Another change from the previous model is the replacement of the COST array by a function to reduce the storage space required by the data (for larger problem sizes than ours this may be a signicant advantage).
model "F-4 Hubs (2)" uses "mmxprs" forward function calc_cost(i,j,k,l:integer):real declarations US = 1..3; EU = 4..6 CITIES = US + EU NHUBS = 2
QUANT: array(CITIES,CITIES) of integer ! Quantity to transport DIST: array(CITIES,CITIES) of integer ! Distance between cities FACTOR: real ! Reduction of costs between hubs flow: dynamic array(CITIES,CITIES,CITIES,CITIES) of mpvar
Air transport
166
hub: array(CITIES) of mpvar end-declarations initializations from f4hub.dat QUANT DIST FACTOR end-initializations
forall(i,j in CITIES | i<j) QUANT(i,j):=QUANT(i,j)+QUANT(j,i) forall(i,j,k in US | i<j) create(flow(i,j,k,k)) forall(i,j,k in EU | i<j) create(flow(i,j,k,k)) forall(i,k in US, j,l in EU) create(flow(i,j,k,l)) ! Objective: total transport cost Cost:= sum(i,j,k,l in CITIES | exists(flow(i,j,k,l))) QUANT(i,j)*calc_cost(i,j,k,l)*flow(i,j,k,l) ! Number of hubs sum(i in CITIES) hub(i) = NHUBS ! One hub-to-hub connection per freight transport forall(i,j in CITIES | i<j) sum(k,l in CITIES) flow(i,j,k,l) = 1 forall(i,j in US | i<j) sum(k in US) flow(i,j,k,k) = 1 forall(i,j in EU | i<j) sum(k in EU) flow(i,j,k,k) = 1 ! Relation between forall(i,j,k,l in flow(i,j,k,l) <= flow(i,j,k,l) <= end-do flows and hubs CITIES | exists(flow(i,j,k,l))) do hub(k) hub(l)
forall(i in CITIES) hub(i) is_binary forall(i,j,k,l in CITIES | exists(flow(i,j,k,l))) flow(i,j,k,l) is_binary ! Solve the problem minimize(Cost) !----------------------------------------------------------------! Transport cost from i to j via hubs k and l function calc_cost(i,j,k,l:integer):real returned:=DIST(i,k)+FACTOR*DIST(k,l)+DIST(l,j) end-function end-model
11.4.4
Results
Chicago
Nice
Both models have the same solution. To minimize the total cost of transport the cities Boston and Paris have to be used as hubs. Not surprisingly, Atlanta and Chicago are assigned to the hub Boston, Nice and Marseille to Paris. This means, the freight from Atlanta, Boston, and Chicago is gathered at the hub Boston. There, any freight destined for any of the American cities is directly sent to its destination. All merchandise for European destinations is rst shipped to the hub at Paris and from there distributed to the European cities. The freight originating from Europe and with destination USA rst transits through the hub at Paris and then through Boston before arriving at its destination. The total cost of transport is
Air transport
167
B 42,153,794. C
11.5
11.5.1
Model formulation
To model this problem, we denote by CITIES = {1, . . . , 7} the set of airports to be served and DISTij the distance between the airports Ai and Aj . Since the journey is carried out by plane, the distance matrix is symmetric. We use binary variables yij that take the value 1 if the plane ies from i to j. The tour we are looking for is a cycle that visits every airport once and once only. At every airport i, the cycle comes from a single predecessor and continues to a single successor airport. The constraints (11.5.1) and (11.5.2) express these conditions. j CITIES : i CITIES : yij = 1
iCITIES,i=j
(11.5.1) (11.5.2)
yij = 1
jCITIES,i=j
If we only use the constraints (11.5.1) and (11.5.2), the cycle may be fragmented into several sub-cycles, for instance going from airport 1 to airport 2 and from there back to 1. This sub-cycle satises these two constraints but does not lead to a valid solution. It is therefore necessary to prevent the forming of sub-cycles from occurring. This is the aim of the constraints (11.5.3): every sub-cycle that appears in a subset S of airports is broken by requiring that the number of arcs in S must be strictly less than the cardinality of S. If N is the number of cities, for even a relatively small N it is simply impossible to test all sub-cycles that may be formed (their number is in the order of 2N ). To start with, we are therefore going to solve the problem without the constraints (11.5.3), which usually leads to a solution comprising sub-cycles, and then one by one add constraints that render the forming of the sub-cycles impossible. This procedure will be described in more detail in the next section. S :
(i,j)S
yij |S| 1
(11.5.3)
The objective function (11.5.4) is the total length of the cycle passing through all cities, that is the length of all arcs that are used. minimize
iCITIES jCITIES
j CITIES : i CITIES :
yij = 1
jCITIES,i=j
Air transport
168
S :
(i,j)S
yij |S| 1
(11.5.7) (11.5.8)
11.5.2
! Cities ! Distance between cities ! Next city after i in the solution ! 1 if flight from i to j
The solution to this problem is represented in Figure 11.3. It contains three subcycles that we need to exclude. The strategy to adopt suppresses one sub-cycle at a time, starting with the smallest one. We have implemented the following procedure break_subtour that is added to the Mosel program above and called after the solution of the initial problem. The procedure rst saves the successor of every city into the array NEXTC. It then calculates the set of cities that are on the tour starting from city 1: if the size of the set corresponds to the total number of cities NCITIES, we have found the optimal solution and the algorithm stops, otherwise there are subtours. The algorithm then enumerates all subtours to nd the smallest one: if a subtour with two cities is found we can stop (there are no subtours of length 1), otherwise the tour starting from the next city that has not yet been enumerated as part of a tour (set ALLCITIES) is calculated. When the smallest subtour has been found, we add a constraint of type (11.5.3) for this set and re-solve the problem.
procedure break_subtour declarations TOUR,SMALLEST,ALLCITIES: set of integer end-declarations forall(i in CITIES) NEXTC(i):= integer(round(getsol(sum(j in CITIES) j*fly(i,j) ))) ! Get (sub)tour containing city 1 TOUR:={} first:=1 repeat
Air transport
169
A2
A6 A5 A3
A1 A4 A7
TOUR+={first} first:=NEXTC(first) until first=1 size:=getsize(TOUR) ! Find smallest subtour if size < NCITIES then SMALLEST:=TOUR if size>2 then ALLCITIES:=TOUR forall(i in CITIES) do if(i not in ALLCITIES) then TOUR:={} first:=i repeat TOUR+={first} first:=NEXTC(first) until first=i ALLCITIES+=TOUR if getsize(TOUR)<size then SMALLEST:=TOUR size:=getsize(SMALLEST) end-if if size=2 then break end-if end-if end-do end-if ! Add a subtour breaking constraint sum(i in SMALLEST) fly(i,NEXTC(i)) <= getsize(SMALLEST) - 1 ! Re-solve the problem minimize(TotalDist) ! New round of subtour elimination break_subtour end-if end-procedure
During its rst execution the subtour elimination procedure adds the following constraint to the model to eliminate the subtour (2,6,2):
fly(2,6) + fly(6,2) <= 1
Air transport
170
With this additional constraint we obtain the solution represented in the following gure: it still consists of three (different) subtours.
A2
A6 A5 A3
A1 A4 A7
When the subtour elimination procedure is called again, it adds a constraint to exclude the subcycle (1,7,1):
fly(1,7) + fly(7,1) <= 1
After this second execution, we nally obtain a single tour with a total length of 2575 km. The arcs that are directed in the model may be replaced by undirected arcs (edges) without any consequence for the solution since the distance matrix is symmetric.
A2
A6 A5 A3
A1 A4 A7
The Mosel implementation of the subtour elimination procedure uses a certain number of set operators and other functionality related to sets: the function getsize returns the size (= number of elements) of a set or array. {} denotes the empty set. A set may be assigned using the usual assignment operator :=, e.g. TOUR:={}, and a set is added to another set using the operator +=.
Air transport
171
11.6
Air transport
172
Chapter 12
Telecommunication problems
In recent years, the domain of telecommunications has experienced an explosive growth. It is extraordinarily rich in original optimization problems, which explains the fact that this book devotes an entire chapter to this topic. The short term exploitation of telecom networks are problems of on-line control and problems tackled by the theory of telecommunication protocols. But design problems, the sizing or location of resources, and planning are well suited to optimization approaches. These are therefore described here. The design of a network needs to satisfy the trafc forecasts between nodes, minimize the construction costs and fulll conditions on its reliability. It starts with the choice of the location of nodes. Section 12.6 deals with a mobile phone network in which transmitters need to be placed to cover the largest possible part of the population within given budget limits. Once the nodes are chosen, one needs to select the pairs of nodes that will be connected with direct lines for the transmission of data. In Section 12.4, a cable network with a tree structure is constructed with the objective of minimizing the total cost. The problem in Section 12.2 studies the connection of cells to a main ring in a mobile phone network with capacity constraints. Reliability considerations demand multiple connections between every cell and the ring. Other optimization problems arise in the analysis and the exploitation of existing networks. A natural question dealt with in the problem of Section 12.3 is to know the maximum trafc that a network with known capacity limits may support. The problem in Section 12.1 concerns the reliability of the data exchange between two nodes of a given network. This reliability is measured by the number k of disjoint paths (that is, paths without any intermediate node in common) between two nodes. If k > 1, then communication is still possible even if k 1 nodes break down. The problem in Section 12.5 is an example of trafc planning: the data packets in the repeater of a telecommunications satellite need to be scheduled.
12.1
Network reliability
We consider the military telecommunications network represented in Figure 12.1. This network consists of eleven sites connected by bidirectional lines for data transmission. For reliability reasons in the case of a conict, the specications require that the two sites (nodes) 10 and 11 of the network remain able to communicate even if any three other sites of the network are destroyed. Does the network in Figure 12.1 satisfy this requirement?
12.1.1
Model formulation
This problem can be converted into a maximum ow problem. The latter is dealt with in detail in Chapter 15 (Problem of water supply), but we recap here briey. Let a directed graph be given as G = (NODES, ARCS), where NODES is a set of nodes, ARCS a set of arcs. An arc connecting node n to node m is written (n, m) and has an integer capacity of CAPnm . Imagine that a liquid enters the network at a given node SOURCE and leaves it at another node SINK. By spreading over the network, this liquid creates a ow that can be dened as a ow ownm in every arc (n, m). This ow is valid if it stays within the capacity limits of the arcs and if it does not incur any loss when passing through intermediate nodes (that is, nodes other than SOURCE and SINK). The maximum ow problem consists of nding a ow that maximizes the total throughput injected at SOURCE (or arriving at SINK since there are no losses). If this problem is formulated as an LP, the simplex algorithm automatically nds an optimal solution with integer ows.
173
10
11
6
Figure 12.1: Telecommunications network
At rst sight, our reliability problem does not quite resemble the maximum ow problem. Let us imagine a modied network H with capacities equal to 1 on all connections: the optimal ows on arcs therefore will take the values 0 or 1. We also impose a capacity of 1 at every node: through this, two units of ow leaving S = 10 through two different arcs will follow two paths to T = 11, without passing through any common node. Such paths are called node-disjunctive. Since a ow on every arc leaving SOURCE is either 0 or 1, the maximum number of disjunctive paths from SOURCE to SINK in G is equal to the throughput of a maximum ow in the modied graph H. If we nd k paths, the network is resilient to k 1 broken nodes: in the worst case, these nodes will be on k 1 disjunctive paths, but communication will remain possible via the one remaining path. In the end, the answer to our reliability problem consists of comparing k 1 with the maximum number of node breakdowns allowed by the specications. The only minor difculty is that the ow problem is usually dened in a directed graph. But in our telecommunications network the bidirectional connections are not directed. To distinguish the ow in both senses on a single connection between the nodes n and m, we replace the connection by two arcs (n, m) and (m, n). We therefore obtain a directed graph G = (NODES, ARCS) that allows us to formulate the problem in a simple manner. maximize n = SOURCE, SINK : n = SOURCE, SINK : owm,SOURCE = 0
m pred.of SOURCE
owSOURCE,m
m succ.of SOURCE
(12.1.1) owmn
m pred.of n
ownm =
m succ.of n
ownm 1
m succ.of n
The objective function (12.1.1) is to maximize the total throughput, the sum of all ows on the arcs leaving SOURCE (we could also sum the ows arriving at SINK). The constraints (12.1.2) model the ow conservation law at every intermediate node n (also called Kirchhoffs law): the total ow arriving from the predecessors must be equal to the total ow leaving to the successors. The constraints (12.1.3) limit the ow through every intermediate node to 1; we consider here the ow leaving every node. The constraint (12.1.4) is necessary to avoid the ow injected at SOURCE returning to this node. It is not required in the water supply problem in Chapter 15 because in this problem the source has no predecessors. And nally, the constraints (12.1.5) specify that all ow variables ownm are binary. Since this is a maximum ow problem, the LP solution will automatically have integer values. Furthermore, the constraints (12.1.3) imply that the variables are upper bounded by 1. The constraints (12.1.5) could therefore be replaced by the usual non-negativity constraints.
Telecommunication problems
174
12.1.2
Implementation
The following Mosel program implements the mathematical model. A graph with N nodes may be encoded in two different ways: in the form of a list of arcs or as an adjacency matrix . The rst method is employed in this book, for example, in the line balancing problem in Section 7.6 and the problem of forming ight crews in Section 11.2. We use here the matrix representation that is also used in the problem of gritting roads in Section 15.4. The adjacency matrix is a binary matrix ARC of size N N, with ARCnm = 1 if and only if the arc (n, m) exists. This array is read from the data le in sparse format, that is, only the non-zero elements or ARC are given, in the form (n m) ARC(n,m). The entries of ARC that are not dened have the default value 0 if they are addressed in the program, but we simply test for existing entries of ARC using the Mosel function exists that enumerates the array in a very efcient way, especially if only relatively few of the N2 possible entries are indeed dened. To obtain a more compact model and hence a smaller LP that solves faster, only the variables ownm that correspond to existing arcs are dened. Note that it is not necessary to repeat this condition in every sum over these variables. The data le contains the representation of the graph in an undirected form: the bidirectional connection between n and m only appears in one sense in the le (with the convention n < m). We therefore construct the oriented version of the graph that is required for the maximum ow formulation: for every dened arc (n, m) we dene its opposite (m, n). The rest of the model is a straight translation from the mathematical formulation. This model is valid for any choice of SOURCE and SINK among the nodes of the network.
model "G-1 Network reliability" uses "mmxprs" declarations NODES: range SOURCE = 10; SINK = 11 ARC: array(NODES,NODES) of integer flow: array(NODES,NODES) of mpvar end-declarations initializations from g1rely.dat ARC end-initializations forall(n,m in NODES | exists(ARC(n,m)) and n<m ) ARC(m,n):= ARC(n,m) forall(n,m in NODES | exists(ARC(n,m)) ) create(flow(n,m)) ! Objective: number of disjunctive paths Paths:= sum(n in NODES) flow(SOURCE,n) ! Flow conservation and capacities forall(n in NODES | n<>SOURCE and n<>SINK) do sum(m in NODES) flow(m,n) = sum(m in NODES) flow(n,m) sum(m in NODES) flow(n,m) <= 1 end-do ! No return to SOURCE node sum(n in NODES) flow(n,SOURCE) = 0 forall(n,m in NODES | exists(ARC(n,m)) ) ! Solve the problem maximize(Paths) ! Solution printing writeln("Total number of paths: ", getobjval) forall(n in NODES | n<>SOURCE and n<>SINK) if(getsol(flow(SOURCE,n))>0) then write(SOURCE, " - ",n) nnext:=n while (nnext<>SINK) do nnext:=round(getsol(sum(m in NODES) m*flow(nnext,m))) flow(n,m) is_binary
! Set of nodes ! Source and sink nodes ! 1 if arc defined, 0 otherwise ! 1 if flow on arc, 0 otherwise
Telecommunication problems
175
The solution display for this example uses a small algorithm to print all paths between the SOURCE and SINK nodes: for every node to which there is a ow from the SOURCE node, we calculate the chain of its successors until we arrive at the SINK node. To obtain the successor of a node n, we exploit the fact that every intermediate node only appears in a single path and hence only has a single successor. We calculate the index number of this successor as the sum of ows leaving node n multiplied by the node index. The result of getsol is type real and needs to be transformed to an integer using the function round.
10
11
6
Figure 12.2: Disjunctive paths
12.1.3
Results
The solution algorithm calculates a maximum throughput of 4, which means there are 4 disjunctive paths between nodes 10 and 11 and hence, the two nodes may continue to communicate in spite of the destruction of three intermediate sites. The specications are satised. The four disjunctive paths between 10 and 11 are represented in Figure 12.2.
12.2
Telecommunication problems
176
Relay
Cell 2 1 connection
Hub 4
Hub 1
MTSO
to the MTSO, that then routes it to another cell or to a hub that serves as the interface to the xed-line telephone network. A relay may be connected directly to the MTSO that also has the functions of an ordinary hub. We consider a network of 10 cells and a ring of 5 nodes with a capacity of CAP = 48 circuits. The MTSO is at node 5. The following table indicates the trafc, the required number of connections and the cost per connection in thousand $ per cell. For example, cell 1 is connectable with node 1 for a cost of $15,000. Its diversity is 2, which means it must be connected to at least two nodes of the ring. Its trafc capacity is of 22 simultaneous circuits. The objective is to dene the connections of the cells to the ring that minimize the connection costs whilst remaining within the capacity limits and satisfying the constraints on the number of connections.
Table 12.1: Connection costs, trafc and number of connections per cell Cell Hub 1 Hub 2 Hub 3 Hub 4 Hub 5 (MTSO) Trafc Connections 1 15 8 7 11 10 22 2 2 9 11 8 5 14 12 2 3 12 6 7 15 15 20 2 4 17 5 9 18 24 12 2 5 8 22 21 19 6 15 3 6 7 25 15 9 17 25 1 7 19 25 21 20 22 15 3 8 20 9 15 18 25 14 2 9 21 22 14 16 20 8 2 10 25 24 13 4 11 22 2
12.2.1
Model formulation
We write CELLS for the set of cells to be connected, NODES = HUBS {MTSO} the set of nodes, composed of the set of simple hubs and an MTSO, and COSTcn the cost of connecting cell c to node n. The connections can be dened through binary variables connectcn , that are 1 if and only if cell c is connected to node n (12.2.4). The objective function (12.2.1) measures the total connection cost. The constraints (12.2.2) ensure that every cell is connected to the required number of nodes. minimize
cCELLS nNODES
c CELLS :
cCELLS nHUBS
Constraint (12.2.3) is a necessary condition for keeping within the capacity limits of the ring. It is based on the fact that all demands of any origin are routed through the MTSO, following the ring in one sense
Telecommunication problems
177
or the other. Since every edge of the ring has a capacity CAP, the total trafc on the ring may not exceed 2 CAP. Note that the trafc of a cell directly connected to the MTSO does not enter the ring. For the problem to have any solution the ring must have a certain minimum capacity to route all the trafc. The least possible trafc in the ring is obtained if every cell c has a direct connection with the MTSO among its CNCTc required connections with the ring. The ring must be able to handle the remaining trafc, which results in the minimum capacity constraint (12.2.5): for example, a cell with diversity 2 1 routes at least 1 2 = 1 of its trafc through the ring; the trafc of a cell with diversity 1 in the best 2 case (i.e. if it is connected to the MTSO) does not enter the ring at all. This relation does not contain any variable, it is therefore not included in the mathematical model. It is however necessary to check whether the given data fulll this condition, which is the case here. TRAFc 1
cCELLS
1 CNCTc
2 CAP
(12.2.5)
The non-specialist in telecommunications might raise the question of what has happened to the return trafc. The trafc from a cell c is expressed in bidirectional circuits. If someone in cell c calls someone in cell d, then the call traces its path from c to the MTSO, reserving a path for the answer. The MTSO then transmits the call to cell d, still reserving a return path. When the called person in d picks up the phone, an access path in both directions is established, consuming one circuit from the capacity of c and one circuit from the capacity of d.
12.2.2
Implementation
The mathematical model is easily translated into a Mosel program. The cost data array from table 12.1 is given in transposed form in the data le to match the format of the array COSTcn . Before dening the model we check whether the ring has a sufciently large capacity to satisfy all trafc demands (inequality (12.2.5)). If this condition does not hold then the program is stopped using the function exit.
model "G-2 Mobile network dimensioning" uses "mmxprs" declarations HUBS = 1..4 MTSO = 5 NODES = HUBS+{MTSO} CELLS = 1..10 CAP: integer COST: array(CELLS,NODES) of integer TRAF: array(CELLS) of integer CNCT: array(CELLS) of integer connect: array(CELLS,NODES) of mpvar end-declarations initializations from g2dimens.dat CAP COST TRAF CNCT end-initializations ! Check ring capacity if not (sum(c in CELLS) TRAF(c)*(1-1/CNCT(c)) <= 2*CAP) then writeln("Ring capacity not sufficient") exit(0) end-if ! Objective: total cost TotCost:= sum(c in CELLS, n in NODES) COST(c,n)*connect(c,n) ! Number of connections per cell forall(c in CELLS) sum(n in NODES) connect(c,n) = CNCT(c) ! Ring capacity sum(c in CELLS, n in HUBS) (TRAF(c)/CNCT(c))*connect(c,n) <= 2*CAP forall(c in CELLS, n in NODES) connect(c,n) is_binary
! ! ! ! ! ! ! !
Set of hubs Node number of MTSO Set of nodes (simple hubs + MTSO) Cells to connect Capacity of ring segments Connection cost Traffic from every cell Connections of a cell to the ring
Telecommunication problems
178
12.2.3
Results
The optimal MIP solution has a total cost of $249,000. The trafc on the ring is 94, compared to a capacity of 96. The following table lists the details of the connections to be established between cells and nodes of the ring.
Table 12.2: Connection costs, trafc and number of connections per cell Cell Host nodes 1 3,5 2 3,4 3 2,5 4 2,3 5 1,4,5 6 5 7 1,4,5 8 2,3 9 3,5 10 4,5
12.3
Valenciennes 70 Troyes
300 120 80
Nice
Figure 12.4: Structure of the network of the company
The number beside each edge (connection) is the capacity of the link in terms of circuits. This issue is worth some further explanation. Suppose that a person A at Nantes calls a person B at Nice. The company needs to nd a path formed by non-saturated edges from Nantes to Nice to route the binary ow corresponding to the digitized voice of A. But the conversation is only possible if a ow from Nice to Nantes is established so that B may answer A. In digital telephone networks, the binary ows all have the same throughput standard (often 64 kbps). The associated capacity is called a channel. The return channel uses the same edges as the rst channel, but in the opposite direction. This linked pair of channels necessary for a telephone conversation is a circuit. The routing of the return channel through the same edges is due to the fact that the call could fail if one waited until the callee picked up the phone before searching for a non-saturated return path. This is why, at the moment of the call, the routing system constructs the path edge by edge and immediately reserves the edges of the return channel. As a consequence, as the capacity of an edge is consumed in increments of a bidirectional circuit, we do not consider any directed ows. For example, there may be 10 persons calling from Nantes to Nice and 20 from Nice to Nantes, or the opposite: in both cases, 30 circuits are used. At a given moment, the company is facing demands for circuits given in the following table. Is it possible to satisfy the demands entirely? If this is not possible, try to transmit as much as possible. In every case, indicate the corresponding routing, that is, the access paths used.
12.3.1
Model formulation
In the maximum ow problem in Section 15.1 (water supply management) the task is to maximize the total throughput of a single product ow that traverses a limited capacity network between an origin
Telecommunication problems
179
Table 12.3: Demand of circuits Names of the cities Nantes-Nice Nantes-Troyes Nantes-Valenciennes Nice-Valenciennes Paris-Troyes Circuits 100 80 75 100 70
(source) and a destination (sink). Here, we are dealing with a generalization called the multi-commodity network ow (MCNF) problem: several ows that may not be mixed and that correspond to different products use the same network, every ow having its own source and sink. The objective is still to maximize the total throughput. Here, a product corresponds to the totality of calls exchanged between two given cities. The calls between two different pairs of cities may not be mixed: calls between Nantes and Nice must not end in Troyes! The MCNF problem is a difcult combinatorial problem. In the classical maximum ow problem, Linear Programming uses ow variables ownm for every arc (n, m). The simplex algorithm automatically nds integer-valued optimal ows if the arc capacities are integers. It is possible to generalize this model to solve the MCNF problem in a directed graph with variables owknm for the ow of product k on the arc (n, m) but the values at the end of the LP are not usually integers. Optimally rounding the fractional ows is very difcult because there may be several ows that are routed through the same saturated arc. Furthermore, the model with three-index variables requires certain tricks for dealing with an undirected network as is the case in the present example. We are therefore going to use a simpler formulation called arc-paths. This formulation is based on different elementary paths (without intermediate nodes in common) that may be used between pairs of cities that are communicating. Instead of using variables owknm for every pair of cities k and every arc (n, m), this formulation uses a single variable owp for the ow all along a path p, where this path corresponds to a known pair of cities. The ow conservation laws per node are therefore implicitly fullled. This formulation cannot be employed in dense networks with an enormous number of possible paths. But for telecommunication networks that have a skeleton-like structure it is better than modeling with three-index ow variables. For the data, we use ARCS for the set of (undirected) arcs, CALLS for the set of city pairs between which there are demands for calls, and PATHS the set of paths. Let CAPa denote the capacity of an arc and DEMc the demand for a city pair c. We also need to know which pair of cities is at the ends of every path, given by the call index CINDEXp . The arc-paths formulation is then remarkably easy. It is called arc-paths because it works with arcs and paths, but not with nodes. maximize
pPATHS
(12.3.1) (12.3.2)
a ARCS :
c CALLS :
owc DEMc
pPATHS CINDEXp =c
(12.3.3)
p PATHS : owp IN
(12.3.4)
The objective function is to maximize (12.3.1), the sum of the ows on all paths that may be used. The constraints (12.3.2) consider every arc a: the sum of ows on the paths passing through a must not exceed the capacity of a. The constraints (12.3.3) concern every pair of cities c: the sum of ows exchanged between them over the various paths must not exceed the demand for circuits. The integrality constraints (12.3.4) are necessary because the MCNF problem is not automatically integer at its linear optimum.
12.3.2
Implementation
The translation of the mathematical model for Mosel is given in the following program. This is a typical case where after the formulation of the mathematical model some work still is left to do for the formulation of the model with Mosel since no direct representation of the paths is immediately available. The pairs of cities are named as represented in Table 12.3. Similarly, the arcs are named with the cities they connect: Nantes-Paris, Nantes-Nice, Paris-Nice, Paris-Valenciennes, Troyes-Nice and Troyes-Valenciennes. The paths are coded as a two-dimensional array ROUTEpa , every line of which corresponds to a path and
Telecommunication problems
180
contains the list of edges it uses. In the worst case, a path may contain all the arcs since the paths are elementary and do not visit any city twice. The size of the second dimension of the array ROUTE is therefore given by the number NARC of arcs in the problem. The following table lists the complete set of paths and the corresponding city pairs at the ends of every path (array CINDEXp ). With this representation, the model can now be implemented easily.
Table 12.4: Denition of paths Path 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 City pair Nantes-Nice Nantes-Nice Nantes-Nice Nantes-Troyes Nantes-Troyes Nantes-Troyes Nantes-Troyes Nantes-Valenciennes Nantes-Valenciennes Nantes-Valenciennes Nantes-Valenciennes Nice-Valenciennes Nice-Valenciennes Nice-Valenciennes Paris-Troyes Paris-Troyes Paris-Troyes List of arcs Nantes-Nice Nantes-Paris, Paris-Nice Nantes-Paris, Paris-Valenciennes, Valenciennes-Troyes, Troyes-Nice Nantes-Paris, Paris-Valenciennes, Valenciennes-Troyes Nantes-Paris, Paris-Nice, Nice-Troyes Nantes-Nice, Nice-Troyes Nantes-Nice, Nice-Paris, Paris-Valenciennes, Valenciennes-Troyes Nantes-Paris, Paris-Valenciennes Nantes-Nice, Nice-Paris, Paris-Valenciennes Nantes-Paris, Paris-Nice, Nice-Troyes, Troyes-Valenciennes Nantes-Nice, Nice-Troyes, Troyes-Valenciennes Nice-Nantes, Nantes-Paris, Paris-Valenciennes Nice-Paris, Paris-Valenciennes Nice-Troyes, Troyes-Valenciennes Paris-Valenciennes, Valenciennes-Troyes Paris-Nantes, Nantes-Nice, Nice-Troyes Paris-Nice, Nice-Troyes
Making the path inventory is quite tedious, but the collection of data is usually a major problem in Mathematical Programming. In industrial applications, the data les must be constructed automatically by some special purpose software (in the examples of Sections 11.2 or 12.5 we use Mosel for doing some data preprocessing) or be extracted from databases or spreadsheets. The full distribution of Mosel includes modules for accessing databases or spreadsheets directly.
model "G-3 Routing telephone calls" uses "mmxprs" declarations CALLS: set of string ARCS: set of string PATHS: range CAP: array(ARCS) of integer DEM: array(CALLS) of integer CINDEX: array(PATHS) of string end-declarations initializations from g3routing.dat CAP DEM INDEX end-initializations finalize(CALLS); finalize(ARCS); finalize(PATHS) NARC:=getsize(ARCS) declarations ROUTE: array(PATHS,1..NARC) of string ! List of arcs composing the routes flow: array(PATHS) of mpvar ! Flow on paths end-declarations initializations from g3routing.dat ROUTE end-initializations ! Objective: total flow on the arcs TotFlow:= sum(p in PATHS) flow(p) ! Flow within demand limits forall(d in CALLS) sum(p in PATHS | CINDEX(p) = d) flow(p) <= DEM(d)
! Set of demands ! Set of arcs ! Set of paths (routes) for demands ! Capacity of arcs ! Demands between pairs of cities ! Call (demand) index per path index
Telecommunication problems
181
! Arc capacities forall(a in ARCS) sum(p in PATHS, b in 1..NARC | ROUTE(p,b)=a) flow(p) <= CAP(a) forall(p in PATHS) flow(p) is_integer ! Solve the problem maximize(TotFlow) end-model
12.3.3
Results
The LP solution to this problem has integer values. 380 out of the required 425 calls are routed, that is all but 45 Nantes-Troyes calls. The following table lists the corresponding routing of telephone calls (there are several equivalent solutions). On the connections Nantes-Paris, Nantes-Nice, Paris-Nice, and Troyes-Valenciennes there is unused capacity; the other arcs are saturated.
Table 12.5: Optimal routing of telephone calls City pair Nantes-Nice Nantes-Troyes Nantes-Valenciennes Nice-Valenciennes Paris-Troyes Demand 100 80 75 100 70 Routed 100 35 75 20 80 70 Path Nantes-Paris, Paris-Nice Nantes-Nice, Nice-Paris, Paris-Valenciennes, Valenciennes-Troyes Nantes-Paris, Paris-Valenciennes Nice-Paris, Paris-Valenciennes Nice-Troyes, Troyes-Valenciennes Paris-Valenciennes, Valenciennes-Troyes
12.4
These terminals are to be connected via underground cables. We suppose the cost of connecting two terminals is proportional to the distance between them. Determine the connections to install to minimize the total cost.
12.4.1
Model formulation
We dene the undirected labeled graph G = (TERMINALS, DIST, CONNECTIONS) where the set of nodes TERMINALS corresponds to the set of terminals and the set of edges CONNECTIONS contains the possible connections [s, t] between these terminals which are labeled with the distance DISTst that separates them. We dene binary variables connectst that are 1 if and only if terminals s and t are directly connected. Since the connections are undirected, it is sufcient to dene the variables for s < t. The objective is to connect all the terminals at the least cost. The objective function is therefore given by (12.4.1). minimize
sTERMINALS
DISTst connectst
tTERMINALS s<t
(12.4.1)
To connect NTERM terminals, the most economical network is a tree of NTERM 1 connections. A tree connecting NTERM nodes is a connected graph without any cycles or, equivalently a connected graph
Telecommunication problems
182
with NTERM 1 connections. The constraint (12.4.2) imposes these NTERM 1 connections. connectst = NTERM 1
sTERMINALS tTERMINALS s<t
(12.4.2)
Furthermore, every terminal must be connected to at least one other terminal in the tree. A rst idea is to add the constraints (12.4.3). s TERMINALS : connectst 1
tTERMINALS s<t
(12.4.3)
However, these constraints are not sufcient. The constraints (12.4.2) and (12.4.3) may lead to an infeasible solution as shown in Figure 12.5 in which a cycle is created.
T4 T2
T5
T6 T1
T3
To avoid this type of solution, we need to impose the constraint (12.4.4) for any subset S of the set of terminals. The translation of this constraint into a program is unfortunately a difcult task: on one hand there is no possibility of enumerating all subsets, and on the other hand the number of constraints of this type is enormous (2NTERM , that is, about one million for twenty nodes). S TERMINALS :
sS tS, s<t
connectst |S| 1
(12.4.4)
There follows therefore, a different way of preventing cycles. Consider a tree with its edges directed departing from a root r, that is, a node that is connected to a single other node, like T1 in Figure 12.6 (any root will do). We may now assign every node t a level value levelt that may be interpreted as the length (in terms of number of edges) of the path connecting t with r (in a tree this path exists and is unique). For example, we have levelr = 0 and levelt = 1 for any node t directly connected to r. The anticycle constraints (12.4.5) are based on positive level value variables. For this formulation, the connections must be directed: we have either connectst = 1 or connectts = 1 for two directly connected nodes s and t. This has no impact on the solution. s, t TERMINALS, s = t : levelt levels + 1 NTERM + NTERM connectst (12.4.5)
To understand these constraints, let us suppose that a solution of the mathematical model contains a cycle, for instance the cycle 1 2 5 1 of Figure 12.5, oriented in this sense. The constraints (12.4.5) for which connectst = 1 in this cycle result in: level2 level1 + 1 level5 level2 + 1 level1 level5 + 1 (12.4.6) (12.4.7) (12.4.8)
By summing up term by term, we obtain a contradiction: 0 3 ! A solution containing a cycle therefore violates the constraints (12.4.5). On the contrary, if we have a tree, values of levelt exist that satisfy the constraints, for instance the level numbers obtained by traversing the tree starting from an arbitrary root r. If s is directly before t on the path from r to t, we have levelt = levels + 1 and connectst = 1. The
Telecommunication problems
183
constraint (12.4.5) for s and t is satised since it reduces to levelt = levels + 1. If s is not directly connected to t, we have connectst = 0 and the constraint (12.4.5) reduces to levelt levels 1NTERM, an inequality that is trivially satised since the level numbers range between 0 and NTERM 1. The constraints (12.4.5) only detect cycles with connections directed around the cycle. For instance, they do not exclude the cycle 1 2 5 1. Such a cycle cannot occur when we add the following constraints that direct all connections to the (arbitrarily chosen) root node. s = 2, . . . , NTERM : connectst = 1
tTERMINALS s=t
(12.4.9)
In the formulation of the constraints (12.4.9) we have chosen node 1 as the root node. Every node must be connected to at least one other node. Since a tree does not contain cycles there must be a single path from every node in the tree to the root node. That means, every node s other than the root node has exactly one outgoing connection. In other words, for every s = 1 exactly one variable connectst must be at 1. We thus obtain the following mathematical model. minimize DISTst connectst
sTERMINALS tTERMINALS
connectst NTERM 1
sTERMINALS tTERMINALS
connectst = 1
(12.4.14) (12.4.15)
12.4.2
Implementation
The translation of the mathematical model into a Mosel program is direct.
model "G-4 Cable connections between terminals" uses "mmxprs" declarations NTERM = 6 TERMINALS = 1..NTERM
connect: array(TERMINALS,TERMINALS) of mpvar ! 1 if direct connection ! between terminals, 0 otherwise level: array(TERMINALS) of mpvar ! level value of nodes end-declarations initializations from g4cable.dat DIST end-initializations ! Objective: length of cable used Length:= sum(s,t in TERMINALS) DIST(s,t)*connect(s,t) ! Number of connections sum(s,t in TERMINALS | s<>t) connect(s,t) = NTERM - 1 ! Avoid subcycle forall(s,t in TERMINALS | s<>t) level(t) >= level(s) + 1 - NTERM + NTERM*connect(s,t) ! Direct all connections towards the root (node 1) forall(s in 2..NTERM) sum(t in TERMINALS | s<>t) connect(s,t) = 1 forall(s,t in TERMINALS | s<>t) connect(s,t) is_binary
Telecommunication problems
184
12.4.3
Results
The optimal solution connects the terminals as shown in Figure 12.6. The total length of cable required is 470 meters.
T4 T2 110 93 T5 103 92 T3 72 T6
T1
12.5
The satellite has a switch that allows any permutation between the four transmitters and the four receivers. Figure 12.8 gives an example of a permutation connecting the transmitters 1 to 4 to the receivers 3, 4, 1, and 2 respectively. These connections allow routing a part of the trafc matrix, called a mode. A part of a matrix entry transmitted during a mode is a packet of data. A mode is thus a 4 4 matrix M with at most one non-zero packet per row and column and such that Mtr TRAFtr for all t, r. To every mode corresponds a slice of a schedule as shown in Figure 12.8.
Table 12.8: Example of a mode and associated schedule 1 2 3 4 colr 1 0 0 15 0 38 2 0 0 0 13 40 3 11 0 0 0 45 4 0 9 0 0 38 Stations 1 to 3 2 to 4 3 to 1 4 to 2 LB = 45 Packets 11 9 15 13
Telecommunication problems
185
A valid schedule of transmissions denes a sequence of permutations for the on-board switch that routes all the trafc of the matrix TRAF. In other words, this boils down to decomposing TRAF into a sum of mode matrices. An element of TRAF may be fragmented, like TRAF31 that is only partially transmitted in the mode represented in Figure 12.8. A fragmented element will appear in several packets and several modes of the nal decomposition. The duration of a mode is the length of its longest packet. The objective is to nd a schedule with minimal total duration.
12.5.1
Model formulation
Let TRANSM = {1, . . . , NT} be the set of transmitter stations and RECV = {1, . . . , NT} the set of receiver stations. We shall rst formulate a model for this problem when fragmentations are not allowed. With a square matrix as in the present case, NT modes are sufcient for decomposing TRAF. We dene binary variables owtrm that are 1 if the element TRAFtr is transmitted in mode number m MODES = {1, . . . , NT} (12.5.7). The constraints (12.5.2) indicate that every TRAFtr must be transmitted in a single mode (no preemption). The constraints (12.5.3) and (12.5.4) ensure that every mode is valid, with a single entry per row and per column. The continuous variables durm represent the duration of every mode, that is, the duration of its largest element. The constraints (12.5.5) bound every TRAFtr transmitted in mode m by durm . The objective function (12.5.1) denotes the total duration of the decomposition to modes, that is, the sum of the durations of the modes. The mathematical model we obtain is a bottleneck assignment problem with three indices. It requires NT 3 + NT variables and NT 3 + 3NT 2 constraints. minimize durm
mMODES
(12.5.1) owtrm = 1
mMODES
owtrm = 1
rRECV
r RECV, m MODES :
owtrm = 1
tTRANSM
t TRANSM, r RECV, m MODES : TRAFtr owtrm durm m MODES : durm 0 t TRANSM, r RECV, m MODES : owtrm {0, 1}
The problem described initially in fact allows preemptions. A formulation in the form of a single mathematical model is still possible in this case, but with an even larger number of variables, since theory shows that of the order of NT 2 modes may be required for decomposing TRAF with a minimal total duration. This is why we are going to use an iterative algorithm due to Gonzalez and Sahni [GS76]. Every iteration requires us to solve an LP to extract a mode from TRAF. Given that the on-board switch connects a transmitter with a receiver station, the elements from the same row or column of TRAF cannot be transmitted in parallel. The sum rowt of the elements of a row t is therefore a lower bound on the duration of any decomposition. The same remark holds for the sum colr of every column r of TRAF. The maximum of these sums denes an even better lower bound LB. The table 12.7 displays these sums: we nd LB = 45. The algorithm is to nd a schedule with duration LB. This duration is optimal since it is not possible to nd anything shorter than the lower bound LB. For the algorithm to work correctly, the trafc matrix TRAF must be converted into a matrix for which the sum of every row and every column is LB. To obtain this so-called quasi bistochastic (QBS) matrix TQBS, we need to add ctitious trafc to the matrix elements so that the row and columns add up to LB. This may be done systematically with the following algorithm. Calculate the row and column sums rowt and colr of matrix TRAF Calculate LB, the maximum of all row and column sums rowt and colr t TRANS, r RECV: Calculate q, the minimum of LB rowt and LB colr Set TQBStr = TRAFtr + q Add q to rowt and to colr
Telecommunication problems
186
The following table contains the matrix TQBS for our example. The elements of all rows and columns sum to 45. The algorithm of Gonzalez and Sahni has the following general structure: Calculate LB, the maximum of the row and column sums of TRAF Convert TRAF into a QBS matrix TQBS by adding ctitious trafc While TQBS is non-zero do Calculate a mode m with NT non-zero elements using Mathematical Programming Calculate pmin, the minimum packet length among the elements of m Create a slice of the schedule with the packets of m cut at pmin Deduce pmin from every element of TQBS contained in mode m end-do Remove the ctitious trafc from the modes that have been obtained This algorithm converges because at every extraction of a mode at least one element of TQBS becomes 0: the one that sets the value of pmin. The algorithm is optimal because after the subtraction of pmin, TQBS remains a QBS matrix with the sums of rows and columns equal to LB pmin. The decomposition creates a slice of the schedule of duration pmin and leaves a matrix with the bound LB pmin. Continuing this way, we obtain a total duration equal to LB. Any mode may be extracted at every iteration, but to have the least number of modes in the decomposition it is desirable to construct modes that are well lled with trafc. A possibility is to calculate maximin modes in which the size of the smallest element is maximized. This may be done using Mathematical Programming. The following model formulates a maximin assignment problem analogous to the one in Chapter 14 for the assignment of personnel to machines.
r RECV :
rRECV TQBStr >0
owtr = 1
(12.5.10)
t TRANSM :
A binary variable owtr (12.5.12) has the value 1 if and only if the element TQBStr is taken in the mode. Right from the beginning the matrix TQBS may contain zero-valued elements and in any case, zeros will appear during the iterations of the algorithm of Gonzalez and Sahni. This is why the variables owtr are only dened for the non-zero TQBStr . The constraints (12.5.9) make it impossible to take more than one element per row, the constraints (12.5.10) play the same role for the columns. A continuous variable pmin bounds the chosen entries (12.5.11) from below. This minimum packet length variable is maximized in the objective function (12.5.8). To apply the algorithm of Gonzalez and Sahni, the preceding mathematical model must be solved for the quasi bistochastic matrix TQBS. The owtr at 1 indicate the elements TQBStr chosen for the mode. The solution value of pmin is then subtracted from the chosen TQBStr and the MIP problem is solved again with the remaining trafc of TQBS. The process stops when TQBS is completely 0.
Telecommunication problems
187
12.5.2
Implementation
The following Mosel program implements the algorithm of Gonzalez and Sahni described in the previous section. After every solution of the MIP problem, the corresponding elements of TQBS are updated, and at the next loop the problem is redened correspondingly. Since the entire MIP problem is redened in every iteration of the while loop, all constraints are named in this problem so that their previous denition may be replaced by the new one. Proceeding in such a way is necessary because the problem denition in Mosel is incremental: constraints may only be removed by explicitly resetting them. Once dened, the variables flow(t,r) cannot be removed, but through the tests TQBS(t,r)>0 in the definition of the constraints only the variables actually required are used in the denition of the current problem. In this program, we save all the solutions found (elements and durations of the modes) for printing out the complete solution in the form of a diagram at the end of the program. During the solution printout, the scheduled packets are compared with the original trafc matrix TRAF so that the additional ctitious trafc in TQBS is not shown, but only the original trafc demands.
model "G-5 Satellite scheduling" uses "mmxprs" declarations TRANSM = 1..4 RECV = 1..4 TRAF: array(TRANSM,RECV) of integer TQBS: array(TRANSM,RECV) of integer row: array(TRANSM) of integer col: array(RECV) of integer LB: integer end-declarations initializations from g5satell.dat TRAF end-initializations ! Row and column sums forall(t in TRANSM) row(t):= sum(r in RECV) TRAF(t,r) forall(r in RECV) col(r):= sum(t in TRANSM) TRAF(t,r) LB:=maxlist(max(r in RECV) col(r), max(t in TRANSM) row(t)) ! Calculate TQBS forall(t in TRANSM,r in RECV) do q:= minlist(LB-row(t),LB-col(r)) TQBS(t,r):= TRAF(t,r)+q row(t)+=q col(r)+=q end-do declarations MODES: range flow: array(TRANSM,RECV) of mpvar ! ! pmin: mpvar ! onerec, minexchg: array(TRANSM) of linctr ! ! onerec: array(RECV) of linctr ! 1 if transmission from t to r, 0 otherwise Minimum exchange Constraints on transmitters and min exchange Constraints on receivers
! Set of transmitters ! Set of receivers ! ! ! ! ! Traffic betw. terrestrial stations Quasi bistochastic traffic matrix Row sums Column sums Maximum of row and column sums
solflowt: array(TRANSM,MODES) of integer solflowr: array(RECV,MODES) of integer solpmin: array(MODES) of integer end-declarations
! Solutions of every iteration ! Solutions of every iteration ! Objective value per iteration
forall(t in TRANSM,r in RECV) flow(t,r) is_binary ct:= 0 while(sum(t in TRANSM,r in RECV) TQBS(t,r) > 0) do ct+=1 ! One receiver per transmitter forall(t in TRANSM) onerec(t):= sum(r in RECV | TQBS(t,r)>0) flow(t,r) =1
Telecommunication problems
188
! One transmitter per receiver forall(r in RECV) onetrans(r):= sum(t in TRANSM | TQBS(t,r)>0) flow(t,r) =1 ! Minimum exchange forall(t in TRANSM) minexchg(t):= sum(r in RECV | TQBS(t,r)>0) TQBS(t,r)*flow(t,r) >= pmin ! Solve the problem: maximize the minimum exchange maximize(pmin) ! Solution printing writeln("Round ", ct, " objective: ", getobjval) ! Save the solution solpmin(ct):= round(getobjval) forall(t in TRANSM,r in RECV | TQBS(t,r)>0) if(getsol(flow(t,r))>0) then solflowt(t,ct):= t solflowr(t,ct):= r end-if ! Update TQBS forall(t in TRANSM) TQBS(solflowt(t,ct),solflowr(t,ct)) -= solpmin(ct) end-do ! Solution printing writeln("\nTotal duration: ", sum(m in MODES) solpmin(m)) write(" ") forall(i in 0..ceil(LB/5)) write(strfmt(i*5,5)) writeln forall(t in TRANSM) do write("From ", t, " to: ") forall(m in MODES) forall(i in 1..solpmin(m)) do write(if(TRAF(solflowt(t,m),solflowr(t,m))>0, string(solflowr(t,m)),"-")) TRAF(solflowt(t,m),solflowr(t,m))-=1 end-do writeln end-do end-model
12.5.3
Results
The following tables show the successive contents of TQBS during the repeated solution of the MIP. The boxed elements are the elements chosen for the mode. The duration of every mode pmin is given above the corresponding table. The decomposition terminates after eight iterations and the resulting schedule has the expected length LB = 45. The upper half of Figure 12.7 shows the schedule obtained with the ctitious trafc of the matrix TQBS, the lower half displays the result for the original trafc data without any ctitious trafc (matrix TRAF).
12.6
Telecommunication problems
189
Table 12.10: Decomposition of TQBS into modes Mode 1, pmin = 13 7 15 17 6 12 8 12 13 11 13 6 15 15 9 10 11 7 15 4 6 Mode 2, pmin = 11 12 8 12 0 11 0 6 15 2 9 10 11 7 4 4 6 Mode 3, pmin = 7 12 8 1 0 0 0 6 15 2 9 10 0
Mode 4, pmin = 6 0 4 4 6 12 1 1 0 0 0 6 8 2 9 3 0 0 4 4 0
Mode 5, pmin = 3 6 1 1 0 0 0 0 8 2 3 3 0 0 4 1 0
Mode 6, pmin = 3 3 1 1 0 0 0 0 5 2 0 3 0
Mode 7, pmin = 1 0 1 1 0 0 1 1 0 0 0 0 2 2 0 0 0 0 0 1 0
Mode 8, pmin = 1 0 1 0 0 0 0 0 1 1 0 0 0
4 3 1 2 13
3 1 2 4 24
1 2 4 3 31
2 4 3 1
2 4 1 3
2 44 1 12 4 21 3 33
37 40 43 45
4 3 1 2 13 4
3 1 2 2 4 3 24 31
2 4 3 1 37 1
4 1 2 4 21 3 45
Table 12.11: Cost and communities covered for every site Site Cost (in million B) C Communities covered 1 1.8 1,2,4 2 1.3 2,3,5 3 4.0 4,7,8,10 4 3.5 5,6,8,9 5 3.8 8,9,12 6 2.6 7,10,11,12,15 7 2.1 12,13,14,15
Telecommunication problems
190
1 1
7 3 10 6
11
15 2 5 2 3 6 4 9 13 8 12 5 7 14
For every community the number of inhabitants is known (see Table 12.12). Where should the transmitters be built to cover the largest population with the given budget limit of B 10M? C
Table 12.12: Inhabitants of the communities Community Population (in 1000) 1 2 2 4 3 13 4 6 5 9 6 4 7 8 8 12 9 10 10 11 11 6 12 14 13 9 14 3 15 6
12.6.1
Model formulation
Let COMMS be the set of communities, PLACES the potential sites for constructing transmitters and BUDGET the budget allocated by the management. We further write COSTp for the cost of building a transmitter a site p, POPc the number of inhabitants of the community c and COVERpc a binary constant that indicates whether a transmitter placed at p covers community c (COVERpc = 1) or not (COVERpc = 0). Two types of binary variables are required: variables coveredc that are 1 if and only if a community c is covered by a transmitter, and variables buildp that are 1 if and only if a transmitter is built at site p. We formulate the constraints for the coverage of the communities rst . We need to translate the equivalence community c receives a GSM signal at least at one site covering this community is a transmitter is built, or coveredc = 1 there is at least one p with COVERpc buildp = 1. This type of equivalence cannot be translated directly into a linear form. Since a community may be covered by more than one transmitter, the constraints (12.6.1) express one direction of the equivalence by specifying that the sum COVERpc buildp is greater than or equal to coveredc . c COMMS :
pPLACES
(12.6.1)
The other direction of the equivalence is ensured through the maximization of the population covered (12.6.2). The optimization algorithm will not leave any coveredc at 0 if any transmitter that covers this community is built. It is also necessary to remain within the budgetary limits. The constraint (12.6.4) bounds the total construction cost for transmitters with the given maximum budget. And nally, the constraints (12.6.5) and (12.6.6) dene all variables to be binaries. maximize
cCOMMS
c COMMS :
Telecommunication problems
191
12.6.2
Implementation
The translation of the mathematical model into a Mosel program is straightforward. The matrix COVER is stored in sparse format in the data le (that is, only the entries with value 1 are given).
model "G-6 Transmitter placement" uses "mmxprs" declarations COMMS = 1..15 PLACES = 1..7
COST: array(PLACES) of real ! Cost of constructing transmitters COVER: array(PLACES,COMMS) of integer ! Coverage by transmitter locations POP: array(COMMS) of integer ! Number of inhabitants (in 1000) BUDGET: integer ! Budget limit build: array(PLACES) of mpvar covered: array(COMMS) of mpvar end-declarations initializations from g6transmit.dat COST COVER POP BUDGET end-initializations ! Objective: total population covered Coverage:= sum(c in COMMS) POP(c)*covered(c) ! Towns covered forall(c in COMMS) sum(p in PLACES) COVER(p,c)*build(p) >= covered(c) ! Budget limit sum(p in PLACES) COST(p)*build(p) <= BUDGET forall(p in PLACES) build(p) is_binary forall(c in COMMS) covered(c) is_binary ! Solve the problem maximize(Coverage) end-model ! 1 if transmitter built, 0 otherwise ! 1 if community covered, 0 otherwise
12.6.3
Results
When solving this problem, we nd that 109,000 persons can be covered by the transmitters. Four transmitters are built, at the sites 2, 4, 6, and 7. Communities 1 and 4 are not covered by these transmitter locations. This operation requires a total budget of B 9.5 million which remains under the limit set by the C management of the GSM operator. In practice, for the choice of transmitter locations other factors also have to be taken into account. The areas covered by neighboring transmitters typically overlap each other: these overlappings should neither be too large (cost inefcient) nor too small (some overlapping is required to pass on calls). Another typical issue is that the transmitters must be placed and dimensioned in such a way that they may be allocated frequencies (out of a set attributed to the operator) that do not cause any interference problems.
12.7
Telecommunication problems
192
methods are given by Gondran [GM90] and Ahuja et al. [AMO93]. For large telecommunications networks, a compatible MCNF algorithm is described by Minoux [Min75], and an algorithm for the minimum cost MCNF problem by Gersht et al. [GS87]. A column generation method for MCNF in telecommunications is described in [BHJS95]. The problem of the cable network in Section 12.4 is a classical minimum weight spanning tree problem. Its model formulation by mathematical LP/MIP is heavy and only valid for small problem (n 20 nodes). It is in fact easily solved by graph algorithms like the one by Prim in O(n2 ) or the one by Kruskal in O(m log n) where m denotes the number of edges. These two algorithms are described by Ahuja et al. [AMO93]. The problem of telecommunications via satellite in Section 12.5 is also known as a workshop scheduling problem (open shop). The transmitter stations become the machines, the receiver stations the products to produce. TRAFtr indicates the processing duration of a product r on a machine t. A machine may only produce a single product at a time, and a product may only be processed on a single machine at any time. As opposed to the ow shop and job shop problems in Chapter 7, the sequence of processing a product on the different machines is free. The objective is to nd the schedule that minimizes the total duration. The open shop problem is NP-hard if preemptions are not allowed. Heuristics have to be used beyond the limit of ten machines/ten products. See for instance Guret and Prins [GP98]. The major variants of open shop to be found in telecommunications by satellite are presented in an overview article by Prins [Pri94b]. An example of planning trafc for a longer term, solved by Mathematical Programming, is given by Scott et al. [SSR00]. The bottleneck assignment model with three indices presented at the beginning of Section 12.5.1 for the nonpreemptive case stems from Balas and Landweer [BL83]. The choice of locations for GSM transmitters in Section 12.6 is a covering problem. The closely related problems of covering and partitioning are classics in 0-1 (M)IP, summarized in the section References and further material to Chapter 15. We introduce a partitioning problem (electoral districts) in Chapter 15 and another type of covering problem (cutting sheet metal) in Chapter 9. The covering problem, although NP-hard, is relatively well solved since the simplex algorithms nds an optimal LP solution where the majority of the binary variables have integer values, which renders the tree search on the remaining fractional variables easier. See for instance Beasley [Bea87]. It is possible to solve problems with several hundred variables to optimality. Very efcient heuristics based on LP/MIP have recently been described for covering problems of very large size [CFT99]. Syslo describes heuristics and exact tree search methods for two types of problems, with source code in Pascal [SDK83].
Telecommunication problems
193
Chapter 13
13.1
Choice of loans
Mr Chic, director of a chain of shops selling clothes, wishes to open three new shops: one in London, one in Munich, and one in Rome. To open a new shop costs respectively B 2.5 million, B 1 million and B 1.7 C C C million. To nance his project, he calls at three different banks.
Table 13.1: Rates offered by the banks for the different projects Shop in London Bank 1 Bank 2 Bank 3 5% 5.2% 5.5% Shop in Munich 6.5% 6.2% 5.8% Shop in Rome 6.1% 6.2% 6.5%
Depending on the location of the shops and the evaluation of the related risks, each bank decides to nance at most B 3 million over 8 years with different interest rates for the shops (Table 13.1). Determine C the amount to borrow from each bank for nancing each shop in order to minimize the total expenses of Mr Chic.
13.1.1
Model formulation
Let borrowbs be the amount borrowed from bank b to nance shop s. Let BANKS and SHOPS respectively be the sets of banks willing to nance and of new shops. Let DUR be the number of years over which the repayment of the credits stretches, VMAX the maximum amount that every bank is prepared to nance, RATEbs the interest rate offered by bank b for shop s, and PRICEs the cost of opening shop s. The mathematical model is the following: minimize
bBANKS sSHOPS
borrowbs
(13.1.1)
194
s SHOPS :
bBANKS
b BANKS :
The objective is to minimize Mr. Chics expenses, that is, to minimize the sum of annual payments he has to make. If the amount borrowbs is borrowed from a bank b to nance the shop s at the rate RATEbs over DUR years, then the annual payment paybs to be made by Mr Chic for this shop to the bank b is calculated as follows: the net present value of all DUR annual payments paybs for shop s to the bank b must equal the value of the loan borrowbs :
DUR
borrowbs =
t=1
(13.1.5)
By dividing the equation by the fraction on the right hand side we obtain the following equation for the annuities paybs : RATEbs borrowbs = paybs (13.1.6) 1 (1 + RATEbs )DUR The annual payments paybs have to be made for all shops s to all banks b during DUR years. But since the annual payments are the same every year, it is sufcient to minimize the sum of the payments for one year. We thus obtain the objective function as the sum of paybs over all b and s. By replacing paybs with the left hand side of equation (13.1.6) we obtain the objective function in the form (13.1.1). Every shop has to be completely nanced, which means that the amounts borrowed for nancing every shop s must correspond to its cost PRICEs . This constraint is expressed through (13.1.2). The constraint (13.1.3) indicates that every bank must not nance more than VMAX and the constraints (13.1.4) state the non-negativity of the variables.
13.1.2
Implementation
The following Mosel program gives the translation of the mathematical model above.
model "H-1 Loan choice" uses "mmxprs" declarations BANKS = 1..3 ! Set of banks SHOPS = {"London", "Munich", "Rome"} ! Set of shops DUR: integer ! Duration of credits PRICE: array(SHOPS) of integer RATE: array(BANKS,SHOPS) of real VMAX: integer borrow: array(BANKS,SHOPS) of mpvar end-declarations initializations from h1loan.dat PRICE RATE VMAX DUR end-initializations ! Objective: interest payments Interest:= sum(b in BANKS, s in SHOPS) borrow(b,s)*RATE(b,s)/(1-(1+RATE(b,s))^(-DUR)) ! Finance all projects forall(s in SHOPS) sum(b in BANKS) borrow(b,s) = PRICE(s) ! Keep within maximum credit volume per bank forall(b in BANKS) sum(s in SHOPS) borrow(b,s) <= VMAX ! Solve the problem minimize(Interest) end-model ! Price of shops ! Interest rates offered by banks ! Maximum loan volume per bank ! Loan taken from banks per project
195
13.1.3
Results
To minimize his expenses, Mr. Chic nances the shop in London (shop 1) entirely through a credit from bank 1 and the shop in Munich (shop 2) through a credit from bank 3. For the shop in Rome (shop 3) he borrows B 0.5 million from bank 1 and B 1.2 million from bank 2. The sum of the annual payments to be C C made by Mr. Chic is then B 822,181. C
13.2
Publicity campaign
The small company, Pronuevo, launches a new product into a regional market and wishes to have a publicity campaign using different media. It therefore contacts a regional publicity agency, PRCo, that specializes in this type of regional campaign and completely hands over this task for a total budget of B 250,000. The agency knows the market well, that is, the impact of publicity in a local magazine or over C the radio, or as a TV spot on the regional channel. It suggests addressing the market for two months through six different media. For each medium, it knows the cost and the number of people on which this medium has an impact. An index of the quality of perception of the campaign is also known for every medium. The publicity agency establishes a maximum number of uses of every medium (for instance, not more than eight transmissions of a TV spot). The following Table 13.2 lists all this information. Pronuevo wants the impact of the publicity campaign to reach at least 100,000 people. Which media should be chosen and in which proportions to obtain a maximum index of perception quality?
Table 13.2: Data for the publicity campaign Number 1 2 3 4 5 6 Media type Free weekly newspaper Monthly magazine Weekly magazine Radio spot Billboard 4x3 m TV spot People potentially reached 12,000 1,500 2,000 6,000 3,000 9,000 Unit cost 1,500 8,000 12,000 9,000 24,000 51,000 Maximum use 4 weeks 2 months 8 weeks 60 broadcasts 4 boards 8 broadcasts Perception quality 3 7 8 2 6 9
13.2.1
Model formulation
We write MEDIA for the set of media that may be used in this campaign. The constants REACHm , COSTm , MAXUSEm , and SCOREm denote respectively the number of people potentially reached, the unit cost of using a medium, the maximum number of uses and the quality index for every medium used. The decision variables usem that we choose are the number of uses made of every medium m during this campaign. To start with, the budgetary constraint needs to be fullled: the constraint (13.2.2) indicates that the sum of the costs for every medium must not exceed the total allocated budget BUDGET. Every medium may be used only up to its maximum authorized number of uses (constraints (13.2.3)). The targeted number of people TARGET needs to be reached, that means, that the sum of the numbers of people potentially reached through every medium must be at least as large as the targeted 100,000 persons (constraint (13.2.4)). The objective function (13.2.1) has to maximize the sum of the quality indices of every media used. The decision variables usem must be integer, constraints (13.2.5). maximize
mMEDIA
SCOREm usem
m MEDIA : usem IN
196
13.2.2
Implementation
This model could be implemented quite simply in a non-generic way but we have given preference to a generic form (using data arrays read from le) that is easier to modify for future extensions.
model "H-2 Publicity" uses "mmxprs" declarations MEDIA = 1..6 REACH: array(MEDIA) of integer COST: array(MEDIA) of integer MAXUSE: array(MEDIA) of integer SCORE: array(MEDIA) of integer BUDGET: integer TARGET: integer use: array(MEDIA) of mpvar end-declarations
! Set of media types ! ! ! ! ! ! Number of people reached Unitary cost Maximum use Quality rating (best=highest value) Available publicity budget Number of people to be reached
initializations from h2publ.dat REACH COST MAXUSE SCORE BUDGET TARGET end-initializations ! Objective: quality of perception of the campaign Perceive:= sum(m in MEDIA) SCORE(m)*use(m) ! Budgetary limit sum(m in MEDIA) COST(m)*use(m) <= BUDGET ! Outreach of campaign sum(m in MEDIA) REACH(m)*use(m) >= TARGET forall(m in MEDIA) do use(m) is_integer use(m) <= MAXUSE(m) end-do ! Solve the problem maximize(Perceive) end-model
13.2.3
Results
With the program above we nd a quality index of 122 units. The budget is fully used and 103,000 people are reached. As detailed in the following table, all media types except the TV spot are used. Given that the problem is of very moderate size, the LP directly calculates an integer solution.
Table 13.3: Use made of different media types Media type Free weekly newspaper Monthly magazine Weekly magazine Radio spot Billboard 4x3 m TV spot Number of uses 4 2 8 4 4 0
We should note that the problem described in this section is a much simplied version of reality. For instance, it is unlikely that the effectiveness of radio advertising is proportional to the number of broadcasts of a particular advert. Nor are adverts in different media independent of each other. In practice, much more sophisticated models will be used.
197
13.3
Portfolio selection
A consultant in nance has to choose for one of his wealthy female clients a certain number of shares in which to invest. She wishes to invest B 100,000 in 6 different shares. The consultant estimates for her the C return on investment that she may expect for a period of six months. The following table gives for each share its country of origin, the category (T: technology, N: non-technology) and the expected return on investment (ROI). The client species certain constraints. She wishes to invest at least B 5,000 and at most C B 40,000 into any share. She further wishes to invest half of her capital in European shares and at most C 30% in technology. How should the capital be divided among the shares to obtain the highest expected return on investment?
Table 13.4: List of shares Number 1 2 3 4 5 6 Origin Japan UK France USA Germany France Category T T T N N N Expected ROI 5.3% 6.2% 5.1% 4.9% 6.5% 3.4%
13.3.1
Model formulation
In the mathematical formulation, we write SHARES for the set of shares chosen for the investment, CAPITAL the total capital that is to be invested, RETs the expected ROI. EU denotes the subset of the shares that are of European origin and TECHNOLOGY the set of technology values. The decision variables buys denote the amount of money invested in share s. Every variable is bounded, at least VMIN = 5000 and at most VMAX = 40000 have to be invested into every share. The constraint (13.3.1) establishes these bounds on the variables buys . (13.3.1) s SHARES : VMIN buys VMAX At most 30% of the values may be technology values, i.e. the sum invested into this category must not exceed B 30,000, constraint (13.3.2). The investor also insists on spending at least 50% on European C shares, that is, at least B 50,000, constraint (13.3.3). C buys 0. 3 CAPITAL
sTECHNOLOGY
(13.3.2) (13.3.3)
buys 0. 5 CAPITAL
sEU
The constraint (13.3.8) species the the total invested sum must correspond to the initial capital CAPITAL. The constraints (13.3.9) are the usual non-negativity constraints. The objective function (13.3.4) maximizes the return on investment of all shares. maximize
sSHARES
buys 0. 5 CAPITAL
sEU
buys = CAPITAL
sSHARES
s SHARES : buys 0
After some further discussion, it turns out that the client actually does not wish to invest VMIN into every share the consultant has chosen for her. She is unwilling to have small share holdings. If she buys any shares in a company she wants to invest at least B 5,000. The model therefore needs to be modied: C instead of constraining every variable buys to take a value between VMIN and VMAX, it must either lie in
198
this interval or take the value 0. This type of variable is known as semi-continuous variable. In this new model, we replace (13.3.5) by the following constraint (13.3.10): s SHARES : buys = 0 VMIN buys VMAX (13.3.10)
13.3.2
Implementation
The translation of the mathematical model into the following Mosel program is straightforward. In the implementation, we have turned the limits on technology values and European shares into parameters of the model (MAXTECH and MINEU). Similarly, the bounds VMIN and VMAX are dened as parameters.
model "H-3 Portfolio" uses "mmxprs" parameters MAXTECH = 0.3 MINEU = 0.5 VMIN = 5000 VMAX = 40000 end-parameters declarations SHARES = 1..6 RET: array(SHARES) of real CAPITAL: integer EU: set of integer TECHNOLOGY: set of integer buy: array(SHARES) of mpvar end-declarations initializations from h3portf.dat RET CAPITAL EU TECHNOLOGY end-initializations ! Objective: total return Return:= sum(s in SHARES) RET(s)/100*buy(s) ! Requirements concerning portfolio composition sum(s in TECHNOLOGY) buy(s) <= MAXTECH*CAPITAL sum(s in EU) buy(s) >= MINEU*CAPITAL ! Total capital to invest sum(s in SHARES) buy(s) = CAPITAL forall(s in SHARES) do VMIN <= buy(s) buy(s) <= VMAX end-do ! Solve the problem maximize(Return) end-model
! ! ! !
into tech. values into European shares a single value a single value
! Set of shares ! ! ! ! Estimated return in investment Capital to invest European values among the shares Technology values among shares
To dene the variables buy(s) as semi-continuous variables, we need to replace the lower bound constraints
VMIN <= buy(s)
by the line
buy(s) is_semcont(VMIN)
13.3.3
Results
The solution to the problem indicates the sums that should be invested into the different shares. The total expected ROI with the initial problem formulation is B 5,755 for six months, for the problem with C semi-continuous variables it is B 5,930. The funds are divided among the shares as shown in the following C table.
199
Table 13.5: Optimal portfolio Share number 1 2 3 4 5 6 Invested amount (in B) C buys VMIN buys semi-cont. 5,000 20,000 5,000 25,000 40,000 5,000 0 30,000 0 30,000 40,000 0
As mentioned in the introduction to this chapter, Mathematical Programming may be used as a simulation tool in nancial applications. In our case, what would happen if we allowed investing up to 40% into technology values? Since the corresponding limit MAXTECH has been dened as a parameter, there is no need to modify the Mosel program to test the result for this value. It is sufcient to set the new value of the parameter when calling Mosel. With the Mosel Command Line Interpreter this may be done with the following command to execute the model:
mosel -c "exec h3portf MAXTECH=0.4"
With this increased limit on technology values, the expected return becomes B 5,885 for the rst model C (and B 6,060 for the second). Compared to the previous plan, B 10,000 are transfered from share 4 to share C C 2, and the amounts invested in the other shares remain the same. By varying the different parameters (it is possible to set new values for several parameters at the same time), the consultant may be able to satisfy his client.
13.4
For the investments, the bank decides to take three different types of bonds, SNCF bonds, Fujitsu bonds, and Treasury bonds. The money that is not invested in these bonds is placed as savings with a guaranteed yield of 3.2%. Table 13.7 lists all information concerning the yield and the durations of the bonds and also the value of a bond. In this type of bond, it is only possible to buy an integer number of bonds, and the invested capital remains locked in for the total duration of the bond. Every year, only the interest on the capital is distributed. The person in charge of the retirement plan decides to buy bonds at the beginning of the rst year, but not in the following years. How should he organize the investments in order to spend the least amount of money to cover the projected retirement plan?
Table 13.7: Information about loans Loan SNCF Fujitsu Treasury Value of bonds (in 1000 B) C 1.0 0.8 0.5 Interest 7.0% 7.0% 6.5% Duration 5 years 4 years 6 years
13.4.1
Model formulation
Let YEARS = {1, . . . , NT} be the time period over which the early retirement scheme stretches, and BONDS the set of loans. capital denotes the total capital that needs to be invested in the rst year in order to be able to nance the scheme over all seven years. Let VALUEb be the unit price for a bond b, DURb its duration, and RATEb the annual interest on bond b. The variable buyb represents the number of bonds of type b bought in the rst year, the variable investt the sum invested (into forms of savings other than the bonds) in year t. The funds required by the early retirement plan per year t are denoted by DEMt .
200
The general principle of the constraints is the following: every year, the set of interest payments has to cover the investments of this year and the amount required by the retirement plan. The constraint (13.4.1) represents the investment in the rst year, the year during which the bonds are bought. The total invested capital minus the price paid for the bonds and minus the investment of the rst year must be equal to the funds required in the rst year. capital
bBONDS
(13.4.1)
While no bond has come to term, that is during the three years following the rst, no more money is invested into bonds, but we receive the interest (rst sum of constraint (13.4.2)). We also receive the interest and the amount invested into other forms of savings than bonds in the preceding year. From these benets we have to subtract the investments (other than loans) and the funds required for the current year to obtain an equilibrium, constraints (13.4.2). t = 2, . . . , 4 :
bBONDS
VALUEb buyb
RATEb + 100
1+
3. 2 100
(13.4.2)
At the beginning of year 5, the Fujitsu bond falls due and similarly at the beginning of year 6, the EDF bond falls due. The capital invested into the corresponding bond is recovered and available for a new investment. We also receive the interest for the preceding year for all bonds. The rest of constraint (13.4.3) is identical to the constraints (13.4.2). t = 5, 6 :
bBONDS DURb =t1
VALUEb buyl 1 +
RATEb 100
+
bBONDS DURb t
VALUEb buyb
RATEb 100
+ 1+
3. 2 100
(13.4.3)
In the last year, only the Treasury bond that ran over 6 years remains. We recover the capital initially invested into this bond and the investments from the preceding year. In this year, there is no new investment (constraint 13.4.4) VALUEb buyb 1 +
bBONDS DURb =6
RATEb 100
1+
3. 2 100
invest6 = DEM7
(13.4.4)
To the constraints (13.4.1) (13.4.4) we still need to add the objective function (13.4.5) that minimizes the initially invested capital, and to declare the denition spaces of the variables (constraints (13.4.6) (13.4.8)) minimize capital cap 0 t YEARS : investt 0 b BONDS : buyb IN (13.4.5) (13.4.6) (13.4.7) (13.4.8)
13.4.2
Implementation
In the following Mosel program, the constraints for the annual balances of years 2-7 are combined into a single constraint expression selecting the corresponding constraint terms through the inline if function. To simplify the notation of the constraints, we dene an auxiliary array RET representing the annual interest per bond.
model "H-4 Retirement" uses "mmxprs" declarations BONDS = {"SNCF","Fujitsu","Treasury"} ! Set of bonds NT = 7 ! Length of planning period YEARS = 1..NT DEM: array(YEARS) of integer VALUE: array(BONDS) of real ! Annual payments for retirement ! Unit price of bonds
201
RATE: array(BONDS) of real RET: array(BONDS) of real DUR: array(BONDS) of real INTEREST: real buy: array(BONDS) of mpvar invest: array(YEARS) of mpvar capital: mpvar end-declarations initializations from h4retire.dat DEM VALUE RATE DUR INTEREST end-initializations
! ! ! !
Remuneration rates paid by bonds Unit annual interest of bonds Duration of loans Interest for other secure investment
forall(b in BONDS) RET(b):= VALUE(b)*RATE(b)/100 ! Annual balances capital - sum(b in BONDS) VALUE(b)*buy(b) - invest(1) = DEM(1) forall(t in 2..NT) sum(b in BONDS | DUR(b)+1>=t) (RET(b)*buy(b) + if(DUR(b)+1=t, VALUE(b)*buy(b), 0)) + (1+INTEREST/100)*invest(t-1) - if(t<NT, invest(t), 0) = DEM(t) forall(b in BONDS) buy(b) is_integer ! Solve the problem: minimize invested capital minimize(capital) end-model
13.4.3
Results
The initially required capital is B 4548.92k. The optimal solution consists of investing B 911k in SNCF bonds C C (911 bonds), B 597.6k in Fujitsu bonds (747 bonds), and B 880k in Treasury coupons (1760 coupons). The C C following table lists the investments into forms of savings other than loans for the rst six years.
Table 13.8: Investments (other than loans) Year Amount (in 1000 B) C 1 1160.317 2 760.249 3 307.379 4 0.017 5 0.420 6 12.403
13.5
Family budget
The mother of a family wishes to use her sons computer. On the internet she has found optimization software and would now like to formulate a mathematical model to help plan their annual budget. She has prepared a list of the monthly expenses and receipts of money. Every month the expenses for living are B 550. The monthly rent for the apartment is B 630. She also budgets B 135 for telephone every two C C C months, B 850 for gas and electricity bills every six months, B 340 per month for the car and B 100 of tax C C C every four months. Her receipts of money are a monthly payment of B 150 of state allowance for families C with dependent children and a net salary of B 1900 per month. She knows that she pays at least B 165 C C for leisure every month (subscription to the swimming pool for the older children, football club for the youngest, gym for herself) but she would like to spend more (restaurant, cinema, holidays). How should the budget be balanced all through the year to maximize the money available for leisure?
13.5.1
Model formulation
Let MONTHS be the set of twelve month representing the year to plan and ITEMS the set of expense types. We write EXPENSEi for the amount of an expense and FREQi for its periodicity (e.g. FREQi = 6 means that i is a 6-monthly expense). The salary is denoted by INCOME, and the allowance by ALLOW. We use two types of variables: hobbym , the amount that may be spent for leisure in month m, and savem , the savings of month m. Every month, the family wishes to spend at least HMIN = B 165 for leisure. This C is expressed by the constraints (13.5.1). m MONTHS : hobbym HMIN (13.5.1)
202
For the system to work, the budget must be balanced. The expenses in every month must not exceed the receipts of money of this month, but it is possible to put aside some money to save it for a month with higher expenses. The constraints (13.5.2) express the fact that the expenses of the current month plus the savings of this month and the money spent for leisure must be less than or equal to the perceived salary, plus the allowance, plus the savings from the preceding month. Since no information about savings at the beginning of the planning period (variable save0 ) is given, we assume them to be 0. The operator mod denotes the remainder of integer division (e.g. 7 mod 6 = 1, that is, 6-monthly payments are only taken into account in months 6 and 12). m MONTHS : EXPENSEi + savem + hobbym INCOME + ALLOW + savem1 (13.5.2)
The objective function is to maximize the total amount available for leisure in the entire year (13.5.3). The non-negativity constraints for the variables hobbym are superseded by the constraints (13.5.1). maximize hobbym
mMONTHS
m MONTHS : hobbym HMIN m MONTHS : EXPENSEi + savem + hobbym INCOME + ALLOW + savem1
iITEMS m mod FREQi =0
m MONTHS : savem 0
(13.5.6)
13.5.2
Implementation
This model is very similar to a production planning model with transfer of stocks from one time period to the next. To deal with the different periodicities of the expenses, we use the Mosel operator mod. For the savings at the beginning of the rst time period, we may either dene a variable save0 and x its value to 0 or, as shown below, directly employ the value 0 in the corresponding constraint.
model "H-5 Family budget" uses "mmxprs" declarations MONTHS = 1..12 ITEMS: set of string INCOME, ALLOW: integer HMIN: integer EXPENSE: array(ITEMS) of integer FREQ: array(ITEMS) of integer hobby: array(MONTHS) of mpvar save: array(MONTHS) of mpvar end-declarations initializations from h5budget.dat INCOME ALLOW HMIN [EXPENSE, FREQ] as PAYMENT end-initializations ! Objective: money for hobby Leisure:= sum(m in MONTHS) hobby(m) ! Monthly balances forall(m in MONTHS) sum(i in ITEMS | m mod FREQ(i) = 0) EXPENSE(i) + hobby(m) + save(m) <= INCOME + ALLOW + if(m>1, save(m-1), 0) forall(m in MONTHS) hobby(m) >= HMIN ! Solve the problem maximize(Leisure) end-model
! Time period ! Set of shops ! ! ! ! Monthly income and allowance Min. amount required for hobbies Expenses Frequency (periodicity) of expenses
203
13.5.3
Results
In the course of the year, the family may spend up to B 3,550 for leisure. The following table shows a C possible plan of their monthly leisure budget (there are other equivalent solutions).
Table 13.9: Monthly leisure budget and savings Month Hobby Savings 1 530 0 2 395 0 3 405 125 4 165 255 5 165 620 6 165 0 7 530 0 8 295 0 9 405 125 10 165 355 11 165 720 12 165 0
13.6
Table 13.11: Annual costs of projects and available funds (in million B) C Project 1 2 3 4 5 Funds Year 1 1.8 1.2 1.2 1.4 1.6 4.8 Year 2 2.4 1.8 1.0 1.4 2.1 6.0 Year 3 2.4 2.4 0 1.2 2.5 4.8 Year 4 1.8 0.6 0.48 1.2 2.0 4.2 Year 5 1.5 0.5 0 1.2 1.8 3.5
13.6.1
Model formulation
We write PROJECTS for the set of projects retained by the management, and TIME for the set of time periods (years) within the planning horizon. The benet from every project p is RETp and COSTpt the cost of project p in year t. CAPt denotes the capital available for funding projects in year t. The binary variable choosep has the value 1 if project p is chosen and 0 otherwise. The only constraints given in this problem are the limits on the capital that the management is prepared to invest every year. The constraints (13.6.2) ensure that the sum of the costs COSTpt of the chosen projects (choosep = 1) does not exceed the available capital CAPt in year t. The objective function (13.6.1) maximizes the total prot, that is, the sum of the benets RETp from the chosen projects. The variables choosep are binary (13.6.3). maximize
pPROJECTS
t TIME :
204
13.6.2
Implementation
The following Mosel program implements the mathematical model above.
model "H-6 Expansion" uses "mmxprs" declarations PROJECTS = 1..5 TIME = 1..5 COST: array(PROJECTS,TIME) of real CAP: array(TIME) of real RET: array(PROJECTS) of real DESCR: array(PROJECTS) of string choose: array(PROJECTS) of mpvar end-declarations initializations from h6expand.dat COST CAP RET DESCR end-initializations ! Objective: Total profit Profit:= sum(p in PROJECTS) RET(p)*choose(p) ! Limit on capital availability forall(t in TIME) sum(p in PROJECTS) COST(p,t)*choose(p) <= CAP(t) forall(p in PROJECTS) choose(p) is_binary ! Solve the problem maximize(Profit) end-model
! Set of possible projects ! Planning period ! ! ! ! Annual costs of projects Annually available capital Estimated profits Description of projects
13.6.3
Results
When solving the above program as is, we obtain a solution with a total prot of B 19.89 million: the C projects New painting facility, Concept car, and Reorganize logistics are chosen. We may try to experiment a little with this problem. If we solve the model again after modifying the call to the optimization as follows:
maximize(XPRS_LIN, Profit)
the linear relaxation of the problem is solved (that is, neglecting the integrality condition for the variables choosep ). Looking at the solution of this relaxed problem, we nd that the variables for choosing projects New paint facility and Reorganize logistics are at 1, the variable for Expand assembly line is almost 1, more precisely 0.9542, and the value of Reorganize shop is almost 0 (0.0042). The total prot of the linear solution is B 25.775M. One might wonder what would happen if we rounded the variable for C Expand assembly line to 1, thus forcing the acceptance of project 1. This may be done by adding the following line to the Mosel program before calling the optimization algorithm:
choose(1)=1
With this additional constraint, the solution consists of choosing the projects Expand assembly line (the project that was forced to be accepted) and New painting facility, with a total prot of B 14M. This C solution demonstrates that rounding fractional variables to the closest integer value is not always a good heuristic for creating integer feasible solutions from the solution to the LP relaxation.
13.7
205
and software company worths tend to move together, but are oppositely correlated with the success of theatrical production, as people go to the theater more when they have become bored with playing with their new computers and computer games.) The return on theatrical productions are highly variable, whereas the T-bill yield is certain. The estimated returns and the variance/covariance matrix are given in Table 13.12
Table 13.12: Estimated returns and variance/covariance matrix Hardware Estimated return Hardware Software Show-biz T-bills 8 4 3 -1 0 Software 9 3 6 1 0 Show-biz 12 -1 1 10 0 T-bills 7 0 0 0 0
Question 1: Which investment strategy should the investor adopt to minimize the variance subject to getting some specied minimum target yield? Question 2: Which is the least variance investment strategy if the investor wants to choose at most two different securities (again subject to getting some specied minimum target yield)?
13.7.1
fracs = 1
sSECS
s SECS : fracs 0
The objective function (13.7.1) is the variance of the estimated returns. Constraint (13.7.2) says that the investor wishes to spend all the money. The desired target yield is enforced through constraint (13.7.3). The constraints (13.7.4) are the usual non-negativity constraints. Note that this is not a Linear Programming problem as we have product terms in the objective function.
13.7.2
! Set of securities ! Expected yield of securities ! Variance/covariance matrix of ! estimated returns ! Fraction of capital used per security ! 1 if asset is in portfolio, 0 otherwise
206
initializations from h7qportf.dat RET VAR end-initializations ! Objective: mean variance Variance:= sum(s,t in SECS) VAR(s,t)*frac(s)*frac(t) ! Spend all the capital sum(s in SECS) frac(s) = 1 ! Target yield sum(s in SECS) RET(s)*frac(s) >= ! Solve the problem minimize(Variance) end-model
TARGET
13.7.3
we get a minimum variance of 0.72476. We should invest 15.14% into hardware, 4.32% into software, 25.24% into show-biz, and 55.29% into T-bills.
13.7.4
then we can see that for a fracs to be bigger than 0, buys must be bigger than 0 (constraints (13.7.6)) and so must be 1 as it is binary (13.7.7). The constraint (13.7.5) establishes the limit on the number of different securities bought. This problem is actually a Mixed Integer Quadratic Program (MIQP) as it has elements of Quadratic Programming and also Integer Programming.
13.7.5
! Set of securities ! Expected yield of securities ! Variance/covariance matrix of ! estimated returns ! Fraction of capital used per security ! 1 if asset is in portfolio, 0 otherwise
207
initializations from h7qportf.dat RET VAR end-initializations ! Objective: mean variance Variance:= sum(s,t in SECS) VAR(s,t)*frac(s)*frac(t) ! Spend all the capital sum(s in SECS) frac(s) = 1 ! Target yield sum(s in SECS) RET(s)*frac(s) >= ! Limit the total number of assets sum(s in SECS) buy(s) <= MAXASSETS forall(s in SECS) do buy(s) is_binary frac(s) <= buy(s) end-do ! Solve the problem minimize(Variance) end-model
TARGET
13.7.6
that is, a target yield of 8.5% and at most two assets in the portfolio, we get a minimum variance of 0.9. We need to invest 30% into show-biz and 70% into T-bills. The results for questions 1 and 2 are summarized in Table 13.13.
Table 13.13: Results with TARGET = 8. 5 Percentage of total investment Question 1 Question 2 Hardware Software Show-biz T-bills Variance 15.14% 4.33% 25.24% 55.29% 0.72 0% 0% 30% 70% 0.9
Notice that because we are restricting ourselves to holding at most two securities, the variance for a given yield has gone up compared with the case where we can hold any number of securities. The second model is probably the more realistic one: in practical applications, there are many thousands of possible securities, and constraints that specify that no more than a certain number of different securities may be bought stop us having the managerial problem of being forced to look after too many securities.
13.7.7
Extension
Finally, we should note that in practice deciding on a reasonable value for an acceptable TARGET / Variance pair is not easy, and the decision maker might want to study a large range of possible combinations. In the implementation we may simply add a loop around the optimization (and solution output). TARGET is no longer a parameter and is therefore now declared in the declarations block. The possible values of TARGET range between the smallest and the largest value of the mean returns of all securities, enumerated in steps of 0.1. Note that in this case the constraint on the target yield must be named (Rmean), so it gets replaced each time through the loop.
declarations TARGET: real end-declarations TARGET:=min(s in SECS) RET(s)
208
repeat Rmean:= sum(s in SECS) RET(s)*frac(s) >= TARGET minimize(Variance) writeln("Target: ", TARGET, " minimum variance: ", getobjval) TARGET+=0.1 until(TARGET>max(s in SECS) RET(s) )
The results of such a study may be plotted as a graph, for instance using the graphing capabilities of Xpress-IVE.
13.8
209
Chapter 14
14.1
The objective is to determine an assignment of workers to machines that maximizes the total productivity. We may start by calculating a (non-optimal) heuristic solution using the following fairly natural method: choose the assignment p m with the highest productivity, cross out the line p and the column m (since the person has been placed and the machine has an operator), and restart this process until we have assigned all persons. The problem should then be solved to optimality using Mathematical Programming. And nally, solve the same problem to optimality, but for machines working in series.
210
14.1.1
Model formulation
14.1.1.1 Parallel machines
This problem type is well known under the name of the assignment problem. It also occurs in Chapter 11 (ight connections). Let PERS be the set of workers, MACH the set of machines (both of the same size N), and OUTPpm the productivity of worker p on machine m. A rst idea for encoding an assignment would be to dene N integer variables assignp taking values in the set of machines, where assignp denotes the number of the machine to which the person p is assigned. With these variables it is unfortunately not possible to formulate in a linear form the constraints that a person has to be on a single machine and a machine only takes one operator. These constraints become easy to express if we instead use N2 binary variables assignpm that are 1 if and only if person p is assigned to machine m (14.1.1). p PERS, m MACH : assignpm {0, 1} (14.1.1)
The fact that a person p is assigned to a single machine m is by (14.1.2). Similarly, to express that a machine m is operated by a single person p, we have constraints (14.1.3). p PERS :
mMACH
assignpm = 1 assignpm = 1
pPERS
(14.1.2) (14.1.3)
m MACH :
The objective function to be maximized sums the OUTPpm for the variables assignpm that are at 1 (14.1.4). The resulting mathematical model is formed by the lines (14.1.1) to (14.1.4). maximize
pPERS mMACH
OUTPpm assignpm
(14.1.4)
The assignment problem may be looked at as a ow problem. It is sufcient to dene a bipartite labeled graph G = (PERS, MACH, ARCS, OUTP), where PERS is a set of nodes representing the personnel, MACH a set of nodes for the machines, and ARCS the set of arcs describing the possible assignments of workers to machines. In our case, there are N2 arcs, but it would be possible to prohibit certain assignments in the general case. Every arc (p, m) has innite capacity and is labeled with the cost (productivity) OUTPpm . We create a source node SOURCE that is connected to every person-node p by an arc (SOURCE, p) of capacity 1. We then also create a sink node SINK to which are connected all machine-nodes m by arcs (m, SINK), also of capacity 1. An optimal assignment corresponds to a ow in G of throughput N with maximum total cost. Due to the unit capacities, the ow will trace N disjunctive paths from SOURCE to SINK that indicate the assignments. The linear solution to the assignment problem is automatically integer. The constraints (14.1.1) may therefore be replaced by simple non-negativity conditions. It is not necessary to specify that the variables assignpm must not be larger than 1 because this is guaranteed through the constraints (14.1.2) and (14.1.3). The model can be modied to deal with sets of personnel and machines of different size. If, for instance, we have more workers than machines, we keep the constraints (14.1.3) so that every machine receives an operator, but we replace the constraints (14.1.2) by (14.1.5). p PERS :
mMACH
assignpm 1
(14.1.5)
Certain assignments may be infeasible. In such a case the value of the corresponding variable assignpm will be forced to 0, or a highly negative number (that is, with a very large absolute value) is used for OUTPpm . If the graph of possible assignments is given instead of the productivity matrix, it is also possible to generate the variables assignpm merely for the arcs (p, m) that are part of the graph.
211
A variable bounding the productivities on every machine from below is dened (here pmin). Constraints are added that bound every productivity by pmin. We maximize pmin which implies that in the optimum at least one productivity is equal to pmin and hence denes the bottleneck. Two groups of constraints are possible to bound the productivities by pmin: the N2 constraints (14.1.6) or the N constraints (14.1.7). In the latter, a single variable assignpm has the value 1 due to the constraints (14.1.2). The resulting mathematical model is given by the lines (14.1.1) to (14.1.3), the constraints (14.1.6) or (14.1.7), the non-negativity condition for pmin and the new objective function: maximize pmin. Due to the constraints (14.1.6) or (14.1.7), the mathematical model is no longer a classical assignment problem and integrality of the LP solution values is no longer guaranteed. We therefore have to keep the constraints (14.1.1). p PERS, m MACH : OUTPpm assignpm pmin p PERS :
mMACH
(14.1.6) (14.1.7)
14.1.2
Implementation
The following Mosel program rst implements and solves the model for the case of parallel machines. Afterwards, we dene the variable pmin that is required for solving the problem for the case that the machines work in series. We also add the necessary bounding constraints (choosing constraints 14.1.7) for the variables assignpm and turn these variables into binaries.
model "I-1 Personnel assignment" uses "mmxprs" declarations PERS = 1..6 MACH = 1..6 OUTP: array(PERS,MACH) of integer end-declarations initializations from i1assign.dat OUTP end-initializations ! **** Exact solution for parallel assignment **** declarations assign: array(PERS,MACH) of mpvar end-declarations ! Objective: total productivity TotalProd:= sum(p in PERS, m in MACH) OUTP(p,m)*assign(p,m) ! One machine per person forall(p in PERS) sum(m in MACH) assign(p,m) = 1 ! One person per machine forall(m in MACH) sum(p in PERS) assign(p,m) = 1 ! Solve the problem maximize(TotalProd) writeln("Parallel machines: ", getobjval) ! **** Exact solution for serial machines **** declarations pmin: mpvar end-declarations
! Minimum productivity
! Calculate minimum productivity forall(p in PERS) sum(m in MACH) OUTP(p,m)*assign(p,m) >= pmin forall(p in PERS, m in MACH) assign(p,m) is_binary
212
The following procedure parallel_heur may be added to the above program. If called after the data has been initialized, it heuristically calculates a (non-optimal) solution to the parallel assignment problem using the intuitive procedure described in the introduction to Section 14.1.
procedure parallel_heur declarations ALLP, ALLM: set of integer HProd: integer pmax,omax,mmax: integer end-declarations
! Copy the sets of workers and machines forall(p in PERS) ALLP+={p} forall(m in MACH) ALLM+={m} ! Assign workers to machines as long as there are unassigned persons while (ALLP<>{}) do pmax:=0; mmax:=0; omax:=0 ! Find the highest productivity among the remaining workers and machines forall(p in ALLP, m in ALLM) if OUTP(p,m) > omax then omax:=OUTP(p,m) pmax:=p; mmax:=m end-if HProd+=omax ALLP-={pmax}; ALLM-={mmax} writeln(" end-do ! Add to total productivity ! Remove person and machine from sets
",pmax, " operates machine ", mmax, " (", omax, ")")
14.1.3
Results
The following table summarizes the results found with the different solution methods for the two problems of parallel and serial machines. The very intuitive heuristic method is likely to be employed by people who do not know of Mathematical Programming. However, there is a notable difference between the heuristic and the exact solution to the problem with parallel machines.
Table 14.2: Optimal assignment found Algorithm Parallel Machines Serial Machines Heuristic Exact Exact 1 4 (19) 3 (31) 6 (29) 2 1 (18) 5 (43) 3 (30) 3 Person 4 2 (26) 6 (30) 2 (26) 5 3 (34) 1 (28) 1 (28) 6 5 (45) 2 (36) 4 (27) Productivity 175 193 26
14.2
Scheduling nurses
Mr. Schedule has been asked to organize the schedule of nurses for the Cardiology service at St. Josephs hospital. A working day in this service is subdivided into twelve periods of two hours. The personnel requirement changes from period to period: for instance, only a few nurses are required during the night, but the total number must be relatively high during the morning to provide specic care to the patients. The following table lists the personnel requirement for every time period. Question 1: Determine the minimum number of nurses required to cover all the requirements, knowing that a nurse works eight hours per day and that she is entitled to a break of two hours after she has worked for four hours.
213
Table 14.3: Personnel requirement per time period Number 0 1 2 3 4 5 6 7 8 9 10 11 Time interval 00am 02am 02am 04am 04am 06am 06am 08am 08am 10am 10am 12pm 12pm 02pm 02pm 04pm 04pm 06pm 06pm 08pm 08pm 10pm 10pm 12am Minimum number of nurses 15 15 15 35 40 40 40 30 31 35 30 20
Question 2: The service only has 80 nurses, which is not sufcient with the given requirements. Mr. Schedule therefore proposes that part of the personnel works two additional hours per day. These two additional hours follow immediately after the last four hours, without any break. Determine the schedule of the nurses in this service that minimizes the number of nurses working overtime.
14.2.1
startt
(14.2.1)
We need to make sure that a sufciently large number of nurses is available during every time period. For instance, in the period t = 6 (12pm2pm) of the day 40 nurses are required. The number of nurses working during this time period is equal to the total of the number of nurses starting work in this period, the immediately preceding time period, and in the two periods 3 and 4 intervals earlier. That is, during time period 6, the nurses starting in the intervals 2, 3, 5, and 6 are working. For instance, a nurse starting in interval 3 will work in the intervals 3 and 4, have her break in interval 5, and work again in the intervals 6 to 7. If we write REQt for the personnel requirement in interval t, we obtain the following constraint for the time period 6: (14.2.2) start2 + start3 + start5 + start6 REQ6 Similarly, we can formulate the personnel requirement constraints for all other time periods. If WORK denotes the set of intervals that have an impact on the time period under consideration (that is WORK = {0, 1, 3, 4}), we may write these constraints in the generic form (14.2.3). t TIME :
iWORK
(14.2.3)
For the rst four time periods every day, we need to take into account the nurses who started working in the last four time intervals of the previous day. The expression (t + 1 + NT) mod NT transposes the indices correctly, so that for instance for the rst interval of a day, the periods 8, 9, 11, and 0 are taken into account by the corresponding constraint (t = 0). The constraints (14.2.4) indicate that all variables startt must be integer. t TIME : startt IN (14.2.4)
14.2.2
Implementation of question 1
The following Mosel program is a straightforward implementation of the mathematical model. WORK is an example of sets in Mosel that contain negative values and also the value 0.
model "I-2 Scheduling nurses 1" uses "mmxprs"
214
declarations NT = 12 TIME = 0..NT-1 WORK: set of integer REQ: array(TIME) of integer start: array(TIME) of mpvar end-declarations
! Number of time periods ! Nurses started in other time periods ! that are working during a period ! Required number of nurses per time period ! Nurses starting work in a period
initializations from i2nurse.dat REQ end-initializations WORK:= {0, -1, -3, -4} ! Objective: total personnel required Total:= sum(t in TIME) start(t) ! Nurses working per time period forall(t in TIME) sum(i in WORK) start((t+i+NT) mod NT) >= REQ(t) forall(t in TIME) start(t) is_integer ! Solve the problem minimize(Total) end-model
14.2.3
14.2.4
The number of nurses may not exceed the available total staff of NUM = 80. This constraint is expressed
215
(14.2.6)
For every time interval t, the number of nurses overtt starting in this period who work overtime may at most be as large as the total number of nurses startt starting their work during this time period. We therefore obtain the constraints (14.2.7) t TIME : overtt startt (14.2.7)
As before, the personnel requirement of every time slice needs to be covered. We obtain the constraints (14.2.8) that are similar to the constraints (14.2.3) of Question 1, but in which we also take into account the nurses working extra hours. For example, the nurses on duty in interval 6 started work either in the intervals 2, 3, 5, or 6 as in the rst question, or in the interval 1 if they are working overtime. t TIME : overt(t5+NT) mod NT +
iWORK
start(t+i+NT)modNT REQt
(14.2.8)
To complete the model for Question 2, the constraints (14.2.9) and (14.2.10) specify that all variables startt and overtt must be integer. t TIME : startt IN t TIME : overtt IN (14.2.9) (14.2.10)
14.2.5
Implementation of question 2
The translation of the mathematical model to Mosel is again immediate.
model "I-2 Scheduling nurses 2" uses "mmxprs" declarations NT = 12 TIME = 0..NT-1 WORK: set of integer
! Number of time periods ! Nurses started in other time periods ! that are working during a period ! Required number of nurses per time period ! Available total staff ! Nurses starting work in a period ! Nurses working overtime
REQ: array(TIME) of integer NUM: integer start: array(TIME) of mpvar overt: array(TIME) of mpvar end-declarations
initializations from i2nurse.dat REQ NUM end-initializations WORK:= {0, -1, -3, -4} ! Objective: total overtime worked TotalOvert:= sum(t in TIME) overt(t) ! Nurses working per time period forall(t in TIME) overt((t-5+NT) mod NT) + sum(i in WORK) start((t+i+NT) mod NT) >= REQ(t) ! Limit on total number of nurses Total <= NUM forall(t in TIME) do start(t) is_integer overt(t) is_integer overt(t) <= start(t) end-do ! Solve the problem minimize(TotalOvert) end-model
216
14.2.6
14.3
The sport lessons have to take place on Thursday afternoon from 14:00 to 16:00. Furthermore, the rst time slot on Monday morning is reserved for supervised homework. Mr Effofecks is absent every Monday morning because he teaches some courses at another college. Mrs Insulin does not work on Wednesday. And nally, to prevent students from getting bored, every class may only have one two-hour lesson per subject on a single day. Write a mathematical program that allows Mr Miller to determine the weekly timetable for the two classes.
14.3.1
Model formulation
Let TEACHERS, and CLASS respectively be the sets of teachers and classes. Let SLOTS denote the set of time slots per week, numbered consecutively from 1 to NP ND, where NP denotes the number of time slots per day and ND the number of days per week. COURSEtc denotes the number of two-hour lessons that the teacher t has to teach class c every week. We dene variables teachtcl that are 1 if the teacher t gives a lesson to class c in time slot l. We obtain
217
minimize
tTEACHERS cCLASS d=0
teachtcl 1 teachtcl 1
cCLASS (d+1)NP
t TEACHERS, l SLOTS :
t TEACHERS, c CLASS, d = 0, . . . , ND 1 :
l=dNP+1
teachtcl 1
teachMrMuscle,1,15 = 1 teachMrsBiceps,2,15 = 1 t TEACHERS, c CLASS : teachtc1 = 0 l = 1, 2 : teachMrEffofecks,2,l = 0 c CLASS, l = 2 NP + 1, . . . , 3 NP : teachMrsInsuline,c,l = 0 t TEACHERS, c CLASS, l SLOTS : teachtcl {0, 1}
The aim of this problem is simply to nd a timetable that fullls all constraints. We may however give ourselves the objective to minimize the holes in the timetable. With this aim, the courses should preferably be placed in the time slots from 10:1512:15 and 14:0016:00. If these time slices remain unused but lessons are placed either at the beginning or at the end of the day, there will necessarily be holes in the middle of the day. We therefore penalize lessons placed at the beginning or the end of the day, which means we minimize the sum of courses taught during slots 1 and 4 of every day; hence the objective function (14.3.1). The constraints (14.3.2) indicate that all lessons taught by the teacher t to class c must be scheduled. The constraints (14.3.3) specify that a class has at most one course at any time, and similarly the constraints (14.3.4) that a teacher must not teach more than one course at a time. The constraints (14.3.5) say that at most one two-hour lesson per subject is taught on the same day. The constraints (14.3.6) to (14.3.10) translate the specic conditions of this problem: the constraints (14.3.6) and (14.3.7) indicate that the sport lessons by Mr Muscle and Mrs Biceps have to take place in the beginning of Thursday afternoon (time slice 15). The rst time interval of the week being reserved for supervised homework, the constraints (14.3.8) specify that no course may be scheduled during this period. The constraints (14.3.9) and (14.3.10) respectively prohibit Mr Effofecks teaching on Monday morning and Mrs Insulin teaching on Wednesday (time slices 9-12). The last set of constraints species that all variables are binaries.
14.3.2
Implementation
The mathematical model of the previous section is implemented by the following Mosel program.
model "I-3 School timetable" uses "mmxprs" declarations TEACHERS: set of string CLASS = 1..2 NP = 4 ND = 5 SLOTS=1..NP*ND
! ! ! ! !
Set of teachers Set of classes Number of time periods for courses Days per week Set of time slots for the entire week
COURSE: array(TEACHERS,CLASS) of integer ! Lessons per teacher and class end-declarations initializations from i3school.dat COURSE end-initializations finalize(TEACHERS)
218
declarations teach: array(TEACHERS,CLASS,SLOTS) of mpvar ! teach(t,c,l) = 1 if teacher t gives a ! lesson to class c during time period l end-declarations ! Objective: number of "holes" in the class timetables Hole:= sum(t in TEACHERS, c in CLASS, d in 0..ND-1) (teach(t,c,d*NP+1) + teach(t,c,(d+1)*NP)) ! Plan all courses forall(t in TEACHERS, c in CLASS) sum(l in SLOTS) teach(t,c,l) = COURSE(t,c) ! For every class, one course at a time forall(c in CLASS, l in SLOTS) sum(t in TEACHERS) teach(t,c,l) <= 1 ! Teacher teaches one course at a time forall(t in TEACHERS, l in SLOTS) sum(c in CLASS) teach(t,c,l) <= 1 ! Every subject only once per day forall(t in TEACHERS, c in CLASS, d in 0..ND-1) sum(l in d*NP+1..(d+1)*NP) teach(t,c,l) <= 1 ! Sport Thursday afternoon (slot 15) teach("Mr Muscle",1,15) = 1 teach("Mrs Biceps",2,15) = 1 ! No course during first period of Monday morning forall(t in TEACHERS, c in CLASS) teach(t,c,1) = 0 ! No course by Mr Effofecks Monday morning forall(l in 1..2) teach("Mr Effofecks",2,l) = 0 ! No Biology on Wednesday forall(c in CLASS, l in 2*NP+1..3*NP) teach("Mrs Insulin",c,l) = 0 forall(t in TEACHERS, c in CLASS, l in SLOTS) teach(t,c,l) is_binary ! Solve the problem minimize(Hole) end-model
14.3.3
Results
The optimal solution found has the value 10, indicating that 10 courses are scheduled in the slots at the beginning or the end of a day. The resulting timetables for the two classes displayed in Tables 14.7 and 14.8 have no holes. Note that there are many equivalent solutions to this problem.
Table 14.7: Timetable for class 1 8:0010:00 10:1512:15 14:0016:00 Biology (Mrs Insulin) Biology (Mrs Insulin) Hist.-Geogr. (Mr Map) Sport (Mr Muscle) Maths (Mrs Derivate) 16:1518:15 Physics (Mrs Electron) Physics (Mrs Electron) Physics (Mrs Electron) Philosophy (Mr Wise) Mon Homework Maths (Mrs Derivate) Tue English (Mr Cheese) Maths (Mrs Derivate) Wed Maths (Mrs Derivate) Thu Hist.-Geogr. (Mr Map) Fri Biology (Mrs Insulin)
Table 14.8: Timetable for class 2 8:0010:00 10:1512:15 14:0016:00 16:1518:15 Mon Homework Hist.-Geogr. (Mr Map) Tue Maths (Mr Effofecks) Wed Physics (Mrs Electron) Thu Physics (Mrs Electron) English (Mr Cheese) Fri Physics (Mrs Electron) Philosophy (Mr Wise) Maths (Mr Effofecks) Biology (Mrs Insulin) Hist.-Geogr. (Mr Map) Biology (Mrs Insulin) Maths (Mr Effofecks) Sport (Mrs Biceps) Biology (Mrs Insulin) Maths (Mr Effofecks)
219
14.4
Exam scheduling
At a technical university every term the third-year students choose eight modules from the eleven modules that are taught, depending on the option they wish to choose in the fourth year (there are two possible choices: Production planning and Quality and security management). In the current term, certain modules are obligatory for students who wish to continue with one of these options. The obligatory courses are Statistics (S), Graph models and algorithms (GMA), Production management (PM), and Discrete systems and events (DSE). The optional modules are: Data analysis (DA), Numerical analysis (NA), Mathematical programming (MP), C++, Java (J), Logic programming (LP), and Software engineering (SE).
Table 14.9: Incompatibilities between different exams DA DA NA C++ SE PM J GMA LP MP S DSE X X X X X NA X X X X X C++ X X X X X X X SE X X X X X X PM X X X X X X X X X X J X X X X X X X GMA X X X X X X X X X X LP X X X X MP X X X X X X S X X X X X X X X X X DSE X X X X X X X X X X
Mrs Edeetee needs to schedule the exams at the end of the term. Every exam lasts two hours. Two days have been reserved for the exams with the following time slices: 8:0010:00, 10:1512:15, 14:0016:00, and 16:1518:15. For every exam she knows the set of incompatible exams that may not take place at the same time because they have to be taken by the same students. These incompatibilities are summarized in Table 14.4.1. Help Mrs Edeetee construct a timetable so that no student has more than one exam at a time.
14.4.1
Model formulation
Let planet be binary variables that are 1 if the exam e is scheduled in time slice t and 0 otherwise. We shall write EXAM for the set of exams and TIME for the set of time slices. The mathematical model associated with the problem is the following: e EXAM :
tTIME
planet = 1
d, e EXAM, d < e INCOMPde = 1, t TIME : planet + plandt 1 e EXAM, t TIME : planet {0, 1}
This mathematical model does not contain any objective function since we simply wish to nd a solution that satises all incompatibility constraints. This does not cause any problem for the solution algorithm that will generate an arbitrary feasible solution (if one exists). We might however add an objective function, for instance by associating costs or preferences with the assignment of certain exams to certain time slices. The constraints (14.4.1) indicate that every exam needs to be scheduled exactly once. The constraints (14.4.2) require that two incompatible exams may not be scheduled at the same time. The incompatibilities are stored in a Boolean matrix INCOMP. An element INCOMPde of this matrix is 1 if the exams d and e are incompatible and 0 otherwise. Since the incompatibility matrix is symmetric for this problem, we only need to dene the constraints (14.4.2) for pairs of exams d and e with d < e. The last set of constraints (14.4.3) species that all variables are binaries. The problem is completely stated by the constraints (14.4.1) to (14.4.3). However, if this problem has a solution then it has an enormous number of equivalent (symmetric) solutions that are obtained by permutating the time slots assigned to compatible sets of exams. We may try to help the solution algorithm by adding constraints breaking some of these symmetries and hence reducing the size of the search space. For instance, we can assign DA to slot 1, and NA to slot 2 (since it is incompatible with DA). In fact, we can go further as PM is incompatible with DA and NA, so it can be assigned to slot 3. Similarly, GMA, S, and DSE must be given unique slots (4, 5, and 6) since they are incompatible with everything.
220
How useful these observations are in general is debatable, but breaking symmetry, if possible, is always a good idea.
14.4.2
Implementation
The mathematical model may be implemented with Mosel as shown below. The problem has no objective function but we wish to invoke the optimization algorithm for nding a feasible solution. We therefore simply indicate a constant (dummy) objective in the call to the optimizer instead of minimize we may also use maximize since we want to solve the problem without optimizing anything. We have not introduced the symmetry-breaking ideas discussed above.
model "I-4 Scheduling exams" uses "mmxprs" declarations EXAM = {"DA","NA","C++","SE","PM","J","GMA","LP","MP","S","DSE"} ! Set of exams TIME = 1..8 ! Set of time slots INCOMP: array(EXAM,EXAM) of integer ! Incompatibility between exams plan: array(EXAM,TIME) of mpvar end-declarations initializations from i4exam.dat INCOMP end-initializations ! Schedule all exams forall(e in EXAM) sum(t in TIME) plan(e,t) = 1 ! Respect incompatibilities forall(d,e in EXAM, t in TIME | d<e and INCOMP(d,e)=1) plan(e,t) + plan(d,t) <= 1 forall(e in EXAM, t in TIME) plan(e,t) is_binary ! Solve the problem (no objective) minimize(0) end-model ! 1 if exam in a time slot, 0 otherwise
14.4.3
Results
The linear relaxation of this problem gives an integer solution (this is not true in general). In the schedule displayed below only seven out of the eight available time intervals are used. This problem has a large number of different feasible solutions.
Table 14.10: Exam schedule 8:0010:00 Day 1 Day 2 NA, SE, LP, MP 10:1512:15 PM S 14:0016:00 GMA J 16:1518:15 DA, C++ DSE
221
Table 14.11: Unitary processing times Products P1 P2 P3 P4 L1 1.3 1.8 1.3 0.9 L2 0.9 1.7 1.2 1.1 Lines L3 2.0 1.4 1.3 1.0 L4 0.3 0.6 1.0 0.9 L5 0.9 1.1 1.4 1.0
Table 14.12: Possible transfers of personnel Origin L1 L2 L3 L4 L5 L1 no yes no yes Destination L2 L3 L4 yes yes no yes yes yes no yes yes no yes no L5 no yes no yes Maximum number of transferable hours 400 800 500 200 300
lines during the planning period as shown in Table 14.12, which is the maximum prot? How many hours are transfered and under what conditions?
14.5.1
Model formulation
Let PRODS be the set of products and LINES the set of production lines. The per unit prot of product p is given as PROFITp and the processing duration of product p on line l as DURpl . The capacity of every production line l in working hours is CAPl . As usual in production planning problems, a variables producep indicates the quantity of product p that is produced. The model corresponding to the rst question is fairly simple. The objective is to maximize the total prot (14.5.1) whilst remaining within the capacity limits of every production line (constraints (14.5.2)). We obtain the following model: maximize
pPRODS
l LINES :
p PRODS : producep 0
If it is now possible to transfer personnel from one line to another, variables hoursl are required that correspond to the working hours used on production line l. We also introduce variables transferlk that represent the number of hours transfered from line l to line k. The constraints (14.5.5) that replace the constraints (14.5.2) of the previous model specify that the number of hours worked is equal to the production multiplied by the per unit duration of the work. The constraints (14.5.7) establish the balance between the working hours carried out on a line, the hours transfered and the maximum number of working hours on this line. On one line, hoursl hours are worked that correspond to the available number of hours for this line, increased by the hours that are transfered to this line from other and decreased by the hours transfered to other lines (TRANSFlk is 1 if it is possible to transfer hours from line l to line k, 0 otherwise). The constraints (14.5.8) establish the limits TMAXl on the number of hours that may be transfered from a line to the others. The last two sets of constraints (14.5.9) and (14.5.10) are the non-negativity conditions for variables transferkl and hoursl . maximize
pPRODS
l LINES :
(14.5.7)
l LINES :
transferlk TMAXl
(14.5.8)
kLINES TRANSFlk =1
222
(14.5.9) (14.5.10)
14.5.2
Implementation
The following Mosel program implements and solves the models for both questions. First the model for question 1 is dened and solved. Then follow the additional declarations of data and variables required by the second model. For the second model, the capacity constraints Load of the rst model (14.5.2) are re-dened with the modied version required by the second model (14.5.5).
model "I-5 Production planning with personnel" uses "mmxprs" declarations PRODS = 1..4 LINES = 1..5 PROFIT: array(PRODS) of integer DUR: array(PRODS,LINES) of real CAP: array(LINES) of integer Load: array(LINES) of linctr produce: array(PRODS) of mpvar end-declarations initializations from i5pplan.dat PROFIT DUR CAP end-initializations ! Objective: Total profit Profit:= sum(p in PRODS) PROFIT(p)*produce(p) ! Capacity constraints on lines forall(l in LINES) Load(l):=sum(p in PRODS) DUR(p,l)*produce(p) <= CAP(l) ! Solve the problem maximize(Profit) writeln("Total profit: ", getobjval) ! **** Allow transfer of working hours between lines **** declarations TRANSF: dynamic array(LINES,LINES) of integer ! 1 if transfer is allowed, ! 0 otherwise TMAX: array(LINES) of integer ! Maximum no. of hours to transfer hours: array(LINES) of mpvar ! Initial working hours per line transfer: dynamic array(LINES,LINES) of mpvar ! Hours transferred end-declarations initializations from i5pplan.dat TRANSF TMAX end-initializations forall(k,l in LINES | exists(TRANSF(k,l))) create(transfer(k,l)) ! Re-define capacity constraints on lines forall(l in LINES) Load(l):=sum(p in PRODS) DUR(p,l)*produce(p) <= hours(l) ! Balance constraints forall(l in LINES) hours(l) = CAP(l) + sum(k in LINES) transfer(k,l) sum(k in LINES) transfer(l,k) ! Limit on transfer forall(l in LINES) sum(k in LINES) transfer(l,k) <= TMAX(l) ! Solve the problem maximize(Profit) writeln("Total profit allowing transfer: ", getobjval) end-model
! Set of products ! Set of production lines ! Profit per product ! Duration of production per line ! Working hours available per line ! Workload constraints ! Quantity produced
223
Note that the variables transfer in the second model are dened as a dynamic array, and only after the data indicating the allowable transfers (array TRANSF) is known do we create the transfer variables actually required. By proceeding in this way, we may remove the tests for the values of the entries of TRANSF from the various constraints since Mosel will automatically sum only those transfer variables that have been created.
14.5.3
Results
If no transfer of personnel (that is, working hours) between production lines is possible, the maximum prot is B 18,883. 1542.55 units of product P1 and 1010.64 units of P2 are produced, and nothing of the C other two products. When examining the capacity constraints for the production lines, we nd that only line 3 and 5 work at their maximum capacity. This indicates that a transfer of working hours may be protable. When the transfer of working hours between lines is allowed, the total prot increases to B 23,431.10. C The quantities to produce are now 702.35 units of P1, 942.82 of P2, 554.83 of P3, and 854.84 of P4. On production line 1 a total of 4100 hours are used and 400 hours are transfered to line 4. Production line 2 works for 3840.3 hours and 800 hours are transfered to line 5. Line 3 works during 4300 hours and 200 hours are transfered to line 4. On line 4, 600 hours are added to the original capacity of 1500 hours and for L5 the 800 hours transfered from line 2 result in a total working time of 3300 hours.
14.6
Overtime work is limited to 25% of the hours worked normally. Every month, at most three workers may arrive at the site. The departure to other sites is limited by agreements with labor unions to 1/3 of the total personnel of the month. We suppose that three steel erectors are already present on site at the end of February, that nobody leaves at the end of February and that three workers need to remain on-site at the end of August. Which are the number of arrivals and departures every month to minimize the total cost?
14.6.1
Model formulation
Let MONTHS be the set of months in the time period, numbered consecutively from FIRST to LAST. The different basic costs are denoted as follows: CARR and CLEAVE the cost of a person arriving and leaving respectively, COVER and CUNDER the cost of over- and understafng per person. NSTART and NFINAL respectively are the number of workers on-site at the beginning and end of the planning period. For every month m the personnel requirement REQm is given. Although it would be possible to formulate this model with fewer variables, we describe a formulation that uses ve types of variables indexed by the months to facilitate the modeling and provide all the details for the recruitment plan. In every month m, onsitem steel erectors are present (between the arrivals at the beginning of the month and the departures at its end). There are arrivem arrivals, leavem workers leaving, overm persons more than the required personnel and underm persons missing (14.6.1). m MONTHS : onsitem , arrivem , leavem , overm , underm IN (14.6.1)
For the rst month FIRST the total staff equals the initial staff plus the arrivals at the beginning of the month (14.6.2). After the last month LAST, the remaining personnel onsite equals the personnel present in the last month minus the departures at the end of this month (14.6.3). onsiteFIRST = NSTART + arriveFIRST NFINAL = onsiteLAST leaveLAST (14.6.2) (14.6.3)
224
For the intermediate months, the personnel on-site, the arrivals and departures are linked by a relation comparable to the stock balance constraints used for the production planning problems in Chapter 8 (14.6.4). m {FIRST + 1, . . . , LAST 1} : onsitem = onsitem1 leavem1 + arrivem (14.6.4) The number of workers present on-site may be different from the number of personnel actually required. But it becomes equal to the requirement if one deducts the overstafng and adds the missing persons (14.6.5). m MONTHS : onsitem overm + underm = REQm (14.6.5) For every month m, the constraints (14.6.6) formulate the limit on the hours worked overtime, the constraints (14.6.7) limit the number of arrivals and the constraints (14.6.8) the number of persons leaving the construction site. m MONTHS : overm onsitem / 4 m MONTHS : arrivem 3 m MONTHS : leavem onsitem / 3 (14.6.6) (14.6.7) (14.6.8)
The objective function (14.6.9) accumulates the costs of arrivals, departures, over- and understafng. Due to the minimization of the cost, there will never be over- and understafng at the same time in any month. minimize
mMONTHS
(14.6.9)
14.6.2
Implementation
In the following Mosel implementation of the mathematical model, the balance constraints (14.6.2) (14.6.4) are grouped into a single constraint expression using the inline if. Note further the index set MONTHS corresponding to the order numbers of the months (and not starting with 1) used for all arrays.
model "I-6 Construction site personnel" uses "mmxprs" declarations FIRST = 3; LAST = 8 MONTHS = FIRST..LAST CARR, CLEAVE: integer COVER, CUNDER: integer NSTART, NFINAL: integer REQ: array(MONTHS) of integer
! Set of time periods (months) ! ! ! ! Cost per arrival/departure Cost of over-/understaffing No. of workers at begin/end of plan Requirement of workers per month
onsite: array(MONTHS) of mpvar ! Workers on site arrive,leave: array(MONTHS) of mpvar ! Workers arriving/leaving over,under: array(MONTHS) of mpvar ! Over-/understaffing end-declarations initializations from i6build.dat CARR CLEAVE COVER CUNDER NSTART NFINAL REQ end-initializations ! Objective: total cost Cost:= sum(m in MONTHS) (CARR*arrive(m) + CLEAVE*leave(m) + COVER*over(m) + CUNDER*under(m)) ! Satisfy monthly need of workers forall(m in MONTHS) onsite(m) - over(m) + under(m) = REQ(m) ! Balances forall(m in MONTHS) onsite(m) = if(m>FIRST, onsite(m-1) - leave(m-1), NSTART) + arrive(m) NFINAL = onsite(LAST) - leave(LAST) ! Limits on departures, understaffing, arrivals; integrality constraints forall(m in MONTHS) do leave(m) <= 1/3*onsite(m) under(m) <= 1/4*onsite(m) arrive(m) <= 3
225
arrive(m) is_integer; leave(m) is_integer; onsite(m) is_integer under(m) is_integer; over(m) is_integer end-do ! Solve the problem minimize(Cost) end-model
14.6.3
Results
The optimal solution to this problem has a cost of $1,780. The following table contains the detailed recruitment plan (there are several equivalent solutions).
Table 14.14: Optimal plan for the construction site personnel Month Requirement On site Arrive Leave Overstafng Understafng Initial 3 0 0 0 0 March 4 4 1 0 0 0 April 6 6 2 0 0 0 May 7 6 0 0 0 1 June 4 6 0 0 2 0 July 6 6 0 2 0 0 August 2 4 0 1 2 0 Final 3 0 0 0 0
14.7
226
duration, shift planning, etc. It also has certain similarities with the problem of planning a eet of vans in Chapter 10.
227
Chapter 15
15.1
35 1 Reservoir 1
20 15 12
15 10 5 6
4 10 15 15 7
7 10
25 2 Reservoir 2 22 6
10
22
10
A study is undertaken to nd out whether the existing network will be able to satisfy the demands of the
228
cities in ten years time, that is 18, 15, and 20 thousand m3 /h. Determine the maximum ow in the current network. Will it be sufcient in ten years from now?
15.1.1
Model formulation
The problem consists of nding a ow through the given graph that best satises the needs of the three cities (nodes 8, 9, and 10) taking into account the availabilities at the reservoirs 1 and 2. This problem is a classical maximum ow problem. We start by transforming the graph by creating: a rst ctitious node called SOURCE (node 11 in Figure 15.2) connected to the reservoirs by two arcs (11,1) and (11,2) with capacities corresponding to the availability of water from the two reservoirs (35 and 25 thousand m3 /h); a second ctitious node called SINK (node 12 in Figure 15.2) to which the three cities are connected by three arcs (8,12), (9,12), and (10,12) with capacities corresponding to the cities requirement for water (18, 15, and 20 thousand m3 /h). The resulting graph (Figure 15.2) is a transport network G = (NODES, ARCS, CAP, SOURCE, SINK) in which: NODES is the set of nodes; ARCS is the set of arcs; CAPnm denotes the capacity of the arc a = (n, m); SOURCE is the source (node 11); SINK is the sink (node 12).
35 11 25
1 Reservoir 1
20 15 12
15 10 5 6
4 10 15 15 7
7 10
12
10 10 Spider Ville 20
2 Reservoir 2 22 6
22
10
Figure 15.2: Water transport network after addition of source and sink
SUCCn denotes the set of immediate successors of a node n and PREDn the set of its immediate predecessors. A ow of a total throughput TotalFlow in this transport network fullls the following constraints. (n, m) ARCS : ownm CAPnm n = SOURCE, SINK :
mSUCCn
(15.1.1) owmn
mPREDn
ownm = own,SINK
TotalFlow =
nPREDSINK
The constraints (15.1.1) indicate that the ow ownm on every arc (n, m) must not exceed the capacity CAPnm of this arc. The constraints (15.1.2) specify that the total ow arriving at any node n also has to leave this node (with the exception of the source and sink nodes). This condition is called Kirchhoffs law. The constraint (15.1.3) indicates that the total ow TotalFlow in the network equals the ow arriving at the sink (it is also equal to the ow leaving the source). Finally, the non-negativity constraints for the variables are given in (15.1.4). The problem that we need to solve corresponds to searching for the maximum ow between the nodes SOURCE and SINK, that is, a ow maximizing TotalFlow. Hence the very simple objective function (15.1.5): maximize TotalFlow (15.1.5)
229
It is quite obviously possible to let non-integer ows pass through the arcs. However, in this type of problem, the simplex algorithm automatically nds integer solution values in the optimal solution to the linear problem if all capacities are integer.
15.1.2
Implementation
In the Mosel implementation of this problem we represent the set of arcs as a list PIPE that denes every arc a ARCS in the form a = (PIPEa1 , PIPEa2 ). For efciency reasons, the arrays CAP and ow are indexed by the sequence number a of the arc, and not with the double index (n, m) indicating the two nodes connected by the arc a as in the mathematical formulation. This indexation allows us to dene these arrays exactly with the required size.
model "J-1 Water supply" uses "mmxprs" declarations ARCS: range NODES=1..12
! Set of arcs
PIPE: array(ARCS,1..2) of integer ! Definition of arcs (= pipes) CAP: array(ARCS) of integer ! Capacity of arcs SOURCE,SINK: integer ! Number of source and sink nodes end-declarations initializations from j1water.dat PIPE CAP SOURCE SINK end-initializations finalize(ARCS) declarations flow: array(ARCS) of mpvar end-declarations
! Flow on arcs
! Objective: total flow TotalFlow:= sum(a in ARCS | PIPE(a,2)=SINK) flow(a) ! Flow balances in nodes forall(n in NODES | n<>SOURCE and n<>SINK) sum(a in ARCS | PIPE(a,1)=n) flow(a) = sum(a in ARCS | PIPE(a,2)=n) flow(a) ! Capacity limits forall(a in ARCS) flow(a) <= CAP(a) ! Solve the problem maximize(TotalFlow) end-model
15.1.3
Results
17/20 31/35 11 21/25 2 Reservoir 2 15/22 1 Reservoir 1 3 7/15 10/10 10/10 5 6/6 6 15/15 7 5/15 0/10 9 Metropolis 10/10 10 Spider Ville 20/20 15/15 12 4 7/7 8 Gotham City 17/18
14/15 0/12
15/22
5/10
The maximum ow that may pass through the network is 52,000 m3 per hour. Figure 15.3 shows an
230
example how this ow may spread through the network (there are other equivalent solutions). In this gure, every arc is labeled with the ow passing through the arc followed by its capacity (both in m3 /h). for instance, the ow on the arc (1,3) is 17 and its capacity is 20. The total ow is not sufcient to satisfy all the demands in ten years time: with the given network layout and capacities, Gotham City will only receive 17,000 m3 of the required 18,000 m3 .
15.2
CCTV surveillance
In the course of the last few months, the industrial zone of Billston has suffered from a series of break-ins and thefts during the night. The zone is watched by security men but there are too few of them. The town council in charge of security in this zone decides to install surveillance cameras to aid the security men with their task. These cameras can be directed and pivot through 360 . By installing a camera at the intersection of several streets, it is possible to survey all adjoining streets. The map in Figure 15.4 shows the industrial zone with the limits of the zone to be covered by closed circuit TV (CCTV) surveillance and the 49 possible locations where to install the cameras. What is the minimum number of cameras that have to be installed to survey all the streets of this zone and where should they be placed?
36
46 45 35 37 44
48 47 49 43 42
24 27 26 17 18 25 19 20 15 13 12 3 9 4 6 16 11 10 5 7 21 23 22 30 28
34
29 33 31 38 41
14
32 39
40
2 8
15.2.1
Model formulation
The most fastidious task in this problem is the encoding of the map of the zone, but this step is necessary for any computerized solving of this problem. The set of possible locations of cameras (mostly street intersections) is denoted by NODES. The street network is modeled through a graph G = (NODES, STREETS), where the set STREETS corresponds to the links (streets) between the possible locations NODES of the cameras. We dene binary variables placen that are 1 if a camera is put up at location n and 0 otherwise. The
231
unique set of constraints (15.2.2) indicates that every street needs to be surveyed by at least one camera. Therefore, if a street exists between the two locations n and m, we need to have a camera in n (placen = 1) or m (placem = 1) or in both places. It is possible to cover a street by two cameras and this may pay in certain cases: in Figure 15.4 two cameras in locations 4 and 6 seem to be too much for the street but they also cover the three cul-de-sacs leading to 5, 7, and 8. The objective function (15.2.1) minimizes the total number of cameras to install. Once the graph is dened, we obtain a remarkably simple 0-1 integer program. minimize
nNODES
placen
15.2.2
Implementation
The undirected graph is encoded by a symmetric adjacency matrix STREET. STREETnm = 1 if the street (n, m) exists and 0 otherwise. This matrix is read from the data le in sparse format, that is, only the entries that are 1 are dened. To reduce the amount of data in the le, only the arcs (n, m) with n < m are given. The other half of the adjacency matrix is calculated in the Mosel program.
model "J-2 Surveillance" uses "mmxprs" declarations NODES=1..49 STREET: dynamic array(NODES,NODES) of integer
initializations from j2bigbro.dat STREET end-initializations forall(n,m in NODES | exists(STREET(n,m)) and n<m ) STREET(m,n):= STREET(n,m) ! Objective: number of cameras to install Total:= sum(n in NODES) place(n) ! Flow balances in nodes forall(n,m in NODES | exists(STREET(n,m)) ) place(n)+place(m) >= 1 forall(n in NODES) place(n) is_binary ! Solve the problem minimize(Total) end-model
15.2.3
Results
The optimization algorithm nds an integer solution with 24 cameras, the locations of which are marked with circles in Figure 15.5 (there are several equivalent solutions to this problem).
232
46 47 24 28 26 18 20 15 13 10 3 4 6 2 21 22 30 32 40 33 35 37 44 42
233
15.3
Rigging elections
In a country far away, the party of the duke Sark Mevo has nally beaten the ruling coalition headed by the princess Reguel Tekris. Mevo wishes to consolidate his position in the capital, the fourteen quarters of which need to be grouped to electoral districts. A schematic map of the capital is given in Figure 15.6. The quarters are numbered from 1 to 14 (bold print). The two other numbers are the forecast number of favorable votes for Mevo and the total number of electors per quarter. All electors must vote and the winner needs to have the absolute majority. A valid electoral district is formed by several adjacent quarters and must have between 30,000 and 100,000 voters. Two quarters that touch each other just at a point like 12 and 13 are not considered adjacent. Electoral districts consisting of a single quarter are permitted if it has at least 50,000 voters. Nevertheless, Mevo may not decently dene an electoral district solely with quarter 10, since this contains his residence. Determine a partitioning into ve electoral districts that maximizes the number of seats for Mevo. Should this cause any difculties, try a partitioning into six districts. Snirp, the mathematical jester, suggests Mevo uses Mathematical Programming...
1
17500/30000
7 6
9000/ 40000 12000/30000
2
15000/50000
8
10000/30000
9
26000/40000
5 3
14200/20000 18000/ 20000
11 10
34000/ 60000 2500/ 10000
12
27000/60000
4
42000/70000
13
29000/ 40000
14
15000/40000
Figure 15.6: Map of the capital and its quarters. Legend: quarter number, supporters/electorate
15.3.1
Model formulation
The problem we are concerned with here is a partitioning problem: given the set of all possible electoral districts, we have to choose a subset such that every quarter appears in a single chosen electoral district. Let QUARTERS be the set of all quarters of the capital, MINSINGLE the minimum size for an electoral district consisting of a single quarter and MINPOP and MAXPOP respectively the minimum and maximum sizes for districts formed from several quarters. The number of electors per quarter is given in POP. We may then calculate the complete set of electoral districts using the following algorithm: forall q in QUARTERS: if (electorate of q MINSINGLE and q = 10): add q to the list of districts forall neighbors p of q: if electorate of (p + q) MAXPOP: call add_neighbor(p, {q}) procedure add_neighbor(toadd, set) add toadd to set if electorate of set MINPOP: add set to the list of districts forall neighbors p of toadd: if electorate of (set {q}) MAXPOP: call add_neighbor(p, set) If the set of neighbors of every quarter is dened in such a way that it only contains those adjacent quarters with sequence numbers larger than the quarter itself, the algorithm calculates every possible electoral district exactly once. In the following we shall assume that the set RDIST of possible districts (there are 48 different ones in this example) has been saved in the form of an array DISTR. An entry DISTRdq of this array has the value
234
1 if quarter q is contained in district d and 0 otherwise. Based on the given forecasts of favorable votes per quarter, we can calculate the majority indicator MAJd for every district d. MAJd is 1 if the sum of favorable votes is at least 50% of the electorate of all quarters in this district (that is, Mevo has the absolute majority), and 0 otherwise. The formulation of this problem requires a binary variable choosed per possible district d that takes the value 1 if the district is chosen for the partitioning (15.3.3). The constraint (15.3.2) means that exactly REQD districts are formed, where REQD indicates the required number of districts. The objective function (15.3.1) consists of maximizing the number of seats in the chosen partitioning. maximize
dRDIST
MAJd choosed
choosed = REQD
dRDIST
Every quarter has to appear in exactly one district of the chosen partitioning. This constraint is expressed by (15.3.4). q QUARTERS : DISTRdq choosed = 1 (15.3.4)
dRDIST
After the corresponding data preprocessing, the mathematical model thus has a very simple form. It has the particularity of an entirely binary coefcient matrix and right hand side (constant terms).
15.3.2
Implementation
For claritys sake, the Mosel implementation of this problem is split into two les separating the data preprocessing from the model itself. In the following, we rst list the code implementing the mathematical model. At the beginning of this model, after the declaration of the data arrays, we include the le j3elect_calc.mos that generates the data in the form required for the model. Any code included into a Mosel program using the include statement is treated as if it were printed at this place in the program itself. In particular, the included code must not contain model "..." and end-model . The required number of districts REQD is dened as a parameter so as to enable the user to run this model for different values of REQD without having to modify the code.
model "J-3 Election districts" uses "mmxprs" parameters REQD = 5 end-parameters declarations QUARTERS = 1..14 RDIST: range
MAJ: array(RDIST) of integer ! 1 if majority of votes, 0 otherwise DISTR: array(RDIST,QUARTERS) of integer ! 1 if quarter is in district, ! 0 otherwise end-declarations include "j3elect_calc.mos" declarations choose: array(RDIST) of mpvar end-declarations
! Objective: number of votes Votes:= sum(d in RDIST) MAJ(d)*choose(d) ! Partitioning forall(q in QUARTERS) sum(d in RDIST) DISTR(d,q)*choose(d) = 1 ! Desired number of districts sum(d in RDIST) choose(d) = REQD forall(d in RDIST) choose(d) is_binary
235
! Solve the problem maximize(Votes) ! Solution printing if(getprobstat<>XPRS_OPT) then writeln("Problem is infeasible") else writeln("Total number of votes: ", getobjval) end-if end-model
In this model, we test the status of the optimizer (using function getprobstat) to decide whether to try printing a solution or not. If no optimal solution is available (XPRS_OPT), the problem may be infeasible (XPRS_INF), unbounded (XPRS_UNB) or the algorithm has not terminated (XPRS_UNF), for instance due to a time limit. The following Mosel procedures implement the algorithm described in Section 15.3.1. For every quarter of the capital, the data le contains the numbers of the voters POP and of the expected favorable votes VOTES, and the set of neighboring quarters with order numbers greater than the quarter itself. From this input, the procedure calculate_distr calculates the list DISTR of possible electoral districts. This procedure is called at the end of this piece of code to start the whole data preprocessing algorithm. After the list of possible electoral districts DISTR has been established, the majority indicator MAJ(d) for every entry d in this list is calculated.
declarations NUMD: integer RN: range NEIGHB: array(QUARTERS,RN) of integer POP: array(QUARTERS) of integer VOTES: array(QUARTERS) of real MINPOP,MAXPOP,MINSINGLE: integer end-declarations
! Number of possible districts ! Neighboring quarters ! ! ! ! Set of Number Number Limits neighboring quarters of electors (in 1000) of favorable votes (in 1000) on electors per district
initializations from j3elect_rev.dat NEIGHB POP VOTES MINPOP MAXPOP MINSINGLE end-initializations !**** Save a new entry in the list of districts **** procedure save_distr(sQ: set of integer) NUMD+=1 forall(q in sQ) DISTR(NUMD,q):=1 end-procedure !**** Add a neighboring quarter to the current set of quarters **** procedure add_neighb(toadd:integer, sQ:set of integer) declarations nQ: set of integer end-declarations nQ:=sQ+{toadd} if(sum(q in nQ) POP(q) >= MINPOP) then ! Large enough to form distr. save_distr(nQ) end-if forall(p in RN | exists(NEIGHB(toadd,p))) ! Try adding every neighbor if(sum(q in nQ) POP(q)+POP(NEIGHB(toadd,p))<=MAXPOP) then add_neighb(NEIGHB(toadd,p), nQ) end-if end-procedure !**** Calculate the list of possible districts **** procedure calculate_distr NUMD:=0 forall(q in QUARTERS) do if (POP(q) >= MINSINGLE and q<>10) then ! Single quarter districts save_distr({q}) end-if forall(p in RN | exists(NEIGHB(q,p))) ! Try adding every neighbor if(POP(q)+POP(NEIGHB(q,p))<=MAXPOP) then add_neighb(NEIGHB(q,p),{q}) end-if
236
end-do forall(d in 1..NUMD) ! Calculate majorities MAJ(d):= if(((sum(q in QUARTERS | DISTR(d,q)>0) VOTES(q)) / (sum(q in QUARTERS | DISTR(d,q)>0) POP(q)) >= 0.5), 1, 0) finalize(RDIST) end-procedure !**** Start the calculation of the list of possible districts **** calculate_distr
15.3.3
Results
The problem has no solution for REQD = 5. Snirp should have noticed this, as the total population is 540,000, and no district may have more than 100,000 electors; so obviously we need at least 6 districts. Mevo executes Snirp, and appoints Che Pike as Court Mathematician. We run the Mosel program a second time with REQD = 6. For this value we nd the partitioning represented in Figure 15.7: all but one district (grey shaded area) is favorable to Mevo.
1 6 2 8
5 3 4 10
11
12
13
14
15.4
Gritting roads
In the case of ice, all the streets of a village need to be gritted. A schematic map of the streets is given in Figure 15.8. The nodes correspond to street intersections, the arcs to the streets that need to be gritted. The arcs are labeled with the length of the street in meters.
150 230
140 130
100 100
165 5
160 6
200 7 109
190 8
180
174
185
190
12
237
The highway maintenance depot with the gritting truck is located at intersection number 1. The truck has a sufciently large capacity to grit all the streets during a single tour. Due to the one-way streets, it may be forced to pass several times through the same street that has already been gritted. Determine a tour for the gritting truck of minimum total length that passes through all streets. For bidirectional streets, both directions need to be gritted separately.
15.4.1
Model formulation
Let G = (ISEC, ARCS, LEN) be the directed graph of the street network. ISEC denotes the set of street intersections, ARCS the set of arcs, and LENij the length LENij of arc (i, j) in meters. The tour we are searching for corresponds to a circuit that starts and nishes at the depot node 1, passes at least once over every arc and has a minimum total length. This classical problem is called the Chinese postman problem because it was rst solved by a Chinese mathematician, Mei-Ko Kuan [Kua62]. A Eulerian circuit in a directed graph is a circuit that visits every arc exactly once. If a Eulerian circuit exists, then this is an optimal tour since it is equal to the sum of all arc lengths. A simple test exists to nd out whether G may contain a Eulerian circuit: every node i needs to be equilibrated, that is the number of arcs arriving at i and leaving i must be equal, see for instance Gibbons [Gib85]. This test must not be confused with the better known case of undirected graphs in which a Eulerian circuit exists if and only if either 0 or 2 nodes are of odd degree. The graph G of this problem does not have a Eulerian circuit because among others the node 1 is not equilibrated. The circuit will thus re-use streets that are already gritted. The objective is to minimize the total length of such unproductive stretches. Formulating a mathematical model that directly deals with this problem is possible, but difcult. We are going to overcome this difculty by dealing with a simpler problem, namely the problem of transforming G into a Eulerian graph G by adding copies of arcs to equilibrate the nodes, whilst minimizing the total length of these copies. It then sufces to extract a Eulerian circuit from G , a task for which simple algorithms exist. The problem of equilibrating the graph at minimum cost is modeled by a fairly simple mathematical model. For every arc (i, j) in ARCS, an integer variable useij is dened that indicates the number of times the tour uses this arc (15.4.3). This number includes one pass for gritting the arc, plus possible other unproductive passages (copies of arcs). Since the gritting of the arc is obligatory, the useij are at least 1. The constraints (15.4.2) imply that the transformed graph G must have equilibrated nodes. These constraints are similar to Kirchhoffs law used in ow problems, such as water conveyance in Section 15.2. The objective function (15.4.1) is to minimize the total length driven. minimize
(i,j)ARCS
i ISEC :
It is in fact not necessary to specify that the variables are integer because the matrix of this model is a node-arc incidence matrix. The simplex algorithm will automatically nd an integer solution. The optimization provides the optimal length and the number of times useij an arc is used. We could stop there if the exact composition of the tour was not part of the question to answer. We obtain the Eulerian graph G by adding useij 1 copies to every arc (i, j). The rst pass for gritting the street is already represented by the existing example of the arc. To obtain a Eulerian circuit, a procedure add_path(i,tour) is used. Starting from a node i, it consists of using arcs that have not yet been used as far as possible. An arc that has been visited is marked to avoid re-using it. At the end, the procedure returns the obtained tour tour. It is possible to show that tour always stops at the end in i and forms a circuit. The procedure add_path is rst applied at the depot node 1. If tour visits all the arcs of G , this is a Eulerian circuit. Otherwise, we increase tour by executing add_path from a node in tour that still has free arcs to visit. The implementation of this algorithm is given after the Mosel implementation of the mathematical model in the following section. The following is pseudo-code for the algorithm implemented with Mosel: Call add_path(1,tour) As long as the tour does not visit all arcs: Search the rst node i in tour from which non-visited arcs leave Call add_path(i,tour)
238
procedure add_path(node,tour) Determine the insertion position pos Find an unused path subtour starting from and returning to node Add the new path subtour to the main tour tour at position pos
15.4.2
Implementation
The mathematical model translates into the following Mosel program. As we have seen, a graph may be encoded in two different ways: in the form of a list of arcs or as an adjacency matrix. The rst method is used in this book, for instance, for the opencast mining problem in Section 6.5, the assembly line balancing problem in Section 7.6, and the composition of ight crews in Section 11.2. The second matrix-based representation that is employed here also nds use in the network reliability problem in Section 12.1 and the CCTV surveillance problem of Section 15.2. The graph is dened by the matrix of arc lengths LEN, with LENij = 0 if arc (i, j) does not exist. The graph is given in sparse format in the data le (that is, it contains only the values of non-zero entries with the corresponding index tuples). By dening LEN as a dynamic array, only the entries that are listed in the data le will actually be created so that we can use the function exists on this array to test the existence of a street (and at the same time, to enumerate the dened entries of LEN efciently). The variables use are created after reading the data, only for the existing entries of LEN. It is not required to repeat the lter exists(LEN(i,j))) every time we dene sums with these variables: Mosel automatically skips the undened entries.
model "J-4 Gritting circuit" uses "mmxprs" declarations ISEC = 1..12 LEN: dynamic array(ISEC,ISEC) of integer use: dynamic array(ISEC,ISEC) of mpvar end-declarations initializations from j4grit.dat LEN end-initializations forall(i,j in ISEC | exists(LEN(i,j))) create(use(i,j)) ! Objective: length of circuit Length:= sum(i,j in ISEC | exists(LEN(i,j))) LEN(i,j)*use(i,j) ! Balance traffic flow through intersections forall(i in ISEC) sum(j in ISEC) use(i,j) = sum(j in ISEC) use(j,i) ! Grit every street forall(i,j in ISEC) use(i,j) >= 1 ! Solve the problem minimize(Length) end-model
The variables useij indicate the number of times the truck passes through a street, but what we really want to know is the complete tour it has to drive to grit all streets. To print the result for this problem in a useful form, we need to calculate a Eulerian circuit. This may be done by adding the following lines to the program above. This code fragment implements the algorithm outlined in the previous section. The procedure add_path has been turned into a function that returns the number of arcs in the new (sub)tour. We dene a counter ct to control when all arcs of the Eulerian graph G calculated by the optimization have been used. Its value is initially set to the result of the optimization and decreased by the number of arcs added as subtours to the main tour. The algorithm stops when the counter is at 0.
forward function find_unused(J: array(range) of integer):integer forward function add_path(node:integer, J: array(range) of integer):integer ct:=round(getsol(sum(i,j in ISEC) use(i,j)))
239
declarations TOUR: array(1..ct+1) of integer COUNT: array(ISEC,ISEC) of integer end-declarations ! Main loop of the Eulerian circuit algorithm forall(i,j in ISEC | exists(LEN(i,j))) COUNT(i,j):=round(getsol(use(i,j))) TOUR(1):=1 ct-=add_path(1,TOUR) while(ct>0) ct-=add_path(find_unused(TOUR),TOUR) writeln("Tour: ", TOUR) !----------------------------------------------------------------! Find first node in list with free path(s) function find_unused(J: array(range) of integer):integer i:=1 returned:=1 while(J(i)>0 and i<getsize(J)) if (sum(j in ISEC) COUNT(J(i),j) > 0) then returned:=J(i) break else i+=1 end-if end-function !----------------------------------------------------------------! Add a subtour to the current tour function add_path(node:integer, J: array(range) of integer):integer declarations NEWJ: array(1..getsize(J)) of integer end-declarations ! Insertion position pos:=1 while(J(pos)<>node and pos<getsize(J)) pos+=1 ! Find a new path cur:=node; newct:=0 while(sum(j in ISEC) COUNT(cur,j) > 0) do forall(j in ISEC) if(COUNT(cur,j) > 0) then COUNT(cur,j)-=1 newct+=1; NEWJ(newct):=j cur:=j break end-if end-do ! Add the new path to main journey i:=getsize(J)-newct while(i>pos) do J(i+newct):=J(i) i-=1 end-do forall(j in 1..newct) J(pos+j):=NEWJ(j) returned:=newct end-function
15.4.3
Results
The optimization nds a tour of length 5990 meters. All arcs are used once except for the following that are used twice: (3,4), (4,8), (5,1), (5,6), (6,9), (10,6), (11,7). Figure 15.9 shows the resulting Eulerian graph G ; arcs that are doubled (used twice) are printed with thick lines. A Eulerian circuit in this graph is the tour 1 2 6 5 6 7 8 12 11 7 11 10 7 3 4 3 4 8 4 8 11 7 6 9 5 6 9 10 6 10 6 2 3 2 5 1 5 1 (there are several equivalent tours).
240
10
11
12
15.5
15 1 15
10 2 5 5 15 16 8 12 30 25 10 22 11 19 19 24 22 16
12 3 18
18 4
18 11 7
24
20 24 13 9 19 12 20 22 12 6
12
22
19
21
15.5.1
Model formulation
We are dealing here with a classical problem called the p-median problem. Let CITIES denote the set of cities in the region and NUMLOC the number of ofces to install. We write POPc for the population of city c. The lengths of the shortest paths between cities are given by a distance matrix DIST shown in the following table. The distance matrix can be calculated from the graph in Figure 15.10 by an all-pairs shortest path algorithm like the Floyd-Warshall algorithm [AMO93]: For all node pairs (c, d): initialize the distance label DISTcd with plus innity (a sufciently large positive value) For all nodes c: set DISTcc := 0 For all arcs a = (c, d): set DISTcd to the length of the arc
241
For all nodes b, c, d: if DISTcd > DISTcb + DISTbd : set DISTcd := DISTcb + DISTbd For the formulation of the problem two groups of binary variables are necessary: a variable buildc that is 1 if and only if a tax ofce is established in city c (15.5.1), and a variable dependcd that equals 1 if the city c depends on the ofce in city d (15.5.2). The variables dependcd are required for calculating the average distance per inhabitant and to nd out which city depends on which ofce. c CITIES : buildc {0, 1} c, d CITIES : dependcd {0, 1} (15.5.1) (15.5.2)
NUMLOC ofces should be opened, which is expressed by the constraint (15.5.3). The constraints (15.5.4) indicate that every city depends on a single ofce. buildc = NUMLOC
cCITIES
(15.5.3) (15.5.4)
c CITIES :
dCITIES
dependcd = 1
The objective function (15.5.5) to be minimized is the total distance weighted by the number of inhabitants of the cities. We need to divide the resulting value by the total population of the region to obtain the average distance per inhabitant to the closest income tax ofce. minimize
cCITIES dCITIES
(15.5.5)
If we stop here, we risk assigning cities to tax ofces that do not exist! We make this impossible by translating the implication buildc = 0 dependcd = 0 into a linear constraint. From this result the constraints (15.5.6): buildc at 0 forces dependcd to be 0. c, d CITIES : dependcd buildd (15.5.6)
15.5.2
Implementation
The following Mosel program implements the mathematical model of the previous section. In theory it is necessary to dene all the variables as binaries, but one may try to solve the problem by omitting these constraints for the dependcd variables to reduce the total number of integer variables.
model "J-5 Tax office location" uses "mmxprs" forward procedure calculate_dist declarations CITIES = 1..12
! Set of cities
242
POP: array(CITIES) of integer ! Population of cities LEN: dynamic array(CITIES,CITIES) of integer ! Road network NUMLOC: integer ! Desired number of tax offices build: array(CITIES) of mpvar ! 1 if office in city, 0 otherwise depend: array(CITIES,CITIES) of mpvar ! (c,d) 1 if city c depends on office ! in city d, 0 otherwise end-declarations initializations from j5tax.dat LEN POP NUMLOC end-initializations ! Calculate the distance matrix calculate_dist ! Objective: weighted total distance TotDist:= sum(c,d in CITIES) POP(c)*DIST(c,d)*depend(c,d) ! Assign cities to offices forall(c in CITIES) sum(d in CITIES) depend(c,d) = 1 ! Limit total number of offices sum(c in CITIES) build(c) <= NUMLOC ! Relations between dependencies and offices built forall(c,d in CITIES) depend(c,d) <= build(d) forall(c in CITIES) build(c) is_binary ! Solve the problem minimize(TotDist) end-model
The Floyd-Warshall algorithm for nding the shortest distance between every pair of nodes is implemented with procedure calculate_dist.
procedure calculate_dist ! Initialize all distance labels with a sufficiently large value BIGM:=sum(c,d in CITIES | exists(LEN(c,d))) LEN(c,d) forall(c,d in CITIES) DIST(c,d):=BIGM ! Set values on the diagonal to 0 forall(c in CITIES) DIST(c,c):=0 ! Length of existing road connections forall(c,d in CITIES | exists(LEN(c,d))) do DIST(c,d):=LEN(c,d) DIST(d,c):=LEN(c,d) end-do ! Update shortest distance for every node triple forall(b,c,d in CITIES | c<d ) if DIST(c,d) > DIST(c,b)+DIST(b,d) then DIST(c,d):= DIST(c,b)+DIST(b,d) DIST(d,c):= DIST(c,b)+DIST(b,d) end-if end-procedure
15.5.3
Results
Without specifying that the variables dependcd are binary, luckily the optimizer nds a solution with all variables taking integer values and a total weighted distance of 2438. Since the region has a total of 185,000 inhabitants, the average distance per inhabitant is 2438/185 13.178 km. The three ofces are established at nodes 1, 6, and 11. The rst serves cities 1,2,5,7, the ofce in 6 cities 3,4,6,9, and the ofce in 11 cities 8,10,11,12.
243
15.6
Efciency of hospitals
The administration of the hospitals in Paris decides to measure the efciency of the surgery departments in four major hospitals with a desire to improve the service to the public. To keep this study anonymous, the hospitals are named H1 to H4. The method suggested to measure the efciency is DEA (Data Envelopment Analysis). This method compares the performance of a ctitious hospital with the performances of the four hospitals. Three initial indicators (resources) are taken into account: the number of non-medical personnel, the general expenses, and the available number of beds. In addition, four nal indicators (services) are analyzed: the number of hospital admissions per day, the number of consultations in the outpatients clinic, the number of nurses on duty every day, and the number of interns and doctors on duty every day. The corresponding data have been analyzed over a period of two years and the numbers representing a day of average activity in every hospital are given in the following two tables.
Table 15.2: Resource indicators H1 Non-medical personnel General expenses (in kB) C Number of beds 90 38.89 34 H2 87 109.48 33 H3 51 40.43 20 H4 66 48.41 33
Table 15.3: Service indicators H1 Admissions Consultations Interns and doctors Nurses on duty 30.12 13.54 13 79 H2 18.54 14.45 7 55 H3 20.88 8.52 8 47 H4 10.42 17.74 26 50
Justify through the DEA method how hospital H2 is performing compared to the others.
15.6.1
Model formulation
15.6.1.1 General idea of the DEA method
To use the DEA method and measure the efciency of a hospital, we need to develop a mathematical model for every hospital that is to be evaluated. Hospital H2 is used here as an example, but the procedure for measuring the performance of the other hospitals would be similar. By using Mathematical Programming we are going to construct a ctitious hospital based on the data from the four hospitals. The service indicators of the ctitious hospital will be weighted sums of the service indicators of the hospitals H1 to H4. Similarly, the resource indicators will be weighted sums of the resource indicators of the four hospitals, always using the same coefcients. The service indicators of the ctitious hospital must be larger than those of the hospital H2. If they are smaller, then the ctitious hospital requires less resources than H2 for a service that is at least equivalent. In other words, hospital H2 is less performing than the ctitious hospital and hence less performing than the other hospitals.
(15.6.1)
The constants INDSERVsh represent the service indicator s of every hospital h (given in Table 15.3). The index s takes its value in the set SERV of service indicator types. Similarly, INDRESrh represents the indicator for resource r of hospital h (data given in Table 15.2), where r ranges over the set RES of resource indicator types. To simplify the model formulation, we introduce variables fservs and fresr for the sums
244
weighted by the coefcients coefh for every service and resource indicator type, constraints (15.6.2) and (15.6.3). s SERV :
hHOSP
(15.6.2) (15.6.3)
r RES :
hHOSP
The variables fservs (service indicators of the ctitious hospital) must be larger than the service indicators of the hospital h for which we wish to evaluate the performance. The constraints (15.6.4) establish these relations for all service types in SERV. s SERV : fservs INDSERVsh (15.6.4)
The weighted sum of the resource indicators fresr (that is, the resource indicators of the ctitious hospital) will not be compared directly with the value of the resource indicators of hospital h , but with a fraction eff of these indicators. The constraints (15.6.5) link the coefcients coefh and this new variable eff. The sense of the inequality has to be less than or equal to since we are trying to show that the hospital h uses less resources than the ctitious hospital. To give a numerical example, the number of beds in hospital h is 33. In this case 33 eff corresponds to the number of beds in the ctitious hospital. If eff = 1 then the number of beds available in the ctitious hospital is identical to that of hospital h . If eff is larger than 1, then the ctitious hospital uses more beds than the hospital h and in the opposite case, the hospital h is performing worse than the ctitious hospital for this resource. r RES : fresr INDRESrh eff (15.6.5)
If a solution exists with eff < 1, this means that the ctitious hospital needs less resources than the hospital h. The objective function (15.6.6) for the DEA method minimizes the value of eff, that is, the resources required by the ctitious hospital. To complete the mathematical model, we need to add the non-negativity constraints (15.6.7) to (15.6.10) for all variables. minimize eff h HOSP : coefh 0 eff 0 s SERV : fservs 0 r RES : fresr 0 (15.6.6) (15.6.7) (15.6.8) (15.6.9) (15.6.10)
15.6.2
Implementation
The following Mosel implementation of the mathematical model solves the problem for every hospital in the set HOSP. The constraint on the sum of the DEA coefcients (15.6.1) and the relations dening the service and resource indicators of the ctitious hospital (constraints (15.6.2) and (15.6.3)) are stated only once. The denition of all constraints referring to a specic hospital (namely constraints (15.6.4) and 15.6.5) is replaced in every new execution of the loop by the corresponding constraints for the hospital that is to be evaluated. To be able to replace (and hence delete) a constraint in the problem held in Mosel, it needs to be named as shown in the following program for LimServ and LimRes. (The declaration of constraints is optional, but it is recommended for efciency reasons if the array sizes are known like in this example).
model "J-6 Hospital efficiency" uses "mmxprs" declarations HOSP = 1..4 SERV: set of string RES: set of string INDSERV: array(SERV,HOSP) of real INDRES: array(RES,HOSP) of real end-declarations initializations from j6hospit.dat INDSERV INDRES end-initializations
! Set of hospitals ! Service indicators ! Resource indicators ! Service indicator values ! Resource indicator values
245
finalize(SERV); finalize(RES) declarations eff: mpvar coef: array(HOSP) of mpvar fserv: array(SERV) of mpvar fres: array(RES) of mpvar LimServ: array(SERV) of linctr LimRes: array(RES) of linctr end-declarations ! DEA coefficients sum(h in HOSP) coef(h) = 1 ! Relations between service and resource indicators forall(s in SERV) fserv(s) = sum(h in HOSP) INDSERV(s,h)*coef(h) forall(r in RES) fres(r) = sum(h in HOSP) INDRES(r,h)*coef(h) ! Solve the problem for every hospital forall(h in HOSP) do ! Limits on services and resources for the hospital currently looked at forall(s in SERV) LimServ(s):= fserv(s) >= INDSERV(s,h) forall(r in RES) LimRes(r):= fres(r) <= INDRES(r,h)*eff ! Minimize efficiency index minimize(eff) writeln("Evaluation of hospital ", h, ": ", getobjval) end-do end-model
! ! ! ! ! !
Efficiency value Coefficients for DEA method Service indicator of fict. hospital Resource indicator of fict. hospit. Hospital-specific service constr. Hospital-specific resource constr.
15.6.3
Results
The program nds efciency values 1 for the hospitals 1, 3, and 4, so these hospitals have the same performance as the ctitious hospital. For hospital 2, the algorithm returns a value of 0.921. This means that the ctitious hospital reaches the same level of services with only approximately 92% of the resources used by hospital 2. In other words, hospital 2 performs less well than the other hospitals in the study. For every evaluation run, the coefcients coefh represent the proportions of the four hospitals that form the ctitious hospital.
15.7
246
Beasley for the covering problem [Bea87] and Fisher [FK90] for both types of problem. The book by Syslo describes heuristics and exact tree search methods for both problem types, with Pascal source code [SDK83]. Very efcient heuristics guided by the Linear Programming relaxations have recently been suggested for very large size covering problems [CFT99]. The Chinese Postman problem seen in Section 15.4 for gritting the streets of a village also exists for undirected graphs. Edmonds and Johnson give efcient polynomial algorithms for the directed and undirected case [EJ73]. Pascal source code for the extraction of Eulerian circuits and the directed Chinese Postman are provided in the book by Prins [Pri94a]. The Chinese Postman problem becomes a Rural Postman problem if only a subset of the arcs needs to be visited. If quantities are added that need to be distributed over the arcs and if trucks of limited capacity are available and several tours are necessary we obtain a Capacitated Arc Routing Problem (CARP). The rural postman and the CARP are NP-hard problems. Numerical examples and heuristics are given in the book by Evans and Minieka [EM92]. Hertz et al. describe local search procedures for the rural postman [HLNH99] and a tabu search methods for the CARP [HLM00]. Location problems like the placement of income tax ofces (Section 15.5) form a rich class of combinatorial problems to which the book by Daskin is entirely dedicated [Das95]. The problem of p-centers is another classical one that differs from the p-median problem in its objective that consists of minimizing the maximum distance between an ofce and a city. This book contains other problems of this type, like the depot location one in Chapter 10 and the choice of locations for mobile phone transmitters in Chapter 12. The DEA (Data Envelopment Analysis) method from Section 15.6 is widely used for comparing the performances related to several almost identical environments. The rst applications were indeed to measure the efciency of a hospital. Other applications and examples for this methods may be found in Sherman [She84] and Lewin et al. [LM81]. A recent book by Cooper et al. gives a very complete overview of the DEA method and its numerous applications [CST99].
247
Bibliography
[AA95] [AC91] [AD93] E. D. Andersen and K. D. Andersen. Presolving in Linear Programming. Mathematical Programming, 71(2):221245, 1995. D. Applegate and W. Cook. A Computational Study of the Job-Shop Scheduling Problem. ORSA Journal on Computing, 3(2):149156, 1991. R. W. Ashford and R. C. Daniel. Mixed-Integer Programming in Production Scheduling: A Case Study. In T. Ciriani and R. C. Leachman, editors, Optimization in Industry, pages 231239, New York, 1993. John Wiley & Sons. R. K.. Ahuja, T. L. Magnanti, and J. B. Orlin. Network Flows. Theory, Algorithms and Applications. Prentice Hall, Englewood Cliffs, NJ, 1993. A. Arbel. Exploring Interior-Point Linear Programming: Algorithms and Software. The MIT Press, 1993.
[AMO93] [Arb93]
[ARVK89] I. Adler, M. Resende, G. Veiga, and N. Karmarkar. An Implementation of Karmarkars Algorithm for Linear Programming. Mathematical Programming, 44:297335, 1989. [Baa88] [BC96] [BDB95] S. Baase. Computer Algorithms. Addison-Wesley, 1988. J. E. Beasley and B. Cao. A Tree Search Algorithm for the Crew cheduling Problem. European Journal of Operational Research, 94:517526, 1996. H. Beringer and B. De Backer. Combinatorial Problem Solving in Constraint Logic Programming with Cooperating Solvers. In C. Beierle and L. Plmer, editors, Logic Programming: Formal Methods and Practical Applications, pages 245272, Amsterdam, 1995. Elsevier Science B. V./North-Holland.
[BDGP95] P. Boizumault, Y Delon, C. Guret, and L. Pridy. Rsolution de problmes en Programmation Logique avec Contraintes. Revue dIntelligence Articielle, 9(3):383406, 1995. [Bea59] [Bea87] E. M. L. Beale. On Quadratic Programming. Naval. Res. logist. Q., 6:227243, 1959. J. E. Beasley. An Algorithm for Set Covering Problems. European Journal of Operational Research, 31:8593, 1987.
[BESW93] J. Bazewicz, K. Ecker, G. Schmidt, and J. Weglarz. Scheduling in Computer and Manufacturing Systems. Springer, Berlin , Heidelberg, 1993. [BF76] [BHJS95] [BJ90] [BJN+ 98] [BK98] [BKSA00] [BL83] [BMR94] [BN96] E. M. L. Beale and J. J. H. Forrest. Global Optimization Using Special Ordered Sets. Mathematical Programming, 10(1):5269, 1976. C. Barnhart, C. A. Hane, E. L. Johnson, and G. Sigismondi. A Column Generation and Partitioning Approach for Multi-commodity Flow Problems. Telecommunication Systems, 3:239258, 1995. M. S. Bazaraa and J. J. Jarvis. Linear Programming and Network Flows. Wiley, 1990. C. Barnhart, E. L. Johnson, G. L. Nemhauser, M. W. P. Savelsbergh, and P. H. Vance. Branch-and-Price: Column Generation for Solving Huge Integer Programs. Operations Research, 46(3):316329, 1998. A. Bockmayr and T. Kasper. Branch and Infer: A Unifying Framework for Integer and Finite Domain Constraint Programming. INFORMS Journal on Computing, 10(3):287300, 1998. J. E. Beasley, M. Krishnamoorthy, Y. M. Sharaiha, and D. Acramson. Scheduling Aircraft Landings the Static Case. Transportation Science, 34:180197, 2000. E. Balas and P. R. Landweer. Trafc Assignment in Communication Satellites. Operation Research Letters, 2(4):141147, 1983. L. Bianco, A. Mingozzi, and S. Ricciardelli. A Set Partitioning Approach to the Multiple Depot Vehicle Scheduling Problem. Optimization Methods and Software, 3:163194, 1994. J. P. Boufet and S. Ngre. Three Methods Used to Solve an Examination Timetabling Problem. In E.K. Burke and P. Ross, editors, Practice and Theory of Automated Timetabling, pages 327344. Springer-Verlag Lecture Notes in Computer Science, 1996. E. H. Bowman. Production Scheduling by the Transportation Method of Linear Programming. Operations Research, 4(1):100103, 1956. E. S. Buffa and R. K. Sarin. Modern Production/Operations Management. Wiley, 1987. E. M. L. Beale and J. A. Tomlin. Special Facilities in a General Mathematical Programming System for Nonconvex Problems Using Ordered Sets of Variables. In J. Lawrence, editor, Operational Research 69, pages 447454. Tavistock Publishing, London, 1970. E. S. Buffa and W. Taubert. Production-Inventory Systems: Planning and control (3rd Ed.). Homewood III, R.D. Irwin, 1979.
[BT79]
248
C. Chu and J. Antonio. Approximation Algorithms to Solve Real-Life Multicriteria Cutting Stock Problems. Operations Research, 47(4):495508, 1999. J. F. Campbell. Hub Location and the p-hub Median Problem. Operations Research, 44(6):923935, 1996. D. Candea. Issues of Hierarchical Planning in Multistage Production Systems. Technical Report 134, Operations Research Center, MIT, Cambridge, Mass., USA, 1977. J. Carlier and P. Chrtienne. Problmes dordonnancement : modlisation / complexit / algorithmes. Masson, 1988. J. Carlier, Chrtienne, J. Erschler, C. Hanen, P. Lopez, A. Munier, E. Pinson, M.-C. Portmann, C. Prins, C. Proust, and P. Villon. Les problmes dordonnancement. RAIRO-Recherche Oprationnelle, 27(1):77150, 1993. G. Cornuejols and M. Dawande. A Class of Hard Small 0-1 Programs. INFORMS Journal on Computing, 11(2):205210, 1999. A. Caprara, M. Fischetti, and P. Toth. A Heuristic Method for the Set Covering Problem. Operations Research, 47(5):730743, 1999. E. G. Coffman, M. R. Garey, and D. S. Johnson. Approximation Algorithms for Bin-packing: a Survey. In D. Hochbaum, editor, Approximation Algorithms for NP-Hard Problems, pages 4693. PWS Publishing, Boston, 1996. J. A. Clark and N. A. J. Hastings. Decision Networks. Operations Research Quaterly, 20:5168, 1977. Y. Colombani and S. Heipcke. Mosel: An Extensible Environment for Modeling and Programming Solutions. In N. Jussien and F. Laburthe, editors, Proceedings of CP-AI-OR02, pages 277290, Le Croisic, March 2002. V. Chvtal. Linear Programming. W.H. Freeman, 1983. P. Chan, K. Heus, and G. Weil. Nurse Scheduling with Global Constraints in CHIP: GYMNASTE. In Proceedings of the Fourth International Conference on the Practical Application of Constraint Technology, PACT98, pages 157169, London, UK, March 1998. The Practical Application Company. M. W. Carter and G. Laporte. Recent Development in Practical Examination Timetabling. In E.K. Burke and P. Ross, editors, Practice and Theory of Automated Timetabling, pages 321. Springer-Verlag Lecture Notes in Computer Science, 1996. T. H. Cormen, C. L. Leiserson, and R. L. Rivest. Introduction to Algorithms. MIT Press and McGraw-Hill, New York, 1990.
[CL96]
[CLR90]
[CMT79a] N. Christodes, A. Mingozzi, and P. Toth. Loading Problems. In N. Christodes and al., editors, Combinatorial Optimization, pages 339369. Wiley, 1979. [CMT79b] N. Christodes, A. Mingozzi, and P. Toth. The Vehicle Routing Problem. In N. Christodes and al., editors, Combinatorial Optimization, pages 315338. Wiley, 1979. [CST99] [CW64] [Dan63] [Das95] [DDS92] [DE73] [DK99] [DPL94] [DW97] [DZ78] [EJ73] [EM92] [Erl78] [Eva64] [FF67] W. W. Cooper, L. M. Seiford, and K. Tone. Data Envelopment Analysis. Kluwer, 1999. G. Clarke and J. W. Wright. Xheduling of Vehicles from a Central Depot to a Number of Delivery Points. Operations Research, 12(4):568581, 1964. G. B. Dantzig. Linear Programming and Extensions. Princeton University Press, Princeton, NJ, 1963. M. S. Daskin. Network and Discrete Location. Wiley, 1995. M. Desrochers, J. Desrosiers, and M. Solomon. A New Optimization Algorithm for the Vehicle Routing Problem with Time Windows. Operations Research, 40(2):342354, 1992. E. M. Dar-El. MALB, a Heuristic Technique for Balancing Large Scale Single-Model Assembly Lines. AIIE Transactions, 5(4):, 1973. A. Dutta and P. Kubat. Design of Partially Survivable Networks for Cellular Telecommunications Systems. European Journal of Operational Research, 118(1):5264, 1999. S. Dauzre-Prs and J. B. Lasserre. An Integrated Approach in Production Planning and Schedulin. In Lecture Notes in Economics and Mathematical Systems 411. Springer-Verlag, 1994. D. De Werra. The Combinatorics of Timetabling. European Journal of Operational Research, 96(3):504513, 1997. U. Derigs and U. Zimmerman. An Augmenting Path Method for Solving Linear Bottleneck Assignment Problems. Computing, 19:285295, 1978. J. Edmonds and E. L. Johnson. Matching, Euler Tours, and the Chinese Postman. Mathematical Programming, 5:88124, 1973. J. E. Evans and E. Minieka. Optimization Algorithms for Networks and Graphs. Marcel Dekker Inc., 1992. D. Erlenkotter. A Dual-Based Procedure for Uncapacited Facility Location. Operations Research, 26:992 1009, 1978. H. F. Evart. Introduction to PERT. Allyn & Bacon, 1964. L. Ford and D. Fulkerson. Flots dans les graphes. Gauthier-Villars, Paris, 1967.
[FJVW86] M. L. Fisher, R. Jaikumar, and L. N. Van Wassenhove. A Multiplier Adjustment Method for the Generalized Assignment Problem. Management Science, 39(2):10951103, 1986. [FK90] [Fle87] M. L. Fisher and P. Kedia. Optimal Solutions of Set Covering/Partitioning Problems Using Dual Heuristics. Management Science, 36:674688, 1990. R. Fletcher. Practical Methods of Optimization (2nd ed.). John Wiley, Chichester UK, 1987.
Bibliography
249
[Fre82] [Gar63] [Gar00] [GG61] [GG63] [GH91] [GHL94] [Gib85] [GJ79] [Gle80] [GM90] [GP98] [GP01] [Gra69] [GS76] [GS87]
S. French. Sequencing and Scheduling. An Introduction to the Mathematics of the Job-Shop. John Wiley and Sons, New York, 1982. L. L. Garver. Power Scheduling by Integer Programming. IEEE Transactions on Power Apparatus and Systems, 81:730735, 1963. D. T. Gardner. Efcient Formulation of Electric Utility Resource Planning Models. Journal of the Operational Society, 51(2):231236, 2000. P. C. Gilmore and R. E. Gomory. A Linear Programming Approach to the Cutting Stock Problem. Part I. Operations Research, 9:849859, 1961. P. C. Gilmore and R. E. Gomory. A Linear Programming Approach to the Cutting Stock Problem. Part II. Operations Research, 11:863888, 1963. M. Grtschel and O. Holland. Solution of Large-Scale Symmetric Traveling Salesman Problems. Mathematical Programming, 51:141202, 1991. M. Gendreau, A. Hertz, and G. Laporte. A Tabu Search Algorithm for the Vehicle Routing Problem. Management Science, 40:12761290, 1994. A. Gibbons. Algorithmic Graph Theory. Cambridge University Press, Cambridge, New York, 1985. M. R. Garey and D. S. Johnson. Computers and Intractability: A Guide to the Theory of NP-completeness. W.H. Freeman & Company, San Francisco, 1979. J. J. Glen. A Parametric Programming Method for Beef Cattle Ration Formulation. Journal of the Operational Research Society, 31:689690, 1980. M. Gondran and M. Minous. Graphes et algorithmes (2nd Ed.). Eyrolles, 1990. C. Guret and C. Prins. Classical and New Heuristics for the Open-Shop Scheduling Problem: a Computational Evaluation. European Journal of Operational Research, 107(2):306314, 1998. Gunluk and Y. Pochet. Mixing mixed-integer inequalities. Mathematical Programming, 90:429457, 2001. R. L. Graham. Bounds on Multiprocessing Timing Anomalies. Siam Journal on Applied Mathematics, 17:416 429, 1969. T. Gonzalez and S. Sahni. Open-Shop Scheduling to Minimize Finish Time. Journal of the ACM, 23:665679, 1976. A. Gersht and A. Shulman. A New Algorithm for the Solution of the Minimum Cost Multicommodity Flow Problem. In IEEE 26th Conference on Decision and Control (CDC87), pages 748758, Los Angeles, December 1987.
[GTdW93] F. Glover, E. Taillard, and D. de Werra. A Users Guide to Tabu Search. Annals of Operations Research, 41(14):328, 1993. [HC84] [HC99] [Hei99a] [Hei99b] [HH60] [Hit41] [HK70] [HLM00] A. C. Hax and D. Candea. Production and Inventory Management. Prentice Hall, 1984. S. Heipcke and Y. Colombani. Julians Problem. Work Assignment at a Disabled Care Centre. ORInsight, 12(1):1620, 1999. S. Heipcke. Combined Modelling and Problem Solving in Constraint Programming and Mathematical Programming. PhD thesis, University of Buckingham, 1999. S. Heipcke. Comparing Constraint Programming and Mathematical Programming Approaches to Discrete Optimisation. The Change Problem. Journal of the Operational Research Society, 50(6):581595, 1999. F. Hanssmann and S. W. Hess. A Linear Programming Approach to Production and Employment Scheduling. Management Technology, 1:, 1960. F. L. Hitchcock. The Distribution of a Product from Several Sources to Numerous Localities. J. Math. Phys., 20(2):224230, 1941. M. Held and R. Karp. The Traveling Salesman Problem and Minimum Spanning Trees. Operations Research, 18:11381162, 1970. A. Hertz, G. Laporte, and M. Mittaz. A Tabu Search Heuristic for the Capacited Arc Routing Problem. Operations Research, 48(1):129135, 2000.
[HLNH99] A. Hertz, G. Laporte, and P. Nanchen Hugo. Improvement Procedures for the Undirected Rural Postman Problem. INFORMS Journal on Computing, 11(1):5362, 1999. [HW95] [HZ96] [Jak96] [JM74] [JNS00] [JSV98] J. L. Ho and J. S. Wong. Makespan Minimization for m Parallel Identical Processors. Naval Research Logistics, 42(6):935948, 1995. M. Hi and V. Zissimopoulos. A Recursive Exact Algorithm for Weighted Two-Dimensional Cutting. European Journal of Operational Research, 91:553564, 1996. S. Jakobs. On Genetic Algorithms for the Packing of Polygons. European Journal of Operational Research, 88:165181, 1996. L. A. Johnson and D. C. Montgomery. Operations Research in Production Planning, Scheduling, and Inventory Control. Wiley, New York, 1974. E. L. Johnson, G. L. Nemhauser, and M. W. P. Savelsbergh. Progress in Linear Programming Based Algorithms for Integer Programming: An Exposition. INFORMS Journal on Computing, 12(1):223, 2000. B. Jaumard, F. Semet, and T. Vovor. A Generalized Linear Programming Model for Nurse Scheduling. European Journal of Operational Research, 107(1):118, 1998.
Bibliography
250
E. P. C. Kao. A Multi-Product Dynamic Lot-Size Problem with Individual and Joint Set-up Costs. Operations Research, 27(2):279289, 1979. N. Karmarkar. A New Polynomial Time Algorithm for Linear Programming. Combinatorica, 4:373395, 1984. R. G. Kasilingam. Logistics and Transportation. Kluwer Academic Publishers, 1998. S. Kirkpatrick, C. D. Gelatt, and M. P. Vecchi. Optimization by Simulated Annealing. Science, 220:671680, 1983. M. K. Kuan. Graphic Programming Using Odd and Even Points. Chinese Mathematics, 1:273277, 1962. A. H. Land and A. G. Doig. An Automatic Method for Solving Discrete Programming Problems. Econometrica, 28:497520, 1960. G. Laporte, M. Desrochers, and Y. Nobert. Two Exact Algorithms for the Distance-Constrained Vehicle Routing Problem. Networks, 14:161172, 1984. A. Y. Lewin and R. C. Morey. Measuring the Relative Efciency and Output Potential of Public Sector Organizations: an Application of Data Envelopment Analysis. International Journal of Policy Analysis and Information Systems, 5(4):267285, 1981. A. Lodi, S. Martello, and D. Vigo. Heuristics and Metaheuristics for a class of two-Dimensional Bin Packing Problems. INFORMS Journal on Computing, 11(4):345357, 1999. J. B. Lasserre and M. Queyranne. Generic Scheduling Polyedra and a new Mixed-Integer Formulation for a Single Machine Scheduling. In Second IPCO Conference, Pittsburg, 1992. Carnegie-Mellon University. P. Lopez and F. Roubellat. Ordonnancement. Economica, 1999. J. T. Linderoth and M. W. P. Savelsbergh. A Computational Study of Search Strategies for Mixed Integer Programming. INFORMS Journal on Computing (to appear), 1998. L. S. Lasdon and R. C. Terjung. An Efcient Algorithm for Multi-Item Scheduling. Operations Research, 19(4):946969, 1971. D. G. Luenberger. Linear and Non-Linear Programming. Addison-Wesley, 1984. A. S. Manne. GAMS/MINOS: Three Examples. Technical report, Department of Operations Research, Stanford University, 1986. M. Minoux and G. Bartnik. Graphes, algorithmes, logiciels. Dunod, 1986. W. H. S. McColl. Management and Operations in an Oil Company. Operations Research Quaterly, 20:6465, 1969. M. Minoux. Rsolution des problmes de multiots en nombres entiers dans les grands rseaux. RAIRO Recherche Oprationnelle, 3:, 1975. K. Marriott and P. J. Stuckey. Programming with Constraints. MIT Press, Cambridge MA, 1998. S. Martello and P. Toth. The 0-1 Knapsack Problem. In N. Christodes and al., editors, Combinatorial Optimization. Wiley, 1979. S. Martello and P. Toth. Knapsack Problems: Algorithms and Computer Implementations. John Wiley, New York, 1990. H. Marchand and L. Wolsey. Aggregation and mixed-integer rounding to solve MIPs. Operations Research, 49:363371, 2001. M. Nawaz, E.E. Enscore, and I. Ham. A Heuristic Algorithm for the m-Machine, n-Job Flow-Shop Sequencing Problem. Omega, 11(1):9195, 1983. J. A. Orlicky. Material Requirement Planning: the New Way of Life in Production and Inventory Management. McGraw-Hill, New York, 1975. W. H. Press, B. P. Flannery, S. A. Teukolsky, and W. T. Vetterling. Numerical Recipes in C The Art of Scientic Computing. Cambridge University Press, Cambridge, 1992 (2nd ed.). M. Pinedo. Scheduling: Theory, Algorithms and Systems. Prentice Hall, 1995. E. Pinson. The Job Shop Scheduling Problem: A Concise Survey and Some Recent Developments. In Ph. Chrtienne, E. G. Coffman, J. K. Lenstra, and Z. Liu, editors, Scheduling Theory and its Applications, pages 277294, Chichester, New York, 1995. John Wiley. C. Prins. Algorithmes de graphes avec programmes en Pascal. Eyrolles, 1994. C. Prins. An Overview of Scheduling Problems Arising in Satellite Communications. J. Opl. Res. Soc., 45(6):611623, 1994. C. H. Papadimitriou and K. Steiglitz. Combinatorial Optimization. Dover, 1998. K. Roos. Theory and Algorithms for Linear Optimization. An Interior Point Approach. John Wiley, Chichester, New York, 1997. Roseaux. Exercices et problmes rsolus de Recherche Oprationnelle Tome 3. Masson, 1985. R. Rodoek, M. G. Wallace, and M. T. Hajian. A New Approach to Integrating Mixed Integer Programming and CLP. Annals of Operations Research, 86:6387, 1999. M. W. P. Savelsbergh. Preprocessing and Probing Techniques for Mixed Integer Programming Problems. ORSA Journal on Computing, 6(4):445454, 1994.
[LMV99] [LQ92] [LR99] [LS98] [LT71] [Lue84] [Man86] [MB86] [McC69] [Min75] [MS98] [MT79] [MT90] [MW01] [NEH83] [Orl75] [PFTVed] [Pin95a] [Pin95b]
Bibliography
251
[SC81]
D. W. Sutton and P. A. Coates. On-Line Mixture Calculation System for Stainless Steel Production by BSC Stainless: the Least Through Cost Mix System (LTCM). Journal of the Operational Research Society, 32:165 169, 1981. A. Schrijver. Theory of Linear and Integer Programming. Wiley, 1986. L. Schrage. Optimization Modeling with LINDO (5th ed.). Duxbury, 1997. A. Scholl. Balancing and Sequencing of Assembly Lines. Physica-Verlag, 1999. M. M. Syslo, N. Deo, and J. S. Kowalik. Discrete Optimization Algorithms with Pascal Programs. Prentice Hall, 1983. M. Sevaux. tude de deux problmes doptimisation en planication et ordonnancement. PhD thesis, Thse de luniversit Pierre-et-Marie-Curie, Paris VI, 1998. H. D. Sherman. Hospital Efciency Measurement and Evaluation. Medical Care, 22(10):922938, 1984. A. M. Sasson and H. M. Merrill. Some Applications of Optimization Techniques to Power Systems Problems. In IEEE,62, pages 959972, 1974. A. Sofer and S. G. Nash. Linear and Non-Linear Programming. McGraw-Hill, 1996. E. Silver, D. F. Pyke, and R. Peterson. Inventory Management and Production Planning and Scheduling. Wiley, 1998. P. E. Sweeney and E. Ridenour Paternoster. Cutting and Packing Problems: a Categorized, ApplicationOriented Research Bibliography. Journal of the Operational Research Society, 43(7):691706, 1992. B. Sans and P. Soriano. Telecommunication Network Planning. Kluwer, 1998. C. H. Scott, O. G. Skelton, and E. Rolland. Tactical and Strategic Models for Satellite Customer Assignment. Journal of the Operational Research Society, 51(1):6171, 2000. A. Tripathy. School Timetabling: a Case in Large Binary Integer Linear Programming. Management Science, 30(12):14731489, 1984. P. Van Hentenryck. The OPL Optimization Programming Language. MIT Press, Cambridge, MA, 1998. S. Vo and D. L. Woodruff. Introduction to Computational Optimization Methods for Production Planning in a Supply Chain. Springer, Berlin, 2002. E. A. Wasil and A. A. Assad. Project Management on the PC: Software, Applications and Trends. Interfaces, 18(2):7584, 1988. H. M. Wagner. An Integer Programming Model for Machine Scheduling. Naval Research Logistics Wuaterly, 6:131140, 1959. W. E. Walker. A Heuristic Adjacent Extreme Point Algorithm for the Fixed Charge Problem. Management Science, 22(5):587596, 1976. M. Widmer and A. Hertz. A New Heuristic Method for the Flow Shop Sequencing Problem. European Journal of Operational Research, 41:186193, 1989. H. P. Williams. Model Building in Mathematical Programming. (3rd Rev. Ed.). John Wiley, Chichester, 1993. W. L. Winston. Operations Research: Applications and Algorithms (3rd ed.). Duxbury Press, Belmont, 1994. W. L. Winston. Financial Models Using Simulation and Optimization. Palisade, 1998. L. A. Wolsey. Integer Programming. Wiley Interscience, 1998. H. M. Wagner and T. M. Whitin. A Dynamic Version of the Economic Lot Size Model. Management Science, 50(1):8996, 1958. Z. A. Zenios. Financial Optimization. Cambridge University Press, 1996.
[Sch86] [Sch97] [Sch99] [SDK83] [Sev98] [She84] [SM74] [SN96] [SPP98] [SRP92] [SS98] [SSR00] [Tri84] [VH98] [VW02] [WA88] [Wag59] [Wal76] [WH89] [Wil93] [Win94] [Win98] [Wol98] [WW58] [Zen96]
Bibliography
252
Index
+, 136 +=, 171 :=, 171 , 141 {}, 171 accounting constraints, 25 accounting variables, 25 activity, 12 adjacency matrix, 101, 175 all item discount pricing, 43 and, 52, 61 arc list, 175 arc-paths formulation, 180 array, 61 as, 50, 51, 53, 61, 111 assignment problem, 157, 211 B&B, see Branch and Bound bin packing, 122 binary variable, 30 bipartite graph, 172 blending, 62 boolean, 61 bottleneck, 93, 211 bottleneck assignment problem, 186 bound lower, 19 upper, 19 Branch and Bound, 31 Branch and Cut, 172 Branch and Price, 45 branching direction strategy, 33 break, 51, 54, 61, 124 break-even point, 13 case, 61 ceil, 50, 51, 74 Chinese postman problem, 238 column generation, 45 comment, 59 complement, 35 conjunctive constraints, 90 constraint, 8 conjunctive, 90 disjunctive, 90, 162 named, 84, 245 non-negativity, 8, 10 soft, 27 strong, 151 constraint activity, 12 Constraint Programming, 45 continuation line, 59 convexity row, 41 covering problem, 193, 246 create, 50, 51, 53, 54, 111 critical machine, 93 cut generation, 45 cutoff value, 125 cutting stock, 121 cycle, 168 cycle time, 99 decision variable, 7 declarations, 58, 61, 72, 92, 111, 208 dense format, 83 deterministic, 11 disjunctive constraints, 90, 162 disjunctive graph, 91 div, 61 divisibility, 11 do, 61 dual value, 12 dummy objective, 221 dynamic, 61, 93 dynamic array, 111 dynamic array, 50, 54, 92, 166 elif, 61 else, 61 empty set, 171 end, 61, 96 end-model, 12, 58, 235 Eulerian circuit, 238 exam, 56 exclusion constraints, 162 exists, 50, 51, 53, 54, 93, 116, 175, 239 exit, 51, 53, 124, 178 facility location problem, 155 false, 61 fathoming, 32 feasibility problem, 220 feasible, 8 finalize, 5054, 72 x costs, 119 ow conservation law, 174 ow shop, 102 forall, 59, 61, 93, 124 forall-do, 5054, 93 forward, 50, 61, 84 free variable, 20, 25 from, 61 function, 124 function, 51, 61, 124 Gantt chart, 93 generalized assignment problem, 117
253
getlast, 51, 116 getobjval, 84 getprobstat, 236 getsize, 5154, 124, 171 getsol, 50, 65, 84, 176 global optimum, 31 Gozinto graph, 109 hard constraint, 27 if, 50, 51, 53, 54, 61, 78, 96, 105, 108, 201, 225 if-then, 50, 51, 53, 54, 64, 96 if-then-elif, 52 if-then-elif-then-else, 65 if-then-else, 51, 54, 65 in, 61 include, 61, 235 index set, 59, 214 infeasible, 8, 15, 236 initialisations, 61 initializations, 60, 61, 68 integer, 50, 61, 99 Integer Programming, 30 integer variable, 30 inter, 61 Interior Point algorithm, 18 inventory balance equation, 104 IP, see Integer Programming is_binary, 50, 61 is_continuous, 61 is_free, 61 is_integer, 50, 61 is_partint, 61 is_semcont, 61 is_semint, 61 is_sos1, 61 is_sos2, 61 isodd, 51, 116 JIT, see Just-in-Time job shop, 102 Just-in-Time, 119 Kirchhoffs law, 142, 174, 229 knapsack constraints, 117 knapsack problem, 58, 122, 128 linctr, 61, 147 line break, 59 linear equation, 10 linear expression, 9 linear inequality, 10 Linear Programming, 9 Linear Programming problem, 10 loading, 121 local optimum, 31 long-term planning, 103 loss equations, 21 lot sizing, 119 lower bound, 19 lower limit, 19 LP, see Linear Programming LP solution, 77, 205 makespan, 93
matching, 158 matching with maximum total weight, 158 Material Requirement Planning, 119 max, 52, 53, 61, 154 maximin, 122, 211 maximin assignment problem, 187 maximize, 59, 221 maximum cardinality matching, 158 maxlist, 52, 154 MCNF, see multi-commodity network ow Method of Potentials, 102 mid-term planning, 103 min, 52, 53, 61, 154 minimax, 122 minimize, 221 minimum cost ow problem, 74, 141, 155 minlist, 52, 154 MIP, see Mixed Integer Programming MIQP, see Mixed Integer Quadratic Programming Mixed Integer Programming, 30 Mixed Integer Quadratic Program, 207 Mixed Integer Quadratic Programming, 46 mmquad, 206 mmxprs, 206 mod, 53, 54, 61, 203 model, 58 parameter, 199 model, 58, 61, 84 model cuts, 147, 150 modules, 56 mpvar, 59, 61, 72 MRP, see Material Requirement Planning MRP method, 119 multi-commodity network ow, 192 multi-stage production planning, 119 multi-time period model, 23, 119 Newton-Barrier algorithm, 18 next, 61 node cover, 246 node selection strategy, 33 non-negativity constraint, 8, 10 not, 52, 61 NP-hard, 101 objective function, 8, 10 dummy, 221 of, 61 optimization, 8 options, 61 or, 52, 61, 160 output visualize, 125 output printing, 59 p-median problem, 241 packing, 121, 122 panic variable, 27 parameter, 96, 199 parameters, 61 partial integer variable, 30 partitioning problem, 234, 246 Parts explosion, 109 path
Index
254
node-disjunctive, 174 pattern selection, 121 PERT method, 102 placement, 121 planning, 103 portfolio optimization, 46 presolving, 18 procedure, 5052, 54, 61, 124 prod, 61, 108 product mix, 62 production planning, 103 public, 61 QP, see Quadratic Programming Quadratic Program, 206 Quadratic Programming, 46 range, 5053, 61, 83, 92, 137 range set, 59 ratio objective function, 28 real, 61, 99, 124, 176 reduced cost, 12 reference row, 40 relaxation, 31 repeat, 61 repeat-until, 5052, 98, 124 returned, 124 RHS, see right hand side right hand side, 10 round, 50, 53, 54, 99, 176 Rural Postman problem, 247 SC, see semi-continuous variable scheduling ow shop, 102 job shop, 102 open shop, 193 scheduling with project crashing, 83 semi-continuous integer variable, 30 semi-continuous variable, 30, 199 separation, 32 sequence-dependent setup times, 102 set, 61 set of integer, 51, 54, 137 setparam, 51 setup costs, 119 shadow price, 12, 13 short-term planning, 103 Simplex method, 18 soft constraint, 27 solving, 59 SOS1, see Special Ordered Set of type 1 SOS2, see Special Ordered Set of type 2 sparse arrays, 93 sparse format, 83 Special Ordered Set of type 1, 30 Special Ordered Set of type 2, 31 sqrt, 52, 141 Stochastic Programming, 11 strfmt, 50, 68 string, 61 sub-cycles, 168 subroutine, 84 sum, 61
symmetry breaking, 133, 221 technological coefcients, 21 then, 61 to, 61 transport network, 229 transportation problem, 140 transshipment ow formulation, 114 traveling salesman problem, 102 trim loss, 121 true, 61, 160 TSP, see traveling salesman problem unbounded, 15, 236 union, 61, 144 until, 61 upper bound, 19 upper limit, 19 uses, 61 variable, 7 0/1, 30 binary, 30 xed, 19 free, 20 integer, 30 partial integer, 30 semi-continuous, 30 semi-continuous integer, 30 variable selection strategy, 33 vehicle routing problem, 155 vertex cover, 246 visualize output, 125 VRP, see vehicle routing problem while, 61, 124, 188 while-do, 51, 53, 54, 124 XPRS_INF, 236 XPRS_LIN, 77, 205 XPRS_MIPADDCUTOFF, 125 XPRS_OPT, 236 XPRS_UNB, 236 XPRS_UNF, 236 XPRS_VERBOSE, 125
Index
255