Modelling Project 2012/13 Project Report Cover-Sheet Table of Contents

43
1 OR301.1 Mathematical Programming Models in Operational Research Modelling Project 2012/13 Project Report Cover-Sheet Deadline: 3.30pm on Friday 22nd March 2013 Please insert this page at the very beginning of your project report. Please complete all the statements below and also the Plagiarism/Receipt Form. Hard copies of the Plagiarism/Receipt Form are also available from the Department of Management (DoM) Reception desk on the 3rd floor of the NAB. Please hand in your report at the DoM Reception desk on the 3rd Floor of the NAB. Note that your Report will NOT be accepted at the Reception desk unless you have completed both this form and the Plagiarism Form. My Candidate Exam Number: 200807777 Date when I handed in this report: 22/03/13 While working on understanding this project and formulating the model(s) I worked together with the following students, either collaborating on the formulation, or seeking advice on some particular details. (use candidate numbers not names): Candidate number Brief statement on the collaboration I completed the model on my own – I talked with various people about the model and checked my answers with them but the model was completed by me

Transcript of Modelling Project 2012/13 Project Report Cover-Sheet Table of Contents

1

OR301.1 Mathematical Programming Models in Operational Research

Modelling Project 2012/13

Project Report Cover-Sheet

Deadline: 3.30pm on Friday 22nd March 2013

Please insert this page at the very beginning of your project report.

Please complete all the statements below and also the Plagiarism/Receipt Form. Hard copies of the

Plagiarism/Receipt Form are also available from the Department of Management (DoM) Reception desk

on the 3rd floor of the NAB.

Please hand in your report at the DoM Reception desk on the 3rd Floor of the NAB.

Note that your Report will NOT be accepted at the Reception desk unless you have completed both this

form and the Plagiarism Form.

My Candidate Exam Number: 200807777

Date when I handed in this report: 22/03/13

While working on understanding this project and formulating the model(s) I worked together with the

following students, either collaborating on the formulation, or seeking advice on some particular details.

(use candidate numbers not names):

Candidate number Brief statement on the collaboration

I completed the model on my own – I talked with various people about the

model and checked my answers with them but the model was completed by me

2

Table of Contents

Executive Summary…………………………………………………………………………………………………... Page 2

Introduction…………………………………………………………………………………………..…………………. Page 4

Analysis

Basic Scenario……..………………………………………………………………………………..…………………… Page 4

Scenario 2………………………………………………………………………………………….....………………….. Page 6

Scenario 3………………………………………………………………………………………........………………….. Page 7

Further Analysis

Changing the Initial Allocation of Bikes……………………………………………………………………….. Page 8

Eliminating Penalty Points………………………………………………………………………………………….. Page 9

Expected Increase in Bike Usage…………………………………………………………………………………. Page 9

Limitations of the Model……………………………………………………………………………………………..Page 9

Recommendations……………………………………………………………………………………………………… Page 11

APPENDIX 1

Basic Scenario Model…………………………………………………………………………………………………. Page 11

Scenario 2………………………………………………………………………………………………………………….. Page 13

Scenario 3………………………………………………………………………………………………………………….. Page 14

Further Analysis

Changing the Initial Allocation of Bikes……………………………………………………………………….. Page 14

Eliminating Penalty Points………………………………………..………………………………………………… Page 15

Expected Increase in Bike Usage…………………………………..…………………………………………….. Page 15

APPENDIX 2

Mathematical Models……..…………………………………………………………………………………………. Page 16-17

APPENDIX 3

AIMMS Listings…………………………………………………………………………………………………………… Page 18-42

3

Executive Summary

In this report we describe the methods we used to formulate our models and our results on a number of scenarios that we were asked to examine by the NMTACoCoL relating to the penalty points generation of the Boris Bikes scheme. Our analysis includes the 3 basic scenarios which we were asked to solve and also 3 further scenarios with some further analysis of the problems. For the first ‘Basic’ scenario we were asked to come up with a routing of the lorries used to carry bicycles with the aim of minimising the total number of penalty points. The optimal result for that scenario is 4045 penalty points. For the second scenario, which asked us to minimise the total distance travelled, we found an optimum value of 28.5 miles travelled while incurring 4315 penalty points which represents a 6.7% increase when compared to the optimum value of the ‘Basic’ scenario, 3.3% lower than the maximum allowed increase though. For the third scenario we had to evaluate two investment decisions with regards to the penalty points incurred. The first investment involved the purchase of 3 new lorries, generating a total of 3464 penalty points, 36 points less than the second option that included the installation of 9 new docking stations (135 slots) and of 100 new bikes. For our first of the 3 further scenarios examined, we tried to find by how much we could possibly improve the total penalty numbers by changing the initial allocation of the bikes through overnight redistribution. We found that the number of points can be reduced by 533 points when compared to the optimum value of the ‘Basic’ scenario. For the second further scenario we estimated the number of new slots and bikes needed to eliminate the usage of lorries. The results can be seen on Figure 10. on page 8 of the Management report. For our third further scenario we estimated the number of new lorries needed to keep the total penalty points incurred at the level of the ‘Basic’ scenario following an increase of 15% in the usage of the bikes. The number of lorries required to achieve that is seven. Finally the report discusses the assumptions of our model and the limitations resulting from those assumptions and wraps up with recommendations on how to further decrease the total penalty points generated.

4

MANAGEMENT REPORT

5

Initial StateOversaturated Congested Scarce Deficient

1 380 430 0 0

3 0 0 46 0

4 0 28 0 0

5 0 0 252 190

6 0 24 0 0

7 235 267 0 0

10 0 0 143 95

11 0 0 27 0

12 280 336 0 0

13 400 452 0 0

14 0 0 253 185

15 370 452 0 0

17 0 0 57 25

18 320 374 0 0

Figure 1.a. Oversaturated is a zone where the number of bikes is greater

than the number of slots

b. Congested is a zone that operates at greater than 80% capacity

c. Scarce is a zone that operates at less than 20% capacity

d. Deficient is a zone where the number of bikes in the zone

is not sufficient to cover demand

Introduction

Several mathematical models were created with the aim of dealing with the simplified versions of the problems we faced. As it can be seen in Technical Appendix, six Mathematical Problem models were created, three MP models to deal with the three basic scenarios (one consisting of 2 sub-models) and another 3 MP models to deal with further analysis of the problem. In all models there were a series of simplifying assumptions made that helped us analyse the problem and create basic models that could be used as stepping stones to analyse and deal with more complicated scenarios created when relaxing some of our assumptions. Thus the models and results provided below should be taken with caution, taking into account the limitations involved.

Below you can find a detailed explanation of each model with the optimum values we received for each one of them. We begin with the explanations of the three Basic Scenarios and we continue with the further analysis that we conducted in an attempt to find the strongest aspects of each model that if combined, they could be used to reach a better optimum value. The report ends off with the recommendations based on our findings.

Analysis

1. Basic Scenario – Minimising the total Penalty points

In the basic scenario we were asked to minimise the total number of penalty points generated subject to a number of constraints. In order to proceed with the analysis we had to make a number of simplifying assumptions which

are discussed in detail in ‘Limitations of the Model’ section of the report. Furthermore the data regarding the number of slots, initial number of bikes and expected number of customers travelled to and from a zone were taken as given (constant) for each scenario and their validity was not tested. Linear mathematical programs were used to analyse each scenario, producing different optimum solutions for each one. For our basic scenario the optimum solution is 4045 penalty points. This was achieved by using lorries to move 30 bikes at a time from oversaturated and congested to mainly scarce and deficient zones. Before we go into the explanation of the re-allocations of the bikes by the lorries and the penalty points generated, it would be beneficial to give an overview of the extent of the problem that we were faced with by looking at the initial state of each zone. This is something that can be clearly seen on Figure 1. The Figure shows the number of bikes classified as oversaturated, congested,

scarce and deficient before any transfers were made. More specifically it shows the number of bikes for which oversaturated, congested, scarce and deficient points were applied on depending on the state of the zone. For example once a zone is congested, congested points are applied on all of the customers planning to travel to that zone. Similarly for scarce zones scarce penalty points are applied to all the people planning to travel from that zone. For deficient and oversaturated zones the points were applied only on the ‘’shortage’’ and the ‘’excess’’

Zon

es

6

Bikes MovedSent Received Penalty Points Saved

3 0 60 244

4 30 0 208

5 0 270 422

6 30 0 312

7 270 0 738

10 0 150 347

11 0 30 180

14 0 150 90

17 0 60 167

18 390 0 872

Total 3580

Figure 2. The Figure shows the penalty points

effect of the re-allocation of bikes on each one

of the zones.

number of bikes respectively with the zero values on the table indicating that the zone had no bike in the state described. By looking at the number of bikes in each state and adding up the columns, we see that the sum of the number of ‘oversaturated bikes’ (i.e. the ‘’extra’’ bikes that incurred oversaturated points) is higher than the sum of the ‘scarce and deficient bikes’ put together. This means that if no restrictions were placed on the model, it would first try to eliminate the scarce and deficient penalty points by only using the ‘oversaturated bikes’ (that generate the highest penalty points) before trying to reduce the number of the ‘congested bikes’. However as explained below due to specific constraints this is something that did not happen. The allocation that led to the optimal solution for our model can be seen on Figure 2. below.

