The gap between not doing something at all and its maximum level often includes a range where the quantity is too small to be practical. An LP model would think nothing (okay, they don’t actually think, but you know what I mean) of buying 1 BBL of a crude grade, but you would never actually do that. A minimum would force the option to be active, while it might be more profitable to leave it at zero. For one such possibility, you could run two cases – not available, then min to max, and compare the results. With multiple items of this type, however, the number of cases needed to cover all the combinations would quickly explode. Fortunately, you can incorporate this kind of condition into your model using semi-continuous bounds (if you have the HXPRESS or HCPLEX optimizer as HSLP does not support them). They are a MIP structure because the possible solutions are divided into discrete parts with gaps where the small quantities would be.
For purchases and sales in GRTMPS a semi-continuous option is built in to the input data records. If you have
You just need to tick the Semi-continuous column (If using table based input put a 1 in column $SC.)
The matrix bounds will change from | to |
LO BOUND1 RRAAARL_~BRX 10.0 | LO BOUND1 RRAAARL_~BRX 10.0 |
UP BOUND1 RRAAARL_~BRX 80.0 | SC BOUND1 RRAAARL_~BRX 80.0 |
I’ve always thought it odd that the SC actually replaces the upper bound, but that is the way it is structured in MPS format. Because of this a maximum is always required. Note that this purchase has a “Per Period” limit basis [TABLE 199.0] so the amounts go into the matrix with just a move of the decimal place to improve the scaling. If an option “Per Day”, then the bounds are multiplied by days in period as well, to give a total quantity. The Semi-continuous setting is also provided for transportation options, but not, at least at present, for process unit limits.
Process unit capacities correspond to rows in the matrix, not columns, so they have Right Hand Side values, not bounds. To use a bound, there has to be a single vector that corresponds to the amount that is controlled by the limit. Many units do have one of those. If the base in a base-delta or adherent recursion representation is the only activity that contributes to the row, then a semi-continuous bound can be applied via the Data:Specific Bounds panel [TABLE 196.0]. For example, this non-linear hydrofiner has a constant contribution to the loading factor that controls throughput.
To say that the unit must run at least 1000 t/day, or not at all set the bound
Here the maximum goes under the Semi-Continuous header. Be careful not to also apply a constraining limit to the capacity itself. If the capacity has multiple contributions – from deltas, from partials on a PUP value, from additional modes – then you can make one vector to bound using an equality row that collects all the contributions and is balanced drive an operation to be equal to the total count on the capacity. Before applying an SC bound to a process unit be sure that a semi-continuous limit is really what is required. The consequence of such a control is that the unit is either running at its minimum or off for the whole period. It is more often the case, that what you want to say is that when the unit is running, it should operate at a minimum value, but it doesn’t need to run all the time. That’s block operation.
A block operated unit has an extra variable to represent the time, usually days, allocated to a particular type of operation. A limit on throughput per day becomes a co-efficient on that variable rather than a hard coded RHS.
The zero entry on the DAY vector in the Hydrofiner Feed Loading row (HYD) will be replaced by the negative of the minimum, and the RHS set to 0. If no time is allocated to the block then the zero activity on the DAY vector multiplied by the mininmum will effectively wipe out the constraint. However, if the DAY vector is active, then the base mode must run at least at the minimum. No MIP.
You might, however, want to impose a minimum campaign length, if the unit is run. Put an SC bound on the DAY vector, like so:
As the limits are Per Day basis here (which is the most typical for Specific Bounds), the maximum is 1 day per day. If the run must be at least 3 days, if the unit is used, and period AA is 30 days, then the minimum is 3/30 = 0.1. Alternatively, if it is more convenient on balance, you could set the bounds data to Per Period basis. The min is then expressed as 3 and the Semi-Continuous value can be set to something larger than any period you might run. Then you don’t have to update the values when the period duration changes – always a handy design feature if you are working with database input and can’t use a formula to set the value (at least until g6!).
From Kathy's boarding gate (Make constructive use of travel delays!), Catania Airport, Sicily
9th March 2019.
9th March 2019.
Comments and suggestions gratefully received via the usual e-mail addresses or here.
You may also use this form to ask to be added to the distribution list so that you are notified via e-mail when new articles are posted.