Either a data table gave values for the parameter with incorrect subscripts, or the parameter’s indexing set changed, causing some previously valid subscripts to become invalid. For example, in the diet.mod + diet.dat example (Figures 2-1 and 2-2) of the AMPL book, values of parameter cost are supplied for all eight members of set FOOD
:
ampl: display cost; cost [*] := BEEF 3.19 FISH 2.29 MCH 1.89 SPG 1.99 CHK 2.59 HAM 2.89 MTL 1.99 TUR 2.49 ;
If you remove the member CHK
from FOOD
, using for example a let
command, then you get a message that cost["CHK"]
has also been dropped from the data:
ampl: let FOOD := FOOD diff {"CHK"}; ampl: display cost; Error executing "display" command: error processing param cost: invalid subscript cost['CHK'] discarded. cost [*] := BEEF 3.19 HAM 2.89 MTL 1.99 TUR 2.49 FISH 2.29 MCH 1.89 SPG 1.99
Since cost["CHK"]
has now been dropped, no further error message will appear if you type display cost
again.
To avoid error messages of this sort, you can define a more flexible set structure for your model as shown in dietflex.mod and dietflex.dat. The auxiliary set DIET_DROP
defaults to empty, so that the problem is solved for all foods; but you can change DIET_DROP
to {"CHK"}
to solve without member CHK
:
ampl: model dietflex.mod; ampl: data dietflex.dat; ampl: option show_stats 1; ampl: solve; 8 variables, all linear 6 constraints, all linear; 47 nonzeros 1 linear objective; 8 nonzeros. MINOS 5.4: optimal solution found. 13 iterations, objective 118.0594032 ampl: let FOOD_DROP := {"CHK"}; ampl: solve; 7 variables, all linear 6 constraints, all linear; 42 nonzeros 1 linear objective; 7 nonzeros. MINOS 5.4: optimal solution found. 3 iterations, objective 117.3218891
Changing FOOD_DROP
does not affect the set FOOD_ALL
, and consequently all of the subscripts in the data remain valid.
Posted in: Sets and Indexing