The figure shows only the zones involved in the re-allocation process (had bikes transferred either from or to them) with all the zones that did not have any bikes transferred from or to them not being displayed. Although this is the re-allocation that led to the optimal solution of 4045 penalty points it does not mean that it is the only re-allocation that leads to this result. Other re-allocations that result in the same optimal value and satisfy the constraints given by the NMTACoCoL might also exist.

It can be seen on Figure 2, that 390 bikes were moved away from zone 18, eliminating both the oversaturated and congested points generated by that zone initially. Similarly, the model also eliminated all the congested and oversaturated points generated by zone 7 initially. Thus as mentioned above, the model did not use only ‘oversaturated bikes’ to eliminate the scarce and deficient points but also used ‘congested bikes’ instead and this can

be explained by looking at the constraints imposed on the model. The most likely reason for that is the one related to the ‘distance covered’ constraint and thus the number of trips made by each lorry. This constraint restricts the lorries from using a combination of short and long trips or performing more than 2 short or 1 long trip during the period of re-allocation, which doesn’t allow the model to minimise all the oversaturated points first before moving to elimination of the congested ones, as some oversaturated zones might be out of range. This is not a very realistic constraint as lorries that operate in less busy areas can probably make a larger number of trips than ones that operate in more busy ones. Another reason for that happening is that once a lorry is used its entire capacity has to be utilised. This constraint in combination with the distance constraint can actually create problems to the optimisation by preventing the model from reaching the optimum solution, something that is explained in more detail in the ‘Limitations of the Model’ section. Turning to the deficient and scarce zones, with the exception of zone 14, all other scarce and deficient zones were eliminated (operating at greater than 20% capacity). The reason that the system chose to eliminate the scarce points for example from zone 3 before eliminating the deficient points from zone 14 has once again to do with the constraints put on the model, with the most likely reason being the distance constraint. Thus it can be seen that the constraints placed on the model may prevent the system from achieving the best possible outcome and as suggested in the ‘Limitations’ section, they should maybe revisited.

Figure 2. also shows the effect on the number of the penalty points of the re-allocation. For example sending 60 bikes into zone 3, reduced the number of penalty points incurred in the initial state (points that would be received by doing nothing) by 244 as there are no more scarce bikes in the zone and thus the penalty points of 0.4/bikes was not applied to the total number of people (610) expected to travel to that zone. The total of 3580 penalty points eliminated, reduced the final figure of the penalty points incurred to 4045, significantly improving customer satisfaction. Although this is the optimal solution for the problem we faced, the number of total penalty points can be further reduced by taking different actions some of which are discussed in the ‘Recommendations’ section of the report.

Zon

es

7

State After Reallocation

Oversaturated Congested Scarce Deficient

1 380 430

12 280 336

13 400 452

14 103 35

15 370 452

Figure 3.

The figure shows the state of each zone after the reallocation

was performed. The zones not belonging to any of the four states

were excluded.

State After Reallocation

Oversaturated Congested Scarce Deficient

1 410 550

12 280 590

13 520 690

14 730 185

15 370 690

Figure 4.

The figure shows the state of each zone after the reallocation

was performed. The zones not belonging to any of the four states

were excluded.

Zo

ne

s

The exact effect of the re-allocation performed to the final states of the zones can be seen on Figure 3. By re-allocating the bikes we managed to reduce the number of zones that were either scarce or deficient from 5 to 1 and the zones that were oversaturated or congested from 8 to 4. The reason for having some oversaturated zones that did not have any bikes removed from, although bikes were removed from congested-only zones is as

discussed earlier due to the constraints in the model and the capacity of the lorries.

2. Scenario two – Minimising the Total Distance

In this scenario we were asked to minimise the total distance travelled by the bikes allowing the penalty points incurred to rise by 10% higher than the optimum value of 4045 found in the basic scenario (i.e. 4450 penalty points). By setting this as an upper value constraint on the total penalty points incurred, we ran our model getting a result of total distance travelled of 28.5 miles which represents a 31% decrease in the distance when compared to the basic scenario (41.6 miles) and a total number of penalty points of 4315 which represents a 6.7% increase in the number of penalty points. The reason that the model didn’t minimise the total distance travelled even further by increasing the penalty points to the maximum 10% allowed, is due tothe combination of the constraints that we have on the model as discussed above. The final states of the zones after the minimisation of the total distance covered can be seen on Figure 4.

Once again the figure shows only the zones that were in one of the four states after the re-allocation took place. It can be seen that although there was a very big decrease in the total distance covered, the number of penalty points and possibly the customer satisfaction rate did not deteriorate by such a great extent. Thus it will be very important for NMTACoCoL to evaluate the increase in the dissatisfaction of customers and the associated loss of revenue related to that and to compare it with the decrease in the costs coming from the minimisation of the distance travelled in order to decide which decision is more beneficial to the company in the long term. If the company decides that the total distance travelled should be its main objective, although it will initially experience an increase in its customer dissatisfaction rates, the money saved from the more efficient routing of the lorries (gas, wages, maintenance of lorries etc.) could be spent on improving certain aspects of the business, that would result into a gradual decrease of the penalty points incurred in the long term. For example the company could invest more heavily into increasing the number of lorries or increasing the number of bikes and slots for deficient/scarce and oversaturated/congested zones respectively. Such actions would reduce the number of penalty points incurred in the long term and could be partly financed by the reduction in costs resulting by the increased operations efficiency (i.e. reduced distance travelled).

Zo

ne

s

8

State After Reallocation

Oversaturated Congested Scarce Deficient

1 380 550

12 280 590

15 370 690

18 230 610

Figure 5.

The figure shows the state of each zone after the reallocation

was performed. The zones not belonging to any of the four states

were excluded.

Zo

ne

sZ

on

es

Optimum Distribution

Bikes Stations

5 43

6 2

13 3

15 4

17 57

Figure 6. The figure shows an

allocation of bikes and stations

that leads to the optimum

value of 3500 penalty points.

State After Reallocation

Oversaturated Congested Scarce Deficient

1 380 550

12 280 590

15 310 690

18 320 610

Figure 7. The Figure shows the states of the zones after

the allocation of the new docking station and bikes.

Zo

ne

s

3. Scenario three – Impact of Investments on Penalty Points

a. Option 1 – Purchasing and operating 3 new lorries

For this option we had to evaluate the impact of purchasing and operating 3 additional lorries on the total penalty points generated. Adding more lorries increased the maximum number of trips permitted, allowing us to now cover a wider range of zones. The impact of such an action led to a new lower optimum value of 3464, reducing the penalty points by over 14% when compared to the basic scenario. The effect of this option to the zones can be seen on Figure 5. below. It can be seen that the number of deficient and scarce zones has been eliminated. This

means when there are 15 lorries operating, by utilising this routing, and given that the current expected usage and initial allocation of the bikes remain unchanged, there will no customer that will be unable to find a bike and there will not be a high chance of that happening in any of the zones as all of them will be operating at greater than 20% capacity. This will lead to a great improvement in the customer satisfaction.

b. Option 2 – Installing 9 docking station and 100 new bikes

For this option we got an optimum value of 3500 penalty points and we achieved that by using the distribution of bikes and docking stations shown on Figure 6. Once again it has to be noted that although this is an allocation that leads to the optimum value there might be different allocations that lead to the same solution of 3500 penalty points. This means that if we re-run the model, a different allocation might come up, giving different valued for the state of each zone than the ones shown below. Implementing this allocation had the following result on the states of the zones as shown on Figure 7. below. It can be seen that in both investments (buying lorries or installing bikes and docking stations) the number of scarce and deficient zones is eliminated. However, purchasing additional lorries is the option that leads to a lower overall number of oversaturated zones and thus total penalty points incurred.

Since the difference in the number of penalty points between the two options is quiet small (only 36 points), although it might be cheaper to go with option 2 (probably lower investment) it is very important for NMTACoCoL to understand what is the impact of penalty points on customer satisfaction. If choosing the less expensive option 2 leads to a loss of a certain number of customers, it might be worth it to spend a bit more money to increase the customer satisfaction and improve the customer retention rates. In addition it would also might be worth looking into the options of leasing the lorries instead of buying them or offering the operation of the lorries to another company. These two options might increase the operating expenses of the company but they might also result in increased cost savings

9

Initial Allocation

Initial Change After

1 210 40 250

2 140 19 159

3 310 20 330

4 270 -28 242

5 290 20 310

6 250 -24 226

7 135 -135

8 250 40 290

9 170 21 191

10 220 20 240

11 210 25 235

12 250 30 280

13 230 -218 12

14 330 10 340

15 350 60 410

16 270 35 305

17 135 25 160

18 230 40 270

Figure 8. The figure shows the

change of the initial allocation

of the bikes.

Zo

ne

s

State After Transfers of Bikes

Oversaturated Congested Scarce Deficient

1 420 550

7 70 570

12 310 590

15 400 690

17 380

Figure 9. The figure shows the state of the zones

after the transfer of the bikes.

through the elimination of the need for the coordination of the whole process, freeing up more time that could be used to concentrate on more important strategic options. Furthermore any of these two option does not require any huge upfront investment reducing the risks associated with taking the wrong decision.

Further Analysis

1. Changing the initial allocation of the bikes

