🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
Calcite | Level 5

## Proc optmodel: initializing an array-variable ?

Good afternoon fellow SAS-users,

I am dealing with a non-linear problem using Proc optmodel (SAS 9.4).

I am optimizing a diet (i.e a list of foods (n=400) with their respecting daily quantities). My objective function minimizes the deviation from the initial (or "observed") diet, and a set of linear and non-linear constraints is imposed.

The variables are thus the (optimized) quantities of the 400 foods.

Here part of my code to show how I defined my variables:

``````set<str> foods;
/* [...] */

num qte_obs{foods}; /* this are the observed  quantities (what the population currently eats) */
/* [...] */

var qte_opt{foods}  >=0; /* in this case, no initialization specified */
/* [...] */minimize deviation = sum{p in foods}(delta[p]/qte_obs[p]); /* with delta[p] defined as (qte_opt[p] - qte_obs[p])*/
/* [...] */
read data foods2 into foods=[_CODAL]  qte_obs=MEAN;
/* foods2 is the table that provides the observed quantities for each food item (column MEAN), _CODAL is the ID of each food item */``````

I noticed that different initializations values may result in different optimal solutions.

So far I used the following syntax to initialize the variables :

``var qte_opt{foods} init 3 >=0;   /* 3 is just an example*/``

Doing so, all the 400 quantities are initialized at 3 (3 g/day).

I would like each of the 400 variables to be initialized at a given value, i.e the observed value. The point of departure would thus be the observed diet.

I tried many syntaxes, all resulting in various errors. Here what I tried, to give you an idea of what I want :

``````var qte_opt{foods} init [1	... 400] >=0; /* I exhaustively typed 400 values: from 1 to 400 (as a try, the real values would be the 400 observed values)*/
/* ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string,
a numeric constant, a datetime constant, a missing value, (, +, -, /, IF, INPUT,
INTER, MAX, MIN, PROD, PUT, SETOF, SLICE, SUM, UNION, {.
ERROR 200-322: The symbol is not recognized and will be ignored. */``````

other try closer to what I want:

``````var qte_opt{foods} init qte_obs{foods} >=0;

/*ERROR 22-322: Syntax error, expecting one of the following: !!, (, *, **, +, -, .., /, <=, <>,
><, >=, BY, CROSS, DIFF, ELSE, INIT, INTER, SYMDIFF, TO, UNION, [, ^, ||.

ERROR 76-322: Syntax error, statement will be ignored.*/``````

and other unsuccessful attempts...

I am wondering if it is possible to do such an initialization, and what is the correct syntax.

Thank you,

Best regards,

T.

1 ACCEPTED SOLUTION

Accepted Solutions
SAS Super FREQ

## Re: Proc optmodel: initializing an array-variable ?

``var qte_opt{p in foods} init qte_obs[p] >=0; ``
2 REPLIES 2
SAS Super FREQ

## Re: Proc optmodel: initializing an array-variable ?

``var qte_opt{p in foods} init qte_obs[p] >=0; ``
Calcite | Level 5

## Re: Proc optmodel: initializing an array-variable ?

Perfect !

Thank you very much.

Discussion stats
• 2 replies
• 1811 views
• 0 likes
• 2 in conversation