Understanding Action Operability
Actions are the decision points in Remsoft models. It is via actions that you define all of the development-altering events that the model can select from when optimizing. The purpose of this tech tip is to describe the different ways that you can declare action operability in models.
The decision variable in a Woodstock model is the area allocated to action X in period Y. More precisely, it is the amount of area of a particular development type, at a particular age, to assign to a particular action in a particular planning period. Thus, you must indicate to the model the development types that are eligible for actions and at what ages. There are several ways to do this.
1. Defining operability by age
First, you can declare the development types and age classes eligible directly. You can do this in one of two ways: using a conditional statement or an end-point statement.
1a. Conditional operability
Conditional age statements are straightforward and the most commonly used method for declaring operability in models. You simply declare the development types operable using a mask, and then supply the operable ages using the _AGE keyword in conditional statements as indicated below.
*ACTION MyAction Y
*OPERABLE MyAction
Mask _AGE >=/=/<= X and/or _AGE >=/=/<= Y and so on up to six age references.
1b. End point operability
End point age statements are another way to declare eligible age classes except these always include two parameters, and they do not require operators. The two parameters are the age class when types are first and last operable as indicated below.
*ACTION MyAction Y
*OPERABLE MyAction
Mask _AGE X _AGE Y
where X is the age that types are first operable and Y is the age that types are last operable. All ages in between the two end points are operable.
2. Defining operability by yield condition
Second, you can declare operability using yield conditions and the system will determine the matching age classes for you. This can be done using conditional or end point statements.
2a. Condition operability
*ACTION MyAction Y
*OPERABLE MyAction
Mask YieldTable >=/=/<= X and/or YieldTable >=/=/<= Y and so on up to six yield references.
2b. End point operability
*ACTION MyAction Y
*OPERABLE MyAction
Mask YieldTable X YieldTable Y
where X is the yield condition when types are first operable and Y is the yield condition when types are last operable. The system will determine the ages associated with the yield conditions and all ages between the two end points are operable.
You can see that a conditional operability and end point operability statements are very similar and you can mix ages and yield conditions within a single statement (e.g. types must be of some minimum age and of some minimum yield condition before they can be treated).
3. Defining operability by time period
Third, you can specify operability based on the planning period. This is generally described as time-dependent operability. You do this using the _CP keyword (for referencing the Current Planning period) in conditional and end point statements.
3a. Conditional operability
*ACTION MyAction Y
*OPERABLE MyAction
Mask _CP >= /=/<= X and/or _CP >=/=/<= Y
where X and Y are whole numbers greater than zero.
3b. End point operability
*ACTION MyAction Y
*OPERABLE MyAction
Mask _CP X _CP Y
where X is the planning period that types are first operable and Y is the planning period that types are last operable. This form of time-dependent operability is not commonly used.
3c. Multiple operability declarations
The other way to declare time-dependent operability is on the *OPERABLE line. If you only supply a single operable statement for an action, it applies in all planning periods. However, you can provide a different operability statement for one or more planning periods for an action as follows:
*ACTION MyAction Y
*OPERABLE MyAction _CP PeriodRange1
Mask Operability statement1
*OPERABLE MyAction _CP PeriodRange2
Mask Operability statement2
And so on…
In theory, you could have a separate operability declaration for every period in the model, but this rarely done and usually not necessary.
This allows great control over the decision matrix by allowing you to combine age and/or yield conditional statements with time-dependent rules. It can be a very effective way to limit the decision matrix by limiting operability over time.