In this scenario we tried to find by how much we are able to improve the optimum solution of our basic scenario by changing the initial allocation of the bikes through an overnight redistribution. The optimum value following the re-allocation is 3512 penalty points, something that leads to an improvement of 13% when compared with the basic scenario’s optimum value. To achieve that, we had to reallocate the bikes in the way shown on Figure 8. A positive number in the ‘change’ column means that there was an increase in the number of bikes and a negative number indicates a decrease in the number of bikes. For example in zone 7, there was a decrease of 135 bikes (135 were moved to another zone), leaving that zone with 0 bikes at the beginning of the period (the supply – i.e. expected people travelling to - of bikes was enough to cover the demand).

This initial re-allocation of the bikes led to a change in the final stated of the zones at the end of the period as shown on Figure 9. below. Although this change in the initial allocation led to decrease in the number of ‘oversaturated’ bikes by 230 and the number of deficient by 35, thus reducing the penalty points by 495 points, it led to an increase in the number of the ‘scarce bikes’

However this increase in the number of scarce bikes is not enough to offset the improvement in the states of the other zones. However once again NMTACoCoL should try to estimate the benefits to the company of that increase in customer satisfaction and evaluate whether that benefit justifies the extra cost of redistributing bikes overnight.

Zon

es

10

Addition Slots and Bikes

New Slots New Bikes

1 538

3 46

4 35

5 252

6 30

7 334

10 143

11 27

12 420

13 565

14 253

15 565

17 57

18 468

Figure 10. The Figure shows

the number of new slots

needed to eliminate the

penalty points generated

Zo

ne

s

2. Eliminating Penalty Points

In this scenario we used a model to estimate the number of new slots and new bicycles needed in the entire city so that the usage of lorries would be completely eliminated. (The details of the model can be seen in Appendix 3). The number of new slots and bikes needed for each zone to eliminate the total number of penalty points and thus the need for using the lorries is shown on Figure 10. The company needs to evaluate the costs of such an investment (including both the acquisition and maintenance costs) and compare those to the costs associated with operating 12 lorries in a year. In that way a financially correct decision of whether proceeding with the investment will be made.

Once again NMTACoCoL needs to evaluate the effect of penalty points on the customers. For example if the company finds that the penalty points have a huge effect on the perceived image of its services and thus on the customer satisfaction, then it might even make sense to go on with an investment that on purely financial grounds would not be made. Even if a cheaper option might look attractive in the short term, the penalty points incurred might prove to be more costly in the long term in terms of customers lost.

In addition whether such a decision would make sense also depends on the stage that the product/service offered is in its life cycle. For example it is in the growth stage and a rapid increase in the usage of bikes was expected then proceeding with this investment might not make much sense as the benefits of the new sots and bikes would extinguish in a short time period. In that case the company might have to constantly installing new slots and bikes until the product/service reaches its maturity stage, something that might prove very expensive for NMTACoCoL and might not be sustainable in the long term.

3. Expected increase in bike usage

In this scenario we created a model to estimate the number of new lorries needed to keep the penalty points in the current level following an expected increase of 15% in the usage of the bikes. Our model for this scenario which can be found in Appendix three under the Further Scenarios – Scenario 3, showed that the number of new lorries needed to keep the penalty points at 4045 is seven new lorries (assuming no change in the parameters). Although this will keep the number of penalty points constant, it is a big investment and once mentioned above more research is needed in evaluating the costs of the penalty points as well as examining other less risky options such as leasing the vehicles instead of buying them.

4. Limitations of the Model

Our model includes a number of simplifying assumptions that lead to the following limitations:

Firstly we considered only the demands and capacities of each zone as a whole without analysing the capacities of

individual docking stations (and scheduling lorries between them) which might not make a big difference in certain

very busy areas but it might be more relevant for areas that are not as busy. This is because although a zone as a

whole might generate points because the extra bike in one docking station cancels out with the extra demand in

another station, it does not mean that the penalty points will not be generated for each docking station. So

although you might have a zone that where docking stations if added up together generate no points, you might be

actually incurring points which you do not account for. This is something that out model does not take into account

as it looks at each of the 19 zones as a whole and not at each of the approximately 342 docking stations making it

one of the limitations. It would be recommended that data for each docking station are collected and a new

11

refined model is created taking into account the data for each station individually in order to produce a more

accurate result.

Furthermore we assume the customers travelling to and from a zone arrive uniformly during the entire period,

something that is not realistic as in a period of 3 hours the usage of the station is likely to fluctuate especially in

less busy areas, something that affects the allocation of points. For example if all the demand (people expected to

travel from) occurred at the beginning of the period (7am), while all the supply (people expected to travel to) took

place at the end of the period (10am), the state of the zone would be likely to change, generating totally different

number of points than If the usage was uniform as we assume in our formulation. This is another limitation of the

model that does not allow us to come up with a very realistic solution. Creating a dynamic simulation model might

be beneficial in this case instead of the static model that we are currently using, as it would allow us to have a

more realistic representation of the situation.

In addition the current way of allocating penalty points is related to time that a customer loses by trying to find a

bike to ride or a an empty slot to leave his bike, leading to the customer dissatisfaction. However there are certain

zones that are busier than others and this is not incorporated into the points calculation. For example imagine that

you decide to take bikes away of a zone that is not very popular leaving it with less than 20% capacity and thus

incurring scarce penalty points. If you did exactly the same with a zone in an area that is extremely busy, then the

likelihood of someone not being able to find a bike is a lot higher than what it is in the less popular zone. Thus,

since the penalty points reflect the likelihood of not finding a bike, busier zones should be penalised more heavily.

The same argument goes for the congested zones. It is recommended that the way the penalty points for the

congested and scarce zones is calculated should be revised in order to reflect the ‘popularity’ of the zone.

Furthermore the same argument can be used when looking at the maximum number of small and long trips

allowed to be made by the lorries. Although there are some areas that are very busy and it could actually take a

lorry a few hours to travel through to deliver bikes - especially during rush hours – there are other zones that are

less busy and it would take less time for a lorry to deliver/pickup bikes to/from there. As a result it would be more

appropriate to base the maximum number of trips that a lorry can make on the areas that it operates in, rather

than on the distances (as a larger distance doesn’t necessarily mean that the lorry will need more time than if it is

operating in a short extremely busy zone).

Furthermore the fact that we should use the entire capacity of lorries (30 bikes) might sound sensible in terms of

transportation cost/bike, however it might create problems in the optimisation problem of minimising the total

penalty points. For example, imagine we only have two zones, zone k with 50 slots and 5 extra bikes (i.e.

oversaturated – 5 people were not able to dock to this station) and another one, zone n with 30 bikes out of 60

slots (i.e. operating at 50% capacity and incurring no penalty points). If we didn’t have the restriction of 30

bikes/lorry, we could send 15 bikes from zone k to n, resulting in total penalty points of zero – there would be no

congested or oversaturated zones as a result of our transfer). However with the restriction, no matter what what

we do, there will be penalty points incurred (either for oversaturated and congestion in zone k by doing nothing or

just for congestion in zone n if we transfer all 30 bikes as it will be operating in full capacity). Thus it can be seen

that the lower transportation cost/bike that was achieved with this restriction might lead to higher dissatisfaction

for customers which might actually result into greater costs for the company. In particular in our case this

constraint is redundant as the maximum number of bikes that can be moved is 720 and given the fact that the sum

of congested and oversaturated bikes is way bigger than the sum of the scarce and deficient and assuming that the

data we were provided with remain unchanged, our mathematical problem would always maximise the number of

bikes in the lorries which was tested by removing that restriction and receiving the same results. Thus it would be

recommended that this restriction is revised by the management of the NMTACoCoL.

12

Recommendations

We believe that the action that should be taken and that would lead to the biggest decrease in the number of the total penalty points is a combination of the different scenarios discussed above. As a first step we believe that there should be an overnight re-allocation of the bikes because as shown above there was a big improvement in the total penalty points (13%). However NMTACoCoL needs to evaluate the benefit of reducing the penalty points by 13% to the increase in the operating costs that it will experience by moving the bikes overnight. Furthermore increasing the number of lorries could provide an extra way to reduce the penalty points by moving ‘oversaturated bikes’ to emptier zones. However the issue with the approach is the high initial investment needed and then the maintenance cost involved for each lorry. Nevertheless a potential way to deal with this and not incur the initial high cost of acquiring the new lorries is as discussed above the leasing option. By leasing the you will be incurring a monthly expense but you don’t have to make a big investment. Furthermore by choosing the right period length for the lease you can become more flexible with the number of lorries you have and if you see that the extra lorries are no longer needed you can stop leasing them. Thus you don’t run the risk of making a bad investment. Finally a combination of the two ways mentioned with adding a few extra slots and bikes will reduce considerable the total penalty points generates without having to undertake a huge investment.

APPENDIX 1

1. Basic Scenario Model

a. Sets and Parameters

The basic model included one Set, called zones indexed by i,ii which defined the 18 zones that were dealing with. Also there were 8 parameters: the initial_bikes(i) and slots_zones(i) which indicated the number of initial bikes and total number of slots in a zone respectively, the demand(i) and supply(i) showing the expected number of people to travel from and to a zone respectively. Also the model included the distance(i,ii), showing the distance between two zones i and ii and also the short_jouney(i,ii) and long_journey(i,ii) parameters representing journeys less and more than 3 miles respectively. Finally the bikes_transferred parameter represents the number of bikes transferred by a lorry at each trip (30).

