Element after Last
Consider a stock balance v_Stock(i_t+1) = v_Stock(i_t) + v_Production(i_t) - p_Demand(i_t)
. Via t+1
we refer to the next element in a set. Using such an expression as an argument of a variable, as in S(t+1)
, we refer to the stock of the next period. The meaning of an expression like t+1
needs to be well-defined, including when t
equals the last element in the set H
. This brings us to the question in the title of this post.
Consider the situation with an index i
, such that \(i \in S=\{1..5\} \subset M=\{1..7\} \subset {\tt{}Integers} \subset \mathbb{Z}\). To denote the next element in a set, the +1
notation is used. Clearly, for i=3, i+1=4
, but when i=5
, what should i+1
be?
Let me answer this question, by considering a few other examples as well, and then come back to how you may handle this in the stock balance.
A set is a collection of unique elements. Among others, elements can be names and numbers. Let me give two additional examples:
The pre-declared set
AllAbbrWeekdays = { Mon, Tue, Wed, Thu, Fri, Sat, Sun }
with indexIndexAbbrWeekdays
and subsetWorkingDays = { Mon, Tue, Wed, Thu, Fri }
with indexwd
; Whenwd = 'Fri' ;
what shouldwd+1
be?The user declared set
PowerUnits = {LargePowerUnitWest, SmallPowerUnitWest, LargePowerUnitEast, SmallPowerUnitEast}
with subsetLargePowerUnits = { LargePowerUnitWest, LargePowerUnitEast }
. The indexpu
is inPowerUnits
and the indexlpu
is inLargePowerUnits
. Whenlpu='LargePowerUnitEast'
, what shouldlpu+1
be?
In addition to the +1
operation, used to refer to the next element, we are also able to refer to the next element cycle, whereby the element after the last in the set is the first element in the next set, using the operation ++1
. Similarly, the operations -1
and --1
refer to the previous, respectively the previous cycle, element. Of course the 1
can be replaced by another integer value.
Now, I will answer the above questions in reverse order:
lpu=last(LargePowerUnits), lpu+1
is the empty element. Even though there is another power unit in the super set, it is not large. If you want to obtain the next element with respect to the setPowerUnits
, you can use the indexpu
, and the expression becomespu+1
.wd=last(WorkingDays), wd+1
is the empty element. Even though there is a Saturday after Friday, in this example Saturday is not a working day. If you view the setWorkingDays
as a cyclic set, you may want to use the++1
operation instead, and the expression becomeswd++1
.i=last(S), i+1
, is the empty element, even thoughS
is a subset ofIntegers
. For the same reasons as above and with the similar remedies.
In mathematics, these elements correspond to integer numbers in the infinite set \(\mathbb{Z}\). Thus “+1” operation on an integer element resulting in the empty element may come as a surprise. However, when only considering finite sets, as AIMMS does, which may consist of names and numbers, this allows for a consistent definition of the next and previous operators.
The above definitions become interesting when applied to indexing, for instance in constraints. As in the introductory example, consider a simple stock balance constraint with a decision variable representing stock v_Stock(t)
registered at the beginning of a period, a parameter representing demand p_Demand(t)
registered during a period and a decision variable representing production v_Production(t)
registered during a period. The definition of this stock balance: v_Stock(i_t+1) = v_Stock(i_t) + v_Production(i_t) - p_Demand(i_t)
.
The StockBalance
becomes:
Constraint C_StockBalance {
IndexDomain: i_t | i_t < last( s_Horizon );
Definition: v_Stock(i_t+1) = v_Stock(i_t) + v_Production(i_t) - p_Demand(i_t);
}
As an aside, the “+1” and “-1” operations discussed above are also known as lead and lag operations, respectively.