b. Variables and Constraints:

The basic model included 10 variables, one of which was the free scalar objective function penalty_points (representing the penalty points awarded) which was minimised. Furthermore the model included the transfer(i,ii) variable that showed the number of lorries sent from zone i to zone ii, taking a minimum value of zero and a maximum value of 5, satisfying the constraint that said that the maximum number of journeys between any two zones can be at most 5. Another variable was the incoming(i) which represented the number of bikes coming into zone i, defined simply as the sum of supply(i) and the total number of bikes transferred into the zone i represented

by bikes_transferred*sum(ii, transfer(ii,i)) (i.e. summing all the lorries transferring from the zones ii into zone i). Similarly we had the outgoing(i) variable that represented the bikes coming out of a zone i, calculated by summing the demand(i) with the number of bikes transferred out by the lorries shown by the notation bikes_transferred*sum(ii, transfer(i,ii)).

We further have 6 variables related to the state of each zone. Two of them, the oversaturated_bikes(i) and the deficient_bikes(i) are non-negative variables that represent the number of bikes that received oversaturated and deficient points respectively. Although there is no definition included in those variables, the number of oversaturated and deficient bikes is derived by the use of constraints as is further explained below. The reason that these variables were defined as non-negative is because as shown in the explanation of the constraints below our model tries to minimise the number of oversaturated and deficient bikes by maximising the number of bikes transferred from and to a zone respectively. This sometimes might result in the two variables taking negative values, which on the one had helps us achieve our objective as the penalty points generated for the zone are

13

negative, bringing the whole total penalty points generated down, however it does not make sense as we cannot have negative extra bikes in an oversaturated zone or positive shortage of bikes in a deficient zone.

For the other two states of the zones, scarce and congested, we have two binary variables namely the scarce(i) and congested(i) that through the use of constraints indicate whether the zone is scarce or congested by taking a value of one when the zone is in that state and a value of zero when the value is not in that state (how we this is exactly achieved is discussed in the explanation of the constraints below). Furthermore we have two more variables for the Scarce and Congested zones, the scarce_bikes(i) and the congested_bikes(i) that give you the number of bikes that we apply the penalty points on for each one of the two states when the zone is in that state (the binary takes a variable of one). These two variables are defined by scarce(i)*demand(i) indicating that if the binary variable scarce(i) takes a value of one meaning that the zone is scarce then penalty points will have to be applied to all the people that are expected to travel from there. Similarly the number of bikes that generate congested penalty points is defined by congested(i)*supply(i) meaning that when a zone is congested (i.e. congested(i)=1), congested points will be applied on all of the people expected to travel to that zone. Both of these two variables can take only positive values as the parameters demand(i) and supply(i) take only positive values by definition. Finally we have the penalty_points which is a free scalar variable and represents the objective function that is being minimised.

Turning to the constraints, we have 6 constraints in our basic model, one related to the number of penalty points that is being minimised, four related to the state of the zones and one related to the maximum number of trips performed by the lorries.

Firstly the penalty_points1 constraint is a constraint that is defined by the sum of the penalty points across all zones. More specifically it’s definition is given by:

sum(i,

1.2*oversaturated_bikes(i)+0.4*scarce_bikes(i)+0.8*congested_bikes(i)+0.6*defi

cient_bikes(i)

<=penalty_points)

The process that the model follows is that it looks at each zone, determines what state it is in, calculates the number of bikes in that state and then applies the penalty points on them. Doing that for all zones and summing the penalty points across all zones gives you the total number of penalty points of 4045. Furthermore it can be seen that although the number of points generated by oversaturated and deficient zones is 2/bike and 1/bikes respectively we are using 1.2 and 0.6/ bike respectively. This is a logical way of dealing with the penalty points if you make the observation that 2=1.2+0.8 and 1=0.6+0.4 and that every zone that is oversaturated is also congested and every zone that is deficient is also scarce. Thus applying the congested and scarce penalty points in the whole of supply and demand of bikes means that you do not need to include the whole amount of penalty points for oversaturated and deficient bikes as this would result to a double counting. By minimising the penalty points we are effectively minimising the maximum of the left hand side expression of the inequality (applying a mini-max function to out model) and making the model minimise the number of bikes in each state. Another way to deal with the penalty points would be to change the definition of the congested_bikes(i) and scarce_bikes(i) to congested(i)*supply-oversaturated_bikes(i) and scarce(i)*demand(i)-deficient_bikes(i), in which case you would have to use the whole of penalty points (i.e. 2 and 1) when calculating the points for oversaturated and deficient bikes.

Next the oversaturated_points constraint is defined by oversaturated_bikes(i)>=initial_bikes(i)+incoming(i)-outgoing(i)-slots_zones(i

)

This constraint gives us the number of oversaturated bikes. Since we are minimising that number through the constraint described above, the model will try to maximise the number of outgoing bikes by maximising the

14

number of bikes transferred out (i.e. sum(ii, transfer(i,ii)) as this is what will minimise the whole right hand side expression. The oversaturated_bikes(i) variable will then take the maximum value of the right hand side of the expression if it is still positive after the transfer of bikes. If it is negative, which would be the result of transferring too many bikes out of the zone something that would indicate that the zone is not oversaturated anymore, being non-negative this variable, the minimum value that it can take is zero.

The constraint that gives us the number of the deficient bikes is given by: deficient_bikes(i)>=outgoing(i)-initial_bikes(i)-incoming(i)

Minimising the number of deficient_bikes(i) can be achieved by maximising the incoming(i) variable and thus maximising the number of bikes transferred into a zone (i.e. sum(ii, transfer(ii,i)). Once again when the right hand side is positive the deficient_bikes(i) will take that positive value and if it is negative, indicating that too many bikes were transferred in and the zone is no longer deficient, the minimum number that it can take is zero as it is a non-negative variable.

The constraint that indicates whether a zone is scarce is given by: 0.2*slots_zones+outgoing(i)-incoming(i)-initial_zones(i)<=7300*scarce(i)

Since we are trying to minimise the number of scarce zones, our model will try to minimise the right hand side of the constraint to zero by maximising the incoming(i) (i.e. the total number transferred to the zone) variable on the left hand side of the model. When not enough bikes are transferred into the zone to make the left hand side of the constraint take a negative value, something that would force the scarce(i) binary to take a value of zero indicating that the zone is no longer scarce and not scarce points should be allocated, the right hand side will have to take a value of one for the inequality to hold. This is known as the big-M method, where the number of 7300 which is the total number of passengers traveling from a zone, representing an upper bound for the left hand side of the inequality.

Similarly the constraint that indicates whether a zone is congested given by: initial_bikes(i)+incoming(i)-outgoing(i)-0.8*slots_zones<=7300*congersted(i)

Since we are minimising the number of congested zones, the way to minimise that expression is by maximising the outgoing(i) variable (i.e. the number of bikes sent out of the zone). When the left hand side of the inequality takes a positive value then the congested variable will take a value of one indicating the zone is congested and applying points on it. When it takes a negative value, the congested(i) will become zero indicating the zone is no longer congested. Once again the value of 7300 is the maximum number of people that could travel to a zone.

Finally the total_trips constraint gives is defined by: sum((i,ii),transfer(i,ii)*short_journey(i,ii))/2+sum((i,ii),transfer(i,ii)*lon

g_hourney(i,ii))<=12

This constraint satisfies the condition that each lorry can make either one long journey or two short journeys. If only long journeys are made then this would sum up to 12, which is the number of lorries, and if only short journeys are made then the left hand side of the inequality above would again sum up to 12 ( as the number of the total short journeys is divided by 2). We then can have any combination of short and long where the left hand side would add up to a maximum of twelve.

Scenario 2

In this scenario we used a modified version of our basic model. Firstly there was an extra Parameter called the optimum_penalty which took a value of 4045 which is the optimum solution for the basic model. Furthermore there was a change in the variables – our objective function now became the distance travelled, represented by the free scalar variable distance_travelled1 (which is the variable we minimised). We then added the following constraint called total_distance1:

sum((i,ii), transfer(i,ii)*distance(i,ii))<=distance_travelled1

15

Minimising the distance_travelled1, also minimised the left hand side of the inequality, which represents the sum of all the distance between all of the lorries put together. In order to achieve that, the model chose the smallest distance that would allow for an increase of up to 10% in the penalty points (while performing the same number of trips as in the basic model). This is represented by the penalty_points1 constraint defined as: sum(i,1.2*oversaturated_bikes(i)+0.4*scarce_bikes(i)+0.8*congested_bikes(i)+0.

6*deficient_bikes(i))<=1.1*optimum_penalty, which is the same constraint as the one in the basic scenario with the only difference that the right hand side now includes a fixed upper bound.

Finally all the other variables and constraints were the same as in the basic scenario. When creating the mathematical program, the objective function to be minimised became the distance_travelled1.

Scenario 3

a. This scenario contains exactly the same model as the basic scenario with the only difference being in the constraint regarding the total trips of the lorries. Since the number of bikes is increased by 3 in this scenario, we had to adjust the right-hand side of the total_trips constraint by increasing it from 12 to 15. This means that if only long trips are made, the total number of trips equals the number of lorries, while if only short trips are made, the total number equals 30 (2 short trips/lorry). Dividing this by two would give us the right hand side of the constraint.

b. In the second scenario we used the basic scenario model but we also added two variables two constraints, making also a few modification on some of the constraints. More specifically we added the allocate_dock_stations(i) which represented the number of dock station allocated to a zone and took values from 0 to 9 and the allocate_bikes(i) which represented the number of bikes allocated to a zone and took values from 0 to 100. Furthermore changes were made to the constraints related to each of the 4 states of the zones and more specifically we changed each definition where the number of slots was

included, by adding to that number the following expression: 15*allocate_dock_stations(i). Summing the two numbers up gives us the new total number of slots in that zone after new slots are allocated. In addition, in the definitions of the constraints that included the parameter initial_bikes(i), we added the allocate_bikes(i) variable to that number - summing the two up gives you the total number of bikes after the new bikes have been distributed. We finally included two new constraints, the first summing up the allocate_dock_stations(i) across all zones and setting an upper bound of 9 for that expression which means that the total number of docking station that can be allocated across all zones is 9. The second constraint sums up the allocate_bikes(i) across all zones and sets an upper value of for that number of 100 which equals to the total number of bikes that we were allowed to allocate.

After running the two models we get a lower total number of penalty points if we choose option a) where 3 new lorries are purchased.

Further Analysis

1. Changing the initial allocation of the bikes

For this scenario two models were used. The first model had as a decision variable the initial_zones1(i) which indicated the initial allocation of bikes. The model was created with the objective of minimising the number of penalty points assuming that there is no transfer of lorries at all. This model was different in the following ways:

Firstly distances were not taken into account (as it was assumed that no transfer is being made). This means that the Parameters related to the distance as well to the bikes transferred have been excluded from the model. Furthermore the transfer(i,ii) variable was replaced by the integer initial_bikes(i) variable representing the initial

16

allocation of bikes (an integer was used as a decimal value of bikes allocated wouldn’t make sense). In addition in the constraints relating to the states of the zones, the initial_bikes(i) parameter was replaced by the initial_bikes1(i) variable, ensuring that the constraints were enforced using the new initial allocation of bikes. Finally two new constraints were included; the bikes(i) constraint defined by initial_bikes1(i)<= slots_zones(i)ensuring that the initial bikes allocated were less than the slots of the zone and the total_bikes(i) constraint defined by sum(i, initial_bikes1(i))=sum(i, initial_bikes(i)), ensuring that the number of bikes allocated equalled the number of bikes that were available. Running the model gave us values for the initial_bikes1(i) variable, which were used as the initial_bikes(i) parameter values (substituting the given values) for our second model which was exactly the same as the basic one. Re-running the basic model with this different initial allocation gave us a new optimum value of 3512 as discussed above.

2. Eliminating Penalty points

For this scenario we used the basic model excluding all the parameters, variables and elements in the constraints (or whole constraints) that are related to the transfers of bikes as our objective was to find what is needed to be done to eliminate the penalty points without the need to use any lorries. Furthermore 3 new variables were included, the integer new_slots(i) variable indicating the number of new slots needed, the integer new_bikes(i) variable that indicated the number of new bikes needed to eliminate the usage of lorries and the new free scalar variable new_slots_and_bikes as the ojective function that is being minimised (this is just the sum of the two new variables across all zones). We further had to include the additional constraint new_slots_and_bikes1 defined by sum(i, new_slots(i)+new_bikes(i))<=new_slots_and_bikes where the left hand side of the expression and thus the new slots and bikes needed was minimised as a result of the new objective function. In addition we had to set the sum of the total penalty points to zero which is included in the penalty_points constraint and ensures that the number of penalty points of this new model will be equal to zero. Finally for the constraints related to the states of the zones we had to add to the value of the parameter initial_bikes(i) the variable new_bikes(i) and to the value of the parameter slots_zones(i) the variable new_slots(i) to indicate that the new constraints should now take into account the new bikes and slots installed. Running the model we get the values for the number of new bikes and slots to be allocated in each zone as shown in the management report above. Testing this solution by using those values in our basic model, we get a value of zero penalty points with no transfers made by the lorries which was our main objective.

3. Expected increase in bike usage

This scenario dealt with an increased expected usage of bikes of 15%. Thus the data we used for the supply(i) and demand(i) in the basic scenario had to be changed to reflect that 15% increase. The model for this scenario was very similar to the basic model with the exception that we introduced a new free scalar variable called extra_lorries which now represented the new objective function that was minimised. Also the Oversaturated_bikes(i) variable was turned into integer as it was observed that adding the new number of bikes caused the variables to take a decimal value. Furthermore we changed the RHS of the constraint penalty_points1 to reflect the fact that penalty points should remain to the same level. Finally in the total_trips constraint, we added the variable extra_lorries to the RHS of the model to ensure that the model took into account the new number of lorries when calculating the maximum number of trips allowed.

17

Scenario 1

Minimise penalty_points Subject to:1) 1.2*oversaturated_bikes(i) + 0.8*congested_bikes(i) <= penalty_points

+ 0.4*scarce_bikes(i) + 0.6*deficient_bikes(i)

2) oversaturated_bikes(i)>=initial_bikes(i)+incoming(i)-outgoing(i)-slots_zones(i)

3) deficient_bikes(i)>=outgoing(i)-initial_bikes(i)-incoming(i)

4) 0.2*slots_zones(i)+outgoing(i)-incoming(i)-initial_bikes(i)<=7300*scarce(i)

5) initial_bikes(i)+incoming(i)-outgoing(i)-0.8*slots_zones(i)<=7300*congested(i)

6) sum((i,ii), transfer(i,ii)*short_journey(i,ii))/2+sum((i,ii), transfer(i,ii)*long_journey(i,ii))<=12

7) oversaturated(i),deficient(i)>=0, 0<=transfer(i,ii)<=5, congested(i), Scarce(i)=[1,0]

Where initial_bikes(i), slots_zones(i), short_journey(i,ii) and long_journey(i,ii) are given

parameters and where the following are variables defined by (this relates to all the models below

incoming(i) = supply(i)+bikes_transferred*sum(ii,transfer(ii,i))

outgoing(i) = supply(i)+bikes_transferred*sum(ii,transfer(ii,i))

scarce_bikes(i) = scarce(i)*demand(i)

congested(i) = congested(i)*supply(i)

Scenario 2

Minimise distance_travelled1

Subject to:

1) 1.2*oversaturated_bikes(i) + 0.8*congested_bikes(i) <=1.1*optimum_penalty+

0.4*scarce_bikes(i) + 0.6*deficient_bikes(i)

2) sum((i,ii), transfer(i,ii)*distance(i,ii))<=distance_travelled1

3) oversaturated_bikes(i)>=initial_bikes(i)+incoming(i)-outgoing(i)-slots_zones(i)

4) deficient_bikes(i)>=outgoing(i)-initial_bikes(i)-incoming(i)

5) 0.2*slots_zones(i)+outgoing(i)-incoming(i)-initial_bikes(i)<=7300*scarce(i)

6) initial_bikes(i)+incoming(i)-outgoing(i)-0.8*slots_zones(i)<=7300*congested(i)

7) sum((i,ii), transfer(i,ii)*short_journey(i,ii))/2+sum((i,ii), transfer(i,ii)*long_journey(i,ii))<=12

8) oversaturated(i),deficient(i)>=0, 0<=transfer(i,ii)<=5, congested(i), Scarce(i)=[1,0]

Where initial_bikes(i), slots_zones(i), distance (i,ii), short_journey(i,ii) and long_journey(i,ii) are given

parameters, optimum_penalty=Scenario 1 optimum solution and where the following are variables defined by

incoming(i) = supply(i)+bikes_transferred*sum(ii,transfer(ii,i))

outgoing(i) = supply(i)+bikes_transferred*sum(ii,transfer(ii,i))

scarce_bikes(i) = scarce(i)*demand(i)

congested(i) = congested(i)*supply(i)

Scenario 3

a) Exactly the same as the basic scenario with the only difference being in constraint number 6 above which changes

to sum((i,ii), transfer(i,ii)*short_journey(i,ii))/2+sum((i,ii), transfer(i,ii)*long_journey(i,ii))<=12

b) Minimise penalty_points

Subject to:

1) 1.2*oversaturated_bikes(i) + 0.8*congested_bikes(i) <= penalty_points+

0.4*scarce_bikes(i) + 0.6*deficient_bikes(i)

2) deficient_bikes(i)>=outgoing(i)-allocate_bikes(i)-initial_bikes(i)-incoming(i)

3) 0.2*(15*allocate_dock_stations(i)+slots_zones(i))+outgoing(i)-incoming(i)-initial_bikes(i)-allocate_bikes(i)<=7300*scarce(i)

4) allocate_bikes(i)+initial_bikes(i)+incoming(i)-outgoing(i)-0.8*(slots_zones(i)+15*allocate_dock_stations(i))<=7300*congested(i)

5) sum((i,ii), transfer(i,ii)*short_journey(i,ii))/2+sum((i,ii), transfer(i,ii)*long_journey(i,ii))<=12

6) sum(i, allocate_dock_stations(i))<=9 and 7)sum(i, allocate_bikes(i))<=100

7) oversaturated(i),deficient(i)>=0, 0<=transfer(i,ii)<=5, congested(i), Scarce(i)=[1,0]

and allocate_dock_stations(i)=[0..9] and allocate_bikes(i)=[0..100]

Appendix 2 – Technical Appendix

18

Further Scenarios

Scenario 1

Minimise penalty_points

Subject to:

1) 1.2*oversaturated_bikes(i) + 0.8*congested_bikes(i) <= penalty_points

+

0.4*scarce_bikes(i) + 0.6*deficient_bikes(i)

2) oversaturated_bikes(i)>=initial_bikes1(i)+supply(i)-demand(i)-slots_zones(i)

3) deficient_bikes(i)>=demand(i)-initial_bikes1(i)-supply(i)

4) 0.2*slots_zones(i)+demand(i)-supply(i)-initial_bikes1(i)<=7300*scarce(i)

5) initial_bikes1(i)+supply(i)-demand(i)-0.8*slots_zones(i)<=7300*congested(i)

6) sum(i, initial_bikes1(i))=sum(i, initial_bikes(i))

7) initial_bikes1(i)<=slots_zones(i)

8) oversaturated(i),deficient(i)>=0, initial_bikes(i)=integer, congested(i), Scarce(i)=[1,0]

Scenario 2

Minimise new_slots_and_bikes

Subject to:

1) sum(i, new_slots(i)+new_bikes(i))<=new_slots_and_bikes

2) 1.2*oversaturated_bikes(i) + 0.8*congested_bikes(i) .= 0

+

0.4*scarce_bikes(i) + 0.6*deficient_bikes(i)

3) oversaturated_bikes(i)>=initial_bikes(i)+new_bikes(i)+supply(i)-demand(i)-slots_zones(i)-new_slots(i)

4) deficient_bikes(i)>=demand(i)-initial_bikes(i)-supply(i)-new_bikes(i)

5) 0.2*(slots_zones(i)+new_slots(i))+demand(i)-supply(i)-initial_bikes(i)-new_bikes(i)<=7300*scarce(i)

6) initial_bikes(i)+new_bikes(i)+supply(i)-demand(i)-0.8*(slots_zones(i)+new_slots(i))<=7300*congested(i)

7) oversaturated(i),deficient(i)>=0, initial_bikes(i)=integer, congested(i), Scarce(i)=[1,0]

8) new_slots(i) and new_bikes(i)=integers

Scenario 3

Minimise extra_lorries

Subject to:

1) 1.2*oversaturated_bikes(i) + 0.8*congested_bikes(i) .= 4045

+

0.4*scarce_bikes(i) + 0.6*deficient_bikes(i)

2) oversaturated_bikes(i)>=initial_bikes(i)+incoming(i)-outgoing(i)-slots_zones(i)

3) deficient_bikes(i)>=outgoing(i)-initial_bikes(i)-incoming(i)

4) 0.2*slots_zones(i)+outgoing(i)-incoming(i)-initial_bikes(i)<=7300*scarce(i)

5) initial_bikes(i)+incoming(i)-outgoing(i)-0.8*slots_zones(i)<=7300*congested(i)

6) sum((i,ii), transfer(i,ii)*short_journey(i,ii))/2+sum((i,ii), transfer(i,ii)*long_journey(i,ii))<=12+extra_lorries

7) oversaturated(i),deficient(i)>=0, 0<=transfer(i,ii)<=5, congested(i), Scarce(i)=[1,0]

19

APPENDIX 3

Basic Scenario

MAIN MODEL Basic_Model DECLARATION SECTION Scenario_1 SET: identifier : zones indices : i, ii definition : {1..18} ; PARAMETER: identifier : initial_bikes index domain : (i) ; PARAMETER: identifier : slots_zones index domain : i ; PARAMETER: identifier : demand index domain : (i) ; PARAMETER: identifier : supply index domain : (i) ; PARAMETER: identifier : bikes_transferred definition : 30 ; PARAMETER: identifier : distance index domain : (i,ii) ; PARAMETER: identifier : short_journey index domain : (i,ii) definition : if distance(i,ii)<=3 then 1 else 0 endif ; PARAMETER: identifier : long_journey index domain : (i,ii) definition : if distance(i,ii)>3 then 1 else 0 endif ; VARIABLE: identifier : transfer index domain : (i,ii) range : {0..5} ;

20

VARIABLE: identifier : incoming index domain : i definition : supply(i)+bikes_transferred*sum(ii,transfer(ii,i)) ; VARIABLE: identifier : outgoing index domain : i definition : demand(i)+bikes_transferred*sum(ii,transfer(i,ii)) ; VARIABLE: identifier : oversaturated_bikes index domain : i range : nonnegative ; VARIABLE: identifier : deficient_bikes index domain : (i) range : nonnegative ; VARIABLE: identifier : scarce index domain : i range : binary ; VARIABLE: identifier : congested index domain : (i) range : binary ; VARIABLE: identifier : scarce_bikes index domain : (i) definition : scarce(i)*demand(i) ; VARIABLE: identifier : congested_bikes index domain : (i) definition : congested(i)*supply(i) ; VARIABLE: identifier : penalty_points ; CONSTRAINT: identifier : penalty_points1 definition : sum(i, 1.2*oversaturated_bikes(i)+0.4*scarce_bikes(i)+0.8*congested_bikes(i)+0.6*deficient_bikes(i))<=penalty_points ; CONSTRAINT: identifier : oversaturated_points index domain : i

21

definition : oversaturated_bikes(i)>=initial_bikes(i)+incoming(i)-outgoing(i)-slots_zones(i) ; CONSTRAINT: identifier : deficient_points index domain : (i) definition : deficient_bikes(i)>=outgoing(i)-initial_bikes(i)-incoming(i) ; CONSTRAINT: identifier : scarce_zone index domain : i definition : 0.2*slots_zones(i)+outgoing(i)-incoming(i)-initial_bikes(i)<=7300*scarce(i) ; CONSTRAINT: identifier : congested_zone index domain : (i) definition : initial_bikes(i)+incoming(i)-outgoing(i)-0.8*slots_zones(i)<=7300*congested(i) ; CONSTRAINT: identifier : total_trips definition : sum((i,ii), transfer(i,ii)*short_journey(i,ii))/2+sum((i,ii), transfer(i,ii)*long_journey(i,ii))<=12 ; ENDSECTION ; DECLARATION SECTION model_detail MATHEMATICAL PROGRAM: identifier : minimise_penalty objective : penalty_points direction : minimize constraints : AllConstraints variables : AllVariables type : MIP ; ENDSECTION ; PROCEDURE identifier : MainInitialization ENDPROCEDURE ; PROCEDURE identifier : MainExecution body : solve minimise_penalty ENDPROCEDURE ; PROCEDURE identifier : MainTermination body :

22

if ( CaseSaveAll( confirm:2 ) = 1 ) then return 1; else return 0; endif ; ENDPROCEDURE ; ENDMODEL Basic_Model ;

Scenario 2

MAIN MODEL Basic_Model DECLARATION SECTION Scenario_2_ SET: identifier : zones indices : i, ii definition : {1..18} ; PARAMETER: identifier : initial_bikes index domain : (i) ; PARAMETER: identifier : slots_zones index domain : i ; PARAMETER: identifier : demand index domain : (i) ; PARAMETER: identifier : supply index domain : (i) ; PARAMETER: identifier : bikes_transferred definition : 30 ; PARAMETER: identifier : distance index domain : (i,ii) ; PARAMETER: identifier : short_journey index domain : (i,ii) definition : if distance(i,ii)<=3 then 1 else 0 endif ;

23

PARAMETER: identifier : long_journey index domain : (i,ii) definition : if distance(i,ii)>3 then 1 else 0 endif ; PARAMETER: identifier : optimum_penalty definition : 4045 ; VARIABLE: identifier : transfer index domain : (i,ii) range : {0..5} ; VARIABLE: identifier : incoming index domain : i definition : supply(i)+bikes_transferred*sum(ii,transfer(ii,i)) ; VARIABLE: identifier : outgoing index domain : i definition : demand(i)+bikes_transferred*sum(ii,transfer(i,ii)) ; VARIABLE: identifier : oversaturated_bikes index domain : i range : nonnegative ; VARIABLE: identifier : deficient_bikes index domain : (i) range : nonnegative ; VARIABLE: identifier : scarce index domain : i range : binary ; VARIABLE: identifier : congested index domain : (i) range : binary ; VARIABLE: identifier : scarce_bikes index domain : (i) definition : scarce(i)*demand(i) ; VARIABLE: identifier : congested_bikes

24

index domain : (i) definition : congested(i)*supply(i) ; VARIABLE: identifier : distance_travelled1 ; CONSTRAINT: identifier : total_distance1 definition : sum((i,ii), transfer(i,ii)*distance(i,ii))<=distance_travelled1 ; CONSTRAINT: identifier : penalty_points1 definition : sum(i, 1.2*oversaturated_bikes(i)+0.4*scarce_bikes(i)+0.8*congested_bikes(i)+0.6*deficient_bikes(i))<=1.1*optimum_penalty ; CONSTRAINT: identifier : oversaturated_points index domain : i definition : oversaturated_bikes(i)>=initial_bikes(i)+incoming(i)-outgoing(i)-slots_zones(i) ; CONSTRAINT: identifier : deficient_points index domain : (i) definition : deficient_bikes(i)>=outgoing(i)-initial_bikes(i)-incoming(i) ; CONSTRAINT: identifier : scarce_zone index domain : i definition : 0.2*slots_zones(i)+outgoing(i)-incoming(i)-initial_bikes(i)<=7300*scarce(i) ; CONSTRAINT: identifier : congested_zone index domain : (i) definition : initial_bikes(i)+incoming(i)-outgoing(i)-0.8*slots_zones(i)<=7300*congested(i) ; CONSTRAINT: identifier : total_trips definition : sum((i,ii), transfer(i,ii)*short_journey(i,ii))/2+sum((i,ii), transfer(i,ii)*long_journey(i,ii))<=12 ; ENDSECTION ; DECLARATION SECTION model_detail MATHEMATICAL PROGRAM: identifier : minimise_penalty objective : distance_travelled1 direction : minimize constraints : AllConstraints variables : AllVariables

25

type : MIP ; ENDSECTION ; PROCEDURE identifier : MainInitialization ENDPROCEDURE ; PROCEDURE identifier : MainExecution body : solve minimise_penalty ENDPROCEDURE ; PROCEDURE identifier : MainTermination body : if ( CaseSaveAll( confirm:2 ) = 1 ) then return 1; else return 0; endif ; ENDPROCEDURE ; ENDMODEL Basic_Model ;

Scenario 3a

MAIN MODEL Basic_Model DECLARATION SECTION Scenario_1 SET: identifier : zones indices : i, ii definition : {1..18} ; PARAMETER: identifier : initial_bikes index domain : (i) ; PARAMETER: identifier : slots_zones index domain : i ; PARAMETER: identifier : demand

26

index domain : (i) ; PARAMETER: identifier : supply index domain : (i) ; PARAMETER: identifier : bikes_transferred definition : 30 ; PARAMETER: identifier : distance index domain : (i,ii) ; PARAMETER: identifier : short_journey index domain : (i,ii) definition : if distance(i,ii)<=3 then 1 else 0 endif ; PARAMETER: identifier : long_journey index domain : (i,ii) definition : if distance(i,ii)>3 then 1 else 0 endif ; VARIABLE: identifier : transfer index domain : (i,ii) range : {0..5} ; VARIABLE: identifier : incoming index domain : i definition : supply(i)+bikes_transferred*sum(ii,transfer(ii,i)) ; VARIABLE: identifier : outgoing index domain : i definition : demand(i)+bikes_transferred*sum(ii,transfer(i,ii)) ; VARIABLE: identifier : oversaturated_bikes index domain : i range : nonnegative ; VARIABLE: identifier : deficient_bikes index domain : (i) range : nonnegative ; VARIABLE: identifier : scarce

27

index domain : i range : binary ; VARIABLE: identifier : congested index domain : (i) range : binary ; VARIABLE: identifier : scarce_bikes index domain : (i) definition : scarce(i)*demand(i) ; VARIABLE: identifier : congested_bikes index domain : (i) definition : congested(i)*supply(i) ; VARIABLE: identifier : penalty_points ; CONSTRAINT: identifier : penalty_points1 definition : sum(i, 1.2*oversaturated_bikes(i)+0.4*scarce_bikes(i)+0.8*congested_bikes(i)+0.6*deficient_bikes(i))<=penalty_points ; CONSTRAINT: identifier : oversaturated_points index domain : i definition : oversaturated_bikes(i)>=initial_bikes(i)+incoming(i)-outgoing(i)-slots_zones(i) ; CONSTRAINT: identifier : deficient_points index domain : (i) definition : deficient_bikes(i)>=outgoing(i)-initial_bikes(i)-incoming(i) ; CONSTRAINT: identifier : scarce_zone index domain : i definition : 0.2*slots_zones(i)+outgoing(i)-incoming(i)-initial_bikes(i)<=7300*scarce(i) ; CONSTRAINT: identifier : congested_zone index domain : (i) definition : initial_bikes(i)+incoming(i)-outgoing(i)-0.8*slots_zones(i)<=7300*congested(i) ; CONSTRAINT: identifier : total_trips definition : sum((i,ii), transfer(i,ii)*short_journey(i,ii))/2+sum((i,ii), transfer(i,ii)*long_journey(i,ii))<=15 ;

28

ENDSECTION ; DECLARATION SECTION model_detail MATHEMATICAL PROGRAM: identifier : minimise_penalty objective : penalty_points direction : minimize constraints : AllConstraints variables : AllVariables type : MIP ; ENDSECTION ; PROCEDURE identifier : MainInitialization ENDPROCEDURE ; PROCEDURE identifier : MainExecution body : solve minimise_penalty ENDPROCEDURE ; PROCEDURE identifier : MainTermination body : if ( CaseSaveAll( confirm:2 ) = 1 ) then return 1; else return 0; endif ; ENDPROCEDURE ; ENDMODEL Basic_Model ; Scenario 3b MAIN MODEL Main_123 DECLARATION SECTION Scenario_3b SET: identifier : zones indices : i, ii definition : {1..18} ;

29

PARAMETER: identifier : initial_bikes index domain : (i) ; PARAMETER: identifier : slots_zones index domain : i ; PARAMETER: identifier : demand index domain : (i) ; PARAMETER: identifier : supply index domain : (i) ; PARAMETER: identifier : bikes_transferred definition : 30 ; PARAMETER: identifier : distance index domain : (i,ii) ; PARAMETER: identifier : short_journey index domain : (i,ii) definition : if distance(i,ii)<=3 then 1 else 0 endif ; PARAMETER: identifier : long_journey index domain : (i,ii) definition : if distance(i,ii)>3 then 1 else 0 endif ; VARIABLE: identifier : transfer index domain : (i,ii) range : {0..5} ; VARIABLE: identifier : allocate_dock_stations index domain : i range : {0..9} ; VARIABLE: identifier : allocate_bikes index domain : (i) range : {0..100} ; VARIABLE:

30

identifier : incoming index domain : i definition : supply(i)+bikes_transferred*sum(ii,transfer(ii,i)) ; VARIABLE: identifier : outgoing index domain : i definition : demand(i)+bikes_transferred*sum(ii,transfer(i,ii)) ; VARIABLE: identifier : oversaturated_bikes index domain : i range : nonnegative ; VARIABLE: identifier : deficient_bikes index domain : (i) range : nonnegative ; VARIABLE: identifier : scarce index domain : i range : binary ; VARIABLE: identifier : congested index domain : (i) range : binary ; VARIABLE: identifier : scarce_bikes index domain : (i) definition : scarce(i)*demand(i) ; VARIABLE: identifier : congested_bikes index domain : (i) definition : congested(i)*supply(i) ; VARIABLE: identifier : penalty_points ; CONSTRAINT: identifier : penalty_points1 definition : sum(i, 1.2*oversaturated_bikes(i)+0.4*scarce_bikes(i)+0.8*congested_bikes(i)+0.6*deficient_bikes(i))<=penalty_points ; CONSTRAINT: identifier : oversaturated_points index domain : i

31

definition : oversaturated_bikes(i)>=initial_bikes(i)+allocate_bikes(i)+incoming(i)-outgoing(i)-slots_zones(i)-15*allocate_dock_stations(i) ; CONSTRAINT: identifier : deficient_points index domain : (i) definition : deficient_bikes(i)>=outgoing(i)-allocate_bikes(i)-initial_bikes(i)-incoming(i) ; CONSTRAINT: identifier : scarce_zone index domain : i definition : 0.2*(15*allocate_dock_stations(i)+slots_zones(i))+outgoing(i)-incoming(i)-initial_bikes(i)-allocate_bikes(i)<=10000*scarce(i) ; CONSTRAINT: identifier : congested_zone index domain : (i) definition : allocate_bikes(i)+initial_bikes(i)+incoming(i)-outgoing(i)-0.8*(slots_zones(i)+15*allocate_dock_stations(i))<=10000*congested(i) ; CONSTRAINT: identifier : total_trips definition : sum((i,ii), transfer(i,ii)*short_journey(i,ii))/2+sum((i,ii), transfer(i,ii)*long_journey(i,ii))<=12 ; CONSTRAINT: identifier : total_allocation definition : sum(i, allocate_dock_stations(i))<=9 ; CONSTRAINT: identifier : total_bikes_allocated definition : sum(i, allocate_bikes(i))<=100 ; ENDSECTION ; DECLARATION SECTION model_detail MATHEMATICAL PROGRAM: identifier : minimise_penalty objective : penalty_points direction : minimize constraints : AllConstraints variables : AllVariables type : MIP ; MATHEMATICAL PROGRAM: identifier : minimise_distance direction : minimize ;

32

ENDSECTION ; PROCEDURE identifier : MainInitialization ENDPROCEDURE ; PROCEDURE identifier : MainExecution body : solve minimise_penalty ENDPROCEDURE ; PROCEDURE identifier : MainTermination body : if ( CaseSaveAll( confirm:2 ) = 1 ) then return 1; else return 0; endif ; ENDPROCEDURE ; ENDMODEL Main_123 ; Further Scenario 1 MAIN MODEL Further_Directions DECLARATION SECTION Further_1 SET: identifier : zones indices : i, ii definition : {1..18} ; PARAMETER: identifier : initial_bikes index domain : (i) ; PARAMETER: identifier : demand index domain : (i) ; PARAMETER: identifier : slots_zones

33

index domain : i ; PARAMETER: identifier : supply index domain : (i) ; VARIABLE: identifier : initial_bikes1 index domain : (i) range : integer ; VARIABLE: identifier : oversaturated_bikes index domain : i range : nonnegative ; VARIABLE: identifier : deficient_bikes index domain : (i) range : nonnegative ; VARIABLE: identifier : scarce index domain : i range : binary ; VARIABLE: identifier : congested index domain : (i) range : binary ; VARIABLE: identifier : scarce_bikes index domain : (i) definition : scarce(i)*demand(i) ; VARIABLE: identifier : congested_bikes index domain : (i) definition : congested(i)*supply(i) ; VARIABLE: identifier : penalty_points ; CONSTRAINT: identifier : penalty_points1 definition : sum(i, 1.2*oversaturated_bikes(i)+0.4*scarce_bikes(i)+0.8*congested_bikes(i)+0.6*deficient_bikes(i))<=penalty_points ; CONSTRAINT: identifier : oversaturated_points

34

index domain : i definition : oversaturated_bikes(i)>=initial_bikes1(i)+supply(i)-demand(i)-slots_zones(i) ; CONSTRAINT: identifier : deficient_points index domain : (i) definition : deficient_bikes(i)>=demand(i)-initial_bikes1(i)-supply(i) ; CONSTRAINT: identifier : scarce_zone index domain : i definition : 0.2*slots_zones(i)+demand(i)-supply(i)-initial_bikes1(i)<=7300*scarce(i) ; CONSTRAINT: identifier : congested_zone index domain : (i) definition : initial_bikes1(i)+supply(i)-demand(i)-0.8*slots_zones(i)<=7300*congested(i) ; CONSTRAINT: identifier : bikes index domain : (i) definition : initial_bikes1(i)<=slots_zones(i) ; CONSTRAINT: identifier : total_bikes definition : sum(i, initial_bikes1(i))=sum(i, initial_bikes(i)) ; ENDSECTION ; DECLARATION SECTION model_detail MATHEMATICAL PROGRAM: identifier : minimise_penalty objective : penalty_points direction : minimize constraints : AllConstraints variables : AllVariables type : MIP ; ENDSECTION ; PROCEDURE identifier : MainInitialization ENDPROCEDURE ; PROCEDURE identifier : MainExecution body : solve minimise_penalty

35

ENDPROCEDURE ; PROCEDURE identifier : MainTermination body : if ( CaseSaveAll( confirm:2 ) = 1 ) then return 1; else return 0; endif ; ENDPROCEDURE ; ENDMODEL Further_Directions ; Further Scenario 2 MAIN MODEL Further_Directions DECLARATION SECTION Further_2 SET: identifier : zones indices : i, ii definition : {1..18} ; PARAMETER: identifier : initial_bikes index domain : (i) ; PARAMETER: identifier : slots_zones index domain : i ; PARAMETER: identifier : demand index domain : (i) ; PARAMETER: identifier : supply index domain : (i) ; VARIABLE: identifier : new_slots index domain : (i) range : integer ; VARIABLE: identifier : new_bikes index domain : (i)

36

range : integer ; VARIABLE: identifier : oversaturated_bikes index domain : i range : nonnegative ; VARIABLE: identifier : deficient_bikes index domain : (i) range : nonnegative ; VARIABLE: identifier : scarce index domain : i range : binary ; VARIABLE: identifier : congested index domain : (i) range : binary ; VARIABLE: identifier : scarce_bikes index domain : (i) definition : scarce(i)*demand(i) ; VARIABLE: identifier : congested_bikes index domain : (i) definition : congested(i)*supply(i) ; VARIABLE: identifier : new_slots_and_bikes ; CONSTRAINT: identifier : new_slots_and_bikes1 definition : sum(i, new_slots(i)+new_bikes(i))<=new_slots_and_bikes ; CONSTRAINT: identifier : penalty_points definition : sum(i, 1.2*oversaturated_bikes(i)+0.4*scarce_bikes(i)+0.8*congested_bikes(i)+0.6*deficient_bikes(i))=0 ; CONSTRAINT: identifier : oversaturated_points index domain : i definition : oversaturated_bikes(i)>=initial_bikes(i)+new_bikes(i)+supply(i)-demand(i)-slots_zones(i)-new_slots(i) ; CONSTRAINT:

37

identifier : deficient_points index domain : (i) definition : deficient_bikes(i)>=demand(i)-initial_bikes(i)-supply(i)-new_bikes(i) ; CONSTRAINT: identifier : scarce_zone index domain : i definition : 0.2*(slots_zones(i)+new_slots(i))+demand(i)-supply(i)-initial_bikes(i)-new_bikes(i)<=7300*scarce(i) ; CONSTRAINT: identifier : congested_zone index domain : (i) definition : initial_bikes(i)+new_bikes(i)+supply(i)-demand(i)-0.8*(slots_zones(i)+new_slots(i))<=7300*congested(i) ; ENDSECTION ; DECLARATION SECTION model_detail MATHEMATICAL PROGRAM: identifier : minimise_penalty objective : new_slots_and_bikes direction : minimize constraints : AllConstraints variables : AllVariables type : MIP ; MATHEMATICAL PROGRAM: identifier : minimise_distance direction : minimize ; ENDSECTION ; PROCEDURE identifier : MainInitialization ENDPROCEDURE ; PROCEDURE identifier : MainExecution body : solve minimise_penalty ENDPROCEDURE ; PROCEDURE identifier : MainTermination body : if ( CaseSaveAll( confirm:2 ) = 1 ) then return 1;

38

else return 0; endif ; ENDPROCEDURE ; ENDMODEL Further_Directions ;

Further Scenario 3

MAIN MODEL Further_Directions DECLARATION SECTION Further_3 SET: identifier : zones indices : i, ii definition : {1..18} ; PARAMETER: identifier : initial_bikes index domain : (i) ; PARAMETER: identifier : slots_zones index domain : i ; PARAMETER: identifier : demand index domain : (i) ; PARAMETER: identifier : supply index domain : (i) ; PARAMETER: identifier : bikes_transferred definition : 30 ; PARAMETER: identifier : distance index domain : (i,ii) ; PARAMETER: identifier : short_journey index domain : (i,ii) definition : if distance(i,ii)<=3 then 1 else 0 endif ; PARAMETER: identifier : long_journey

39

index domain : (i,ii) definition : if distance(i,ii)>3 then 1 else 0 endif ; VARIABLE: identifier : transfer index domain : (i,ii) range : {0..5} ; VARIABLE: identifier : incoming index domain : i definition : supply(i)+bikes_transferred*sum(ii,transfer(ii,i)) ; VARIABLE: identifier : outgoing index domain : i definition : demand(i)+bikes_transferred*sum(ii,transfer(i,ii)) ; VARIABLE: identifier : oversaturated_bikes index domain : i range : integer ; VARIABLE: identifier : deficient_bikes index domain : (i) range : nonnegative ; VARIABLE: identifier : scarce index domain : i range : binary ; VARIABLE: identifier : congested index domain : (i) range : binary ; VARIABLE: identifier : scarce_bikes index domain : (i) definition : scarce(i)*demand(i) ; VARIABLE: identifier : congested_bikes index domain : (i) definition : congested(i)*supply(i) ; VARIABLE: identifier : extra_lorries range : free ;

40

CONSTRAINT: identifier : penalty_points1 definition : sum(i, 1.2*oversaturated_bikes(i)+0.4*scarce_bikes(i)+0.8*congested_bikes(i)+0.6*deficient_bikes(i))=4045 ; CONSTRAINT: identifier : oversaturated_points index domain : i definition : oversaturated_bikes(i)>=initial_bikes(i)+incoming(i)-outgoing(i)-slots_zones(i) ; CONSTRAINT: identifier : deficient_points index domain : (i) definition : deficient_bikes(i)>=outgoing(i)-initial_bikes(i)-incoming(i) ; CONSTRAINT: identifier : scarce_zone index domain : i definition : 0.2*slots_zones(i)+outgoing(i)-incoming(i)-initial_bikes(i)<=7300*scarce(i) ; CONSTRAINT: identifier : congested_zone index domain : (i) definition : initial_bikes(i)+incoming(i)-outgoing(i)-0.8*slots_zones(i)<=7300*congested(i) ; CONSTRAINT: identifier : total_trips definition : sum((i,ii), transfer(i,ii)*short_journey(i,ii))/2+sum((i,ii), transfer(i,ii)*long_journey(i,ii))<=12+extra_lorries ; ENDSECTION ; DECLARATION SECTION model_detail MATHEMATICAL PROGRAM: identifier : minimise_penalty objective : extra_lorries direction : minimize constraints : AllConstraints variables : AllVariables type : MIP ; ENDSECTION ; PROCEDURE identifier : MainInitialization ENDPROCEDURE ; PROCEDURE

41

identifier : MainExecution body : solve minimise_penalty ENDPROCEDURE ; PROCEDURE identifier : MainTermination body : if ( CaseSaveAll( confirm:2 ) = 1 ) then return 1; else return 0; endif ; ENDPROCEDURE ; ENDMODEL Further_Directions ;

42

43